Escolar Documentos
Profissional Documentos
Cultura Documentos
ESTUDAR MQL5 e
RESOLVER todas as tarefas:
Content
Referência MQL5 68
1 Elementos Básicos
.................................................................................................
da Linguagem 70
Sintaxe ............................................................................................................................71
Comentários
......................................................................................................................... 72
Identificadores
......................................................................................................................... 73
Palavras Reservadas
......................................................................................................................... 74
............................................................................................................................76
Tipos de Dados
Tipos Inteiros
......................................................................................................................... 77
Tipos char, short,
................................................................................................................
int e long 78
Constantes de ................................................................................................................
Caracteres 82
Tipo datetime................................................................................................................ 86
Tipo color ................................................................................................................ 87
Tipo bool ................................................................................................................ 88
Enumeradores................................................................................................................ 89
Tipos Reais.........................................................................................................................
(double, float) 91
Tipo string......................................................................................................................... 96
Estruturas,.........................................................................................................................
Classes e Interfaces 97
Objeto Array
.........................................................................................................................
Dinâmico 124
Conversão.........................................................................................................................
de Tipo (Typecasting) 125
Tipo void.........................................................................................................................
e constante NULL 130
Tipos personalizados
......................................................................................................................... 131
Ponteiros.........................................................................................................................
de Objeto 141
Referência,
.........................................................................................................................
Modificador & e Palavra-chave this 144
Operaç ões............................................................................................................................146
e Expressões
Express õ.........................................................................................................................
es 147
Operaç ões
.........................................................................................................................
Aritméticas 148
Operaç ões
.........................................................................................................................
de Atribuição 149
Operaç ões
.........................................................................................................................
de Relação 150
Operaç ões Booleanas
......................................................................................................................... 151
Operaç ões Binárias
......................................................................................................................... 153
Outras Operaç ões
......................................................................................................................... 156
Regras de
.........................................................................................................................
Precedência 160
Operadores............................................................................................................................162
Operador.........................................................................................................................
Composto 164
Operador.........................................................................................................................
de Expressão 165
Operador.........................................................................................................................
return 166
Operador.........................................................................................................................
Condicional if-else 167
Ternário ?
Operador......................................................................................................................... 168
Operador.........................................................................................................................
switch 170
Operador.........................................................................................................................
de loop while 172
Operador.........................................................................................................................
de loop for 173
Operador.........................................................................................................................
de loop do while 175
break
Operador......................................................................................................................... 176
Operador.........................................................................................................................
continue 177
Operador.........................................................................................................................
de Criação de Objeto new 178
Operação.........................................................................................................................
de Exclusão de Objeto delete 180
Funç ões ............................................................................................................................181
de Função
Chamada......................................................................................................................... 183
Passando.........................................................................................................................
Parâmetros 184
Sobrecarga de Função
......................................................................................................................... 187
Sobrecarga
.........................................................................................................................
de Operação 190
Descrição de Funç ões Externas
......................................................................................................................... 204
Exportação de Funç ões
......................................................................................................................... 206
O BJ_ELLIOT................................................................................................................
W AV E3 521
O BJ_RECTAN................................................................................................................
GLE 528
O BJ_TRIANG................................................................................................................
LE 534
O BJ_ELLIPSE................................................................................................................ 541
O BJ_ARRO W_ THUMB_UP
................................................................................................................ 548
O BJ_ARRO W_ THUMB_DO W N
................................................................................................................ 554
O BJ_ARRO W_ ................................................................................................................
UP 560
O BJ_ARRO W_ DO W N
................................................................................................................ 566
O BJ_ARRO W_ ................................................................................................................
STOP 572
O BJ_ARRO W_ C HEC K
................................................................................................................ 578
O BJ_ARRO W_ LEFT_PRICE
................................................................................................................ 584
O BJ_ARRO W_ RI GHT_PRICE
................................................................................................................ 589
O BJ_ARRO W_B UY
................................................................................................................ 594
O BJ_ARRO W_ ................................................................................................................
SELL 599
O BJ_ARRO W................................................................................................................ 604
O BJ_TEX T ................................................................................................................ 610
O BJ_LABEL ................................................................................................................ 616
O BJ_BUTTON................................................................................................................ 624
O BJ_C HART ................................................................................................................ 631
O BJ_BITMAP................................................................................................................ 638
O BJ_BITMAP................................................................................................................
_LABEL 645
O BJ_EDIT ................................................................................................................ 652
O BJ_EV ENT ................................................................................................................ 659
O BJ_RECTAN................................................................................................................
GLE_LABEL 664
Propriedades
.........................................................................................................................
do Objeto 670
de V inculação de Objeto
Métodos ......................................................................................................................... 678
Gráfico
Canto de......................................................................................................................... 683
V isibilidade
.........................................................................................................................
de Objetos 686
Níveis de.........................................................................................................................
Onda de Elliott 689
Objetos G .........................................................................................................................
ann 690
Cores W eb ......................................................................................................................... 692
W ingdings ......................................................................................................................... 694
Constantes............................................................................................................................695
de Indic ador
Constantes.........................................................................................................................
de Preço 696
Métodos .........................................................................................................................
de Suavização 699
Linhas de.........................................................................................................................
Indicadores 700
Estilos de.........................................................................................................................
Desenho 702
Propriedades
.........................................................................................................................
de Indicador Customizado 706
Tipos de .........................................................................................................................
Indicador 709
Identificadores
.........................................................................................................................
de Tipo de Dados 711
............................................................................................................................712
Estado de Ambiente
Propriedades
.........................................................................................................................
do Terminal Cliente 713
Propriedades
.........................................................................................................................
de um Programa MQL5 em Execução 719
Propriedades
.........................................................................................................................
do Ativo 722
Propriedades
.........................................................................................................................
da Conta 748
Estatísticas
.........................................................................................................................
de Teste 753
Constantes............................................................................................................................757
de Negoc iaç ão
Propriedades de uma Base Histórica de Dados
......................................................................................................................... 758
Propriedades
.........................................................................................................................
de uma Ordem 759
Propriedades
.........................................................................................................................
de uma Posição 764
Propriedades
.........................................................................................................................
de uma Operação 768
Operaç ões de Negociação
Tipos de ......................................................................................................................... 772
Tipos de .........................................................................................................................
Transação de Negociação 784
Ordens de.........................................................................................................................
Negociação em DOM (Profundidade de Mercado) 787
Propriedades
.........................................................................................................................
de Sinal 788
Constantes............................................................................................................................790
Nomeados
Substituiç ões de Macro Predefinidas
......................................................................................................................... 791
Constantes
.........................................................................................................................
Matemáticas 797
Constantes.........................................................................................................................
de Tipo Numérico 799
Códigos de.........................................................................................................................
Motivos de Desinicialização 802
V erificação
.........................................................................................................................
de Ponteiro de Objeto 804
Outras Constantes
......................................................................................................................... 805
............................................................................................................................809
Estruturas de Dados
Estrutura
.........................................................................................................................
do Tipo Data 810
Estrutura
.........................................................................................................................
de Parâmetros de Entrada 811
Estrutura de Dados Históricos
......................................................................................................................... 812
Estrutura
.........................................................................................................................
DOM 813
Estrutura
.........................................................................................................................
de Solicitação de Negociação (Trade) 814
Estrutura de Resultados de V erificação de Solicitação
......................................................................................................................... 828
Estrutura
.........................................................................................................................
de Resultado de Solicitação de uma Negociação (Trade) 829
Estrutura
.........................................................................................................................
de uma Transação de Negociação 833
Estrutura
.........................................................................................................................
para Preços Correntes 841
Estruturas do calendário econômico
......................................................................................................................... 843
Códigos de ............................................................................................................................848
Erros e Avisos
Códigos de
.........................................................................................................................
Retorno do Servidor de Negociação 849
Avisos do.........................................................................................................................
Compilador 853
Erros de .........................................................................................................................
Compilação 857
Erros em.........................................................................................................................
Tempo de Execução 870
Constantes............................................................................................................................884
de Entrada/Saída
Flags de Abertura
.........................................................................................................................
de Arquivo 885
Propriedades
.........................................................................................................................
de Arquivo 888
Posição In- File
......................................................................................................................... 890
Uso de um.........................................................................................................................
Código de Página (Codepage) 891
MessageB.........................................................................................................................
ox 892
3 Programas MQL5
................................................................................................. 894
............................................................................................................................895
Exec uç ão de Programa
............................................................................................................................903
Trade permission
Eventos do ............................................................................................................................907
Terminal Cliente
Rec ursos ............................................................................................................................910
Chamadas de............................................................................................................................922
Funç ões Importadas
............................................................................................................................924
Erros em Tempo de Exec uç ão
............................................................................................................................925
Testando Estratégias de Negoc iaç ão
4 Variáveis Predefinidas
................................................................................................. 951
_AppliedTo............................................................................................................................952
_Digits ............................................................................................................................954
_Point ............................................................................................................................955
_LastError ............................................................................................................................956
_Period ............................................................................................................................957
_RandomSeed............................................................................................................................958
_StopFlag ............................................................................................................................959
_Symbol ............................................................................................................................960
............................................................................................................................961
_UninitReason
_IsX 64 ............................................................................................................................962
5 Funções Comuns
................................................................................................. 963
Alert ............................................................................................................................965
Chec k Pointer
............................................................................................................................966
Comment ............................................................................................................................968
............................................................................................................................970
CryptEnc ode
............................................................................................................................972
CryptDec ode
k
DebugBrea............................................................................................................................973
............................................................................................................................974
ExpertRemove
GetPointer ............................................................................................................................976
GetTic k Count
............................................................................................................................980
GetTic k Count64
............................................................................................................................981
............................................................................................................................982
GetMic rosec ondCount
MessageBox............................................................................................................................984
............................................................................................................................985
PeriodSec onds
PlaySound ............................................................................................................................986
Print ............................................................................................................................987
PrintFormat............................................................................................................................989
............................................................................................................................995
ResetLastError
............................................................................................................................996
Resourc eCreate
Resourc eFree............................................................................................................................998
............................................................................................................................999
Resourc eReadImage
............................................................................................................................1000
Resourc eSave
............................................................................................................................1001
SetReturnError
............................................................................................................................1002
SetUserError
Sleep ............................................................................................................................1003
............................................................................................................................1004
TerminalClose
TesterH ideIndic
............................................................................................................................1006
ators
............................................................................................................................1008
TesterStatistic s
TesterStop............................................................................................................................1009
............................................................................................................................1010
TesterDeposit
TesterW ithdra w al
............................................................................................................................1011
Translate K............................................................................................................................1012
ey
Z eroMemory............................................................................................................................1013
6 Funções para.................................................................................................
Array 1014
............................................................................................................................1016
ArrayBsearc h
ArrayCopy............................................................................................................................1020
............................................................................................................................1025
ArrayCompare
ArrayFree............................................................................................................................1026
............................................................................................................................1035
ArrayGetAsSeries
............................................................................................................................1038
ArrayInitialize
ArrayFill ............................................................................................................................1040
............................................................................................................................1042
ArrayIsDynamic
............................................................................................................................1044
ArrayIsSeries
............................................................................................................................1046
ArrayMaximum
............................................................................................................................1057
ArrayMinimum
ArrayPrint............................................................................................................................1068
ArrayRange............................................................................................................................1071
ArrayResiz............................................................................................................................1072
e
............................................................................................................................1075
ArrayInsert
............................................................................................................................1078
ArrayRemove
............................................................................................................................1080
ArrayReverse
............................................................................................................................1082
ArraySetAsSeries
ArraySize ............................................................................................................................1085
ArraySort............................................................................................................................1087
ArrayS w ap
............................................................................................................................1092
7 Funções de Conversão
................................................................................................. 1094
............................................................................................................................1096
CharToString
............................................................................................................................1097
CharArrayToString
............................................................................................................................1098
CharArrayToStruc t
............................................................................................................................1099
Struc tToCharArray
............................................................................................................................1100
ColorToARGB
............................................................................................................................1102
ColorToString
............................................................................................................................1103
DoubleToString
............................................................................................................................1104
EnumToString
............................................................................................................................1106
IntegerToString
............................................................................................................................1107
ShortToString
............................................................................................................................1108
ShortArrayToString
............................................................................................................................1109
TimeToString
NormalizeDouble
............................................................................................................................1110
............................................................................................................................1112
StringToCharArray
© 2000-2021, MetaQuotes Ltd
7 Conteúdo
............................................................................................................................1113
StringToColor
............................................................................................................................1114
StringToDouble
............................................................................................................................1115
StringToInteger
............................................................................................................................1116
StringToShortArray
............................................................................................................................1117
StringToTime
............................................................................................................................1118
StringFormat
8 Funções Matemáticas
................................................................................................. 1122
MathAbs ............................................................................................................................1124
............................................................................................................................1125
MathArc c os
MathArc sin............................................................................................................................1126
MathArc tan............................................................................................................................1127
............................................................................................................................1128
MathArc tan2
............................................................................................................................1129
MathClassify
MathCeil ............................................................................................................................1131
MathCos ............................................................................................................................1132
MathExp ............................................................................................................................1133
MathFloor............................................................................................................................1134
MathLog ............................................................................................................................1135
MathLog10............................................................................................................................1136
MathMax ............................................................................................................................1137
MathMin ............................................................................................................................1138
MathMod ............................................................................................................................1139
MathPo w ............................................................................................................................1140
MathRand ............................................................................................................................1141
MathRound ............................................................................................................................1142
MathSin ............................................................................................................................1143
MathS q rt ............................................................................................................................1144
MathSrand............................................................................................................................1145
MathTan ............................................................................................................................1148
............................................................................................................................1149
MathIsValidNumber
MathExpm1 ............................................................................................................................1150
MathLog1p............................................................................................................................1151
............................................................................................................................1152
MathArc c osh
............................................................................................................................1153
MathArc sinh
............................................................................................................................1154
MathArc tanh
MathCosh ............................................................................................................................1155
MathSinh ............................................................................................................................1156
MathTanh ............................................................................................................................1157
MathS w ap............................................................................................................................1158
9 Funções de String
................................................................................................. 1159
StringAdd ............................................................................................................................1161
............................................................................................................................1163
StringBufferLen
............................................................................................................................1164
StringCompare
StringConc............................................................................................................................1166
atenate
StringFill ............................................................................................................................1167
StringFind............................................................................................................................1168
............................................................................................................................1169
StringGetCharac ter
StringInit ............................................................................................................................1170
StringLen ............................................................................................................................1171
............................................................................................................................1172
StringSetLength
............................................................................................................................1173
StringReplac e
............................................................................................................................1174
StringReserve
............................................................................................................................1176
StringSetCharac ter
StringSplit............................................................................................................................1178
............................................................................................................................1180
StringSubstr
w er
StringToLo............................................................................................................................1181
............................................................................................................................1182
StringToUpper
............................................................................................................................1183
StringTrimLeft
© 2000-2021, MetaQuotes Ltd
8 Conteúdo
............................................................................................................................1184
StringTrimRight
10 Data e Hora ................................................................................................. 1185
............................................................................................................................1186
TimeCurrent
............................................................................................................................1187
TimeTradeServer
TimeLoc al............................................................................................................................1188
TimeGMT ............................................................................................................................1189
............................................................................................................................1190
TimeDaylightSavings
............................................................................................................................1191
TimeGMTOffset
............................................................................................................................1192
TimeToStruc t
............................................................................................................................1193
Struc tToTime
11 Informações .................................................................................................
de Conta 1194
............................................................................................................................1195
Ac c ountInfoDouble
............................................................................................................................1196
Ac c ountInfoInteger
............................................................................................................................1198
Ac c ountInfoString
12 Verificando Estado
................................................................................................. 1199
............................................................................................................................1200
GetLastError
IsStopped ............................................................................................................................1201
UninitializeReason
............................................................................................................................1202
............................................................................................................................1203
TerminalInfoInteger
............................................................................................................................1204
TerminalInfoDouble
............................................................................................................................1205
TerminalInfoString
............................................................................................................................1206
MQLInfoInteger
............................................................................................................................1207
MQLInfoString
Symbol ............................................................................................................................1208
Period ............................................................................................................................1209
Digits ............................................................................................................................1210
Point ............................................................................................................................1211
13 Manipulação .................................................................................................
de eventos 1212
OnStart ............................................................................................................................1214
OnInit ............................................................................................................................1217
OnDeinit ............................................................................................................................1220
OnTic k ............................................................................................................................1223
............................................................................................................................1229
OnCalc ulate
OnTimer ............................................................................................................................1233
OnTrade ............................................................................................................................1236
............................................................................................................................1241
OnTradeTransac tion
OnBoo k Event
............................................................................................................................1247
............................................................................................................................1251
OnChartEvent
OnTester ............................................................................................................................1258
............................................................................................................................1265
OnTesterInit
............................................................................................................................1272
OnTesterDeinit
............................................................................................................................1273
OnTesterPass
14 Informações .................................................................................................
de Mercado 1274
............................................................................................................................1276
SymbolsTotal
............................................................................................................................1277
SymbolExist
SymbolName............................................................................................................................1278
............................................................................................................................1279
SymbolSelec t
............................................................................................................................1280
SymbolIsSync hronized
............................................................................................................................1281
SymbolInfoDouble
............................................................................................................................1283
SymbolInfoInteger
............................................................................................................................1285
SymbolInfoString
............................................................................................................................1286
SymbolInfoMarginRate
............................................................................................................................1287
SymbolInfoTic k
............................................................................................................................1288
SymbolInfoSessionQuote
............................................................................................................................1289
SymbolInfoSessionTrade
Mark etBoo............................................................................................................................1290
k Add
Mark etBoo............................................................................................................................1291
k Release
Mark etBoo............................................................................................................................1292
k Get
15 Calendário econ ômico
................................................................................................. 1293
............................................................................................................................1294
CalendarCountryById
............................................................................................................................1296
CalendarEventById
............................................................................................................................1299
CalendarValueById
............................................................................................................................1302
CalendarCountries
............................................................................................................................1304
CalendarEventByCountry
............................................................................................................................1306
CalendarEventByCurrenc y
............................................................................................................................1308
CalendarValue H istoryByEvent
............................................................................................................................1311
CalendarValue H istory
............................................................................................................................1314
CalendarValueLastByEvent
............................................................................................................................1319
CalendarValueLast
16 Séries Temporais
.................................................................................................
e Acesso a Indicadores 1324
Direç ão de............................................................................................................................1329
Indexaç ão em Arrays, Buffers e Séries Temporais
Organizando............................................................................................................................1333
Ac esso aos Dados
............................................................................................................................1343
SeriesInfoInteger
Bars ............................................................................................................................1345
............................................................................................................................1348
BarsCalc ulated
............................................................................................................................1350
Indic atorCreate
............................................................................................................................1352
Indic atorParameters
............................................................................................................................1354
Indic atorRelease
CopyBuffer ............................................................................................................................1356
CopyRates............................................................................................................................1361
CopyTime............................................................................................................................1365
CopyOpen............................................................................................................................1368
Copy H igh ............................................................................................................................1371
CopyLo w ............................................................................................................................1375
CopyClose............................................................................................................................1378
CopyTic k Volume
............................................................................................................................1381
............................................................................................................................1385
CopyRealVolume
CopySpread ............................................................................................................................1388
CopyTic k s............................................................................................................................1392
CopyTic k sRange
............................................................................................................................1397
iBars ............................................................................................................................1399
iBarShift ............................................................................................................................1400
iClose ............................................................................................................................1403
iH igh ............................................................................................................................1405
iH ighest ............................................................................................................................1407
iLo w ............................................................................................................................1408
iLo w est ............................................................................................................................1410
iOpen ............................................................................................................................1411
iTime ............................................................................................................................1413
iTic k Volume
............................................................................................................................1415
iRealVolume............................................................................................................................1417
iVolume ............................................................................................................................1419
iSpread ............................................................................................................................1421
17 Símbolos personali zados
................................................................................................. 1423
............................................................................................................................1425
CustomSymbolCreate
............................................................................................................................1427
CustomSymbolDelete
............................................................................................................................1428
CustomSymbolSetInteger
............................................................................................................................1429
CustomSymbolSetDouble
............................................................................................................................1430
CustomSymbolSetString
............................................................................................................................1431
CustomSymbolSetMarginRate
............................................................................................................................1432
CustomSymbolSetSessionQuote
............................................................................................................................1433
CustomSymbolSetSessionTrade
............................................................................................................................1434
CustomRatesDelete
............................................................................................................................1435
CustomRatesReplac e
............................................................................................................................1436
CustomRatesUpdate
k sAdd
CustomTic............................................................................................................................1437
k sDelete
CustomTic............................................................................................................................1439
k sReplac e
CustomTic............................................................................................................................1440
CustomBoo k Add
............................................................................................................................1442
18 Operações de.................................................................................................
Gráficos 1445
............................................................................................................................1448
ChartApplyTemplate
............................................................................................................................1451
ChartSaveTemplate
ChartW indo w Find
............................................................................................................................1456
............................................................................................................................1458
ChartTimePric eTo X Y
ChartX Y ToTimePric
............................................................................................................................1459
e
ChartOpen............................................................................................................................1461
ChartFirst ............................................................................................................................1462
ChartNext............................................................................................................................1463
ChartClose............................................................................................................................1464
ChartSymbol............................................................................................................................1465
ChartPeriod............................................................................................................................1466
ChartRedra w
............................................................................................................................1467
............................................................................................................................1468
ChartSetDouble
............................................................................................................................1469
ChartSetInteger
............................................................................................................................1471
ChartSetString
............................................................................................................................1473
ChartGetDouble
............................................................................................................................1475
ChartGetInteger
............................................................................................................................1477
ChartGetString
............................................................................................................................1479
ChartNavigate
ChartID ............................................................................................................................1482
ChartIndic............................................................................................................................1483
atorAdd
ChartIndic............................................................................................................................1487
atorDelete
ChartIndic............................................................................................................................1490
atorGet
ChartIndic............................................................................................................................1492
atorName
ChartIndic............................................................................................................................1493
atorsTotal
ChartW indo w OnDropped
............................................................................................................................1494
............................................................................................................................1495
ChartPric eOnDropped
............................................................................................................................1496
ChartTimeOnDropped
ChartX OnDropped
............................................................................................................................1497
ChartY OnDropped
............................................................................................................................1498
............................................................................................................................1499
ChartSetSymbolPeriod
............................................................................................................................1500
ChartSc reenShot
19 Funções de Negociação
................................................................................................. 1503
OrderCalc............................................................................................................................1506
Margin
OrderCalc............................................................................................................................1507
Profit
k
OrderChec............................................................................................................................1508
OrderSend............................................................................................................................1509
............................................................................................................................1514
OrderSendAsync
............................................................................................................................1525
PositionsTotal
............................................................................................................................1526
PositionGetSymbol
............................................................................................................................1527
PositionSelec t
............................................................................................................................1528
PositionSelec tByTic k et
............................................................................................................................1529
PositionGetDouble
............................................................................................................................1530
PositionGetInteger
............................................................................................................................1532
PositionGetTic k et
............................................................................................................................1533
PositionGetString
............................................................................................................................1534
OrdersTotal
............................................................................................................................1535
OrderGetTic k et
OrderSelec............................................................................................................................1537
t
............................................................................................................................1538
OrderGetDouble
............................................................................................................................1539
OrderGetInteger
© 2000-2021, MetaQuotes Ltd
11 Conteúdo
............................................................................................................................1540
OrderGetString
H istorySelec
............................................................................................................................1541
t
H istorySelec
............................................................................................................................1543
tByPosition
H istoryOrderSelec
............................................................................................................................1544
t
H istoryOrdersTotal
............................................................................................................................1545
H istoryOrderGetTic k et
............................................................................................................................1546
H istoryOrderGetDouble
............................................................................................................................1548
H istoryOrderGetInteger
............................................................................................................................1549
H istoryOrderGetString
............................................................................................................................1552
H istoryDealSelec
............................................................................................................................1553
t
H istoryDealsTotal
............................................................................................................................1554
H istoryDealGetTic k et
............................................................................................................................1555
H istoryDealGetDouble
............................................................................................................................1557
H istoryDealGetInteger
............................................................................................................................1558
H istoryDealGetString
............................................................................................................................1561
20 Gerenciamento
.................................................................................................
de sinais 1562
............................................................................................................................1563
SignalBaseGetDouble
............................................................................................................................1564
SignalBaseGetInteger
............................................................................................................................1565
SignalBaseGetString
............................................................................................................................1566
SignalBaseSelec t
............................................................................................................................1567
SignalBaseTotal
............................................................................................................................1568
SignalInfoGetDouble
............................................................................................................................1569
SignalInfoGetInteger
............................................................................................................................1570
SignalInfoGetString
............................................................................................................................1571
SignalInfoSetDouble
............................................................................................................................1572
SignalInfoSetInteger
............................................................................................................................1573
SignalSubsc ribe
............................................................................................................................1574
SignalUnsubsc ribe
21 Funções de rede
................................................................................................. 1575
Soc k etCreate
............................................................................................................................1577
Soc k etClose
............................................................................................................................1580
Soc k etConnec
............................................................................................................................1583
t
Soc k etIsConnec
............................................................................................................................1587
ted
Soc k etIsReadable
............................................................................................................................1588
Soc k etIsW............................................................................................................................1591
ritable
Soc k etTimeouts
............................................................................................................................1592
Soc k etRead
............................................................................................................................1593
Soc k etSend
............................................................................................................................1597
Soc k etTlsH andshak e
............................................................................................................................1601
Soc k etTlsCertific
............................................................................................................................1602
ate
Soc k etTlsRead
............................................................................................................................1606
Soc k etTlsReadAvailable
............................................................................................................................1610
Soc k etTlsSend
............................................................................................................................1611
W ebRe q uest
............................................................................................................................1612
SendFTP ............................................................................................................................1615
SendMail ............................................................................................................................1616
SendNotific............................................................................................................................1617
ation
22 Variáveis Globais
.................................................................................................
do Terminal 1618
............................................................................................................................1619
GlobalVariableChec k
............................................................................................................................1620
GlobalVariableTime
............................................................................................................................1621
GlobalVariableDel
............................................................................................................................1622
GlobalVariableGet
............................................................................................................................1623
GlobalVariableName
............................................................................................................................1624
GlobalVariableSet
............................................................................................................................1625
GlobalVariablesFlush
............................................................................................................................1626
GlobalVariableTemp
............................................................................................................................1627
GlobalVariableSetOnCondition
............................................................................................................................1628
GlobalVariablesDeleteAll
............................................................................................................................1629
GlobalVariablesTotal
23 Funções de Ar quivo
................................................................................................. 1630
............................................................................................................................1633
FileSelec tDialog
............................................................................................................................1635
FileFindFirst
FileFindNext............................................................................................................................1637
............................................................................................................................1639
FileFindClose
FileIsExist ............................................................................................................................1641
FileOpen ............................................................................................................................1644
FileClose ............................................................................................................................1647
FileCopy ............................................................................................................................1648
FileDelete............................................................................................................................1651
FileMove ............................................................................................................................1653
FileFlush ............................................................................................................................1656
............................................................................................................................1658
FileGetInteger
FileIsEnding............................................................................................................................1661
............................................................................................................................1663
FileIsLineEnding
............................................................................................................................1668
FileReadArray
FileReadBool............................................................................................................................1670
............................................................................................................................1673
FileReadDatetime
............................................................................................................................1676
FileReadDouble
............................................................................................................................1679
FileReadFloat
............................................................................................................................1682
FileReadInteger
FileReadLong............................................................................................................................1686
............................................................................................................................1689
FileReadNumber
............................................................................................................................1694
FileReadString
............................................................................................................................1696
FileReadStruc t
FileSee k ............................................................................................................................1700
FileSize ............................................................................................................................1703
FileTell ............................................................................................................................1705
File W rite ............................................................................................................................1708
File W riteArray
............................................................................................................................1711
File W riteDouble
............................................................................................................................1714
File W riteFloat
............................................................................................................................1717
File W riteInteger
............................................................................................................................1719
File W riteLong
............................................................................................................................1722
File W riteString
............................................................................................................................1724
File W riteStruc
............................................................................................................................1727
t
FileLoad ............................................................................................................................1730
FileSave ............................................................................................................................1732
FolderCreate............................................................................................................................1734
FolderDelete............................................................................................................................1737
FolderClean ............................................................................................................................1740
24 Indicadores Customi zados
................................................................................................. 1743
............................................................................................................................1747
Estilos de Indic ador em Exemplos
DRAW_NONE
......................................................................................................................... 1755
DRAW_LINE
......................................................................................................................... 1758
DRAW_SECTION
......................................................................................................................... 1762
DRAW_H.........................................................................................................................
ISTO GRAM 1766
DRAW_H.........................................................................................................................
ISTO GRAM2 1770
DRAW_ARRO W
......................................................................................................................... 1774
DRAW_Z.........................................................................................................................
I GZAG 1779
DRAW_F.........................................................................................................................
ILLING 1784
DRAW_B.........................................................................................................................
ARS 1789
DRAW_CANDLES
......................................................................................................................... 1795
DRAW_COLOR _LINE
......................................................................................................................... 1802
DRAW_COLOR _SECTION
......................................................................................................................... 1807
DRAW_COLOR _HISTO GRAM
......................................................................................................................... 1813
iMFI ............................................................................................................................2040
iMA ............................................................................................................................2045
iOsMA ............................................................................................................................2050
iMACD ............................................................................................................................2055
iOBV ............................................................................................................................2061
iSAR ............................................................................................................................2066
iRSI ............................................................................................................................2071
iRVI ............................................................................................................................2076
iStdDev ............................................................................................................................2081
iStoc hastic............................................................................................................................2086
iTEMA ............................................................................................................................2092
iTriX ............................................................................................................................2097
iW PR ............................................................................................................................2102
iVIDyA ............................................................................................................................2107
iVolumes ............................................................................................................................2112
com Resultados de Otimização
27 Trabalhando................................................................................................. 2117
FrameFirst............................................................................................................................2118
............................................................................................................................2119
FrameFilter
FrameNext............................................................................................................................2120
............................................................................................................................2121
FrameInputs
FrameAdd............................................................................................................................2122
............................................................................................................................2123
ParameterGetRange
............................................................................................................................2126
ParameterSetRange
28 Trabalhando.................................................................................................
com Eventos 2128
............................................................................................................................2129
EventSetMillisec ondTimer
............................................................................................................................2130
EventSetTimer
EventKillTimer
............................................................................................................................2131
............................................................................................................................2132
EventChartCustom
29 Trabalhando.................................................................................................
com OpenCL 2138
CLH andleType
............................................................................................................................2140
............................................................................................................................2141
CLGetInfoInteger
............................................................................................................................2144
CLGetInfoString
............................................................................................................................2147
CLContextCreate
............................................................................................................................2148
CLContextFree
CLGetDevic............................................................................................................................2149
eInfo
............................................................................................................................2153
CLProgramCreate
............................................................................................................................2157
CLProgramFree
CLKernelCreate
............................................................................................................................2158
CLKernelFree
............................................................................................................................2159
CLSetKernelArg
............................................................................................................................2160
CLSetKernelArgMem
............................................................................................................................2161
CLSetKernelArgMemLoc
............................................................................................................................2162
al
............................................................................................................................2163
CLBufferCreate
............................................................................................................................2164
CLBufferFree
CLBufferW............................................................................................................................2165
rite
............................................................................................................................2166
CLBufferRead
CLExec ute............................................................................................................................2167
............................................................................................................................2169
CLExec utionStatus
30 Trabalhar com
.................................................................................................
bancos de dados 2170
............................................................................................................................2174
DatabaseOpen
............................................................................................................................2176
DatabaseClose
............................................................................................................................2177
DatabaseImport
............................................................................................................................2179
DatabaseExport
............................................................................................................................2181
DatabasePrint
............................................................................................................................2186
DatabaseTableExists
............................................................................................................................2187
DatabaseExec ute
............................................................................................................................2199
DatabasePrepare
............................................................................................................................2208
DatabaseReset
............................................................................................................................2214
DatabaseBind
............................................................................................................................2219
DatabaseBindArray
............................................................................................................................2224
DatabaseRead
............................................................................................................................2225
DatabaseReadBind
............................................................................................................................2229
DatabaseFinali ze
............................................................................................................................2230
DatabaseTransac tionBegin
............................................................................................................................2235
DatabaseTransac tionCommit
............................................................................................................................2236
DatabaseTransac tionRollbac k
............................................................................................................................2237
DatabaseColumnsCount
............................................................................................................................2238
DatabaseColumnName
............................................................................................................................2239
DatabaseColumnType
............................................................................................................................2240
DatabaseColumnSi ze
............................................................................................................................2241
DatabaseColumnText
............................................................................................................................2242
DatabaseColumnInteger
............................................................................................................................2243
DatabaseColumnLong
............................................................................................................................2244
DatabaseColumnDouble
............................................................................................................................2245
DatabaseColumnBlob
DirectX
31 Trabalho com................................................................................................. 2246
DX ContextCreate
............................................................................................................................2248
DX ContextSetSi ze
............................................................................................................................2249
DX ContextGetSi ze
............................................................................................................................2250
DX ContextClearColors
............................................................................................................................2251
DX ContextClearDepth
............................................................................................................................2252
DX ContextGetColors
............................................................................................................................2253
DX ContextGetDepth
............................................................................................................................2254
DX BufferCreate
............................................................................................................................2255
DX TextureCreate
............................................................................................................................2256
DX InputCreate
............................................................................................................................2263
DX InputSet
............................................................................................................................2264
DX ShaderCreate
............................................................................................................................2265
DX ShaderSetLayout
............................................................................................................................2266
DX ShaderInputsSet
............................................................................................................................2267
DX ShaderTexturesSet
............................................................................................................................2268
DX Draw ............................................................................................................................2269
DX Draw Indexed
............................................................................................................................2270
DX PrimiveTopologySet
............................................................................................................................2271
DX BufferSet
............................................................................................................................2272
DX ShaderSet
............................................................................................................................2273
DX H andleType
............................................................................................................................2274
DX Release............................................................................................................................2275
32 Integração ................................................................................................. 2276
............................................................................................................................2277
MetaTrader para Python
initialize......................................................................................................................... 2283
login ......................................................................................................................... 2285
shutdown ......................................................................................................................... 2288
version......................................................................................................................... 2289
last _error
......................................................................................................................... 2291
_info
account......................................................................................................................... 2293
_info
terminal......................................................................................................................... 2296
_total
symbols......................................................................................................................... 2299
_get
symbols......................................................................................................................... 2300
symbol_.........................................................................................................................
info 2303
symbol_.........................................................................................................................
info_tic k 2307
symbol_.........................................................................................................................
select 2309
mar k et _.........................................................................................................................
book_add 2313
mar k et _.........................................................................................................................
book_get 2314
mar k et _.........................................................................................................................
book_release 2317
MathMoments Gamma
........................................................................................................... 2442
Qui-quadrado
................................................................................................................ 2443
MathProbabilityDensityChiSquare
........................................................................................................... 2447
MathCumulativeDistributionChiSquare
........................................................................................................... 2449
MathQuantileChiSquare
........................................................................................................... 2451
MathRandomChiSquare
........................................................................................................... 2453
MathMomentsChiSquare
........................................................................................................... 2454
Qui-quadrado
................................................................................................................
não-central 2455
MathProbabilityDensityNoncentralChiSquare
........................................................................................................... 2459
MathCumulativeDistributionNoncentralChiSquare
........................................................................................................... 2461
MathQuantileNoncentralChiSquare
........................................................................................................... 2463
MathRandomNoncentralChiSquare
........................................................................................................... 2465
MathMomentsNoncentralChiSquare
........................................................................................................... 2466
Distribuição
................................................................................................................
exponencial 2467
MathProbabilityDensityExponential
........................................................................................................... 2471
MathCumulativeDistributionExponential
........................................................................................................... 2473
MathQuantileExponential
........................................................................................................... 2475
MathRandomExponential
........................................................................................................... 2477
MathMomentsExponential
........................................................................................................... 2478
Distribuição F de Fisher
................................................................................................................ 2479
MathProbabilityDensity F
........................................................................................................... 2483
MathCumulativeDistribution F
........................................................................................................... 2485
MathQuantile F
........................................................................................................... 2487
MathRandom F
........................................................................................................... 2489
MathMoments F
........................................................................................................... 2490
Distribuição F de Fisher não-central
................................................................................................................ 2491
MathProbabilityDensityNoncentral F
........................................................................................................... 2495
MathCumulativeDistributionNoncentral F
........................................................................................................... 2497
MathQuantileNoncentral F
........................................................................................................... 2499
MathRandomNoncentral F
........................................................................................................... 2501
MathMomentsNoncentral F
........................................................................................................... 2502
Distribuição
................................................................................................................
t de Student 2503
MathProbabilityDensityT
........................................................................................................... 2507
MathCumulativeDistributionT
........................................................................................................... 2509
MathQuantileT........................................................................................................... 2511
MathRandomT ........................................................................................................... 2513
MathMomentsT ........................................................................................................... 2514
Distribuição
................................................................................................................
t de Student não-central 2515
MathProbabilityDensityNoncentralT
........................................................................................................... 2519
MathCumulativeDistributionNoncentralT
........................................................................................................... 2521
MathQuantileNoncentralT
........................................................................................................... 2523
MathRandomNoncentralT
........................................................................................................... 2525
MathMomentsNoncentralT
........................................................................................................... 2526
Distribuição
................................................................................................................
logística 2527
MathProbabilityDensityLogistic
........................................................................................................... 2531
MathCumulativeDistributionLogistic
........................................................................................................... 2533
MathQuantileLogistic
........................................................................................................... 2535
MathRandomLogistic
........................................................................................................... 2537
MathMomentsLogistic
........................................................................................................... 2538
Distribuição
................................................................................................................
de Cauchy 2539
MathProbabilityDensityCauchy
........................................................................................................... 2543
MathCumulativeDistributionCauchy
........................................................................................................... 2545
MathQuantileCauchy
........................................................................................................... 2547
MathRandomCauchy
........................................................................................................... 2549
MathMomentsCauchy
........................................................................................................... 2550
Distribuição
................................................................................................................
uniforme 2551
MathProbabilityDensityUniform
........................................................................................................... 2555
MathCumulativeDistributionUniform
........................................................................................................... 2557
MathQuantileUniform
........................................................................................................... 2559
MathRandomUniform
........................................................................................................... 2561
MathMomentsUniform
........................................................................................................... 2562
Distribuição de W eibull
................................................................................................................ 2563
MathProbabilityDensity W eibull
........................................................................................................... 2567
MathCumulativeDistribution W eibull
........................................................................................................... 2569
MathQuantile W eibull
........................................................................................................... 2571
MathRandom W eibull
........................................................................................................... 2573
MathMoments W eibull
........................................................................................................... 2574
Distribuição
................................................................................................................
binomial 2575
MathProbabilityDensity Binomial
........................................................................................................... 2578
MathCumulativeDistribution Binomial
........................................................................................................... 2580
MathQuantile Binomial
........................................................................................................... 2582
MathRandom Binomial
........................................................................................................... 2584
MathMoments Binomial
........................................................................................................... 2585
Distribuição
................................................................................................................
binomial negativa 2586
MathProbabilityDensityNegative Binomial
........................................................................................................... 2589
MathCumulativeDistributionNegative Binomial
........................................................................................................... 2591
MathQuantileNegative Binomial
........................................................................................................... 2593
MathRandomNegative Binomial
........................................................................................................... 2595
MathMomentsNegative Binomial
........................................................................................................... 2596
Distribuição
................................................................................................................
geométrica 2597
MathProbabilityDensity Geometric
........................................................................................................... 2601
MathCumulativeDistribution Geometric
........................................................................................................... 2603
MathQuantile Geometric
........................................................................................................... 2605
MathRandom Geometric
........................................................................................................... 2607
MathMoments Geometric
........................................................................................................... 2608
Distribuição
................................................................................................................
hipergeométrica 2609
MathProbabilityDensity Hypergeometric
........................................................................................................... 2613
MathCumulativeDistribution Hypergeometric
........................................................................................................... 2615
MathQuantile Hypergeometric
........................................................................................................... 2617
MathRandom Hypergeometric
........................................................................................................... 2619
MathMoments Hypergeometric
........................................................................................................... 2620
Distribuição
................................................................................................................
de Poisson 2621
MathProbabilityDensityPoisson
........................................................................................................... 2625
MathCumulativeDistributionPoisson
........................................................................................................... 2627
MathQuantilePoisson
........................................................................................................... 2629
MathRandomPoisson
........................................................................................................... 2631
MathMomentsPoisson
........................................................................................................... 2632
Funç ões auxiliares
................................................................................................................ 2633
MathRandomNon Zero
........................................................................................................... 2638
MathMoments ........................................................................................................... 2639
MathPowInt ........................................................................................................... 2640
MathFactorial
........................................................................................................... 2641
MathTrunc........................................................................................................... 2642
MathRound........................................................................................................... 2643
MathArctan2 ........................................................................................................... 2645
MathGamma ........................................................................................................... 2647
MathGammaLog........................................................................................................... 2648
MathBeta ........................................................................................................... 2649
MathBetaLog ........................................................................................................... 2650
MathBetaIncomplete
........................................................................................................... 2651
MathGammaIncomplete
........................................................................................................... 2652
MathBinomialCoefficient
........................................................................................................... 2653
MathBinomialCoefficientLog
........................................................................................................... 2654
MathHypergeometric2 F2
........................................................................................................... 2655
MathSequence........................................................................................................... 2656
MathSequence ByCount
........................................................................................................... 2657
MathReplicate
........................................................................................................... 2658
MathReverse
........................................................................................................... 2659
MathIdentical
........................................................................................................... 2660
MathUnique........................................................................................................... 2661
MathQuic k...........................................................................................................
SortAscending 2662
MathQuic k...........................................................................................................
SortDescending 2663
MathQuic k...........................................................................................................
Sort 2664
MathOrder........................................................................................................... 2665
MathBitwiseNot
........................................................................................................... 2666
MathBitwiseAnd
........................................................................................................... 2667
MathBitwiseOr
........................................................................................................... 2668
MathBitwise X or
........................................................................................................... 2669
MathBitwiseShiftL
........................................................................................................... 2670
MathBitwiseShiftR
........................................................................................................... 2671
MathCumulativeSum
........................................................................................................... 2672
MathCumulativeProduct
........................................................................................................... 2673
MathCumulativeMin
........................................................................................................... 2674
MathCumulativeMax
........................................................................................................... 2675
MathSin ........................................................................................................... 2676
MathCos ........................................................................................................... 2677
MathTan ........................................................................................................... 2678
MathArcsin........................................................................................................... 2679
MathArccos........................................................................................................... 2680
MathArctan........................................................................................................... 2681
MathSinPi ........................................................................................................... 2682
MathCosPi ........................................................................................................... 2683
MathTanPi ........................................................................................................... 2684
MathAbs ........................................................................................................... 2685
MathCeil ........................................................................................................... 2686
MathFloor ........................................................................................................... 2687
MathSqrt ........................................................................................................... 2688
MathExp ........................................................................................................... 2689
MathPow ........................................................................................................... 2690
MathLog ........................................................................................................... 2691
MathLog2 ........................................................................................................... 2692
MathLog10........................................................................................................... 2693
MathLog1p........................................................................................................... 2694
MathDifference
........................................................................................................... 2695
MathSample........................................................................................................... 2697
MathTuk eySummary
........................................................................................................... 2700
MathRange........................................................................................................... 2701
MathMin ........................................................................................................... 2702
MathMax ........................................................................................................... 2703
MathSum ........................................................................................................... 2704
MathProduct
........................................................................................................... 2705
MathStandardDeviation
........................................................................................................... 2706
MathAverageDeviation
........................................................................................................... 2707
MathMedian........................................................................................................... 2708
MathMean ........................................................................................................... 2709
MathV ariance
........................................................................................................... 2710
MathSk ewness
........................................................................................................... 2711
MathKurtosis
........................................................................................................... 2712
MathExpm1........................................................................................................... 2713
MathSinh ........................................................................................................... 2714
MathCosh ........................................................................................................... 2715
MathTanh ........................................................................................................... 2716
MathArcsinh
........................................................................................................... 2717
MathArccosh
........................................................................................................... 2718
CTrapezoidMembership Function
........................................................................................................... 2776
X1 ........................................................................................................... 2778
X2 ........................................................................................................... 2778
X3 ........................................................................................................... 2779
X4 ........................................................................................................... 2779
Get V alue ........................................................................................................... 2780
CTriangularMembership Function
........................................................................................................... 2781
X1 ........................................................................................................... 2783
X2 ........................................................................................................... 2783
X3 ........................................................................................................... 2784
F
ToNormalM........................................................................................................... 2784
Get V alue ........................................................................................................... 2784
C Z_ShapedMembership Function
........................................................................................................... 2786
A ........................................................................................................... 2788
B ........................................................................................................... 2788
Get V alue ........................................................................................................... 2789
IMembership Function
........................................................................................................... 2790
Get V alue ........................................................................................................... 2790
Regras para ................................................................................................................
sistemas difusos 2791
CMamdaniF...........................................................................................................
uzzyRule 2792
Conclusion........................................................................................................... 2793
W eight ........................................................................................................... 2793
CSugenoFuzzyRule
........................................................................................................... 2794
Conclusion........................................................................................................... 2795
CSingleCondition
........................................................................................................... 2796
Not ........................................................................................................... 2796
Term ........................................................................................................... 2797
V ar ........................................................................................................... 2797
CConditions ........................................................................................................... 2799
ConditionsList
........................................................................................................... 2799
Not ........................................................................................................... 2800
Op ........................................................................................................... 2800
C Generic FuzzyRule
........................................................................................................... 2802
Conclusion........................................................................................................... 2802
Condition ........................................................................................................... 2803
CreateCondition
........................................................................................................... 2803
Variáveis p................................................................................................................
ara sistemas difusos 2805
C Fuzzy V ariable
........................................................................................................... 2806
AddTerm ........................................................................................................... 2807
GetTermByName........................................................................................................... 2807
Max ........................................................................................................... 2807
Min ........................................................................................................... 2808
Terms ........................................................................................................... 2808
V alues ........................................................................................................... 2808
CSugenoV ariable
........................................................................................................... 2810
Functions ........................................................................................................... 2810
Get Func ByName
........................................................................................................... 2811
V alues ........................................................................................................... 2811
Termos difusos
................................................................................................................ 2812
Membership Function
........................................................................................................... 2813
Sistemas difusos
................................................................................................................ 2814
Sistema Mamdani
........................................................................................................... 2815
AggregationMethod
........................................................................................................... 2815
Calculate ........................................................................................................... 2816
DefuzzificationMethod
........................................................................................................... 2816
EmptyRule ........................................................................................................... 2816
ImplicationMethod
........................................................................................................... 2816
Output ........................................................................................................... 2817
Output ByName
........................................................................................................... 2817
ParseRule ........................................................................................................... 2817
Rules ........................................................................................................... 2818
Sistema Sugeno
........................................................................................................... 2819
Calculate ........................................................................................................... 2819
CreateSugeno Function
........................................................................................................... 2820
EmptyRule ........................................................................................................... 2821
Output ........................................................................................................... 2821
Output ByName
........................................................................................................... 2821
ParseRule ........................................................................................................... 2821
Rules ........................................................................................................... 2822
OpenCL ............................................................................................................................2823
BufferCreate
......................................................................................................................... 2825
Buffer Free
......................................................................................................................... 2826
Buffer FromArray
......................................................................................................................... 2827
BufferRead
......................................................................................................................... 2828
Buffer W.........................................................................................................................
rite 2829
Execute......................................................................................................................... 2830
GetContext
......................................................................................................................... 2831
Get Kernel
......................................................................................................................... 2832
Get KernelName
......................................................................................................................... 2833
GetProgram
......................................................................................................................... 2834
Initialize
......................................................................................................................... 2835
KernelCreate
......................................................................................................................... 2836
KernelFree
......................................................................................................................... 2837
SetArgument
......................................................................................................................... 2838
SetArgument Buffer
......................................................................................................................... 2839
SetArgumentLocalMemory
......................................................................................................................... 2840
Set BuffersCount
......................................................................................................................... 2841
Set KernelsCount
......................................................................................................................... 2842
Shutdown ......................................................................................................................... 2843
SupportDouble
......................................................................................................................... 2844
............................................................................................................................2845
Classe base CObjec t
Prev ......................................................................................................................... 2846
Prev ......................................................................................................................... 2847
Next ......................................................................................................................... 2848
Next ......................................................................................................................... 2849
Compare
......................................................................................................................... 2850
Save ......................................................................................................................... 2852
Load ......................................................................................................................... 2854
Type ......................................................................................................................... 2856
Coleç ões ............................................................................................................................2857
de dados
CArray ......................................................................................................................... 2858
Step ................................................................................................................ 2860
Step ................................................................................................................ 2861
Total ................................................................................................................ 2862
Available ................................................................................................................ 2863
Max ................................................................................................................ 2864
IsSorted ................................................................................................................ 2865
SortMode ................................................................................................................ 2866
Clear ................................................................................................................ 2867
Sort ................................................................................................................ 2868
Save ................................................................................................................ 2869
Load ................................................................................................................ 2870
CArrayChar
......................................................................................................................... 2871
Reserve ................................................................................................................ 2874
Resize ................................................................................................................ 2875
Shutdown ................................................................................................................ 2876
CArrayInt
......................................................................................................................... 2948
Reserve ................................................................................................................ 2951
Resize ................................................................................................................ 2952
Shutdown ................................................................................................................ 2953
Add ................................................................................................................ 2954
AddArray ................................................................................................................ 2955
AddArray ................................................................................................................ 2956
Insert ................................................................................................................ 2958
InsertArray................................................................................................................ 2959
InsertArray................................................................................................................ 2960
AssignArray................................................................................................................ 2962
AssignArray................................................................................................................ 2963
Update ................................................................................................................ 2965
Shift ................................................................................................................ 2966
Delete ................................................................................................................ 2967
DeleteRange ................................................................................................................ 2968
At ................................................................................................................ 2969
CompareArray ................................................................................................................ 2971
CompareArray ................................................................................................................ 2972
InsertSort ................................................................................................................ 2973
Search ................................................................................................................ 2974
SearchGreat ................................................................................................................ 2975
SearchLess................................................................................................................ 2976
SearchGreatOrEqual
................................................................................................................ 2977
SearchLessOrEqual
................................................................................................................ 2978
SearchFirst................................................................................................................ 2979
SearchLast................................................................................................................ 2980
SearchLinear ................................................................................................................ 2981
Save ................................................................................................................ 2982
Load ................................................................................................................ 2984
Type ................................................................................................................ 2986
CArrayLong
......................................................................................................................... 2987
Reserve ................................................................................................................ 2990
Resize ................................................................................................................ 2991
Shutdown ................................................................................................................ 2992
Add ................................................................................................................ 2993
AddArray ................................................................................................................ 2994
AddArray ................................................................................................................ 2995
Insert ................................................................................................................ 2997
InsertArray................................................................................................................ 2998
InsertArray................................................................................................................ 2999
AssignArray................................................................................................................ 3001
AssignArray................................................................................................................ 3002
Update ................................................................................................................ 3004
Shift ................................................................................................................ 3005
Delete ................................................................................................................ 3006
DeleteRange ................................................................................................................ 3007
At ................................................................................................................ 3008
CompareArray ................................................................................................................ 3010
CompareArray ................................................................................................................ 3011
InsertSort ................................................................................................................ 3012
Search ................................................................................................................ 3013
SearchGreat ................................................................................................................ 3014
SearchLess................................................................................................................ 3015
SearchGreatOrEqual
................................................................................................................ 3016
SearchLessOrEqual
................................................................................................................ 3017
SearchFirst................................................................................................................ 3018
SearchLast................................................................................................................ 3019
CRedBlac k TreeNode<T>
......................................................................................................................... 3309
V alue ................................................................................................................ 3310
Parent ................................................................................................................ 3311
Left ................................................................................................................ 3312
Right ................................................................................................................ 3313
Color ................................................................................................................ 3314
IsLeaf ................................................................................................................ 3315
CreateEmptyNode
................................................................................................................ 3316
CLink edListNode <T>
......................................................................................................................... 3317
List ................................................................................................................ 3318
Next ................................................................................................................ 3319
Previous ................................................................................................................ 3320
V alue ................................................................................................................ 3321
C Key V aluePair <TKey,TV alue>
......................................................................................................................... 3322
Key ................................................................................................................ 3323
V alue ................................................................................................................ 3324
Clone ................................................................................................................ 3325
Compare ................................................................................................................ 3326
Equals ................................................................................................................ 3327
HashCode ................................................................................................................ 3328
CArrayList <T>
......................................................................................................................... 3329
Capacity ................................................................................................................ 3331
Count ................................................................................................................ 3332
Contains ................................................................................................................ 3333
TrimExcess................................................................................................................ 3334
Try Get V alue................................................................................................................ 3335
TrySet V alue ................................................................................................................ 3336
Add ................................................................................................................ 3337
AddRange ................................................................................................................ 3338
Insert ................................................................................................................ 3339
InsertRange ................................................................................................................ 3340
CopyTo ................................................................................................................ 3341
BinarySearch ................................................................................................................ 3342
IndexOf ................................................................................................................ 3343
LastIndexOf ................................................................................................................ 3344
Clear ................................................................................................................ 3345
Remove ................................................................................................................ 3346
RemoveAt ................................................................................................................ 3347
RemoveRange ................................................................................................................ 3348
Reverse ................................................................................................................ 3349
Sort ................................................................................................................ 3350
C HashMap <TKey,TV alue>
......................................................................................................................... 3351
Add ................................................................................................................ 3353
Count ................................................................................................................ 3354
Comparer ................................................................................................................ 3355
Contains ................................................................................................................ 3356
Contains Key ................................................................................................................ 3357
Contains V alue
................................................................................................................ 3358
CopyTo ................................................................................................................ 3359
Clear ................................................................................................................ 3360
Remove ................................................................................................................ 3361
Try Get V alue................................................................................................................ 3362
TrySet V alue ................................................................................................................ 3363
C HashSet <T>
......................................................................................................................... 3364
Add ................................................................................................................ 3366
Count ................................................................................................................ 3367
Contains ................................................................................................................ 3368
Comparer ................................................................................................................ 3369
TrimExcess................................................................................................................ 3370
CopyTo ................................................................................................................ 3371
Clear ................................................................................................................ 3372
Remove ................................................................................................................ 3373
Except W ith................................................................................................................ 3374
Intersect W................................................................................................................
ith 3375
SymmetricExcept W ith
................................................................................................................ 3376
UnionW ith ................................................................................................................ 3377
IsProperSubsetOf
................................................................................................................ 3378
IsProperSupersetOf
................................................................................................................ 3379
IsSubsetOf................................................................................................................ 3380
IsSupersetOf ................................................................................................................ 3381
Overlaps ................................................................................................................ 3382
SetEquals ................................................................................................................ 3383
CLink edList <T>
......................................................................................................................... 3384
Add ................................................................................................................ 3386
AddAfter ................................................................................................................ 3387
AddBefore ................................................................................................................ 3388
AddFirst ................................................................................................................ 3389
AddLast ................................................................................................................ 3390
Count ................................................................................................................ 3391
Head ................................................................................................................ 3392
First ................................................................................................................ 3393
Last ................................................................................................................ 3394
Contains ................................................................................................................ 3395
CopyTo ................................................................................................................ 3396
Clear ................................................................................................................ 3397
Remove ................................................................................................................ 3398
RemoveFirst ................................................................................................................ 3399
RemoveLast................................................................................................................ 3400
Find ................................................................................................................ 3401
FindLast ................................................................................................................ 3402
<T>
CQueue......................................................................................................................... 3403
Add ................................................................................................................ 3404
Enqueue ................................................................................................................ 3405
Count ................................................................................................................ 3406
Contains ................................................................................................................ 3407
TrimExcess................................................................................................................ 3408
CopyTo ................................................................................................................ 3409
Clear ................................................................................................................ 3410
Remove ................................................................................................................ 3411
Dequeue ................................................................................................................ 3412
Peek ................................................................................................................ 3413
CRedBlac k Tree<T>
......................................................................................................................... 3414
Add ................................................................................................................ 3416
Count ................................................................................................................ 3417
Root ................................................................................................................ 3418
Contains ................................................................................................................ 3419
Comparer ................................................................................................................ 3420
Try GetMin ................................................................................................................ 3421
Try GetMax................................................................................................................ 3422
CopyTo ................................................................................................................ 3423
Clear ................................................................................................................ 3424
Remove ................................................................................................................ 3425
RemoveMin................................................................................................................ 3426
RemoveMax................................................................................................................ 3427
Find ................................................................................................................ 3428
FindMin ................................................................................................................ 3429
SetUnicode................................................................................................................ 3495
SetCommon................................................................................................................ 3496
Open ................................................................................................................ 3497
Close ................................................................................................................ 3498
Delete ................................................................................................................ 3499
IsExist ................................................................................................................ 3500
Copy ................................................................................................................ 3501
Move ................................................................................................................ 3502
Size ................................................................................................................ 3503
Tell ................................................................................................................ 3504
Seek ................................................................................................................ 3505
Flush ................................................................................................................ 3506
IsEnding ................................................................................................................ 3507
IsLineEnding ................................................................................................................ 3508
FolderCreate ................................................................................................................ 3509
FolderDelete ................................................................................................................ 3510
FolderClean................................................................................................................ 3511
FileFindFirst................................................................................................................ 3512
FileFindNext ................................................................................................................ 3513
FileFindClose................................................................................................................ 3514
C FileBin......................................................................................................................... 3515
Open ................................................................................................................ 3517
W riteChar ................................................................................................................ 3518
W riteShort................................................................................................................ 3519
W riteInteger................................................................................................................ 3520
W riteLong ................................................................................................................ 3521
W riteFloat ................................................................................................................ 3522
W riteDouble ................................................................................................................ 3523
W riteString................................................................................................................ 3524
W riteCharArray
................................................................................................................ 3525
W riteShortArray
................................................................................................................ 3526
W riteIntegerArray
................................................................................................................ 3527
W riteLongArray
................................................................................................................ 3528
W riteFloatArray
................................................................................................................ 3529
W riteDoubleArray
................................................................................................................ 3530
W riteObject ................................................................................................................ 3531
ReadChar ................................................................................................................ 3532
ReadShort ................................................................................................................ 3533
ReadInteger ................................................................................................................ 3534
ReadLong ................................................................................................................ 3535
ReadFloat ................................................................................................................ 3536
ReadDouble................................................................................................................ 3537
ReadString ................................................................................................................ 3538
ReadCharArray................................................................................................................ 3539
ReadShortArray
................................................................................................................ 3540
ReadIntegerArray
................................................................................................................ 3541
ReadLongArray................................................................................................................ 3542
ReadFloatArray
................................................................................................................ 3543
ReadDoubleArray
................................................................................................................ 3544
ReadObject................................................................................................................ 3545
C FileTxt......................................................................................................................... 3546
Open ................................................................................................................ 3547
W riteString................................................................................................................ 3548
ReadString ................................................................................................................ 3549
Cadeias de............................................................................................................................3550
c arac teres
CString ......................................................................................................................... 3551
Str ................................................................................................................ 3553
Len ................................................................................................................ 3554
FontAngleG................................................................................................................
et 3901
FontAngleSet ................................................................................................................ 3902
Font Flags G................................................................................................................
et 3903
Font FlagsSet................................................................................................................ 3904
Font Get ................................................................................................................ 3905
FontNameG................................................................................................................
et 3906
FontNameSet ................................................................................................................ 3907
FontSet ................................................................................................................ 3908
FontSizeGet ................................................................................................................ 3909
FontSizeSet................................................................................................................ 3910
Height ................................................................................................................ 3911
Line ................................................................................................................ 3912
LineAA ................................................................................................................ 3913
LineW u ................................................................................................................ 3914
LineHorizontal
................................................................................................................ 3915
LineV ertical................................................................................................................ 3916
LineStyleSet ................................................................................................................ 3917
LineThic k ................................................................................................................ 3918
LineThic kV................................................................................................................
ertical 3919
LineThic kH................................................................................................................
orizontal 3920
LoadFromF................................................................................................................
ile 3921
PixelGet ................................................................................................................ 3922
PixelSet ................................................................................................................ 3923
PixelSetAA ................................................................................................................ 3924
Polygon ................................................................................................................ 3925
PolygonAA ................................................................................................................ 3926
PolygonW u................................................................................................................ 3927
k
PolygonThic................................................................................................................ 3928
PolygonSmooth................................................................................................................ 3929
Polyline ................................................................................................................ 3930
PolylineSmooth
................................................................................................................ 3931
k
PolylineThic................................................................................................................ 3932
PolylineW u ................................................................................................................ 3933
PolylineAA ................................................................................................................ 3934
Rectangle ................................................................................................................ 3935
Resize ................................................................................................................ 3936
ResourceName ................................................................................................................ 3937
Text Height................................................................................................................ 3938
TextOut ................................................................................................................ 3939
TextSize ................................................................................................................ 3940
Text W idth ................................................................................................................ 3941
TransparentLevelSet
................................................................................................................ 3942
Triangle ................................................................................................................ 3943
TriangleAA ................................................................................................................ 3944
TriangleW u................................................................................................................ 3945
Update ................................................................................................................ 3946
W idth ................................................................................................................ 3947
CChartCanvas
......................................................................................................................... 3948
Color Bac k ground
................................................................................................................ 3952
Color Border................................................................................................................ 3953
ColorText ................................................................................................................ 3954
Color Grid ................................................................................................................ 3955
MaxData ................................................................................................................ 3956
MaxDescrLen ................................................................................................................ 3957
ShowFlags ................................................................................................................ 3958
IsShowLegend ................................................................................................................ 3959
IsShowScaleLeft
................................................................................................................ 3960
IsShowScaleRight
................................................................................................................ 3961
IsShowScaleTop................................................................................................................ 3962
Bottom
IsShowScale................................................................................................................ 3963
IsShowGrid................................................................................................................ 3964
IsShowDescriptors
................................................................................................................ 3965
IsShowPercent ................................................................................................................ 3966
V ScaleMin ................................................................................................................ 3967
V ScaleMax ................................................................................................................ 3968
NumGrid ................................................................................................................ 3969
DataOffset................................................................................................................ 3970
DataTotal ................................................................................................................ 3971
DrawDescriptors
................................................................................................................ 3972
DrawData ................................................................................................................ 3973
Create ................................................................................................................ 3974
AllowedShow Flags
................................................................................................................ 3975
ShowLegend ................................................................................................................ 3976
ShowScaleLeft ................................................................................................................ 3977
ShowScaleRight................................................................................................................ 3978
ShowScaleTop ................................................................................................................ 3979
ShowScaleB................................................................................................................
ottom 3980
ShowGrid ................................................................................................................ 3981
ShowDescriptors
................................................................................................................ 3982
ShowV alue ................................................................................................................ 3983
ShowPercent ................................................................................................................ 3984
LegendAlignment
................................................................................................................ 3985
Accumulative ................................................................................................................ 3986
V ScaleParams ................................................................................................................ 3987
DescriptorUpdate
................................................................................................................ 3988
ColorUpdate ................................................................................................................ 3989
V aluesChec................................................................................................................
k 3990
Redraw ................................................................................................................ 3991
DrawBac k ground
................................................................................................................ 3992
DrawLegend ................................................................................................................ 3993
DrawLegend V ertical
................................................................................................................ 3994
DrawLegend Horizontal
................................................................................................................ 3995
CalcScales ................................................................................................................ 3996
DrawScales................................................................................................................ 3997
DrawScaleLeft ................................................................................................................ 3998
DrawScaleRight................................................................................................................ 3999
DrawScaleTop ................................................................................................................ 4000
DrawScaleB................................................................................................................
ottom 4001
DrawGrid ................................................................................................................ 4002
DrawChart................................................................................................................ 4003
C HistogramChart
......................................................................................................................... 4004
Gradient ................................................................................................................ 4009
Bar Gap ................................................................................................................ 4010
BarMinSize................................................................................................................ 4011
Bar Border ................................................................................................................ 4012
Create ................................................................................................................ 4013
SeriesAdd ................................................................................................................ 4014
SeriesInsert ................................................................................................................ 4015
SeriesUpdate ................................................................................................................ 4016
SeriesDelete ................................................................................................................ 4017
V alueUpdate ................................................................................................................ 4018
DrawData ................................................................................................................ 4019
DrawBar ................................................................................................................ 4020
Gradient Brush................................................................................................................ 4021
CLineChart
......................................................................................................................... 4022
Filled ................................................................................................................ 4026
ApplyTemplate
......................................................................................................................... 4152
ScreenShot
......................................................................................................................... 4153
W indowOnDropped
......................................................................................................................... 4154
PriceOnDropped
......................................................................................................................... 4155
TimeOnDropped
......................................................................................................................... 4156
X OnDropped
......................................................................................................................... 4157
Y OnDropped
......................................................................................................................... 4158
Save ......................................................................................................................... 4159
Load ......................................................................................................................... 4160
Type ......................................................................................................................... 4161
Gráfic os c ............................................................................................................................4162
ientífic os
GraphPlot......................................................................................................................... 4163
CAxis ......................................................................................................................... 4167
AutoScale ................................................................................................................ 4169
Min ................................................................................................................ 4170
Max ................................................................................................................ 4171
Step ................................................................................................................ 4172
Name ................................................................................................................ 4173
Color ................................................................................................................ 4174
V aluesSize ................................................................................................................ 4175
V alues W idth................................................................................................................ 4176
V alues Format................................................................................................................ 4177
V aluesDateTimeMode
................................................................................................................ 4178
V alues Function Format
................................................................................................................ 4179
V alues Function FormatC BData
................................................................................................................ 4181
NameSize ................................................................................................................ 4182
ZeroLever ................................................................................................................ 4183
DefaultStep................................................................................................................ 4184
MaxLabels ................................................................................................................ 4185
MinGrace ................................................................................................................ 4186
Max Grace ................................................................................................................ 4187
SelectAxisScale
................................................................................................................ 4188
CColor G.........................................................................................................................
enerator 4189
Next ................................................................................................................ 4190
Reset ................................................................................................................ 4191
CCurve......................................................................................................................... 4192
Type ................................................................................................................ 4195
Name ................................................................................................................ 4196
Color ................................................................................................................ 4197
X Max ................................................................................................................ 4198
X Min ................................................................................................................ 4199
Y Max ................................................................................................................ 4200
Y Min ................................................................................................................ 4201
Size ................................................................................................................ 4202
PointsSize ................................................................................................................ 4203
Points Fill ................................................................................................................ 4204
PointsColor................................................................................................................ 4205
Get X ................................................................................................................ 4206
Get Y ................................................................................................................ 4207
LinesStyle ................................................................................................................ 4208
LinesIsSmooth ................................................................................................................ 4209
LinesSmoothTension
................................................................................................................ 4210
LinesSmoothStep
................................................................................................................ 4211
LinesEndStyle ................................................................................................................ 4212
Lines W idth................................................................................................................ 4213
HistogramW ................................................................................................................
idth 4215
CustomPlotC BData
................................................................................................................ 4216
Function
CustomPlot................................................................................................................ 4217
PointsType................................................................................................................ 4221
StepsDimension................................................................................................................ 4222
TrendLineCoefficients
................................................................................................................ 4223
TrendLineColor................................................................................................................ 4224
TrendLineV................................................................................................................
isible 4225
Update ................................................................................................................ 4227
V isible ................................................................................................................ 4229
C Graphic......................................................................................................................... 4230
Create ................................................................................................................ 4233
Destroy ................................................................................................................ 4234
Update ................................................................................................................ 4235
ChartObjectName
................................................................................................................ 4236
ResourceName ................................................................................................................ 4237
X Axis ................................................................................................................ 4238
Y Axis ................................................................................................................ 4239
GapSize ................................................................................................................ 4240
Bac k groundColor
................................................................................................................ 4241
Bac k groundMain
................................................................................................................ 4242
Bac k groundMainSize
................................................................................................................ 4243
Bac k groundMainColor
................................................................................................................ 4244
Bac k groundSub
................................................................................................................ 4245
Bac k groundSubSize
................................................................................................................ 4246
Bac k groundSubColor
................................................................................................................ 4247
GridLineColor ................................................................................................................ 4248
GridBac k groundColor
................................................................................................................ 4249
GridCircleRadius
................................................................................................................ 4250
GridCircleColor
................................................................................................................ 4251
GridHasCircle ................................................................................................................ 4252
HistoryName W idth
................................................................................................................ 4253
HistoryNameSize
................................................................................................................ 4254
HistorySymbolSize
................................................................................................................ 4255
TextAdd ................................................................................................................ 4256
LineAdd ................................................................................................................ 4257
CurveAdd ................................................................................................................ 4258
CurvePlot ................................................................................................................ 4261
CurvePlotAll ................................................................................................................ 4262
CurveGet ByIndex
................................................................................................................ 4263
CurveGet ByName
................................................................................................................ 4264
CurveRemove ByIndex
................................................................................................................ 4265
CurveRemove ByName
................................................................................................................ 4266
CurvesTotal ................................................................................................................ 4267
Mar k sToAxisAdd
................................................................................................................ 4268
MajorMar k Size
................................................................................................................ 4269
FontSet ................................................................................................................ 4270
Font Get ................................................................................................................ 4271
GridAxisLineColor
................................................................................................................ 4272
Attach ................................................................................................................ 4273
CalculateMaxMin V alues
................................................................................................................ 4274
Height ................................................................................................................ 4275
IndentDown ................................................................................................................ 4276
IndentLeft ................................................................................................................ 4277
IndentRight................................................................................................................ 4278
IndentUp ................................................................................................................ 4279
Redraw ................................................................................................................ 4280
ResetParameters
................................................................................................................ 4281
SetDefaultParameters
................................................................................................................ 4282
ScaleX ................................................................................................................ 4283
ScaleY ................................................................................................................ 4284
TradeModeDescription
................................................................................................................ 4820
TradeExecution................................................................................................................ 4821
TradeExecutionDescription
................................................................................................................ 4822
SwapMode ................................................................................................................ 4823
SwapModeDescription
................................................................................................................ 4824
SwapRollover3days
................................................................................................................ 4825
SwapRollover3daysDescription
................................................................................................................ 4826
MarginInitial ................................................................................................................ 4827
MarginMaintenance
................................................................................................................ 4828
MarginLong................................................................................................................ 4829
MarginShort ................................................................................................................ 4830
MarginLimit................................................................................................................ 4831
MarginStop................................................................................................................ 4832
MarginStopLimit
................................................................................................................ 4833
TradeTimeF................................................................................................................
lags 4834
TradeFillFlags................................................................................................................ 4835
Digits ................................................................................................................ 4836
Point ................................................................................................................ 4837
Tic kV alue ................................................................................................................ 4838
Tic kV alueProfit
................................................................................................................ 4839
Tic kV alueLoss
................................................................................................................ 4840
Tic k Size ................................................................................................................ 4841
ContractSize ................................................................................................................ 4842
LotsMin ................................................................................................................ 4843
LotsMax ................................................................................................................ 4844
LotsStep ................................................................................................................ 4845
LotsLimit ................................................................................................................ 4846
SwapLong ................................................................................................................ 4847
SwapShort ................................................................................................................ 4848
Currency Base ................................................................................................................ 4849
CurrencyProfit................................................................................................................ 4850
CurrencyMargin................................................................................................................ 4851
Bank ................................................................................................................ 4852
Description................................................................................................................ 4853
Path ................................................................................................................ 4854
SessionDeals ................................................................................................................ 4855
SessionBuyOrders
................................................................................................................ 4856
SessionSellOrders
................................................................................................................ 4857
SessionTurnover
................................................................................................................ 4858
SessionInterest
................................................................................................................ 4859
SessionBuyOrders V olume
................................................................................................................ 4860
SessionSellOrders V olume
................................................................................................................ 4861
SessionOpen ................................................................................................................ 4862
SessionClose ................................................................................................................ 4863
SessionAW ................................................................................................................ 4864
SessionPriceSettlement
................................................................................................................ 4865
SessionPriceLimitMin
................................................................................................................ 4866
SessionPriceLimitMax
................................................................................................................ 4867
InfoInteger................................................................................................................ 4868
InfoDouble ................................................................................................................ 4869
InfoString ................................................................................................................ 4870
NormalizePrice................................................................................................................ 4871
COrderInfo
......................................................................................................................... 4872
Tic k et ................................................................................................................ 4875
TimeSetup ................................................................................................................ 4876
TimeSetupMsc ................................................................................................................ 4877
OrderType................................................................................................................ 4878
TypeDescription
................................................................................................................ 4879
FormatRequestResult
................................................................................................................ 5064
CTerminalInfo
......................................................................................................................... 5065
Build ................................................................................................................ 5067
IsConnected ................................................................................................................ 5068
IsDLLsAllowed ................................................................................................................ 5069
IsTradeAllowed ................................................................................................................ 5070
IsEmailEnabled ................................................................................................................ 5071
Is FtpEnabled ................................................................................................................ 5072
Max Bars ................................................................................................................ 5073
CodePage ................................................................................................................ 5074
CPUCores ................................................................................................................ 5075
MemoryPhysical ................................................................................................................ 5076
MemoryTotal ................................................................................................................ 5077
MemoryAvailable................................................................................................................ 5078
MemoryUsed ................................................................................................................ 5079
Is X 64 ................................................................................................................ 5080
OpenCLSupport ................................................................................................................ 5081
Dis k Space ................................................................................................................ 5082
Language ................................................................................................................ 5083
Name ................................................................................................................ 5084
Company ................................................................................................................ 5085
Path ................................................................................................................ 5086
DataPath ................................................................................................................ 5087
CommonDataPath ................................................................................................................ 5088
InfoInteger................................................................................................................ 5089
InfoString ................................................................................................................ 5090
............................................................................................................................5091
Módulos de estratégias
Base para Expert Advisors
Classes ......................................................................................................................... 5094
CExpert Base ................................................................................................................ 5095
InitPhase ........................................................................................................... 5098
TrendType........................................................................................................... 5099
UsedSeries........................................................................................................... 5100
EveryTic k ........................................................................................................... 5101
Open ........................................................................................................... 5102
High ........................................................................................................... 5103
Low ........................................................................................................... 5104
Close ........................................................................................................... 5105
Spread ........................................................................................................... 5106
Time ........................................................................................................... 5107
Tic kV olume........................................................................................................... 5108
RealV olume........................................................................................................... 5109
Init ........................................................................................................... 5110
Symbol ........................................................................................................... 5111
Period ........................................................................................................... 5112
Magic ........................................................................................................... 5113
V alidationSettings
........................................................................................................... 5114
SetPriceSeries
........................................................................................................... 5115
SetOtherSeries
........................................................................................................... 5116
InitIndicators
........................................................................................................... 5117
InitOpen ........................................................................................................... 5118
Init High ........................................................................................................... 5119
InitLow ........................................................................................................... 5120
InitClose ........................................................................................................... 5121
InitSpread ........................................................................................................... 5122
InitTime ........................................................................................................... 5123
InitTic kV olume
........................................................................................................... 5124
InitRealV olume
........................................................................................................... 5125
PriceLevelUnit
........................................................................................................... 5126
StartIndex........................................................................................................... 5127
CompareMagic........................................................................................................... 5128
CExpert ................................................................................................................ 5129
Init ........................................................................................................... 5134
Magic ........................................................................................................... 5135
InitSignal ........................................................................................................... 5136
InitTrailing........................................................................................................... 5137
InitMoney ........................................................................................................... 5138
InitTrade ........................................................................................................... 5139
Deinit ........................................................................................................... 5140
OnTic k Process
........................................................................................................... 5141
OnTradeProcess
........................................................................................................... 5142
OnTimerProcess
........................................................................................................... 5143
OnChartEventProcess
........................................................................................................... 5144
OnBook EventProcess
........................................................................................................... 5145
MaxOrders........................................................................................................... 5146
Signal ........................................................................................................... 5147
V alidationSettings
........................................................................................................... 5148
InitIndicators
........................................................................................................... 5149
OnTic k ........................................................................................................... 5150
OnTrade ........................................................................................................... 5151
OnTimer ........................................................................................................... 5152
OnChartEvent........................................................................................................... 5153
OnBook Event........................................................................................................... 5154
InitParameters
........................................................................................................... 5155
DeinitTrade ........................................................................................................... 5156
DeinitSignal........................................................................................................... 5157
DeinitTrailing
........................................................................................................... 5158
DeinitMoney ........................................................................................................... 5159
DeinitIndicators
........................................................................................................... 5160
Refresh ........................................................................................................... 5161
Processing........................................................................................................... 5162
SelectPosition
........................................................................................................... 5164
Chec k Open........................................................................................................... 5165
Chec k OpenLong
........................................................................................................... 5166
Chec k OpenShort
........................................................................................................... 5167
OpenLong ........................................................................................................... 5168
OpenShort ........................................................................................................... 5169
Chec k Reverse
........................................................................................................... 5170
Chec k ReverseLong
........................................................................................................... 5171
Chec k ReverseShort
........................................................................................................... 5172
ReverseLong ........................................................................................................... 5173
ReverseShort........................................................................................................... 5174
Chec k Close........................................................................................................... 5175
Chec k CloseLong
........................................................................................................... 5176
Chec k CloseShort
........................................................................................................... 5177
CloseAll ........................................................................................................... 5178
Close ........................................................................................................... 5179
CloseLong ........................................................................................................... 5180
CloseShort ........................................................................................................... 5181
Chec k TrailingStop
........................................................................................................... 5182
Chec k TrailingStopLong
........................................................................................................... 5183
Chec k TrailingStopShort
........................................................................................................... 5184
TrailingStopLong
........................................................................................................... 5185
TrailingStopShort
........................................................................................................... 5186
Chec k TrailingOrderLong
........................................................................................................... 5187
Chec k TrailingOrderShort
........................................................................................................... 5188
TrailingOrderLong
........................................................................................................... 5189
TrailingOrderShort
........................................................................................................... 5190
Chec k DeleteOrderLong
........................................................................................................... 5191
Chec k DeleteOrderShort
........................................................................................................... 5192
DeleteOrders........................................................................................................... 5193
DeleteOrder ........................................................................................................... 5194
DeleteOrderLong
........................................................................................................... 5195
DeleteOrderShort
........................................................................................................... 5196
LotOpenLong ........................................................................................................... 5197
LotOpenShort........................................................................................................... 5198
LotReverse........................................................................................................... 5199
PrepareHistoryDate
........................................................................................................... 5200
HistoryPoint........................................................................................................... 5201
Chec k TradeState
........................................................................................................... 5202
W aitEvent ........................................................................................................... 5203
NoW aitEvent........................................................................................................... 5204
TradeEventPositionStopTa ke
........................................................................................................... 5205
TradeEventOrderTriggered
........................................................................................................... 5206
TradeEventPositionOpened
........................................................................................................... 5207
TradeEventPosition V olumeChanged
........................................................................................................... 5208
TradeEventPositionModified
........................................................................................................... 5209
TradeEventPositionClosed
........................................................................................................... 5210
TradeEventOrderPlaced
........................................................................................................... 5211
TradeEventOrderModified
........................................................................................................... 5212
TradeEventOrderDeleted
........................................................................................................... 5213
TradeEventNotIdentified
........................................................................................................... 5214
TimeframeAdd........................................................................................................... 5215
Flags
Timeframes........................................................................................................... 5216
CExpertSignal
................................................................................................................ 5217
BasePrice ........................................................................................................... 5220
UsedSeries........................................................................................................... 5221
W eight ........................................................................................................... 5222
PatternsUsage
........................................................................................................... 5223
General ........................................................................................................... 5224
Ignore ........................................................................................................... 5225
Invert ........................................................................................................... 5226
ThresholdOpen
........................................................................................................... 5227
ThresholdClose
........................................................................................................... 5228
PriceLevel........................................................................................................... 5229
StopLevel ........................................................................................................... 5230
Tak eLevel ........................................................................................................... 5231
Expiration ........................................................................................................... 5232
Magic ........................................................................................................... 5233
V alidationSettings
........................................................................................................... 5234
InitIndicators
........................................................................................................... 5235
AddFilter ........................................................................................................... 5236
Chec k OpenLong
........................................................................................................... 5237
Chec k OpenShort
........................................................................................................... 5238
OpenLongParams
........................................................................................................... 5239
OpenShortParams
........................................................................................................... 5240
Chec k CloseLong
........................................................................................................... 5241
Chec k CloseShort
........................................................................................................... 5242
CloseLongParams
........................................................................................................... 5243
CloseShortParams
........................................................................................................... 5244
Chec k ReverseLong
........................................................................................................... 5245
Chec k ReverseShort
........................................................................................................... 5246
Chec k TrailingOrderLong
........................................................................................................... 5247
Chec k TrailingOrderShort
........................................................................................................... 5248
LongCondition
........................................................................................................... 5249
ShortCondition
........................................................................................................... 5250
Direction ........................................................................................................... 5251
CExpertTrailing
................................................................................................................ 5252
Chec k TrailingStopLong
........................................................................................................... 5254
Chec k TrailingStopShort
........................................................................................................... 5255
CExpertMoney ................................................................................................................ 5256
Percent ........................................................................................................... 5257
V alidationSettings
........................................................................................................... 5258
Chec k OpenLong
........................................................................................................... 5259
Chec k OpenShort
........................................................................................................... 5260
Chec k Reverse
........................................................................................................... 5261
Chec k Close........................................................................................................... 5262
Módulos.........................................................................................................................
de Sinais de Negociação 5263
Signals of the
................................................................................................................
Indicator Accelerator Oscillator 5266
Signals of the
................................................................................................................
Indicator Adaptive Moving Average 5269
Signals of the
................................................................................................................
Indicator Awesome Oscillator 5273
Signals of the Oscillator Bears Power
................................................................................................................ 5277
Signals of the Oscillator Bulls Power
................................................................................................................ 5279
Signals of the
................................................................................................................
Oscillator Commodity Channel Index 5281
Signals of the Oscillator DeMar k er
................................................................................................................ 5285
Signals of the
................................................................................................................
Indicator Double Exponential Moving Average 5289
Signals of the
................................................................................................................
Indicator Envelopes 5293
Signals of the Indicator Fractal Adaptive Moving Average
................................................................................................................ 5296
Signals of the Intraday Time Filter
................................................................................................................ 5300
Signals of the
................................................................................................................
Oscillator MACD 5302
Signals of the
................................................................................................................
Indicator Moving Average 5308
Signals of the
................................................................................................................
Indicator Parabolic SAR 5312
Signals of the
................................................................................................................
Oscillator Relative Strength Index 5314
Signals of the Oscillator Relative V igor Index
................................................................................................................ 5320
Signals of the
................................................................................................................
Oscillator Stochastic 5322
Signals of the
................................................................................................................
Oscillator Triple Exponential Average 5327
Signals of the
................................................................................................................
Indicator Triple Exponential Moving Average 5331
Signals of the Oscillator W illiams Percent Range
................................................................................................................ 5335
Classes .........................................................................................................................
de Trailing Stop 5338
CTrailing FixedPips
................................................................................................................ 5339
StopLevel ........................................................................................................... 5341
ProfitLevel........................................................................................................... 5342
V alidationSettings
........................................................................................................... 5343
Chec k TrailingStopLong
........................................................................................................... 5344
Chec k TrailingStopShort
........................................................................................................... 5345
CTrailingMA................................................................................................................ 5346
Period ........................................................................................................... 5348
Shift ........................................................................................................... 5349
Method ........................................................................................................... 5350
Applied ........................................................................................................... 5351
InitIndicators
........................................................................................................... 5352
V alidationSettings
........................................................................................................... 5353
Chec k TrailingStopLong
........................................................................................................... 5354
Chec k TrailingStopShort
........................................................................................................... 5355
CTrailingNone................................................................................................................ 5356
Chec k TrailingStopLong
........................................................................................................... 5357
Chec k TrailingStopShort
........................................................................................................... 5358
CTrailingPSAR................................................................................................................ 5359
Step ........................................................................................................... 5361
Maximum ........................................................................................................... 5362
InitIndicators
........................................................................................................... 5363
Chec k TrailingStopLong
........................................................................................................... 5364
Chec k TrailingStopShort
........................................................................................................... 5365
de Gerenciamento de Dinheiro
Classes ......................................................................................................................... 5366
CMoney FixedLot
................................................................................................................ 5367
Lots ........................................................................................................... 5369
V alidationSettings
........................................................................................................... 5370
Chec k OpenLong
........................................................................................................... 5371
Chec k OpenShort
........................................................................................................... 5372
CMoney FixedMargin
................................................................................................................ 5373
Chec k OpenLong
........................................................................................................... 5374
Chec k OpenShort
........................................................................................................... 5375
CMoney FixedRis k
................................................................................................................ 5376
Chec k OpenLong
........................................................................................................... 5377
Chec k OpenShort
........................................................................................................... 5378
CMoneyNone ................................................................................................................ 5379
V alidationSettings
........................................................................................................... 5380
Chec k OpenLong
........................................................................................................... 5381
Chec k OpenShort
........................................................................................................... 5382
CMoneySizeOptimized
................................................................................................................ 5383
DecreaseFactor
........................................................................................................... 5385
V alidationSettings
........................................................................................................... 5386
Chec k OpenLong
........................................................................................................... 5387
Chec k OpenShort
........................................................................................................... 5388
Painéis e c............................................................................................................................5389
aixas de diálogo
CRect ......................................................................................................................... 5391
Left ................................................................................................................ 5392
Top ................................................................................................................ 5393
Right ................................................................................................................ 5394
Bottom ................................................................................................................ 5395
W idth ................................................................................................................ 5396
Height ................................................................................................................ 5397
Set Bound ................................................................................................................ 5398
Move ................................................................................................................ 5399
Shift ................................................................................................................ 5400
Contains ................................................................................................................ 5401
Format ................................................................................................................ 5402
CDateTime
......................................................................................................................... 5403
MonthName................................................................................................................ 5405
ShortMonthName................................................................................................................ 5406
DayName ................................................................................................................ 5407
ShortDayName ................................................................................................................ 5408
DaysInMonth ................................................................................................................ 5409
DateTime ................................................................................................................ 5410
Date ................................................................................................................ 5411
Time ................................................................................................................ 5412
Sec ................................................................................................................ 5413
Min ................................................................................................................ 5414
Hour ................................................................................................................ 5415
Day ................................................................................................................ 5416
Mon ................................................................................................................ 5417
Y ear ................................................................................................................ 5418
SecDec ................................................................................................................ 5419
SecInc ................................................................................................................ 5420
MinDec ................................................................................................................ 5421
MinInc ................................................................................................................ 5422
HourDec ................................................................................................................ 5423
HourInc ................................................................................................................ 5424
DayDec ................................................................................................................ 5425
DayInc ................................................................................................................ 5426
MonDec ................................................................................................................ 5427
OnThumbDragEnd................................................................................................................ 5704
CalcPos ................................................................................................................ 5705
C W ndClient
......................................................................................................................... 5706
Create ................................................................................................................ 5709
OnEvent ................................................................................................................ 5710
Color Bac k ground
................................................................................................................ 5711
Color Border................................................................................................................ 5712
BorderType................................................................................................................ 5713
V Scrolled ................................................................................................................ 5714
HScrolled ................................................................................................................ 5715
CreateBac k................................................................................................................ 5716
CreateScroll V
................................................................................................................ 5717
CreateScroll H
................................................................................................................ 5718
OnResize ................................................................................................................ 5719
OnV ScrollShow................................................................................................................ 5720
OnV ScrollHide................................................................................................................ 5721
OnHScrollShow ................................................................................................................ 5722
OnHScrollHide ................................................................................................................ 5723
OnScrollLineDown
................................................................................................................ 5724
OnScrollLineUp................................................................................................................ 5725
OnScrollLineLeft
................................................................................................................ 5726
OnScrollLineRight
................................................................................................................ 5727
Rebound ................................................................................................................ 5728
CList V iew
......................................................................................................................... 5729
Create ................................................................................................................ 5735
OnEvent ................................................................................................................ 5736
TotalV iew ................................................................................................................ 5737
AddItem ................................................................................................................ 5738
Select ................................................................................................................ 5739
Select ByText ................................................................................................................ 5740
Select By V alue
................................................................................................................ 5741
V alue ................................................................................................................ 5742
CreateRow................................................................................................................ 5743
OnResize ................................................................................................................ 5744
OnV ScrollShow................................................................................................................ 5745
OnV ScrollHide................................................................................................................ 5746
OnScrollLineDown
................................................................................................................ 5747
OnScrollLineUp................................................................................................................ 5748
k
OnItemClic................................................................................................................ 5749
Redraw ................................................................................................................ 5750
RowState ................................................................................................................ 5751
Chec kV iew................................................................................................................ 5752
Box
CCombo......................................................................................................................... 5753
Create ................................................................................................................ 5759
OnEvent ................................................................................................................ 5760
AddItem ................................................................................................................ 5761
List V iewItems
................................................................................................................ 5762
Select ................................................................................................................ 5763
Select ByText ................................................................................................................ 5764
Select By V alue
................................................................................................................ 5765
V alue ................................................................................................................ 5766
CreateEdit................................................................................................................ 5767
CreateButton ................................................................................................................ 5768
CreateList ................................................................................................................ 5769
OnClic k Edit................................................................................................................ 5770
OnClic kButton................................................................................................................ 5771
OnChangeList ................................................................................................................ 5772
ListShow ................................................................................................................ 5773
Manual MQL5
A MetaQuotes Language 5 (MQL5) é uma linguagem de programação para indicadores técnicos, para
robôs de negociação e para aplicativos auxiliares, providenciando automatização da negociação nos
mercados financeiros. A MQL5 é uma linguagem moderna de alto nível desenvolvida pela MetaQuotes
Software Corp. para a sua própria plataforma de negociação. A sintaxe da linguagem é tão próxima
quanto possível da C++ e permite escrever programas no estilo da programação orientada a objetos
(POO).
O manual MQL5 contém - divididas por categorias - funções, operações, palavras reservadas e outras
construções da linguagem. Além disso, permite encontrar a descrição de cada elemento da linguagem.
T ambém o manual descreve as classes da Biblioteca padrão para criar estratégias de negociação,
painéis de controle, gráficos personalizados e trabalhar com arquivos.
· Expert Advisor — sistema de negociação automática que está ligado a um gráfico específico. O
Expert Advisor contém as funções manipuladoras dos eventos predefinidos que, ao ocorrerem,
desencadeiam os respectivos elementos da estratégia de negociação. Esses eventos podem ser a
inicialização e a desinicialização do programa, a chegada de um novo tick , a ativação do
temporizador, a mudança no livro de ofertas, nos eventos do gráfico e nos eventos do usuário.
O Expert Advisor pode, além de calcular sinais de negociação segundo as regras estabelecidas,
realizar trades automaticamente na conta de negociação, direcionando-os diretamente para o
servidor de negociação. Os Expert Advisor são armazenados no
<diretório_do_terminal>\MQL5\Experts .
· Indicador personalizado — indicador técnico escrito pelo usuário, além dos indicadores já
integrados na plataforma de negociação. Os indicadores personalizados, assim como os indicadores
embutidos, não podem ser trocados automaticamente e se destinam apenas à implementação de
funções analíticas. Os indicadores personalizados podem usar os valores de outros indicadores em
seus cálculos, e eles próprios podem ser chamados nos próprios Expert Advisors.
Os indicadores personalizados são armazenados no <diretório_do_terminal>\MQL5\Indicators.
· Script — programa projetado para a execução única de certa ação. Ao contrário dos Expert
Advisors, os scripts não lidam com eventos, exceto com aqueles que são de inicialização e
desinicialização. Para executar o script em seu código, deve haver uma função manipulador
OnStart. Os scripts são armazenados no <diretório_do_terminal>\MQL5\Scripts.
· Serviço – um programa que, ao contrário de indicadores, EAs e scripts, não estão vinculados a um
gráfico para o seu trabalho. Como os scripts, os serviços processam apenas eventos de
inicialização. Para executar o serviço em seu código, deve estar presenta uma função manipulador
OnStart. Os serviços aceitam apenas o evento o Start, mas podem enviar aos gráficos eventos
personalizados usando EventChartCustom. Os serviços são armazenados no diretório
<diretório_do_terminal>\MQL5\Services.
· Biblioteca — biblioteca de funções personalizadas projetada para armazenar e distribuir blocos -
usados com frequência - de programas do usuário. As bibliotecas não podem ser executadas por
conta própria.
As bibliotecas são armazenadas no <As bibliotecas não podem ser executadas por conta
própria.>\MQL5\Libraries
· Arquivo de inclusão — código fonte de blocos - usados com frequência - de programas do usuário.
Esses arquivos podem ser incluídos nos códigos fonte de Expert Advisors, de scripts, de indicadores
personalizados e de bibliotecas durante fase de compilação. Devido à sobrecarga adicional ao
chamar funções de biblioteca, é melhor usar arquivos de inclusão do que bibliotecas.
Arquivos de inclusão podem estar no mesmo diretório que o código fonte, neste caso é usada a
diretiva #include com aspas duplas. Outro local para armazenar os arquivos de inclusão está no
<diretório_do_terminal>\MQL5\Include, neste caso, é utilizada a diretiva #include com colchetes
angulares.
MQL5 é baseado no conceito da popular linguagem de programação C++. Em comparação com MQL 4, a
nova linguagem tem agora enumeradores, estruturas, classes e manipulação de evento. Ao aumentar
o número de tipos principais incorporados, a interação dos programas executáveis em MQL5 com
outros aplicativos através de dll é agora tão fácil quanto possível. A sintaxe do MQL5 é similar à
sintaxe do C++, e isso faz com que seja fácil traduzir para ele programas de linguagens modernas de
programação.
Para ajudar você a estudar a linguagem MQL5, todos os tópicos estão agrupados nas seguintes seções :
· Sintaxe
· T ipos de Dados
· Operadores
· Funções
· Variáveis
· Preprocessador
· Espaços de nomes
Sintaxe
Quanto à sintaxe, a linguagem MQL5 para programação de estratégias de negociação é muito similar à
linguagem de programação C++, com exceção de alguns recursos :
Também Veja
Enumeradores, Estruturas e Classes, H erança
Comentários
Comentários de múltiplas linhas começam com o par de símbolos /* e terminam com o par */. Este
tipo de comentário não pode ser aninhado. Comentários de linha única começam com o par de
símbolos // e terminam com o caractere newline, eles podem ser aninhados em outros comentários de
múltiplas linhas. Comentários são permitidos em todos os lugares onde os espaços são permitidos,
eles podem conter qualquer número de espaços.
Exemplos:
//--- Comentário de linha única
/* Comentário
de múltiplas // Comentário de linha única aninhada
linhas
*/
Identificadores
Identificadores são usados como nomes de variáveis e funções. O comprimento de um identificador
não pode exceder 63 caracteres.
Exemplos:
NAME1 namel Total_5 Paper
Também Veja
Variáveis, Funções
Palavras Reservadas
Os seguintes identificadores são registrados como palavras reservadas, cada uma delas corresponde a
uma certa ação, e não pode ser usada com outro significado:
Tipos de Dados
double struct
enum uchar
Especificadores de Acesso
delete protected
override public
Classes de Memória
Operadores
default if sizeof
do offsetof while
Outros
Tipos de Dados
Qualquer programa funciona com dados. Os dados podem ser de diferentes tipos dependendo da sua
finalidade. Por exemplo, dados inteiros são usados para acessar componentes de arrays. Dados de
preço pertencem ao tipo de dupla precisão com ponto flutuante. Isso está relacionado ao fato de que
nenhum tipo de dados especial para detalhes de preço é fornecido pelo MQL5.
Dados de diferentes tipos são processados com diferentes taxas. Dados inteiros são os de
processamento mais rápido. Para processar dados de dupla precisão, um co-processador especial é
utilizado. No entanto, por causa da complexidade da representação interna de dados com ponto
flutuante, eles são processados mais devagar que os dados inteiros.
Dados do tipo string são os de processamento mais lento por causa da alocação/realocação dinâmica
de memória de computador.
· lógico (bool);
· literais (ushort);
· strings (string);
· cor (color);
· data e hora(datetime);
· enumeradores (enum).
· estruturas ;
· classes.
Em termos de OOP tipos de dados complexos são chamados de tipos de dados abstratos.
Os tipos color e datetime fazem sentido apenas para facilitar a entrada e visualização de parâmetros
definidos do lado de fora - a partir da tabela de um Expert Advisor ou propriedades de um indicador
customizado (o guia Entradas). Dados de cor (color) e data e hora (datetime) são representados como
inteiros. T ipos inteiros e tipos de ponto flutuante são chamados tipos aritméticos (numéricos).
Apenas convers ões de tipo (type casting) implícitas são usadas em express ões, a menos que uma
conversão (casting) explícita seja especificado.
Também Veja
Conversão de T ipo (Typecasting)
Tipos Inteiros
Em MQL5, os inteiros são representados por onze tipos. Alguns tipos podem ser utilizados em conjunto
com outros tipos, se exigido pela lógica do programa, mas neste caso é necess ário lembrar as regras
de conversão de tipos.
A tabela abaixo lista as características de cada tipo. Além disso, a última coluna apresenta o tipo
correspondente em C++ para cada tipo.
Valores do tipo integer podem ser apresentados como constantes numéricas, literais de cor, literais de
data-hora, constantes de caractere e enumeradores.
Também Veja
Conversão de Dados, Constantes de T ipos Numéricos
uchar
O tipo inteiro uchar também ocupa 1 byte de memória, assim como o tipo char , mas diferente dele
uchar é destinado apenas para valores positivos. O valor mínimo é zero, o valor máximo é 255. A
primeira letra u no nome do tipo uchar é abreviatura de unsigned (sem sinal).
short
O tamanho do tipo short é de 2 bytes (16 bits) e, conseqüentemente, ele permite expressar a faixa de
valores igual a 2 elevado a 16: 2^16 = 65 536. Como o tipo short é um tipo com sinal, e contém tanto
valores positivos quanto negativos, a faixa de valores é entre -32 768 e 32 767.
ushort
O tipo short sem sinal é o tipo ushort, que também tem 2 bytes de tamanho. O valor mínimo é 0, o
valor máximo é 65 535.
int
O tamanho do tipo int é de 4 bytes (32 bits). O valor mínimo é -2 147 483 648, o valor máximo é 2 147
483 647.
uint
O tipo integer sem sinal é uint. Ele usa 4 bytes de memória e permite expressar inteiros de 0 a 4 294
967 295.
long
O tamanho do tipo long é de 8 bytes (64 bits). O valor mínimo é -9 223 372 036 854 775 808, o valor
máximo é 9 223 372 036 854 775 807.
ulong
O tipo ulong também ocupa 8 bytes e pode armazenar valores de 0 a 18 446 744 073 709 551 615.
Exemplos:
char ch=12;
short sh=-5000;
int in=2445777;
Como os tipo inteiros sem sinal não são concebidos para armazenar valores negativos, a tentativa de
atribuir um valor negativo pode levar a conseqüências inesperadas. Este simples script levará a um
loop infinito:
for(char ch=-128;ch<128;ch++)
{
u_ch=ch;
Print("ch = ",ch," u_ch = ",u_ch);
}
}
A variante correta é:
for(char ch=-128;ch<=127;ch++)
{
u_ch=ch;
Print("ch = ",ch," u_ch = ",u_ch);
if(ch==127) break;
}
}
Resultado:
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
Exemplos:
//--- Valores negativos não podem ser armazenados em tipos sem sinal
uchar u_ch=-120;
ushort u_sh=-5000;
uint u_in=-401280;
H exadecimal: números 0-9, as letras a-f ou A-F para os valores de 10-15; começam com 0x ou 0X.
Exemplos:
0x0A, 0x12, 0X12, 0x2f, 0xA3, 0Xa3, 0X7C7
For integer variables, the values can be set in binary form using B prefix. For example, you can encode
the work ing hours of a trading session into int type variable and use information about them according
to the required algorithm:
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- set 1 for working hours and 0 for nonworking ones
int AsianSession =B'111111111'; // Asian session from 0:00 to 9:00
int EuropeanSession=B'111111111000000000'; // European session 9:00 - 18:00
int AmericanSession =B'111111110000000000000011'; // American session 16:00 - 02:00
//--- derive numerical values of the sessions
PrintFormat("Asian session hours as value =%d",AsianSession);
PrintFormat("European session hours as value is %d",EuropeanSession);
PrintFormat("American session hours as value is %d",AmericanSession);
//--- and now let's display string representations of the sessions' working hours
Print("Asian session ",GetHoursForSession(AsianSession));
Print("European session ",GetHoursForSession(EuropeanSession));
Print("American session ",GetHoursForSession(AmericanSession));
//---
}
//+------------------------------------------------------------------+
//| return the session's working hours as a string |
//+------------------------------------------------------------------+
string GetHoursForSession(int session)
{
//--- in order to check, use AND bit operations and left shift by 1 bit <<=1
//--- start checking from the lowest bit
int bit=1;
string out="working hours: ";
//--- check all 24 bits starting from the zero one and up to 23 inclusively
for(int i=0;i<24;i++)
{
//--- receive bit state in number
bool workinghour=(session&bit)==bit;
//--- add the hour's number to the message
if(workinghour )out=out+StringFormat("%d ",i);
//--- shift by one bit to the left to check the value of the next one
bit<<=1;
}
//--- result string
return out;
}
Também Veja
Conversão de T ipo (Typecasting)
Constantes de Caracteres
Os caracteres como elementos de uma string,em MQL5, são índices do conjunto de caracteres
Unicode. Eles são valores hexadecimais que podem ser convertidos para inteiros, e que podem ser
manipulados por operações com inteiros como adição e subtração.
Qualquer caractere único entre aspas simples ou um código hexadecimal ASCII de um caractere como
'\x 10' é um caractere constante e é do tipo ushort. Por exemplo, uma anotação do tipo '0' representa o
valor numérico 30, que corresponde ao índice do zero na tabela de caracteres.
Exemplo:
void OnStart()
{
//--- define constantes de caracteres
int symbol_0='0';
int symbol_9=symbol_0+9; // obtém o símbolo '9'
//--- valores de saída de constantes
printf("Num formato decimal: symbol_0 = %d, symbol_9 = %d",symbol_0,symbol_9);
printf("Num formato hexadecimal: symbol_0 = 0x%x, symbol_9 = 0x%x",symbol_0,symbol_9);
//--- entrada de constantes em uma string
string test="";
StringSetCharacter(test,0,symbol_0);
StringSetCharacter(test,1,symbol_9);
//--- isso é como eles se apresentam em uma string
Print(test);
}
Uma barra invertida (\) é um caractere de controle para o compilador ao lidar com strings constantes e
constantes caracteres no texto fonte de um programa. Alguns símbolos, por exemplo uma aspas
simples ('), aspas duplas (" ), barra invertida (\) e caracteres de controle podem ser representados
como combinação de símbolos que começam com uma barra invertida (\), de acordo com a tabela
abaixo:
Caso uma barra invertida seja seguida por outro caractere não descrito acima, o resultado é
indefinido.
Exemplo
void OnStart()
{
//--- declara constantes de caracteres
int a='A';
int b='$';
int c='©'; // código 0xA9
int d='\xAE'; // código do símbolo ®
//--- saída imprime constantes
Print(a,b,c,d);
//--- acrescenta um caractere na string
string test="";
StringSetCharacter(test,0,a);
Print(test);
//--- substitui um caractere na string
StringSetCharacter(test,0,b);
Print(test);
//--- substitui um caractere na string
StringSetCharacter(test,0,c);
Print(test);
//--- substitui um caractere na string
StringSetCharacter(test,0,d);
Print(test);
//--- representa caracteres como número
int a1=65;
int b1=36;
int c1=169;
int d1=174;
//--- acrescenta um caractere na string
StringSetCharacter(test,1,a1);
Print(test);
//--- acrescenta um caractere na string
StringSetCharacter(test,1,b1);
Print(test);
//--- acrescenta um caractere na string
StringSetCharacter(test,1,c1);
Print(test);
//--- acrescenta um caractere na string
StringSetCharacter(test,1,d1);
Print(test);
}
Como foi mencionado acima, o valor de uma constante caractere (ou variável) é o valor do índice na
tabela de caracteres. Sendo o índice um inteiro, pode ser escrito de diferentes maneiras.
void OnStart()
{
//---
int a=0xAE; // o código de ® corresponde ao literal '\xAE'
int b=0x24; // o código de $ corresponde ao literal '\x24'
int c=0xA9; // o código de © corresponde ao literal '\xA9'
int d=0x263A; // o código de ☺ corresponde ao literal '\x263A'
//--- mostrar valores
Print(a,b,c,d);
//--- acrescenta um caractere na string
string test="";
StringSetCharacter(test,0,a);
Print(test);
//--- substitui um caractere na string
StringSetCharacter(test,0,b);
Print(test);
//--- substitui um caractere na string
StringSetCharacter(test,0,c);
Print(test);
//--- substitui um caractere na string
StringSetCharacter(test,0,d);
Print(test);
//--- código de terno cartão
int a1=0x2660;
int b1=0x2661;
int c1=0x2662;
int d1=0x2663;
//--- acrescenta um caractere de espadas
StringSetCharacter(test,1,a1);
Print(test);
//--- acrescenta um caractere de copas
StringSetCharacter(test,2,b1);
Print(test);
//--- acrescenta um caractere de ouros
StringSetCharacter(test,3,c1);
Print(test);
//--- acrescenta um caractere de paus
StringSetCharacter(test,4,d1);
Print(test);
//--- Exemplo de literais de caractere em uma string
test="Rainha\x2660Ás\x2662";
printf("%s",test);
}
Também Veja
StringSetCharacter(), String GetCharacter(), ShortT oString(), ShortArrayT oString(),
String T oShortArray()
Tipo datetime
O tipo datetime é destinado a armazenar data e hora como o número de segundos decorridos desde 01
de Janeiro de 1970. Este tipo ocupa 8 bytes de memória.
Constantes de data e hora podem ser representados como string literal, que consiste de 6 partes
mostrando o valor numérico do ano, mês, dia (ou dia, mês, ano), horas, minutos e segundos. A
constante é colocado entre aspas simples e começa com o caractere D.
Os valores variam de 1 de Janeiro de 1970 a 31 de Dezembro de 3000. T anto a data (ano, mês, dia)
quanto a hora (horas, minutos, segundos), ou ambos podem ser omitidos.
Na especificação da data literal , é desejável que você especifique ano, mês e dia. Caso contrário, o
compilador retorna um aviso sobre entrada incompleta.
Exemplos:
datetime NY=D'2015.01.01 00:00'; // Data Hora de começo do ano 2015
datetime d1=D'1980.07.19 12:30:27'; // Ano Mês Dia Horas Minutos Segundos
datetime d2=D'19.07.1980 12:30:27'; // Igual a D'1980.07.19 12:30:27';
datetime d3=D'19.07.1980 12'; // Igual a D'1980.07.19 12:00:00'
datetime d4=D'01.01.2004'; // Igual a D'01.01.2004 00:00:00'
datetime compilation_date=__DATE__; // Data de Compilação
datetime compilation_date_time=__DATETIME__; // Data e Hora de Compilação
datetime compilation_time=__DATETIME__-__DATE__;// Hora de Compilação
//--- Exemplos de declarações após o qual avisos do compilador serão retornados
datetime warning1=D'12:30:27'; // Igual a D'[data de compilação] 12:30:27'
datetime warning2=D''; // Igual a __DATETIME__
Também Veja
Estrutura do T ipo Data, Data e H ora, T imeT oString, String T oT ime
Tipo color
O tipo color é destinado para armazenar informações sobre cor e ocupa 4 bytes na memória. O
primeiro byte é ignorado, os restantes 3 bytes contém os componentes RGB.
As constantes de cor podem ser representadas de três formas : literalmente, por inteiros, ou por nome
(somente por W eb-colors nomeados).
A representação literal consiste de três partes representando os valores numéricos das taxas dos três
principais componentes de cor: vermelho, verde e azul. A constante começa com C e colocada entre
aspas simples. Os valores numéricos da taxa de um componente de cor ficam entre 0 e 255.
Exemplos:
//--- Literais
C'128,128,128' // Cinza
C'0x00,0x00,0xFF' // Azul
//nomes de cores
clrRed // Vermelho
clrYellow // Amarelo
clrBlack // Preto
//--- Representações integrais
0xFFFFFF // Branco
16777215 // Branco
0x008000 // Verde
32768 // Verde
Também Veja
W eb Colors, ColorT oString, String T oColor, Conversão de T ipo (Typecasting)
Tipo bool
O tipo bool é destinado para armazenar os valores lógicos true ou false, a representação numérica
deles é 1 ou 0, respectivamente.
Exemplos:
bool a = true;
bool b = false;
bool c = 1;
A representação internal é um número inteiro de 1 byte de tamanho. Deve-se notar que em express ões
lógicas é possível usar outros tipos reais ou inteiros ou express ões desses tipos - o compilador não irá
gerar qualquer erro. Neste caso, o valor zero será interpretado como false (falso), e todos os outros
valores - como true (verdadeiro).
Exemplos:
int i=5;
double d=-2.5;
if(i) Print("i = ",i," e tem valor true");
else Print("i = ",i," e tem valor false");
i=0;
if(i) Print("i = ",i," e tem o valor true");
else Print("i = ",i,"e tem o valor false");
d=0.0;
if(d) Print("d = ",d," e tem o valor true");
else Print("d = ",d," e tem o valor false");
Também Veja
Operações Booleanas, R egras de Precedência
Enumeradores
Dados do tipo enum pertencem a um determinado conjunto limitado de dados. Definindo o tipo
enumerador:
A lista de valores é uma lista de identificadores de constantes nomeados separados por vírgulas.
Exemplo:
enum months // enumeração de constantes nomeados
{
January,
February,
March,
April,
May,
June,
July,
August,
September,
October,
November,
December
};
Após a enumeração ser declarada, um novo tipo de dados de inteiro de 4 bytes aparece. A declaração
do novo tipo de dados permite ao compilador controlar rigidamente os tipos de parâmetros passados,
porque a enumeração introduz novas constantes nomeadas. No exemplo acima, a constante nomeada
January tem valor igual a 0, February - 1, December - 11.
Rule: Se um certo valor não estiver atribuído a uma constante nomeada que é membro da
enumeração, seu novo valor será formado automaticamente. Se ele é o primeiro membro da
enumeração, o valor 0 será atribuído a ele. Para todos os subseqüentes membros, os valores serão
calculados baseados no valor dos membros anteriores adicionando um.
Exemplo:
enum intervals // Enumeração de constantes nomeadas
{
month=1, // Intervalo de um mês
two_months, // Dois meses
quarter, // Três meses - trimestre
halfyear=6, // Semestre
year=12, // Ano - 12 meses
};
Observações
· Diferente do C++, o tamanho da representação interna do tipo enumerado no MQL5 é sempre igual a
4 bytes. Ou seja, sizeof(months) retorna o valor 4.
· Diferente do C++, uma enumeração anônima não pode ser declarada no MQL5. Ou seja, um nome
único deve ser sempre especificado após a palavra-chave enum.
Também Veja
Conversão de T ipo (Typecasting)
O nome double significa que a precisão destes números é duas vezes a precisão dos números do tipo
float. Na maioria dos casos, o tipo double é o tipo mais conveniente. Em muitos casos a precisão
limitada de números float não é suficiente. O motivo do tipo float ser ainda utilizado é a economia de
memória (isto é importante para arrays grandes de números reais).
Constantes de ponto flutuante consistem de um parte inteira, um ponto (.) e a parte fracionária. As
partes inteira e fracionária são seqüências de algarismos decimais.
Exemplos:
double a=12.111;
double b=-956.1007;
float c =0.0001;
float d =16;
Existe uma forma científica de escrever constantes reais, frequentemente este método de notação é
mais compacta que a forma tradicional.
Exemplo:
double c1=1.12123515e-25;
double c2=0.000000000000000000000000112123515; // 24 zeros após o ponto decimal
Print("1. c1 =",DoubleToString(c1,16));
// Resultado: 1. c1 = 0.0000000000000000
Print("2. c1 =",DoubleToString(c1,-16));
// Resultado: 2. c1 = 1.1212351499999999e-025
Print("3. c2 =",DoubleToString(c2,-16));
// Resultado: 3. c2 = 1.1212351499999999e-025
Deve-se lembrar que números reais são armazenados em memória com precisão limitada no sistema
binário, apesar da notação decimal ser geralmente usada. É por isso que muitos números que são
precisamente representados no sistema decimal só podem ser escritos como fração infinita no sistema
binário.
Por exemplo, os números 0.3 e 0.7 são representados no computador como frações infinitas, enquanto
o número 0.25 é armazenado de forma exata, porque ele representa uma potência de dois.
Neste sentido, recomenda-se fortemente não comparar dois números com igualdade, porque tal
comparação não é correta.
Exemplo:
void OnStart()
{
//---
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");
// Resultado: 1/3 + 4/3 != 5/3
}
Se você ainda precisa comparar com igualdade dois números reais, então você pode fazer isso de duas
maneiras diferentes. A primeira maneira é comparar a diferença entre dois números com alguma
quantidade pequena que especifica a precisão da comparação.
Exemplo:
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;
}
void OnStart()
{
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("Diferente: d_val = ",DoubleToString(d_val,16)," f_val = ",DoubleToString(f_val,16));
// Resultado: Diferente: d_val= 0.7000000000000000 f_val= 0.6999999880790710
}
Note que o valor de epsilon no exemplo acima pode ser menor que a constante predefinida
DBL _EPS ILON. O valor desta constante é 2.2204460492503131e-016. A constante correspondente ao
tipo float é FL T_EPS ILON = 1.192092896e-07. O significado destes valores é o seguinte: é o menor
valor que satisfaz a condição 1.0 + DBL _EPS ILON! = 1.0 (para números do tipo float 1.0 +
FL T_EPS ILON! = 1.0).
A segunda maneira compara a diferença normalizada de dois números reais com zero. Não faz sentido
comparar a diferença de números normalizados com zero, porque qualquer operação matemática com
números normalizados dá um resultado não normalizado.
Exemplo:
bool CompareDoubles(double number1,double number2)
{
if(NormalizeDouble(number1-number2,8)==0)
return(true);
else
return(false);
}
void OnStart()
{
double d_val=0.3;
float f_val=0.3;
if(CompareDoubles(d_val,f_val))
Print(d_val," iguais ",f_val);
else
Print("Diferente: d_val = ",DoubleToString(d_val,16)," f_val = ",DoubleToString(f_val,16));
// Resultado: Diferente: d_val= 0.3000000000000000 f_val= 0.3000000119209290
}
Algumas operações do co-processador matemático podem resultar em um número real inv álido, o qual
não pode ser usado em operações matemáticas e operações de comparação, porque o resultado de
operações com números reais inv álidos é indefinido. Por exemplo, quando tentar calcular o arco-seno
de 2, o resultado é infinito negativo.
Exemplo:
double abnormal = MathArcsin(2.0);
Print("MathArcsin(2.0) =",abnormal);
// Resulto: MathArcsin(2.0) = -1.#IND
Além do menos infinito, existe o mais infinito e o NaN (not a number). Para determinar se um número
é inv álido, você pode usar MathIs ValidNumber(). De acordo com o padrão IEEE, eles tem uma
representação de máquina especial. Por exemplo, mais infinito para o tipo double tem a representação
binária de 0x 7FF0 0000 0000 0000.
Exemplos:
struct str1
{
double d;
};
struct str2
{
long l;
};
//--- Começo
str1 s1;
str2 s2;
//---
s1.d=MathArcsin(2.0); // Obtém o número inválido -1.#IND
s2=s1;
printf("1. %f %I64X",s1.d,s2.l);
//---
s2.l=0xFFFF000000000000; // número inválido -1.#QNAN
s1=s2;
printf("2. %f %I64X",s1.d,s2.l);
//---
s2.l=0x7FF7000000000000; // maior sem-número SNaN
s1=s2;
printf("3. %f %I64X",s1.d,s2.l);
//---
s2.l=0x7FF8000000000000; // menor sem-número QNaN
s1=s2;
printf("4. %f %I64X",s1.d,s2.l);
//---
s2.l=0x7FFF000000000000; // maior sem-número QNaN
s1=s2;
printf("5. %f %I64X",s1.d,s2.l);
//---
s2.l=0x7FF0000000000000; // // Infinito positivo 1.#INF e menor sem-número 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);
//---
Também Veja
DoubleT oString, NormalizeDouble, Constantes de T ipos Numéricos
Tipo string
O tipo string é usado para armazenar cadeias de texto. Uma cadeia de texto é uma seqüência de
caracteres no formato Unicode com zero no final do mesmo. Um constante string pode ser atribuído a
uma variável string. Uma constante string é uma seqüência de caracteres entre aspas duplas : "T his is
a string constant" .
Se for preciso incluir um aspas duplo (" ) em uma string, o caractere barra invertida (\) deve ser
colocada antes dele. Quaisquer constantes de caractere especial pode ser escrito em uma string, se o
caractere barra invertida (\) for digitado antes deles.
Exemplos:
string svar="Esta é uma character string";
string svar2=StringSubstr(svar,0,4);
Print("Símbolo de direitos autorais\t\x00A9");
FileWrite(handle,"Esta string contém uma nova linha de símbolos \n");
string MT5path="C:\\Program Files\\MetaTrader 5";
Para tornar o código fonte legível, longas strings de constantes podem ser divididas em partes sem a
operação de adição. Durante a compilação, estas partes serão combinadas em uma string longa:
Também Veja
Funções de Conversão, Funções de String, FileOpen, FileR eadString, FileW riteString
Declaração da Estrutura
O tipo de dados estrutura é determinado pela seguinte descrição:
struct structure_name
{
elements_description
};
O nome da estrutura não pode ser usado como um identificador (nome de uma variável ou função).
Deve-se notar que em estruturas MQL5, os elementos seguem um ao outro diretamente, sem
alinhamento. Em C++ tal ordem é feita pelo compilador usando a seguinte instrução:
#pragma pack(1)
Se você quiser ter outro alinhamento na estrutura, use membros auxiliares, " fillers " (preenchedores)
para o tamanho certo.
Exemplo:
struct trade_settings
{
uchar slippage; // valor do tamanho do slippage admissível - 1 byte
char reserved1; // pula 1 byte
short reserved2; // pula 2 bytes
int reserved4; // outros 4 bytes são pulados. garantir um alinhamento de 8 bytes de limite
double take; // valores do preço de fixação de lucro
double stop; // valor do preço de stop de proteção
};
T al descrição de estruturas alinhadas é necess ário somente para transferência de dados para funções
de dll importadas.
Atenção: Este exemplo ilustra dados incorretamente esquematizados. Seria melhor primeiro declarar o
take e stop de grandes volumes de dados do tipo double, e então declarar o membro slippage do tipo
uchar. Neste caso, a representação interna de dados será sempre a mesma, independentemente do
valor especificado no #pragma pack().
Se a estrutura contém variáveis do tipo string e/ou objeto de um array dinâmico, o compilador atribui
um construtor implícito para tal estrutura. Este construtor redefine todos os membros de tipo string
da estrutura e corretamente inicializa objetos do array dinâmico.
Estruturas Simples
· se os objetos são ligados por uma linha herança, isto é, uma estrutura é um descendente de uma
outra estrutura.
Mostraremos isso com ajuda de exemplos, criamos uma estrutura personalizada CustomMqlT ick
idêntica em composição à estrutura construída MqlT ick . O compilador não permitirá tentativas de
copiar e colar os valores do objeto MqlT ick no objeto de tipo CustomMqlT ick . A conversão direta para
o tipo desejado também causará um erro de compilação:
Portanto, resta só uma opção, isto é, copiar e colar os valores dos membros da estrutura elemento por
elemento. Mas, ao fazer isto, é permitido copiar e colar os valores dos objetos do mesmo
tipo CustomMqlT ick .
CustomMqlTick my_tick1,my_tick2;
//--- também é possível copiar e colar objetos da mesma estrutura CustomMqlTick
my_tick2=my_tick1;
//--- criamos uma matriz a partir de objetos da estrutura simples CustomMqlTick e registramos
CustomMqlTick arr[2];
arr[0]=my_tick1;
arr[1]=my_tick2;
Como um teste é chamada a função ArrayPrint() para exibir os valores da matriz arr[], no diário.
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- criamos a mesma estrutura como a construída por MqlTick
struct CustomMqlTick
{
datetime time; // Tempo da última atualização dos preços
double bid; // Preço atual Bid
double ask; // Preço atual Ask
double last; // Preço atual da última transação (Last)
ulong volume; // Volume para o preço atual Last
long time_msc; // Hora da última atualização dos preços em milissegundos
uint flags; // Sinalizadores de ticks
};
//--- por isso copiamos e colamos os membros da estrutura elemento por elemento
my_tick1.time=last_tick.time;
my_tick1.bid=last_tick.bid;
my_tick1.ask=last_tick.ask;
my_tick1.volume=last_tick.volume;
my_tick1.time_msc=last_tick.time_msc;
my_tick1.flags=last_tick.flags;
//--- criamos uma matriz a partir de objetos da estrutura simples CustomMqlTick e registramos
CustomMqlTick arr[2];
arr[0]=my_tick1;
arr[1]=my_tick2;
ArrayPrint(arr);
//--- exemplo de exibição de valores de matriz contendo objetos do tipo CustomMqlTick
/*
[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());
}
O segundo exemplo mostra a possibilidade de copiar e colar estruturas simples segundo linha de
herança. Assumamos que temos uma estrutura básica Animal, da qual são geradas - para herança - as
estruturas Cat e Dog. Nós podemos copiar e colar entre si mesmos os objetos Animal e Cat (ou Animal
e Dog), no entanto não podemos copiar e colar entre sim mesmos Cat e Dog, embora ambos sejam
descendentes da estrutura Animal.
};
//--- estrutura para descrição de gatos
struct Cat: Animal
{
bool home; // raça domestica
};
//--- criamos os objetos das subclasses
Dog dog;
Cat cat;
//--- é possível copiar no ancestral e colar no descendente (Animal ==> Dog)
dog=some_animal;
dog.swim=true; // cães sabem nadar
//--- é impossível copiar e colar objetos de subestruturas (Dog != Cat)
cat=dog; // aqui o compilador gerará um erro
some_animal.fly=false;
some_animal.swim=false;
some_animal.run=true;
//--- criamos os objetos dos subtipos
Dog dog;
Cat cat;
//--- é possível copiar no ancestral e colar no descendente (Animal ==> Dog)
dog=some_animal;
dog.swim=true; // cães sabem nadar
//--- é impossível copiar e colar objetos de subestruturas (Dog != Cat)
//cat=dog; // aqui o compilador gerará um erro
//--- por isso é possível copiar e colar apenas elemento por elemento
cat.head=dog.head;
cat.legs=dog.legs;
cat.wings=dog.wings;
cat.tail=dog.tail;
cat.fly=dog.fly;
cat.swim=false; // gatos não sabem nadar
//--- é possível copiar valores no descendente e colá-los no ancestral
Animal elephant;
elephant=cat;
elephant.run=false;// elefantes não sabem correr
elephant.swim=true;// elefantes nadam
//--- criamos uma matriz
Animal animals[4];
animals[0]=some_animal;
animals[1]=dog;
animals[2]=cat;
animals[3]=elephant;
//--- imprimimos
ArrayPrint(animals);
//--- resultado da execução
/*
[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
*/
}
Outro método para copiar e colar tipos simples consiste em utilizar associações, para fazer isto, os
objetos destas estruturas devem ser membros da mesma associação – veja o exemplo em union.
Exemplo:
struct trade_settings
{
double take; // valor do preço de fixação do lucro
double stop; // valor do preço stop de proteção
uchar slippage; // valor do slippage admissível
};
//--- cria e inicializa uma variável do tipo trade_settings
trade_settings my_set={0.0,0.0,5};
if (input_TP>0) my_set.take=input_TP;
pack([n])
Exemplo:
struct pack(sizeof(long)) MyStruct
{
// membros da estrutura serão alinhados a 8 bytes
};
ou
struct MyStruct pack(sizeof(long))
{
// membros da estrutura serão alinhados a 8 bytes
};
Por padrão, pack (1) é usado para estruturas. Isso significa que na memória os membros da estrutura
estão localizados um após o outro e o tamanho da estrutura é igual à soma dos tamanhos de seus
membros.
Exemplo:
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- estrutura simples sem alinhamento
struct Simple_Structure
{
char c; // sizeof(char)=1
short s; // sizeof(short)=2
int i; // sizeof(int)=4
double d; // sizeof(double)=8
};
//--- declaramos uma instância de uma estrutura simples
Simple_Structure s;
//--- exibimos o tamanho de cada membro da estrutura
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));
//--- verificamos de que o tamanho da estrutura POD é igual à soma dos tamanhos de seus membros
Print("sizeof(simple_structure)=",sizeof(simple_structure));
/*
Resultado:
sizeof(s.c)=1
sizeof(s.s)=2
sizeof(s.i)=4
sizeof(s.d)=8
sizeof(simple_structure)=15
*/
}
O alinhamento dos campos da estrutura pode ser necess ário ao trocar dados com bibliotecas de
terceiros (*.DLL), nas quais é aplicado tal alinhamento.
Vamos exemplificar como funciona o alinhamento. Peguemos a estrutura de quatro membros sem
alinhamento.
Os campos da estrutura serão localizados na memória um após o outro, de acordo com a ordem de
declaração e o tamanho do tipo. T amanho da estrutura igual 15, nos arrays será indefinido o
deslocamento para os campos da estrutura.
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
O tamanho da estrutura foi alterado para que todos os membros de 4 bytes ou mais tivessem um
deslocamento múltiplo de 4 bytes a partir do início da estrutura. Membros menores serão alinhados ao
seu próprio tamanho (por exemplo, 2 para short). Veja que o byte adicionado é mostrado em cinza.
Neste caso, após o membro s.c é adicionado 1 byte, para que o campo s.s (sizeof(short)==2) tenha um
limite de 2 byte (alinhamento para o tipo short).
O deslocamento para o início da estrutura no array também será alinhado a 4 bytes, ou seja, para
Simple_Structure arr[], os endereços dos elementos a[0], a[1], a[n] serão múltiplos de 4 bytes.
Consideremos mais duas estruturas que consistem no mesmo tipo com alinhamento a 4 bytes, mas
cuja ordem de membros é diferente. Na primeira estrutura, os membros são organizados em ordem
ascendente segundo o tamanho do tipo.
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- estrutura simples com alinhamento a 4 bytes
struct CharShortInt pack(4)
{
char c; // sizeof(char)=1
short s; // sizeof(short)=2
int i; // sizeof(double)=4
};
//--- declaramos uma instância de uma estrutura simples
CharShortInt ch_sh_in;
//--- exibimos o tamanho de cada membro da estrutura
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));
//--- verificamos de que o tamanho da estrutura POD é igual à soma dos tamanhos de seus membros
Print("sizeof(CharShortInt)=",sizeof(CharShortInt));
/*
Resultado:
sizeof(ch_sh_in.c)=1
sizeof(ch_sh_in.s)=2
sizeof(ch_sh_in.i)=4
sizeof(CharShortInt)=8
*/
}
Como se pode ver, o tamanho da estrutura é 8 e consiste em dois blocos de 4 bytes cada. No primeiro
bloco, são colocados os campos com tipos char e short, no segundo - o campo com tipo int.
Agora, a partir da primeira estrutura, vamos fazer a segunda, que difere apenas na ordem dos
campos : reorganizamos o tipo de membro short no final.
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- estrutura simples com alinhamento a 4 bytes
struct CharIntShort pack(4)
{
char c; // sizeof(char)=1
int i; // sizeof(double)=4
short s; // sizeof(short)=2
};
//--- declaramos uma instância de uma estrutura simples
CharIntShort ch_in_sh;
//--- exibimos o tamanho de cada membro da estrutura
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));
//--- verificamos de que o tamanho da estrutura POD é igual à soma dos tamanhos de seus membros
Print("sizeof(CharIntShort)=",sizeof(CharIntShort));
/*
Resultado:
sizeof(ch_in_sh.c)=1
sizeof(ch_in_sh.i)=4
sizeof(ch_in_sh.s)=2
sizeof(CharIntShort)=12
*/
}
Embora a estrutura em si não tenha mudado, a alteração na ordem dos membros levou a um aumento
no tamanho da própria estrutura.
Durante a herança, também é preciso levar em conta o alinhamento. Exemplificamos uma estrutura
Parent simples, que possui apenas um membro do tipo char. O tamanho dessa estrutura sem
alinhamento é 1.
struct Parent
{
char c; // sizeof(char)=1
};
Crie uma classe filha Children com adição de um membro do tipo short (sizeof(short)=2).
Como resultado, ao definir o alinhamento como 2 bytes, o tamanho da estrutura será 4, embora o
tamanho dos próprios membros seja 3. Já que sob a classe pai, para Parent serão alocados 2 bytes, de
forma que o acesso ao campo short da classe filha seja alinhado a 2 bytes.
O conhecimento de como a memória é alocada para membros de uma estrutura é necess ário se o
programa MQL5 interage com dados de terceiros escrevendo/lendo no nível do arquivo ou da thread.
A Biblioteca padrão contém funções para trabalhar com funções W inAPI, no catálogo
MQL5\Include\W inAPI. Estas funções usam estruturas com um determinado alinhamento para os casos
em que são necess árias para trabalhar com W inAPI.
offsetof é um comando especial que está diretamente relacionado ao atributo pack . Ele permite obter
o deslocamento do membro a partir do início da estrutura.
Especificador final
A presença do especificador final, ao declarar a estrutura, proíbe a herança a partir dela. Se a
estrutura não precisar de alterações futuras ou se essas alterações não se puderem levar a cabo por
causa de questões de segurança, declare-a usando o especificador final. Além disso, todos os
membros da estrutura também serão implicitamente considerados como final.
Como no exemplo acima, ao tentar herdar a partir da estrutura, usando o modificador final, o
compilador irá emitir um erro:
Classes
As classes diferem das estruturas no seguinte:
· por default (padrão), todos os membros da classe têm especificador de acesso private, a menos que
seja indicado o contrário. Dados -membros da estrutura têm o tipo default de acesso como public, a
menos que seja indicado o contrário;
· objetos de classe sempre tem uma tabela de funções virtuais, mesmo que não existam funções
virtuais declaradas na classe. Estruturas não podem ter funções virtuais ;
· o operador new pode ser aplicado a objetos de classe; o operador this não pode ser aplicado a
estruturas ;
· classes pode ser herdados somente de classes, estruturas pode ser herdados somente de estruturas.
Classes e estruturas podem ter um construtor e destrutor explícitos. Se seu construtor for definido
explicitamente, a inicialização de uma variável de estrutura ou classe usando a seqüência de
inicialização é impossível.
Exemplo:
struct trade_settings
{
double take; // valor do preço de fixação do lucro
double stop; // valor do preço stop de proteção
uchar slippage; // valor do slippage admissível
//--- Construtor
trade_settings() { take=0.0; stop=0.0; slippage=5; }
//--- Destrutor
~trade_settings() { Print("Este é o final"); }
};
//--- Compilador gerará uma mensagem de erro de que a inicialização é impossível
trade_settings my_set={0.0,0.0,5};
Construtores e Destrutores
Um construtor é uma função especial, que é chamada automaticamente ao se criar um objeto de uma
estrutura ou classe e normalmente é usado para inicializar membros da classe. Mais adiante,
falaremos sobre classes, tudo que for dito se aplica também a estruturas, a menos que seja indicado o
contrário. O nome de um construtor deve corresponder ao nome da classe. O construtor não tem tipo
de retorno (você pode especificar o tipo void).
Membros de classe definidos – strings, arrays dinâmicos e objetos que exigem inicialização – serão
inicializados em qualquer caso,independentemente de haver ou não um construtor.
Cada classe pode ter múltiplos construtores, diferindo pelo número de parâmetros e a lista de
inicialização. Um construtor que exige especificação de parâmetros é chamado um construtor
paramétrico.
//+------------------------------------------------------------------+
//| Uma classe para trabalhar com uma data |
//+------------------------------------------------------------------+
class MyDateClass
{
private:
int m_year; // Ano
int m_month; // Mês
int m_day; // Dia do mês
int m_hour; // Hora no dia
int m_minute; // Minutos
int m_second; // Segundos
public:
//--- Construtor default
MyDateClass(void);
//--- Construtor paramétrico
MyDateClass(int h,int m,int s);
};
Um construtor pode ser declarado na descrição da classe e então seu corpo pode ser definido. Por
exemplo, dois construtores de M yDateClasse podem ser definidos da seguinte maneira:
//+------------------------------------------------------------------+
//| Construtor 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__);
}
//+------------------------------------------------------------------+
//| Construtor paramétrico |
//+------------------------------------------------------------------+
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__);
}
No construtor default, todos os membros da classes são preenchidos usando a função T imeCurrent(),
no construtor paramétrico somente os valores de hora são preenchidos. Outros membros da classe
(m_year, m_month and m_day) serão inicializados automaticamente com a data corrente.
O construtor default tem um propósito especial ao inicializar um array de objetos de sua classe. Um
construtor, o qual todos o parâmetros têm valores default, não é um construtor default. Aqui está um
exemplo:
//+------------------------------------------------------------------+
//| Uma classe com um construtor default |
//+------------------------------------------------------------------+
class CFoo
{
string ToString(){return(TimeToString(m_call_time,TIME_DATE|TIME_SECONDS));};
};
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
// CFoo foo; // Esta variação não pode ser utilizada - um construtor default não foi definido
//--- Possíveis opções para criar o objeto CFoo
CFoo foo1(TimeCurrent()); // Uma explicita chamada de um construtor paramétrico
CFoo foo2(); // Uma explícita chamada de um construtor paramétrico com parâmetr
CFoo foo3=D'2009.09.09'; // Uma implícita chamada de um construtor paramétrico
CFoo foo40(foo1); // Uma explicita chamada de um construtor copiador
CFoo foo41=foo1; // Uma implícita chamada de um construtor copiador
CFoo foo5; // Uma explícita chamada de um construtor default (se não existir
// então um construtor paramétrico com um valor default é chamado)
//--- Possíveis opções para criar o objeto CFoo
CFoo *pfoo6=new CFoo(); // Criação dinâmica de um objeto e recepção de um ponteiro para el
CFoo *pfoo7=new CFoo(TimeCurrent());// Outra opções de criação dinâmica de objeto
CFoo *pfoo8=GetPointer(foo1); // Agora pfoo8 aponta para o objeto foo1
CFoo *pfoo9=pfoo7; // pfoo9 e pfoo7 apontam para o mesmo objeto
// CFoo foo_array[3]; // Esta opção não pode ser usado - um construtor default não foi e
//--- Mostra os valores de 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());
//--- Exclui dinamicamente arrays criados
delete pfoo6;
delete pfoo7;
//delete pfoo8; // Você não precisa excluir pfoo8 explicitamente, já que ele aponta para o obje
//delete pfoo9; // Você não precisa excluir pfoo9 explicitamente, já que ele aponta para o mesm
}
//CFoo foo_array[3]; // Esta variante não pode ser usada - um construtor default não está def
ou
//CFoo foo_dyn_array[]; // Esta variante não pode ser usada - um construtor default não está def
então o compilar retorná um erro para eles " default constructor is not defined" (construtor default não
definido).
Se uma classe tiver um construtor definido pelo usuário, o construtor padrão não é gerado pelo
compilador. Isso significa que se um construtor paramétrico é declarado em uma classe, mas um
construtor default não é declarado, você não pode declarar arrays de objetos desta classe. O
compilador retorná um erro para este script:
//+------------------------------------------------------------------+
//| Uma classe sem um construtor default |
//+------------------------------------------------------------------+
class CFoo
{
string m_name;
public:
CFoo(string name) { m_name=name;}
};
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
//--- Obtém o erro "default constructor is not defined" durante compilação
CFoo badFoo[5];
}
Neste exemplo, a classe CFoo tem um construtor paramétrico declarado - em tais casos, o compilador
não cria um construtor default automaticamente durante compilação. Ao mesmo tempo quando você
declara um array de objetos, presume-se que todos os objetos devam se criados e inicializados
automaticamente. Durante a auto-inicialização de um objeto, é necess ário chamar um construtor
default, mas já que o construtor default não foi explicitamente declarado e nem automaticamente
gerado pelo compilador, é impossível criar tal objeto. Por esta razão, o compilador gerou um error na
etapa de compilação.
Existe uma sintaxe especial para inicializar um objeto usando um construtor. Inicializadores de
membros de uma estrutura ou classe (construções especiais para inicialização) podem ser
especificados na lista de inicialização.
Uma lista de inicialização é uma lista de inicializadores separados por vírgulas, que seguem depois do
dois pontos (:), depois da lista de parâmetros de um construtor e precede o corpo (antes da abertura
de chave). Há v ários requisitos :
· A lista de inicialização deve ser seguida por uma definição (implementação) de uma função.
Aqui está um exemplo de v ários construtores para inicializações de membros de uma classe.
//+------------------------------------------------------------------+
//| Uma classe para armazenar o nome de um caractere |
//+------------------------------------------------------------------+
class CPerson
{
string m_first_name; // Primeiro nome
string m_second_name; // Segundo nome
public:
//--- Um construtor default vazio
CPerson() {Print(__FUNCTION__);};
//--- Um construtor paramétrico
CPerson(string full_name);
//--- Um construtor com uma lista de inicialização
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);
}
}
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
//--- Obtém o erro "default constructor is not defined"
CPerson people[5];
CPerson Tom="Tom Sawyer"; // Tom Sawyer
CPerson Huck("Huckleberry","Finn"); // Huckleberry Finn
CPerson *Pooh = new CPerson("Winnie","Pooh"); // Winnie the Pooh
//--- Valores de sáida
Tom.PrintName();
Huck.PrintName();
Pooh.PrintName();
1. Um construtor default explícito, que permite a criação de um array de objetos desta classe;
2. Um construtor com um parâmetro, que recebe um nome completo como um parâmetro e divide
com o nome e segundo nome de acordo com o espaço encontrado;
3. Um construtor com dois parâmetros que contem uma lista de inicialização. Inicializadores -
m_second_name(surname) e m_first_name(name).
Note que a inicialização usando uma lista substitui uma atribuição. Membros individuais devem ser
inicializados como:
Na lista de inicialização, membros podem aparecer em qualquer ordem, mas todos os membros da
classe serão inicializados de acordo com a ordem de sua aparição. Isso significa que no terceiro
construtor, primeiro o membro m_first_name será inicializado, já que ele aparece primeiro, e
somente depois m_second_name será inicializado. Isto será tomado em conta nos casos onde a
inicialização de alguns membros da classe depende dos valores em outros membros da classe.
Se um construtor default não for declarado na base base, e ao mesmo tempo um ou mais construtores
com parâmetros forem declarados, você deve sempre chamar um dos construtores da classe base na
lista de inicialização. Ele é passado com vírgula da mesma forma que membros comuns da lista e será
chamado primeiro durante a inicialização do objeto, não importando onde ele é colocado na lista de
inicialização.
//+------------------------------------------------------------------+
//| A classe base |
//+------------------------------------------------------------------+
class CFoo
{
string m_name;
public:
//--- Um construtor com uma lista de inicialização
CFoo(string name) : m_name(name) { Print(m_name);}
};
//+------------------------------------------------------------------+
//| Uma classe derivada a partir de CFoo |
//+------------------------------------------------------------------+
class CBar : CFoo
{
CFoo m_member; // Um membro de classe é um objeto do pai
public:
//--- O construtor default na lista de inicialização chama o construtor do pai
CBar(): m_member(_Symbol), CFoo("CBAR") {Print(__FUNCTION__);}
};
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
CBar bar;
}
Neste exemplo, ao criar o objeto bar, um construtor default CBar() será chamado, no qual primeiro um
construtor do pai de CFoo é chamado, e então vem um construtor para o membro de classe
m_member.
Um destrutor é uma função especial que é chamado automaticamente quando um objeto de classe é
destruído. O nome do destrutor é escrito como nome de classe precedido de (~). Strings, arrays
dinâmicos e objetos, exigindo desinicialização, serão desinicializados de qualquer forma, não
importando se o destrutor estiver presente ou ausente. Se existir um destrutor, essas ações serão
executadas após chamar o destrutor.
Destrutores são sempre virtuais, não importando se eles são declarados com a palavra-chave virtual
ou não.
Exemplo:
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[]);
virtual bool CheckLeft(int& side_row[]);
virtual bool CheckRight(int& side_row[]);
};
Funções a partir de SetR ightBorder(int border) até Draw() são declarados e definidos diretamente
dentro da classe CT etrisShape.
Exemplo:
//+------------------------------------------------------------------+
//| Construtor da classe básica |
//+------------------------------------------------------------------+
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;
}
//+--------------------------------------------------------------------+
//| Verificação da capacidade de move para baixo (para a varra e 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);
}
Se você precisar de acesso com abertura completa aos membros e/ou métodos de uma classe, use a
palavra-chave public.
Exemplo:
class CTetrisField
{
private:
int m_score; // Contagem
int m_ypos; // Posição corrente das figuras
int m_field[FIELD_HEIGHT][FIELD_WIDTH]; // Boa matriz
int m_rows[FIELD_HEIGHT]; // Numeração das linhas boas
int m_last_row; // Última linha livre
CTetrisShape *m_shape; // Figura Tetris
bool m_bover; // Fim de jogo
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();
};
Quaisquer membros de classe e métodos declarados após o especificador public: (e antes do próximo
especificador de acesso) ficam disponíveis para qualquer referência ao objeto da classe pelo
programa. Neste exemplo, existem os seguintes membros : funções CT etris Field(), Init(), Deinit(),
Down(), Left(), R ight(), R otate() e Drop().
Quaisquer membros de classe e métodos declarados após o especificador private: (e antes do próximo
especificador de acesso) ficam disponíveis somente para as funções -membros desta classe.
Especificadores de acesso a elementos sempre terminam com um dois pontos (:) e podem aparecer na
definição da classe v árias vezes.
Qualquer membro da classe declarado após o especificador de acesso protected: (e antes do próximo
especificador de acesso) está disponível apenas para funções -membro dessa classe e funções -membro
dos herdeiros desta classe. Ao tentar usar membros com especificadores private e protected um erro
será recebido de fora no estágio de compilação. Exemplo:
class A
{
protected:
//--- operador de cópia está disponível apenas na classe A e seus herdeiros
void operator=(const A &)
{
}
};
class B
{
//--- declarado objeto de classe A
A a;
};
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- declaradas duas variáveis do tipo B
B b1, b2;
//--- tentativa de copiar um objeto para outro
b2=b1;
}
Ao compilar esse código, aparecerá uma mensagem de erro — tentativa de chamar o operador de
cópia remoto:
A segunda linha abaixo fornece uma descrição mais detalhada — o operador de cópia na classe B foi
excluído explicitamente, pois foi chamado o operador de cópia indisponível da classe A:
function 'void B::operator=(const B&)' was implicitly deleted because it invokes inaccessible fu
O acesso aos membros de uma classe base pode ser redefinido durante a herança nas classes
derivadas.
Especificador delete
O especificador delete marca funções -membro da classe que não podem ser usadas. Isso significa que
se o programa se referir explícita ou implicitamente a essa função, aparecerá um erro no estágio de
compilação. Por exemplo, esse especificador permite tornar indisponíveis os métodos pai em uma
classe filho. Você pode obter o mesmo resultado se declarar na classe pai uma função na área privada
(declarações na seção private) Use delete, nesse caso, torna o código mais legível e gerenciável no
nível dos herdeiros.
class A
{
public:
A(void) {value=5;};
double GetValue(void) {return(value);}
private:
double value;
};
class B: public A
{
double GetValue(void)=delete;
};
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- declaramos uma variável do tipo A
A a;
Print("a.GetValue()=", a.GetValue());
//--- tentativa de obter um valor de uma variável do tipo B
B b;
Print("b.GetValue()=", b.GetValue()); // o compilador dá um erro nessa linha
}
Mensagem do compilador:
class A
{
public:
void SetValue(double v) {value=v;}
//--- proibimos a chamado com o tipo int
void SetValue(int) = delete;
//--- proibimos o operador de cópia
void operator=(const A&) = delete;
private:
double value;
};
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- declaramos duas variáveis do tipo A
A a1, a2;
a1.SetValue(3); // erro!
a1.SetValue(3.14); // OK
a2=a1; // erro!
}
Especificador final
A presença do especificador final, ao declarar a classe, proíbe a herança a partir dela. Se a interface
da classe não precisar de alterações futuras ou se essas alterações não se puderem levar a cabo por
causa de questões de segurança, declare-a usando o modificador final. Além disso, todos os métodos
da classe também serão implicitamente considerados como final.
Como no exemplo acima, ao tentar herdar a partir da classe, usando o especificador final, o
compilador irá emitir um erro:
Uniães (union)
A união é um tipo de dados especial que compreende uma série de variáveis que compartilham o
mesmo espaço de memória. Assim, a união permite interpretar a mesma sequência de bit de dois (ou
mais) formas diferentes. A declaração de união é semelhante a declarar estruturas e começa com a
palavra-chave union.
union LongDouble
{
long long_value;
double double_value;
};
Mas ao contrário das estruturas, diferentes membros de união pertencem ao mesmo local de memória.
Neste exemplo, é declarada a união Long Double, nela o tipo long e o valor do tipo double compartilham
a mesma região memória. É importante entender que é impossível fazer com que esta associação
armazene ao mesmo tempo um valor inteiro long e um verdadeiro double (como acontecia na
estrutura), porque as variáveis long _value e double_value são sobrepostas (na memória). Mas o
programa MQL5 a qualquer momento pode processar a informação contida nesta união, como um valor
inteiro (long) ou real (double). Assim, a união faz com que seja possível obter duas (ou mais)
variantes de representação da mesma série de dados.
Ao declarar a união, o compilador automaticamente aloca uma área de memória suficiente para
armazenar na união as maiores variáveis de acordo com o volume do tipo. Para acessar o elemento de
união, usa-se a mesma sintaxe como para as estruturas, isto é, operador ponto.
union LongDouble
{
long long_value;
double double_value;
};
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//---
LongDouble lb;
//--- obtemos o número inválido -nan(ind) e exibimo-lo
lb.double_value=MathArcsin(2.0);
printf("1. double=%f integer=%I64X",lb.double_value,lb.long_value);
//--- maior número normalizado (DBL_MAX)
lb.long_value=0x7FEFFFFFFFFFFFFF;
printf("2. double=%.16e integer=%I64X",lb.double_value,lb.long_value);
//--- menor número positivo normalizado (DBL_MIN)
lb.long_value=0x0010000000000000;
printf("3. double=%.16e integer=%.16I64X",lb.double_value,lb.long_value);
}
/* Resultado da execução
1. double=-nan(ind) integer=FFF8000000000000
2. double=1.7976931348623157e+308 integer=7FEFFFFFFFFFFFFF
3. double=2.2250738585072014e-308 integer=0010000000000000
*/
Como as uniões permitem que o programa interprete os mesmos dados na memória de diferentes
maneiras, elas são frequentemente utilizadas em aplicações que requerem uma conversão de tipos
pouco comum.
As uniões não podem participar na herança, além disso, não podem ter membros estáticos por
definição. De resto union comporta-se como uma estrutura, em que todos os membros têm
deslocamento zero. Ao mesmo tempo, os membros de união não podem ser dos seguintes tipos :
· arrays dinâmicas
· strings
· classes de objetos
Como as classes, a união pode ter construtores e destruidores, bem como métodos. Por padrão, os
membros da união têm o tipo de acesso public<t2, para criar um elementos fechados necess árias para
usar a palavra-chave private. T odos esses recursos são mostrados no exemplo que mostra como
converter a cor do tipo color, no formato ARGB, como o faz a função ColorT oARGB().
//+------------------------------------------------------------------+
//| União para conversão de color(BGR) no formato ARGB |
//+------------------------------------------------------------------+
union ARGB
{
uchar argb[4];
color clr;
//--- construtores
ARGB(color col,uchar a=0){Color(col,a);};
~ARGB(){};
//--- métodos públicos
public:
uchar Alpha(){return(argb[3]);};
void Alpha(const uchar alpha){argb[3]=alpha;};
color Color(){ return(color(clr));};
//--- métodos fechados
private:
//+------------------------------------------------------------------+
//| definição de cor e valor do canal-alfa |
//+------------------------------------------------------------------+
void Color(color col,uchar alpha)
{
//--- definimos a cor no membro clr
clr=col;
//--- definimos o valor do componente Alpha, isto é, o nível de opacidade
argb[3]=alpha;
//--- mudamos de lugar os bytes do componente R e B (Red e Blue)
uchar t=argb[0];argb[0]=argb[2];argb[2]=t;
};
};
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- o valor 0x55 significa 55/255=21.6 % (0% - totalmente transparente)
uchar alpha=0x55;
//--- o tipo color têm o formato 0x00BBGGRR
color test_color=clrDarkOrange;
//--- aqui entrarão os valores de bytes a partir da união ARGB
uchar argb[];
PrintFormat("0x%.8X - assim se vê o tipo color para %s, BGR=(%s)",
test_color,ColorToString(test_color,true),ColorToString(test_color));
//--- o tipo ARGB é apresentado como 0x00RRGGBB, mudados de lugar os componentes RR e BB
ARGB argb_color(test_color);
//--- copiamos o array de bytes
ArrayCopy(argb,argb_color.argb);
//--- vemos como fica no formato ARGB
PrintFormat("0x%.8X - presentação ARGB com alfa-canal=0x%.2x, ARGB=(%d,%d,%d,%d)",
argb_color.clr,argb_color.Alpha(),argb[3],argb[2],argb[1],argb[0]);
//--- adicionamos o valor de opacidade
argb_color.Alpha(alpha);
//--- tentamos imprimir ARGB como tipo color
Print("ARGB como color=(",argb_color.clr,") alfa-canal=",argb_color.Alpha());
//--- copiamos o array de bytes
ArrayCopy(argb,argb_color.argb);
//--- assim fica no formato ARGB
PrintFormat("0x%.8X - presentação ARGB com alfa-canal=0x%.2x, ARGB=(%d,%d,%d,%d)",
argb_color.clr,argb_color.Alpha(),argb[3],argb[2],argb[1],argb[0]);
//--- verificamos se é gerada a função ColorToARGB()
PrintFormat("0x%.8X - resultado ColorToARGB(%s,0x%.2x)",ColorToARGB(test_color,alpha),
ColorToString(test_color,true),alpha);
}
/* Resultado da execução
0x00008CFF - assim se vê o tipocolor para clrDarkOrange, BGR=(255,140,0)
0x00FF8C00 - presentação ARGB com alfa-canal=0x00, ARGB=(0,255,140,0)
ARGB como color=(0,140,255) alfa-canal=85
0x55FF8C00 - presentação ARGB com alfa-canal=0x55, ARGB=(85,255,140,0)
0x55FF8C00 - resultado ColorToARGB(clrDarkOrange,0x55)
*/
Interfaces
A interface é projetada para determinar a funcionalidade específica que a classe pode implementar.
Na verdade, essa é uma classe que não pode conter nenhum membro e não pode ter um construtor
e/ou destrutor. T odos os métodos declarados na interface são normalmente virtuais, mesmo sem uma
definição explícita.
};
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- matriz do ponteiro para o objeto do tipo IAnimal
IAnimal *animals[2];
//--- geramos descendente IAnimal e salvamos os ponteiros para eles nas suas matrizes
animals[0]=new CCat;
animals[1]=new CDog;
//--- chamamos o método Sound() da interface base IAnimal para cada descendente
for(int i=0;i<ArraySize(animals);++i)
animals[i].Sound();
//--- removemos objetos
for(int i=0;i<ArraySize(animals);++i)
delete animals[i];
//--- resultado da execução
/*
Cat was born
Dog was born
meou
guaf
Cat is dead
Dog is dead
*/
}
Como as classes abstratas, não se deve criar o objeto da interface sem descendente. A interface pode
ser herdada apenas a partir de outras interfaces e pode se tornar descendente para a classe. Além
disso, a interface sempre tem visibilidade pública.
Veja Também
Programação Orientada a Objetos
Arrays dinâmicos são automaticamente liberados quando ficam além da área de visibilidade do bloco
em que eles foram declarados.
Exemplo:
double matrix[][10][20]; // array dinâmico de 3 dimensões
ArrayResize(matrix,5); // define o tamanha da primeira dimensão
Arrays Estáticos
Quando todas as dimens ões significantes do array são explicitamente especificadas, o compilador pré-
aloca o tamanho de memória necess ário. T al array é chamado estático. Contudo, o compilador aloca
memória adicional para o array dinâmico, que é associado ao buffer estático pré-alocado (parte da
memória para armazenar o array).
A criação de um objeto array dinâmico é devido a possível necessidade de passar este array estático
como parâmetro para alguma função.
Exemplos:
double stat_array[5]; // array estático de uma dimensão
some_function(stat_array);
...
bool some_function(double& array[])
{
if(ArrayResize(array,100)<0) return(false);
...
return(true);
}
Arrays em Estruturas
Quando um array estático é declarado como membro de uma estrutura, um objeto array dinâmico não
é criado. Isso é assim para assegurar compatibilidade com estruturas de dados usados em API's do
W indows.
Contudo, arrays estáticos que são declarados como membros de estruturas, podem também serem
passados para funções em MQL5. Neste caso, quando passar o parâmetro um objeto temporário de um
array dinâmico, conectado com o array estático - membro da estrutura, será criado.
Também Veja
Funções com Arrays, Inicialização de Variáveis, Visibilidade Escopo e T empo de Vida de Variáveis,
Criando e Excluindo Objetos
Linhas sólidas com setas indicam mudanças que são realizadas quase sem nenhuma perda de
informação. Ao invés do tipo char, o tipo bool pode ser usado (ambos ocupam 1 byte de memória), ao
invés do tipo int, o tipo color pode ser usado (4 bytes), ao invés do tipo long, datetime pode ser usado
(ocupa 8 bytes). As quatro linhas cinzentas tracejadas, também com setas, denotam conversão em
que a perda de precisão pode ocorrer. Por exemplo, o número de algarismos em um inteiro igual a
123456789 (int) é maior que o número de algarismos que podem ser representados por um float.
int n=123456789;
float f=n; // o conteúdo de f é igual a 1.234567892E8
Print("n = ",n," f = ",f);
// resultado n= 123456789 f= 123456792.00000
O número convertido em float tem a mesma ordem de grandeza, mas é menos preciso. Convers ões,
no sentido contrário das setas pretas, podem ser realizadas com possível perda de dados. Convers ões
entre char e uchar, short e ushort, int e uint, long e ulong (convers ões para ambos os lados), podem
levar a perda de dados.
Como resultado da conversão de valores de ponto flutuante para o tipo inteiro, a parte fracionária é
sempre excluída. Se você quiser arredondar um float para o inteiro mais próximo (que em muitos
casos é mais útil), você deve usar MathR ound().
Exemplo:
//--- Aceleração gravitacional
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);
/*
Resultado:
round_g = 9
math_round_g = 10
*/
Se dois valores são combinados por um operador binário, antes da execução da operação, o operando
do tipo mais baixo é convertido para o do tipo mais alto, em concordância com a prioridade dada no
esquema abaixo:
Os tipos de dados char, uchar, short, e ushort incondicionalmente são convertido para o tipo int.
Exemplos:
char c1=3;
//--- Primeiro exemplo
double d2=c1/2+0.3;
Print("c1/2 + 0.3 = ",d2);
// Resultado: c1/2+0.3 = 1.3
A expressão calculada consiste de duas operações. No primeiro exemplo, a variável c1 do tipo char é
convertida para uma variável temporária do tipo int, porque o segundo operando da operação de
divisão, a constante 2, é do tipo mais alto, int. Como resultado da divisão de inteiros, 3/2, nós
obtemos o valor 1, que é do tipo inteiro.
Na segunda operação do primeiro exemplo, o segundo operando é a constante 0.3, que é do tipo
double, então o resultado da primeira operação é convertido em uma variável temporária para o tipo
double com o valor 1.0.
No segundo exemplo, a variável c1 do tipo char é convertida para uma variável temporária do tipo
double, porque o segundo operando da operação de divisão, a constante 2.0, é do tipo double;
nenhuma conversão adicional é feita.
var_1 = (type)var_2;
Uma expressão ou resultado de execução de uma função podem ficar no lugar da variável var_2. A
notação funcional de uma conversão explícita é também possível:
var_1 = type(var_2);
double d2=(double)c1/2+0.3;
Print("(double)c1/2 + 0.3 = ",d2);
// Resultado: (double)c1/2+0.3 = 1.80000000
Antes da operação de divisão ser realizada, a variável c1 é explicitamente convertida para o tipo
double. Agora a constante inteira 2 é convertida no valor 2.0 do tipo double, pois o resultado da
conversão do primeiro operando assumiu o tipo double. De fato, a conversão explícita é uma operação
unária.
Além disso, quanto tentar converter tipos, o resultado pode ir além da faixa permitida. Neste caso, o
truncamento ocorre. Por exemplo:
char c;
uchar u;
c=400;
u=400;
Print("c = ",c); // Resultado c=-112
Print("u = ",u); // Resultado u=144
Antes de operações (exceto operações de atribuição) serem realizadas, os dados são convertidos para
o tipo de máxima prioridade. Antes de operações de atribuição serem realizadas, os dados são
convertidos para o tipo destino.
Exemplos:
int i=1/2; // nenhuma conversão, o resultado é 0
Print("i = 1/2 ",i);
double x=1/2; // a expressão do tipo inteiro é convertido para o tipo destino double,
Print("x = 1/2; ",x); // o resultado é 0.0
Ao converter o tipo long /ulong em double, a precisão pode ser perdida caso o valor inteiro seja maior
do que 223372036854774784 ou menor do que -9223372036854774784.
void OnStart()
{
long l_max=LONG_MAX;
long l_min=LONG_MIN+1;
//--- definir o valor inteiro maior, que não perde a precisão ao ser lançado para double
while(l_max!=long((double)l_max))
l_max--;
//--- definir o valor inteiro menor, que não perde a precisão ao ser lançado para double
while(l_min!=long((double)l_min))
l_min++;
//--- resulta no intervalo encontrado para valores inteiro
PrintFormat("Ao converter um valor inteiro para double, ele deve ser "
"dentro [%I64d, %I64d] do intervalo",l_min,l_max);
//--- agora, vamos ver o que acontece se o valor fica fora deste intervalo
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)));
//--- receber o seguinte resultado
// Ao converter um valor integer para double, ele deve estar dentro do intervalo [-9223372036854774
// 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
}
Exemplos:
string s1=1.0/8; // a expressão é convertida para o tipo double,
Print("s1 = 1.0/8; ",s1); // daí é convertida para o tipo string,
// resultado é "0.12500000" (uma string contém 10 caracteres)
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));
gerados a partir de uma única classe base, poderem diferir significativamente um do outro, podemos
criar uma lista ligada (List) com eles, já que vemos eles como objetos do tipo base. Mas o inverso não
é verdade: objetos da classe base não são automaticamente objetos da classe derivada.
Você pode usar a conversão explicita para converter ponteiros da classe base para ponteiros da classe
derivada. Mas você deve estar totalmente confiante na admissibilidade de tal transformação, porque
senão um erro crítico de execução ocorrerá e o programa MQL5 será interrompido.
O parâmetro type-id em colchetes angulares deve ser o ponteiro um tipo de classe definido
anteriormente. O tipo de operando expression (ao contrário de C++) pode ser qualquer um, exceto
void.
Exemplo:
class CBar { };
class CFoo : public CBar { };
void OnStart()
{
CBar bar;
//--- permitida a conversão dinâmica do tipo de ponteiro *bar para o ponteiro *foo
CFoo *foo = dynamic_cast<CFoo *>(&bar); // não acontecerão erros críticos de execução
Print(foo); // foo=NULL
//--- restringida a tentativa de clara conversão dos enlaces do objeto do tipo Bar para o objeto de
foo=(CFoo *)&bar; // acontecerá um erro crítico de execução
Print(foo); // esta linha não será executada
}
Também Veja
T ipos de Dados
A predefinida variável constante NULL é do tipo void. Ele pode ser atribuído a variáveis de qualquer
outro tipo fundamental sem conversão. A comparação de variáveis de tipo fundamental com o valor
NULL é permitida..
Exemplo:
//--- Se a string não é inicializada, então atribua nosso valor predefinido a ela
if(some_string==NULL) some_string="empty";
T ambém NULL pode ser comparado com ponteiros de objetos criados com o operador new.
Também Veja
Variáveis, Funções
Tipos personalizados
A palavra-chave typedef em linguagem C++ permite criar tipos personalizados de dados, basta definir
o nome do tipo de dados para um tipo de dados existente. Ao fazer isto, não é criado um novo tipo de
dados, mas sim é definido um novo nome para o tipo existente. Graças ao uso de tipos
personalizados, você pode tornar o programa mais flexível, basta suficiente alterar as instruções
typedef usando os macros de substituição (#define). Usar os tipos personalizados também pode
melhorar a legibilidade do código, uma vez que, para os tipos de dados padrão, você pode usar seus
próprios nomes descritivos com ajuda de typedef. Formato geral para escrever instruções a fim de
criar um tipo personalizado:
Aqui o elemento tipo representa qualquer tipo de dados v álido, enquanto o elemento novo_nome é o
nome novo para este tipo. É importante notar que o novo nome é definido apenas como um
complemento para o nome existente do tipo e não para substituí-lo. Na linguagem MQL5, você pode
criar um ponteiro para a função, usando typedef.
onde, após a palavra typedef, é definida a assinatura da função, isto é, o número e tipo de
parâmetros de entrada, bem como o tipo de resultado a ser retornado pela função. Aqui está uma
explicação de como criar e usar um ponteiro para uma função:
// --- declaramos o ponteiro para uma função que aceita dois parâmetros do tipo int
typedef int (*TFunc)(int,int);
//--- TFunc é o tipo, e nós podemos declarar o ponteiro-variável para a função
TFunc func_ptr; // ponteiro para a função
//--- declaramos as funções que correspondem à descrição TFunc
int sub(int x,int y) { return(x-y); } // / subtração de um número a partir de outro
int add(int x,int y) { return(x+y); } // adição de dois números
int neg(int x) { return(~x); } // inversão de bits na variável
//--- você pode armazenas o endereço da função na variável func_ptr, para chamá-la no futuro
func_ptr=sub;
Print(func_ptr(10,5));
func_ptr=add;
Print(func_ptr(10,5));
func_ptr=neg; // erro: neg não tem o tipo int (int,int)
Print(func_ptr(10)); // erro: deve haver dois parâmetros
Neste exemplo, à variável func_ptr podem ser atribuídas as funções sub e add, uma vez que cada uma
delas tem dois parâmetros de entrada do tipo int, conforme especificado na definição do ponteiro para
a função TFunc. Aqui à função neg não pode ser atribuído o ponteiro func_ptr, uma vez que sua
assinatura é diferente.
Usando os ponteiros para a função você pode facilmente construir a manipulação de eventos ao criar a
interface personalizada. Mostraremos um exemplo a partir da seção CButton sobre como criar botões e
adicionar neles uma função para processamento do carregamento do botão. Em primeiro lugar,
definimos o ponteiro para a função TAction, ela será chamada pressionando um botão, e criaremos
três funções em conformidade com a descrição TAction.
Logo realizamos a classe M yButton a partir do CButton, em que adicionamos o membro TAction que,
por sua vez, é o ponteiro para a função.
//+------------------------------------------------------------------+
//| Criamos nossa classe de botão com a função de manipulador de eventos |
//+------------------------------------------------------------------+
class MyButton: public CButton
{
private:
TAction m_action; // manipulador de eventos para o gráfico
public:
MyButton(void){}
~MyButton(void){}
//--- construtor com indicação do texto do botão e ponteiro para a função a fim de manipular eve
MyButton(string text, TAction act)
{
Text(text);
m_action=act;
}
//--- definição de função que será chamada a partir do manipulador de eventos OnEvent()
void SetAction(TAction act){m_action=act;}
//--- manipulador padrão de eventos de gráfico
virtual bool OnEvent(const int id,const long &lparam,const double &dparam,const string &spa
{
if(m_action!=NULL & lparam==Id())
{
//--- chamamos o manipulador próprio m_action()
m_action(sparam,(int)lparam);
return(true);
}
else
//--- retornamos o resultado da chamada do manipulador a partir da classe mão CButton
return(CButton::OnEvent(id,lparam,dparam,sparam));
}
};
Em seguida, criamos a classe derivada CControls Dialog a partir da CAppDialog, à qual adicionamos a
matriz m_buttons para armazenas os botões do tipo MyButton, bem como os métodos
AddButton(MyButton &button) e CreateButtons().
//+------------------------------------------------------------------+
//| Classe CControlsDialog |
//| Designação: painel gráfico para controle do aplicativo |
//+------------------------------------------------------------------+
class CControlsDialog : public CAppDialog
{
private:
CArrayObj m_buttons; // matriz de botões
public:
CControlsDialog(void){};
~CControlsDialog(void){};
//--- create
virtual bool Create(const long chart,const string name,const int subwin,const int x1,const
//--- adição de botão
bool AddButton(MyButton &button){return(m_buttons.Add(GetPointer(button)));m_button
protected:
//--- criação de botões
bool CreateButtons(void);
};
//+------------------------------------------------------------------+
//| Criação do objeto CControlsDialog no gráfico |
//+------------------------------------------------------------------+
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());
//---
}
//+------------------------------------------------------------------+
//| defines |
//+------------------------------------------------------------------+
//--- indents and gaps
#define INDENT_LEFT (11) // indent from left (with allowance for borde
#define INDENT_TOP (11) // indent from top (with allowance for border
#define CONTROLS_GAP_X (5) // gap by X coordinate
#define CONTROLS_GAP_Y (5) // gap by Y coordinate
//--- for buttons
#define BUTTON_WIDTH (100) // size by X coordinate
#define BUTTON_HEIGHT (20) // size by Y coordinate
//--- for the indication area
#define EDIT_HEIGHT (20) // size by Y coordinate
//+------------------------------------------------------------------+
//| Criação e adição de botões para o painel CControlsDialog |
//+------------------------------------------------------------------+
bool CControlsDialog::CreateButtons(void)
{
//--- cálculo de coordenadas de botões
int x1=INDENT_LEFT;
int y1=INDENT_TOP+(EDIT_HEIGHT+CONTROLS_GAP_Y);
int x2;
int y2=y1+BUTTON_HEIGHT;
//--- adicionamos os objetos dos botões juntamente com os ponteiros para as funções
AddButton(new MyButton("Open",Open));
AddButton(new MyButton("Save",Save));
AddButton(new MyButton("Close",Close));
//--- criamos os botões 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("Failed to create button %s %d",b.Text(),i);
return(false);
}
//--- adicionamos cada botão no recipiente CControlsDialog
if(!Add(b))
return(false);
}
//--- succeed
return(true);
}
Agora podemos escrever o programa usando o painel de controle CControls Dialog, no qual são criados
3 botões " Open" , " Save" e " Close" . Ao pressionar o botão, é chamada a função correspondente que
está escrita como um ponteiro para a função TAction.
//--- declaramos o objeto no nível global para criá-lo automaticamente ao inciar o programa
CControlsDialog MyDialog;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- agora criamos o objeto no gráfico
if(!MyDialog.Create(0,"Controls",0,40,40,380,344))
return(INIT_FAILED);
//--- executamos o aplicativo
MyDialog.Run();
//--- inicialização bem-sucedida do aplicativo
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- destroy dialog
MyDialog.Destroy(reason);
}
//+------------------------------------------------------------------+
//| Expert chart event function |
//+------------------------------------------------------------------+
void OnChartEvent(const int id, // event ID
const long& lparam, // event parameter of the long type
const double& dparam, // event parameter of the double type
const string& sparam) // event parameter of the string type
{
//--- para os eventos do gráfico, chamamos o manipulador a partir da classe mãe (neste caso, CAppDi
MyDialog.ChartEvent(id,lparam,dparam,sparam);
}
//+------------------------------------------------------------------+
//| Panel_Buttons.mq5 |
//| Copyright 2017, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
}
//+------------------------------------------------------------------+
//| Expert chart event function |
//+------------------------------------------------------------------+
void OnChartEvent(const int id, // event ID
const long& lparam, // event parameter of the long type
const double& dparam, // event parameter of the double type
const string& sparam) // event parameter of the string type
{
//--- para os eventos do gráfico, chamamos o manipulador a partir da classe mãe (neste caso, CAppDi
MyDialog.ChartEvent(id,lparam,dparam,sparam);
}
Veja também
Variáveis, Funções
Ponteiros de Objeto
Em MQL5, existe a possibilidade de dinamicamente criar objetos de tipo complexo. Isso é feito por
meio do operador new, que retorno um descritor do objeto criado. Descritores têm 8 bytes de
tamanho. Sintaticamente, descritores de objeto em MQL5 são similares aos ponteiros em C++.
Exemplos:
MyObject* hobject= new MyObject();
Em contraste com o C++, a variável hobject do exemplo acima não é um ponteiro para memória, mas
sim um descritor de objeto. Além disso, no MQL5 todos os objetos em parâmetros de função devem
ser passados por referência. Abaixo estão exemplos de passar objetos como parâmetros da função:
class Foo
{
public:
string m_name;
int m_id;
static int s_counter;
//--- construtores e desconstrutores
Foo(void){Setup("noname");};
Foo(string name){Setup(name);};
~Foo(void){};
//--- inicializar objetos do tipo Foo
void Setup(string name)
{
m_name=name;
s_counter++;
m_id=s_counter;
}
};
int Foo::s_counter=0;
//+------------------------------------------------------------------+
//| Função de início do programa script |
//+------------------------------------------------------------------+
void OnStart()
{
//--- Declarar um objeto como variável com sua criação automática
Foo foo1;
//--- Variante para passar um objeto por referência
PrintObject(foo1);
//+------------------------------------------------------------------+
Também Veja
Variáveis, Inicialização de Variáveis, Visibilidade Escopo e T empo de Vida de Variáveis, Criando e
Excluindo Objetos
Passar um parâmetro por referência significa passar o endereço da variável, é por isso que todas as
mudanças no parâmetro que é passado por referência será imediatamente refletida na variável
origem. Usando parâmetros passados por referência, pode-se implementar o retorno de v ários
resultados de uma função ao mesmo tempo. A fim de evitar alteração de um parâmetro passado por
referência, use o modificador const.
Assim, se o parâmetro de entrada de uma função for um array, um objeto de classe ou estrutura, o
símbolo '&' é colocado no cabeçalho da função após o tipo da variável e antes de seu nome.
Exemplo
class CDemoClass
{
private:
double m_array[];
public:
void setArray(double &array[]);
};
//+------------------------------------------------------------------+
//| Preenchendo o array |
//+------------------------------------------------------------------+
void CDemoClass::setArray(double &array[])
{
if(ArraySize(array)>0)
{
ArrayResize(m_array,ArraySize(array));
ArrayCopy(m_array, array);
}
}
No exemplo acima, a classe CDemoClass é declarada, e contém o membro array private - m_array[] de
tipo double. A função setArray() é declarada, e o parâmetro array[] é passado por referência. Se o
cabeçalho da função não contém a indicação de passar por referência, isto é, não contém o caractere
" e comercial" (&), uma mensagem de erro será gerada na tentativa de compilar tal código.
Apesar do fato de que um array é passado por referência, não se pode atribuir um array ao outro. Nós
precisamos realizar a cópia elemento a elemento de conteúdo do array origem para o array destino. A
presença de & nas descrições de função é uma condição obrigatória para array e estruturas quando
passado como parâmetro de função.
Palavra-chave this
Uma variável de tipo de classe (objeto) pode ser passado tanto por referência como por ponteiro.
Assim como referência, o ponteiro permite ter acesso a um objeto. Após o ponteiro de objeto ser
declarado, o operador new deve ser aplicado nele para criá-lo e inicializá-lo.
A palavra reservada this é destinado para obter a referência do objeto para si mesmo, que fica
disponível dentro de métodos de classe e estrutura. this sempre referencia o objeto, dentro do
método em que ele é usado, e a expressão GetPointer(this) retorna o ponteiro do objeto, cujo
membro é a função na qual a chamada ao GetPointer() é realizado. Em funções MQL5 não se pode
retornar objetos, mas eles podem retornar ponteiro de objeto.
Assim, se precisamos de uma função para retornar um objeto, nós podemos retornar o ponteiro deste
objeto na forma de GetPointer(this). Vamos adicionar a função getDemoClass() que retorna o ponteiro
do objeto para este classe, na descrição de CDemoClass.
class CDemoClass
{
private:
double m_array[];
public:
void setArray(double &array[]);
CDemoClass *getDemoClass();
};
//+------------------------------------------------------------------+
//| Preenchendo o array |
//+------------------------------------------------------------------+
void CDemoClass::setArray(double &array[])
{
if(ArraySize(array)>0)
{
ArrayResize(m_array,ArraySize(array));
ArrayCopy(m_array,array);
}
}
//+------------------------------------------------------------------+
//| Retorna seu próprio ponteiro |
//+------------------------------------------------------------------+
CDemoClass *CDemoClass::getDemoClass(void)
{
return(GetPointer(this));
}
Estruturas não têm ponteiros, os operadores new e delete não podem ser aplicados a eles,
GetPointer(this) não pode ser usado.
Também Veja
Ponteiros de Objetos, Criando e Excluindo Objetos, Visibilidade Escopo e T empo de Vida de
Variáveis
Operações e Expressões
Alguns caracteres e seqüências de caractere são de uma importância especial. Existem os chamados
símbolos de operação, por exemplo:
Os símbolos de operação são usados em express ões e têm sentido quando operandos apropriados são
dados a eles. Sinais de pontuação são enfatizados, da mesma forma. Existem parênteses, chaves,
vírgula, dois pontos, e ponto e vírgula.
Símbolos de operação, sinais de pontuação, e espaços são usados para separar elementos de
linguagem uns dos outros.
· Express ões
· Operações Aritméticas
· Operações de Atribuição
· Operações de R elação
· Operações Booleanas
· Operações Binárias
· Outras Operações
· R egras de Precedência
Expressões
Uma expressão consiste de um ou mais operandos e símbolos de operação. Uma expressão pode ser
escrita em v árias linhas.
Exemplos:
a++; b = 10; // várias expressões estão localizados em uma linha
//--- uma expressão está dividida em várias linhas
x = (y * z) /
(w + 2) + 127;
Também Veja
R egras de Precedência
Operações Aritméticas
Operações aritméticas incluem operações aditivas e multiplicativas :
Soma de variáveis i = j + 2;
Diferença de variáveis i = j - 3;
Mudança de sinal x = - x;
Produto de variáveis z = 3 * x;
Quociente de divisão i = j / 5;
Resto de divisão minutes = time % 60;
Adicionando 1 ao valor da variável i++;
Adicionando 1 ao valor da variável ++i;
Subtraindo 1 ao valor da variável k--;
Subtraindo 1 do valor da variável --k;
Operações de incremento e decremento são aplicadas somente a variáveis, elas não podem ser
aplicadas a constantes. O prefixo de incremento (++i) e decremento (--k ) são aplicados à variável
imediatamente antes desta variável ser usada em uma expressão.
Pós -incremento (i++) e pós -decremento (k--) são aplicados à variável imediatamente depois da
variável ser usado em uma expressão.
Observação importante
int i=5;
int k = i++ + ++i;
Atualmente, a primeira forma de calcular o pós -decremento (pós -incremento) está implementado no
MQL5. Mas mesmo conhecendo esta peculiaridade, não se recomenda experiências com seu uso.
Exemplos:
int a=3;
a++; // expressão válida
int b=(a++)*3; // expressão inválida
Também Veja
R egras de Precedência
Operações de Atribuição
O valor da expressão que inclui uma dada operação é o valor a esquerda do operando após a
atribuição:
Adicionando x à variável y y += x;
Subtraindo x da variável y y -= x;
Multiplicando a variável y por x y *= x;
Dividindo a variável y por x y /= x;
Resto da divisão da variável y por x y %= x;
Operação AND bit a bit de representações binárias de y e x y &= x;
Operação AND bit a bit de representações binárias de y e x y &= x;
Operação AND bit a bit de representações binárias de y e x y &= x;
Operação OR bit a bit de representações binárias de y e x y |= x;
Operação OR Exclusivo bit a bit de representações binárias de y e x y ^= x;
Operações bit a bit podem ser aplicados somente em inteiros. Ao realizar a operação de deslocamento
lógico da representação de y para direita/esquerda em x bits, os 5 menores dígitos binários do valor
de x são usados, os bits maiores são descartados, isto é, o deslocamento é feito para 0-31 bits.
Pela operação %= (resto da divisão de y por x), o sinal resultante é igual ao sinal do número dividido.
O operador de atribuição pode ser usado v árias vezes em uma expressão. Neste caso o processamento
da expressão é realizado da esquerda para direta:
y=x=3;
Primeiro, a variável x será atribuída o valor 3, então a variável y será atribuída o valor de x, isto é,
também 3.
Também Veja
R egras de Precedência
Operações de Relação
A booleana FALSE é representada pelo valor zero inteiro, enquanto que a booleana TRUE é
representada por qualquer valor não inteiro.
O valor de express ões contendo operações de relação ou operações lógicas é FALSE (0) ou TRUE (1).
True se a é igual a b a == b;
True se a não igual a b a != b;
True se a é menor que b a < b;
True se a não é menor que b a > b;
True se a é menor ou igual a b a <= b;
True se a é maior ou igual a b a >= b;
A igualdade de dois números reais não pode ser comparada. Na maioria dos casos, dois números
aparentemente idênticos podem ser desiguais por causa da diferença de valores na 15 casa decimal. A
fim de comparar corretamente dois números reais, compare a diferença normalizada destes números
com zero.
Exemplo:
bool CompareDoubles(double number1,double number2)
{
if(NormalizeDouble(number1-number2,8)==0) return(true);
else return(false);
}
void OnStart()
{
double first=0.3;
double second=3.0;
double third=second-2.7;
if(first!=third)
{
if(CompareDoubles(first,third))
printf("%.16f e %.16f são iguais",first,third);
}
}
// Resultado: 0.3000000000000000 0.2999999999999998 são iguais
Também Veja
R egras de Precedência
Operações Booleanas
Negação Lógica NOT (!)
Operando da negação lógia (!) deve ser de tipo aritmético. O resultado é TRUE (1), se o valor do
operando é FALSE (0); e é igual a FALSE (0), se o operando difere de FALSE (0).
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
//--- o primeiro exemplo de estimação breve
if(func_false() && func_true())
{
Print("Operação &&: Você nunca verá esta expressão");
}
else
{
Print("Operação &&: Resultado da primeira expressão é falso, então a segunda não é calculada"
}
//--- o segundo exemplo da estimação breve
if(!func_false() || !func_true())
{
Print("Operação ||: Resultado da primeira expressão é verdadeiro,então a segunda não é calcul
}
else
{
Print("Operação ||: Você nunca verá esta expressão");
}
}
//+------------------------------------------------------------------+
Também Veja
R egras de Precedência
Operações Binárias
Complementar de Um
Complementar do valor da variável até um. O valor da expressão contém 1 em todos os dígitos onde o
valor da variável contem 0, e 0 em todos os demais dígitos onde a variável contem 1.
b = ~n;
Exemplo:
char a='a',b;
b=~a;
Print("a = ",a, " b = ",b);
// O resultado será:
// a = 97 b = -98
Se o valor a ser desloca é de um tipo com sinal (signed type), o deslocamento aritmético para direita é
feito, isto é, os dígitos do lado esquerdo liberados serão preenchidos com o valor do bit de sinal (sign
bit) (se o número é positivo, o valor do bit de sinal é 0, se o número é negativo, o valor do bit de sinal
é 1).
x = x >> y;
Exemplo:
char a='a',b='b';
Print("Antes: a = ",a, " b = ",b);
//--- deslocamento para direita
b=a>>1;
Print("Após: a = ",a, " b = ",b);
// O resultado será:
// Antes: a = 97 b = 98
// Após: a = 97 b = 48
x = x << y;
Exemplo:
char a='a',b='b';
Print("Antes: a = ",a, " b = ",b);
//--- deslocamento para a esquerda
b=a<<1;
Print("Após: a = ",a, " b = ",b);
// O resultado será:
// Antes: a = 97 b = 98
// Após: a = 97 b = -62
Não é recomendável deslocar um número maior ou igual de bits que o comprimento da variável
deslocada, porque o resultado de tal operação é indefinido.
Exemplo:
char a='a',b='b';
//--- operação AND
char c=a&b;
Print("a = ",a," b = ",b);
Print("a & b = ",c);
// O resultado será:
// a = 97 b = 98
// a & b = 96
b = x | y;
Exemplo:
char a='a',b='b';
//--- operação OR
char c=a|b;
Print("a = ",a," b = ",b);
Print("a | b = ",c);
// O resultado será:
// a = 97 b = 98
// a | b = 99
b = x ^ y;
Exemplo:
char a='a', b='b';
//--- operação OR Exclusivo
char c=a^b;
Print("a = ",a," b = ",b);
Print("a ^ b = ",c);
// O resultado será:
// a = 97 b = 98
// a ^ b = 3
Também Veja
R egras de Precedência
Outras Operações
Indexação ( [] )
Ao endereçar o i-ésimo elemento de um array, o valor da expressão é o valor da variável com o
número serial i.
Exemplo:
array[i] = 3; // Atribui o valor de 3 ao i-ésimo elemento do array.
Somente um inteiro pode ser índice de um array. São permitidos arrays com 4 dimens ões ou menos.
Cada medida é indexada de 0 ao tamanho da medida - 1. Em particular, para um array de uma
dimensão consistindo de 50 elementos, a referência ao primeiro elemento se assemelhará a array[0],
e a referência ao último elemento será array[49].
Ao endereçar além do array, o subsistema em execução gerará um erro crítico, e o programa será
interrompido.
O valor da expressão é o valor retornado pela função. Se o valor retornado é do do tipo void, a
chamada da função não pode ser colocada a direita de um operador de atribuição. R epare que a ordem
de execução x 1, ..., xn é garantida.
Exemplo:
int length=1000000;
string a="a",b="b",c;
//--- Outras Operações
int start=GetTickCount(),stop;
long i;
for(i=0;i<length;i++)
{
c=a+b;
}
stop=GetTickCount();
Print("tempo para 'c = a + b' = ",(stop-start)," milissegundos, i = ",i);
Operação Vírgula ( , )
Express ões separadas por vírgulas são executadas da esquerda para direita. T odos os efeitos
colaterais do cálculo da expressão a esquerda podem aparecer antes da expressão a direita ser
calculada. O tipo do resultado e o valor coincidem com aqueles da expressão a direita. A lista de
parâmetros a ser passada (seja acima) pode ser considerada como um exemplo.
Exemplo:
Operador Ponto ( . )
Para o acesso direto a membros públicos de estruturas e classes, a operação ponto é usada. Sintaxe:
Nome_da_variável_do_tipo_estrutura.Nome_do_membro
Exemplo:
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 não existir nenhum nome de escopo, isto é uma orientação explícita para usar o escopo global. Se
não existir nenhuma operação de resolução de escopo, a função é procurada no escopo mais próximo.
Se não existir nenhuma função no escopo local, a procura é conduzida no escopo global.
type Class_name::Function_name(parameters_description)
{
// corpo da função
}
1. Métodos de classe. Se nenhuma função com o nome especificado for definida na classe, mova para
o próximo nível.
2. Funções do MQL5. Se o idioma não tiver essa função, v á para o próximo nível.
3. Funções globais definidas pelo usuário. Se nenhuma função com o nome especificado for
encontrada, mova para o próximo nível.
4. Funções importadas. Se nenhuma função com o nome especificado for encontrada, o compilador
retornará um erro.
Para evitar a ambig üidade de chamadas de função, sempre explicitamente especificar o escopo de
função usando a operação de resolução de escopo.
Exemplo:
#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());
}
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
//---
CCheckContext2 test;
test.Print();
}
//+------------------------------------------------------------------+
Exemplo:
sizeof(expression)
Qualquer identificador, ou nome de tipo entre colchetes pode ser usado como uma expressão. Observe
que o nome tipo void não pode ser usado, e o identificar não pode pertencer ao campo de bits, ou ser
um nome de função.
Se a expressão for o nome de um array estático (isto é, a primeira dimensão é dada), então o
resultado é o tamanho do array inteiro (isto é, o produto do número de elementos e o comprimento do
tipo. Se a expressão é o nome de um array dinâmico (a primeira dimensão não é especificada), o
resultado será o tamanho do objeto do array dinâmico.
Exemplo:
struct myStruct
{
char h;
int b;
double f;
} str;
Print("sizeof(str) = ",sizeof(str));
Print("sizeof(myStruct) = ",sizeof(myStruct));
Veja Também
R egras de Precedência
Regras de Precedência
Cada grupo de operações na tabela tem a mesma prioridade. Quanto mais alta a prioridade de
operações, mais alta é a posição do grupo na tabela. As regras de precedência determinar o
agrupamento de operações e operandos.
Para mudar a ordem de execução de operação, são usados parênteses, que são de prioridade mais
alta.
Operadores
Operadores de linguagem descrevem algumas operações algorítmicas que devem ser executadas para
se realizar uma tarefa. O corpo do programa é uma seqüência de tais operadores. Operadores, um a
um, são separados por ponto e vírgula.
Operador Descrição
Operador Composto {} Um ou mais operadores de qualquer tipo, entre
chaves {}
if-else operador condicional É usado quando é necess ário fazer uma escolha
Um operador pode ocupar uma ou mais linhas. Dois ou mais operadores podem ser colocados na
mesma linha. Operadores que controlam a ordem de execução (if, if-else, switch, while e for) podem
ser aninhados (encaixados) um no outro.
Exemplo:
if(Month() == 12)
if(Day() == 31) Print("Feliz Ano Novo!");
Também Veja
Inicialização de Variáveis, Visibilidade Escopo e T empo de Vida de Variáveis, Criando e Excluindo
Objetos
Operador Composto
Um operador composto (um bloco) consiste de um ou mais operadores de qualquer tipo, entre chaves
{}. A chave de fechamento deve ser seguida por dois pontos (;).
Exemplo:
if(x==0)
{
Print("posição inválida x = ",x);
return;
}
Também Veja
Inicialização de Variáveis, Visibilidade Escopo e T empo de Vida de Variáveis, Criando e Excluindo
Objetos
Operador de Expressão
Qualquer expressão seguida por ponto e vírgula (;) é o operador. Aqui estão alguns exemplos de
operadores de expressão.
Operador de Atribuição
Identificador = expressão;
x=3;
y=x=3;
bool equal=(x==y);
Um operador de atribuição pode ser usado muitas vezes em uma expressão. Neste caso, o
processamento da expressão é realizado da direita para a esquerda.
FileClose(file);
Operador Empty
Consiste somente de um ponto e vírgula (;) e é usado para denotar um corpo vazio de um operador de
controle.
Veja Também
Inicialização de Variáveis, Visibilidade Escopo e T empo de Vida de Variáveis, Criando e Excluindo
Objetos
Operador return
O operador return finaliza a execução da função corrente e retorna o controle para o programa
chamador. O resultado do cálculo da expressão é retornado para a função chamadora. A expressão
pode conter um operador de atribuição.
Exemplo:
int CalcSum(int x, int y)
{
return(x+y);
}
Em funções com o tipo de retorno void, o operador return sem expressão deve ser usada:
void SomeFunction()
{
Print("Olá!");
return; // este operador pode ser removido
}
A chave direita da função ("}" ) significa execução implícita do operador return sem expressão.
Pode ser retornado: tipos simples, estruturas simples, ponteiros de objetos. Com o operador return
não se pode retornar arrays, objetos de classe, variáveis de tipo estrutura composta.
Também Veja
Inicialização de Variáveis, Visibilidade Escopo e T empo de Vida de Variáveis, Criando e Excluindo
Objetos
if (expressão)
operador1
else
operador2
A parte else do operador if pode ser omitida. Assim, uma diverg ência pode aparecer em operadores
aninhados (encaixados) if com omissão da parte else. Neste caso, o else se refere ao operador
anterior if mais próximo no mesmo bloco que não tem a parte else.
Exemplos:
//--- A parte else refere-se ao segundo operador if:
if(x>1)
if(y==2) z=5;
else z=6;
//--- A parte else refere-se ao primeiro operador if:
if(x>l)
{
if(y==2) z=5;
}
else z=6;
//--- Operadores aninhados
if(x=='a')
{
y=1;
}
else if(x=='b')
{
y=2;
z=3;
}
else if(x=='c')
{
y=4;
}
else Print("ERROR");
Também Veja
Inicialização de Variáveis, Visibilidade Escopo e T empo de Vida de Variáveis, Criando e Excluindo
Objetos
Operador Ternário ?
A forma geral do operador ternário é a seguinte:
Para o primeiro operando - " expressão1" - qualquer expressão que resulte em um valor do tipo bool
pode ser usado. Se o resultado é true, então o operador definido pelo segundo operando, isto é,
" expressão2" , é executado.
Se o primeiro operando é false, o terceiro operando - " expressão3" é executado. Os segundo e terceiro
operandos, isto é, " expressão2" e " expressão3" devem retornar valores de algum tipo e não devem ser
do tipo void. O resultado da execução do operador condicional é o resultado de expressão2 ou o
resultado de expressão3, dependendo do resultado de expressão1.
//--- diferença normalizada entre preços de abertura e fechamento para intervalo de um dia
double true_range = (High==Low)?0:(Close-Open)/(High-Low);
double true_range;
if(High==Low)true_range=0; // se o Máximo e o Mínimo são iguais
else true_range=(Close-Open)/(High-Low); // se a faixa não é nula
1. Não confunda o tipo user-defined (definida pelo usuário) com o tipo simples ou enumerador. NULL
pode ser usado para ponteiro.
2. Se os tipos dos valores são simples, o operador será do tipo máximo (veja Conversão de T ipos
(type casting)).
3. Se algum dos valores é uma enumeração e o segundo valor é de um tipo numérico, a enumeração é
substituída por int e a segunda regra é aplicada.
4. Se ambos os valores são enumerações, seus tipos devem ser idênticos, e o operador será do tipo
enumeração.
Observação
Cuidado ao usar o operador condicional como um argumento de uma função de sobrecarga, porque o
tipo do resultado de um operador condicional é definido na durante a compilação do programa. E este
tipo é definido como a maior dos tipos " expression2" e " expression3" .
Exemplo:
void func(double d) { Print("double argumento: ",d); }
void func(string s) { Print("string argumento: ",s); }
bool Expression1=true;
double Expression2=M_PI;
string Expression3="3.1415926";
void OnStart()
{
func(Expression2);
func(Expression3);
// Resultado:
// double argumento: 3.141592653589793
// string argumento: 3.1415926
// string argumento: 3.141592653589793
// string argumento: 3.1415926
Também Veja
Inicialização de Variáveis, Visibilidade Escopo e T empo de Vida de Variáveis, Criando e Excluindo
Objetos
Operador switch
Compara o valor da expressão com constantes em todas as variantes de case e passa o controle para o
operador, que corresponde ao valor da expressão. Cada variante de case pode ser marcada com uma
constante inteira, uma constante literal ou uma expressão constante. A expressão constante não pode
conter variáveis ou chamadas de função. A expressão do operador switch deve ser do tipo inteiro – int
ou uint.
switch(expressão)
{
case constantes: operadores
case constantes: operadores
...
default: operadores
}
Operadores marcados pelo rótulo default são executados se nenhuma das constantes nos operadores
case forem iguais ao valor da expressão. A variante default não precisa ser necessariamente
declarada e não precisa ser necessariamente ser a último. Se nenhuma das constantes corresponder ao
valor da expressão e a variante default não estiver presente, nenhuma ação será executada.
A palavra-chave case com uma constante são apenas rótulos, e se operadores forem executados para
alguma variante case, o programa continuará a executar os operadores de todas as subseqüentes
variantes até que o operador break ocorra. Isso permite vincular uma seqüência de operadores com
v árias variantes.
Uma expressão constante é calculada durante a compilação. Duas constantes em um operador switch
não podem ter o mesmo valor.
Exemplos:
//--- Primeiro exemplo
switch(x)
{
case 'A':
Print("CASE A");
break;
case 'B':
case 'C':
Print("CASE B ou C");
break;
default:
Print("NOT A, B ou 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
*/
Também Veja
Inicialização de Variáveis, Visibilidade Escopo e T empo de Vida de Variáveis, Criando e Excluindo
Objetos
while(expression)
operador;
Observação
Se é esperado que um grande número de iterações seja tratado por um loop, é recomendável que se
verifique a ocorrência de uma finalização de programa forçada usando a função IsStopped().
Exemplo:
while(k<n && !IsStopped())
{
y=y*x;
k++;
}
Também Veja
Inicialização de Variáveis, Visibilidade Escopo e T empo de Vida de Variáveis, Criando e Excluindo
Objetos
expressão1;
while(expressão2)
{
operador;
expressão3;
};
Quaisquer das três ou todas as três express ões podem estar ausentes no operador for, mas o ponto e
vírgula (;) que as separada não pode ser omitido. Se expressão2 é omitida, ela é considerada como
verdadeira. O operador for(;;) é um loop contínuo, equivalente ao operador while(1). As express ões 1
e 3 podem consistir de v árias express ões combinadas por um operador vírgula ','.
Observação
Se é esperado que um grande número de iterações seja tratado por um loop, é recomendável que se
verifique a ocorrência de uma finalização de programa forçada usando a função IsStopped().
Exemplos:
for(x=1;x<=7000; x++)
{
if(IsStopped())
break;
Print(MathPower(x,2));
}
//--- Outro exemplo
for(;!IsStopped();)
{
Print(MathPower(x,2));
x++;
if(x>10) break;
}
//--- Terceiro exemplo
for(i=0,j=n-l;i<n && !IsStopped();i++,j--) a[i]=a[j];
Também Veja
do
operador;
while(expression);
Primeiro o operador é executado, então a expressão é calculada. Se a expressão for verdadeira, então
o operador é executado novamente, e assim por diante. Se a expressão se tornar falsa, o loop
termina.
Observação
Se é esperado que um grande número de iterações seja tratado por um loop, é recomendável que se
verifique a ocorrência de uma finalização de programa forçada usando a função IsStopped().
Exemplo:
//--- Calcula a série de 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++; // Sem este operador um loop infinito aparecerá!
}
while(i<counterFibonacci && !IsStopped());
Também Veja
Inicialização de Variáveis, Visibilidade Escopo e T empo de Vida de Variáveis, Criando e Excluindo
Objetos
Operador break
O operador break finaliza a execução do operador aninhado (encaixado) switch, while, do-while ou for
mais próximo. O controle é passado ao operador que se segue a aquele finalizado. Um dos propósitos
deste operador é finalizar a execução de loop quando um certo valor é atribuído a uma variável.
Exemplo:
//--- buscando pelo primeiro elemento zero
for(i=0;i<array_size;i++)
if(array[i]==0)
break;
Também Veja
Inicialização de Variáveis, Visibilidade Escopo e T empo de Vida de Variáveis, Criando e Excluindo
Objetos
Operador continue
O operador continue passa o controle para o começo do próximo loop do operador while, do-while ou
for mais próximo, executando a próxima iteração. O propósito deste operador é oposto ao do
operador break .
Exemplo:
//--- Soma de todos os elementos não-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);
}
Também Veja
Inicialização de Variáveis, Visibilidade Escopo e T empo de Vida de Variáveis, Criando e Excluindo
Objetos
O operador new pode ser aplicado somente a objetos de classe. Ele não pode ser aplicado a estruturas.
O operador não deve ser usado para criar arrays de objetos. Para fazer isso, use a função
ArrayR esize().
Exemplo:
//+------------------------------------------------------------------+
//| Criação de Figura |
//+------------------------------------------------------------------+
void CTetrisField::NewShape()
{
m_ypos=HORZ_BORDER;
//--- cria aleatoriamente uma das 7 possíveis formas
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;
}
//--- desenhar
if(m_shape!=NULL)
{
//--- pré-configurações
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();
}
//---
}
Deve ser notado que um descritor do objeto não é um ponteiro para um endereço de memória.
Um objeto criado com o operador new deve ser explicitamente removido usando o operador delete.
Também Veja
Exemplo:
//--- exclui figura
delete m_shape;
m_shape=NULL;
//--- criar uma nova figura
NewShape();
Também Veja
Inicialização de Variáveis, Visibilidade Escopo e T empo de Vida de Variáveis, Criando e Excluindo
Objetos
Funções
T oda tarefa pode ser dividida em sub-tarefas, cada qual podendo ser representada tanto na forma de
código, como ser divida em sub-tarefas ainda menores. Este método é chamado de refinamento passo
a passo.. Funções são usadas para escrever o código das sub-tarefas a serem resolvidas. O código que
descreve o que uma função faz é chamado de definição de função:
function_header
{
instruções
}
T udo que está antes da primeira chave é o cabeçalho (header) da definição de função, e o que está
entre as chaves é o corpo (body) da definição de função. O cabeçalho de função (function header)
inclui a descrição do tipo de valor de retorno, o nome (identificador) e os parâmetros formais. O
número de parâmetros passados para a função é limitado e não pode exceder 64.
A função pode ser chamada de outras partes do programa quantas vezes forem necess árias. Na
verdade, o tipo de retorno, o identificador da função e os tipos de parâmetros constituem o protótipo
da função.
Protótipo de função é a declaração da função, mas não a sua definição. Devido a declaração explícita
do tipo de retorno e da lista dos tipos de argumentos, a verificação estrita de tipo e a implícita
conversão de tipo (typecasting) são possíveis durante as chamadas de função. Muito freqüentemente
declarações de funções são usadas em classes para melhorar a legibilidade do código.
As definições de função devem corresponder exatamente à sua declaração. Cada função declarada
deve ser definida.
Exemplo:
double // tipo do valor de retorno
linfunc (double a, double b) // nome da função e lista de parâmetros
{
// operador composto
return (a + b); // valor do retorno
}
O operador return pode retornar o valor de uma expressão localizada neste operador. Se necess ário, o
valor da expressão é convertido para o tipo do resultado da função. Pode ser retornado: tipos simples,
estruturas simples, ponteiros de objetos. Com o operador return não se pode retornar arrays, objetos
de classe, variáveis de tipo estrutura composta.
Uma função que não retorna nenhum valor deve ser descrita como do tipo void.
Exemplo:
void errmesg(string s)
{
Print("erro: "+s);
}
Parâmetros passado para a função podem ter valores default (padrão), que são definidos por
constantes daquele tipo.
Exemplo:
int somefunc(double a,
double d=0.0001,
int n=5,
bool b=true,
string s="string transmitida")
{
Print("Parâmetro obrigatório a = ",a);
Print("Transmitir os seguintes parâmetros: d = ",d," n = ",n," b = ",b," s = ",s);
return(0);
}
Se algum dos parâmetros tem um valor default, todos os parâmetros subseqüentes devem também ter
valores default.
Também Veja
Sobrecarga (Overload), Funções Virtuais, Polimorfismo
Chamada de Função
Se um nome, que não foi descrito antes, aparece em uma expressão e é seguido pelo parêntesis de
abertura, ele é considerado contextualmente como o nome de uma função.
Argumentos (parâmetros formais) são passados por valor, isto é, cada expressão x 1,.., xn é
calculada, e os valores são passados para a função. A ordem de cálculo das express ões e a ordem de
carregamento dos valores não são garantidos. Durante a execução, o sistema verifica o número e o
tipo dos argumentos passados para a função. T al forma de abordar uma função é chamada de uma
chamada de valor.
Chamada de função é uma expressão, cujo valor é o valor retornado pela função. O tipo da função
descrito acima deve corresponder com o tipo do valor de retorno. Uma função pode ser declarada ou
descrita em qualquer parte do programa no escopo global, isto é, fora de outras funções. Uma função
não pode ser declarada ou descrita dentro de outra função.
Exemplos:
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);
}
Na chamada de uma função com parâmetros default, a lista de parâmetros a serem passados pode ser
limitada, mas não antes do primeiro parâmetro default.
Exemplos:
void somefunc(double init,
double sec=0.0001, //define valores default
int level=10);
//...
somefunc(); // Chamada errada. O primeiro parâmetro deve estar presente.
somefunc(3.14); // Chamada correta
somefunc(3.14,0.0002); // Chamada correta
somefunc(3.14,0.0002,10); // Chamada correta
Ao chamar uma função, não se pode pular parâmetros, mesmo aqueles que têm valores default:
Também Veja
Sobrecarga (Overload), Funções Virtuais, Polimorfismo
Passando Parâmetros
Existem pois métodos pelo qual a linguagem de máquina pode passar argumentos para um
subprograma (função). O primeiro método é enviar um parâmetro por valor. Este método copia o valor
do argumento para um parâmetro formal de função. Portanto, quaisquer mudanças neste parâmetro
ocorridas dentro da função não têm influência no correspondente argumento usado na chamada da
função.
//+------------------------------------------------------------------+
//| Passando parâmetros por valor |
//+------------------------------------------------------------------+
double FirstMethod(int i,int j)
{
double res;
//---
i*=2;
j/=2;
res=i+j;
//---
return(res);
}
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
//---
int a=14,b=8;
Print("a e b antes chamada:",a," ",b);
double d=FirstMethod(a,b);
Print("a e b após chamada:",a," ",b);
}
//--- Resultado da execução do script
// a e b antes chamada: 14 8
// a e b após chamada: 14 8
O segundo método é passar por referência. Neste caso, a referência para um parâmetro (não seu
valor) é passada para um parâmetro de função. Dentro da função, ele é usado para referenciar o
verdadeiro parâmetro especificado na chamada. Isso significa que mudanças no parâmetro afetarão o
argumento usado na chamada da função.
//+------------------------------------------------------------------+
//| Passando parâmetros por referência |
//+------------------------------------------------------------------+
double SecondMethod(int &i,int &j)
{
double res;
//---
i*=2;
j/=2;
res=i+j;
//---
return(res);
}
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
//---
int a=14,b=8;
Print("a e b antes chamada:",a," ",b);
double d=SecondMethod(a,b);
Print("a e b após chamada:",a," ",b);
}
//+------------------------------------------------------------------+
//--- resultado da execução do script
// a e b antes chamada: 14 8
// a e b após chamada: 28 4
MQL5 usa ambos os métodos, com uma exceção, arrays, variáveis tipo estrutura e objetos de classe
são sempre passados por referência. A fim de evitar modificações nos parâmetros reais (argumentos
passados na chamada da função) use o especificador de acesso const. Ao se tentar modificar o
conteúdo de uma variável declarada com o especificador const, o compilador gerará um erro.
Observação
Deve se notar que os parâmetros são passados para uma função em ordem inversa, ou seja, o último
parâmetro é calculado e passado primeiro, depois o último mas apenas um, etc. O último parâmetro
calculado e passado é aquele que está em primeiro lugar depois da abertura dos parênteses.
Exemplo:
void OnStart()
{
//---
int a[]={0,1,2};
int i=0;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void func(int par1,int par2,string comment)
{
Print(comment,": par1 = ",par1," par2 = ",par2);
}
Na primeira chamada (ver exemplo acima) a variável i é usada pela primeira vez na concatenação de
strings :
Aqui o valor não muda. Então a variável i é usada no cálculo do elemento do array a[i++], ou seja,
quando o elemento do array com índice i é acessado, a variável i é incrementada. E só depois disso o
primeiro parâmetro com valor alterado da variável i é calculado.
Na segunda chamada o mesmo valor de i (calculado sobre a primeira fase da função chamada) é
utilizado no cálculo de todos os três parâmetros. Somente depois de os primeiros parâmetros serem
calculados, a variável i é alterada novamente.
Também Veja
Escopo de visibilidade e tempo de vida das variáveis, Sobrecarga, Funções Virtuais, Polimorfismo
Sobrecarga de Função
Geralmente, o nome da função tende a refletir seu propósito principal. Como regra, programas
legíveis contém v ários identificadores bem selecionados. Às vezes, funções diferentes são usados
para os mesmos propósitos. Vamos considerar, por exemplo, uma função que calcula o valor médio de
um array de números de dupla precisão e a mesma função, mas operando com um array de inteiros.
Ambas são convenientemente chamadas de AverageFromArray:
//+------------------------------------------------------------------+
//| O cálculo de média de um array de 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]; // Soma para o tipo double
}
aver=sum/size; // Apenas divide a soma pelo número
//---
Print("Cálculo da média para um array do tipo double");
return aver;
}
//+------------------------------------------------------------------+
//| O cálculo de média para um array de 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]; // Soma para o tipo int
}
aver=(double)sum/size;// Fornece uma quantidade de tipo double, e divide
//---
Print("Cálculo da média para um array do tipo int");
return aver;
}
O compilador seleciona a função necess ária de acordo com os tipos dos argumentos e suas
quantidades. A regra, que define a escolha a ser feita, é chamada de algoritmo de correspondência de
assinatura. Um assinatura é uma lista de tipos usados na declaração da função.
Exemplo:
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
//---
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);
}
//--- Resultado do script
// Calcula a média para um array de tipo int
// Calcula a média para um array de tipo double
// int_aver= 3.00000000 double_aver= 3.30000000
Sobrecarga de função é um processo de criar v árias funções com o mesmo nome, mas com diferentes
parâmetros. Isso significa que em variantes sobrecarregadas de uma função, o número de argumentos
e/ou seus tipos devem ser diferentes. Um variante de função específica é selecionada baseada na
correspondência entre lista de argumentos ao chamar a função com a lista de parâmetros na
declaração da função.
Quando uma função sobrecarregada é chamada, o compilador deve ter uma algoritmo para selecionar
a função apropriada. O algoritmo que realiza esta escolha depende da conversão de quais tipos
estiverem presentes. A melhor correspondência deve ser única. Uma função sobrecarregada deve ser a
melhor correspondência dentre todas as outras variantes para ao menos um argumento. Ao mesmo
tempo, ela não deve ser pior que as outras variantes para todos os outros argumentos.
O incremento de tipo padrão é melhor que outras convers ões padrão. Incremento é a conversão de
float para double, de bool, char, short ou enum para int. Conversão de tipo de arrays de tipos inteiros
similares também pertencem a conversão de tipo. T ipos similares são: bool, char, uchar, já que todos
os três tipo são inteiros de único bytes, inteiros de duplo byte short e ushort; inteiros de 4 bytes int,
uint, e color; long, ulong e datetime.
Claro que a estrita correspondência é a melhor. Para alcançar tal consistência conversão de tipo
(typecasting) pode ser usada. O compilador não pode lidar com situações ambíguas. Portanto você não
deve confiar em diferenças sutis de tipos e convers ões implícitas que tornam a função sobrecarregada
não clara.
A sobrecarga de funções de sistema é permitida, mas deve-se observar que o compilador é capaz de
selecionar com precisão a função necess ária. Por exemplo, podemos sobrecarregar o sistema da
função MathMax() de 4 maneiras diferentes, mas apenas duas variantes são corretas.
Exemplo:
// 1. sobrecarga é permitida - função difere da função embutida MathMax() em número de parâmetros
double MathMax(double a,double b,double c);
Também Veja
Sobrecarga (Overload), Funções Virtuais, Polimorfismo
Sobrecarga de Operação
Para facilitar a leitura e escrita de código, a sobrecarga de algumas operações é permitida. O
operador de sobrecarga é escrito usando a palavra-chave operator. Os seguintes operadores podem
ser sobrecarregados :
· binário +,-,/,*,%,<<,>>,==,!=,<,>,<=,>=,=,+=,-=,/=,*=,%=,&=,|=,^=,<<=,>>=,&&,||,&,|,^
· unário +,-,++,--,!,~
· operador de atribuição =
· operador de indexação []
Sobrecarga de operação permite o uso da notação de operação (escrita na forma de express ões
simples) para objetos complexos - estruturas e classes. Escrevendo express ões usando operações de
sobrecarga simplifica a visualização do código fonte, porque uma implementação mais complexa fica
escondida.
Por exemplo, considere números complexos, que consistem de partes real e imaginária. Eles são
amplamente utilizados na matemática. A linguagem MQL5 não tem um tipo de dado que represente
números complexos, mas é possível criar um novo tipo de dado na forma de uma estrutura ou classe.
Declare a estrutura complexa e defina quatro métodos que implementam as quatro operações
aritméticas :
//+------------------------------------------------------------------+
//| Uma estrutura para operações com números complexos |
//+------------------------------------------------------------------+
struct complex
{
double re; // Parte real
double im; // Parte imaginário
//--- Construtores
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) { }
//--- Operações Aritméticas
complex Add(const complex &l,const complex &r) const; // Adição
complex Sub(const complex &l,const complex &r) const; // Subtração
complex Mul(const complex &l,const complex &r) const; // Multiplicação
complex Div(const complex &l,const complex &r) const; // Divisão
};
Agora, em nosso código nós podemos declarar variáveis representando números complexos, e
trabalhar com eles.
Por exemplo:
void OnStart()
{
//--- Declara e inicialize variáveis de um tipo complexo
complex a(2,4),b(-4,-2);
PrintFormat("a=%.2f+i*%.2f, b=%.2f+i*%.2f",a.re,a.im,b.re,b.im);
//--- Soma dois números
complex z;
z=a.Add(a,b);
PrintFormat("a+b=%.2f+i*%.2f",z.re,z.im);
//--- Multiplica dois números
z=a.Mul(a,b);
PrintFormat("a*b=%.2f+i*%.2f",z.re,z.im);
//--- Dividir dois números
z=a.Div(a,b);
PrintFormat("a/b=%.2f+i*%.2f",z.re,z.im);
//---
}
Mas seria mais conveniente usar os operadores usuais " +" , "-" , "*" e "/" para operações aritméticas
comuns com números complexos.
A palavra-chave operator é usado para definir uma função membro que realiza conversão de tipo.
Operações unárias e binárias para variáveis de objeto de classe podem ser sobrecarregadas como
funções membro não estáticas. Elas implicitamente agem nos objetos de classe.
A maioria das operações binárias podem ser sobrecarregadas como funções regulares que tomam uma
variável de classe e/ou um ponteiro de objeto desta classe como argumento. Para o nosso tipo
complexo, a sobrecarga na declaração se parecerá como:
//--- Operadores
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)); }
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
//--- Declara e inicialize variáveis de um tipo complexo
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;
//--- Soma dois números
complex z=a+b;
PrintFormat("a+b=%.2f+i*%.2f",z.re,z.im);
//--- Multiplica dois números
z=a*b;
PrintFormat("a*b=%.2f+i*%.2f",z.re,z.im);
//--- Dividir dois números
z=a/b;
PrintFormat("a/b=%.2f+i*%.2f",z.re,z.im);
//---
}
//+------------------------------------------------------------------+
//| Uma estrutura para operações com números complexos |
//+------------------------------------------------------------------+
struct complex
{
double re; // Parte real
double im; // Parte imaginário
//--- Construtores
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) { }
//--- Operações Aritméticas
complex Add(const complex &l,const complex &r) const; // Adição
complex Sub(const complex &l,const complex &r) const; // Subtração
complex Mul(const complex &l,const complex &r) const; // Multiplicação
complex Div(const complex &l,const complex &r) const; // Divisão
//--- Operadores binárias
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)); }
};
//+------------------------------------------------------------------+
//| Adição |
//+------------------------------------------------------------------+
complex complex::Add(const complex &l,const complex &r) const
{
complex res;
//---
res.re=l.re+r.re;
res.im=l.im+r.im;
//--- Resultado
return res;
}
//+------------------------------------------------------------------+
//| Subtração |
//+------------------------------------------------------------------+
complex complex::Sub(const complex &l,const complex &r) const
{
complex res;
//---
res.re=l.re-r.re;
res.im=l.im-r.im;
//--- Resultado
return res;
}
//+------------------------------------------------------------------+
//| Multiplicação |
//+------------------------------------------------------------------+
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;
//--- Resultado
return res;
}
//+------------------------------------------------------------------+
//| Divisão |
//+------------------------------------------------------------------+
complex complex::Div(const complex &l,const complex &r) const
{
//--- Numero complexo vazio
complex res(EMPTY_VALUE,EMPTY_VALUE);
//--- Verificar se é zero
if(r.re==0 && r.im==0)
{
Print(__FUNCTION__+": número é zero");
return(res);
}
//--- Variáveis auxiliares
double e;
double f;
//--- Selecionando a variante de cálculo
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;
}
//--- Resultado
return res;
A maioria das operações unárias para classes podem ser sobrecarregadas como funções comuns que
aceitam um único argumento de objeto de classe ou ponteiro dele. Adicione sobrecarga de operações
unárias "-" e "!" .
//+------------------------------------------------------------------+
//| Uma estrutura para operações com números complexos |
//+------------------------------------------------------------------+
struct complex
{
double re; // Parte real
double im; // Parte imaginário
...
//--- Operadores unários
complex operator-() const; // Unary minus
bool operator!() const; // Negação
};
...
//+------------------------------------------------------------------+
//| Sobrecarregar operador de "menos unário" |
//+------------------------------------------------------------------+
complex complex::operator-() const
{
complex res;
//---
res.re=-re;
res.im=-im;
//--- Resultado
return res;
}
//+------------------------------------------------------------------+
//| Sobrecarregar operador de "negação lógica" |
//+------------------------------------------------------------------+
bool complex::operator!() const
{
//--- São as partes real e imaginária do número complexo igual a zero?
return (re!=0 && im!=0);
}
Agora nós podemos verificar se valor de um número complexo é zero e obter um valor negativo:
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
//--- Declara e inicialize variáveis de um tipo complexo
complex a(2,4),b(-4,-2);
PrintFormat("a=%.2f+i*%.2f, b=%.2f+i*%.2f",a.re,a.im,b.re,b.im);
//--- Dividir dois números
complex z=a/b;
PrintFormat("a/b=%.2f+i*%.2f",z.re,z.im);
//--- Um número complexo é igual a zero por padrão (no construtor padrão re==0 e im==0
complex zero;
Print("!zero=",!zero);
//--- Atribuir um valor 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);
//--- Verificar se é zero mais uma vez
Print("!zero=",!zero);
//---
}
Note que nós não tivemos que sobrecarregar o operador de atribuição "=" , já que estruturas de tipos
simples pode ser diretamente copiadas uma no outra. Assim, nós agora podemos escrever um código
para cálculos envolvendo números complexos de maneira usual.
Sobrecarga de operador de indexação permite obter os valores dos arrays fechados em um objeto, de
uma maneira simples e familiar, e isso também contribui para uma melhor legibilidade do código
fonte. Por exemplo, nós precisamos fornecer acesso a um símbolo dentro de uma string em uma
posição específica. Uma string em MQL5 é um tipo string separado, que não é um array de símbolos,
mas com a ajuda de uma operação de indexação sobrecarregada podemos fornecer um trabalho
simples e transparente na classe CString gerada:
//+----------------------------------------------------------------------+
//| Uma classe para acessar símbolos em string como na array de símbolos |
//+----------------------------------------------------------------------+
class CString
{
string m_string;
public:
CString(string str=NULL):m_string(str) { }
ushort operator[] (int x) { return(StringGetCharacter(m_string,x)); }
};
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
//--- Um array para receber os símbolos a partir de uma string
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;
//--- Fazer um frase usando símbolos da variável str
for(int i=0,n=ArraySize(x);i<n;i++)
{
res+=ShortToString(str[x[i]]);
}
//--- Mostrar o resultado
Print(res);
}
Um outro exemplo de sobrecarga do operador de indexação são operações com matrizes. A matriz
representa um array dinâmico de duas dimens ões, o tamanho do array não é definido com
antecedência. Portanto, você não pode declarar um array da forma array[][] sem especificar o
tamanho da segunda dimensão, e então passar este array como um parâmetro. Uma possível solução é
uma classe especial CMatrix, que contém um array de objetos de classe CR ow.
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
//--- Operações de adição e multiplicação de matrizes
CMatrix A(3),B(3),C();
//--- Preparar um array para as linhas
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};
//--- Preencher as matrizes
A[0]=a1; A[1]=a2; A[2]=a3;
B[0]=b1; B[1]=b2; B[2]=b3;
//--- Saída de matrizes no log Experts
Print("---- Os elementos da matriz A");
Print(A.String());
Print("---- Os elementos da matriz B");
Print(B.String());
//--- Agora mostraremos como obter valores no estilo dos arrays dinâmicos matrix[i][j]
Print("Saída de valores da matriz C elemento a elemento");
//--- Atravessar as linhas da matriz - objetos CRow - num loop
for(int i=0;i<3;i++)
{
for(int i=0;i<size;i++)
m_array[i]=array[i];
}
//---
}
//+------------------------------------------------------------------+
//| Atribuir operação para o array |
//+------------------------------------------------------------------+
void CRow::operator=(const double &array[])
{
int size=ArraySize(array);
if(size==0) return;
//--- Preencher array com valores
ArrayResize(m_array,size);
for(int i=0;i<size;i++) m_array[i]=array[i];
//---
}
//+------------------------------------------------------------------+
//| Operação de atribuição para CRow |
//+------------------------------------------------------------------+
void CRow::operator=(const CRow &r)
{
int size=r.Size();
if(size==0) return;
//--- Preencher array com valores
ArrayResize(m_array,size);
for(int i=0;i<size;i++) m_array[i]=r[i];
//---
}
//+------------------------------------------------------------------+
//| Operador de multiplicação por outra linha |
//+------------------------------------------------------------------+
double CRow::operator*(const CRow &o)
{
double res=0;
//--- Verificações
int size=Size();
if(size!=o.Size() || size==0)
{
Print(__FUNCSIG__,": Falha ao multiplicar duas matrizes, elas são de tamanhos diferentes");
return(res);
}
//--- Multiplicar arrays elemento a elemento e adicionar os produtos
for(int i=0;i<size;i++)
res+=m_array[i]*o[i];
//--- Resultado
return(res);
}
//+------------------------------------------------------------------+
public:
//--- Construtores e um destrutor
CMatrix(void);
CMatrix(int rows) { ArrayResize(m_rows,rows); }
~CMatrix(void){};
//--- Obter os tamanhos de matriz
int Rows() const { return(ArraySize(m_rows)); }
int Cols() const { return(Rows()>0? m_rows[0].Size():0); }
//--- Retorna o valor da coluna na forma da linha Crow
CRow GetColumnAsRow(const int col_index) const;
//--- Retorna uma string com valores de matriz
string String(void) const;
//--- O operador de indexação retorna uma string pelo seu número
CRow *operator[](int i) const { return(GetPointer(m_rows[i])); }
//--- Operador de adição
CMatrix operator+(const CMatrix &m);
//--- Operador de multiplicação
CMatrix operator*(const CMatrix &m);
//--- Operador de atribuição
CMatrix *operator=(const CMatrix &m);
};
//+------------------------------------------------------------------+
//| Um construtor padrão, cria um array de linhas de tamanho zero |
//+------------------------------------------------------------------+
CMatrix::CMatrix(void)
{
//--- O número zero das linhas na matriz
ArrayResize(m_rows,0);
//---
}
//+------------------------------------------------------------------+
//| Retorna o valor da coluna na forma de CRow |
//+------------------------------------------------------------------+
CRow CMatrix::GetColumnAsRow(const int col_index) const
{
//--- A variável para obter os valores a partir da coluna
CRow row();
//--- O número de linhas na matriz
int rows=Rows();
//--- Se o número de linhas maior do que zero, executar a operação
if(rows>0)
{
//--- Um array para receber os valores da coluna com índice col_indez
double array[];
ArrayResize(array,rows);
//--- Preenchendo o array
for(int i=0;i<rows;i++)
{
//--- Verificar o número da coluna para a linha i - que podem ultrapassar os limites da ma
if(col_index>=this[i].Size())
{
Print(__FUNCSIG__,": Erro! Número da coluna ",col_index,"> tamanho da linha ",i);
break; // linha não inicializará o objeto
}
array[i]=this[i][col_index];
}
//--- Criar uma linha CRow baseada nos valores do array
row=array;
}
//--- Resultado
return(row);
}
//+------------------------------------------------------------------+
//| Adicionar duas matrizes |
//+------------------------------------------------------------------+
CMatrix CMatrix::operator+(const CMatrix &m)
{
//--- O número de linha e colunas na matriz passada
int cols=m.Cols();
int rows=m.Rows();
//--- A matriz recebe os resultados da adição
CMatrix res(rows);
//--- Os tamanhos de matriz devem coincidir
if(cols!=Cols() || rows!=Rows())
{
//--- Adição impossível
Print(__FUNCSIG__,": Falha para adicionar duas matrizes, seus tamanhos são diferentes");
return(res);
}
//--- Array auxiliar
double arr[];
ArrayResize(arr,cols);
//--- Atravessar as linhas para adicionar
for(int i=0;i<rows;i++)
{
//--- Escrever os resultados da adição das strings matriz no array
for(int k=0;k<cols;k++)
{
arr[k]=this[i][k]+m[i][k];
}
//--- Colocar o array para a linha matriz
res[i]=arr;
}
//--- retorna o resultado da adição de matrizes
return(res);
}
//+------------------------------------------------------------------+
//| Multiplicação de duas matrizes |
//+------------------------------------------------------------------+
CMatrix CMatrix::operator*(const CMatrix &m)
{
//--- Número de colunas da primeira matriz, número de linhas transmitidas na matriz
int cols1=Cols();
int rows2=m.Rows();
int rows1=Rows();
int cols2=m.Cols();
//--- Matriz para receber o resultado da adição
CMatrix res(rows1);
//--- Matrizes devem ser coordenadas
if(cols1!=rows2)
{
//--- Multiplicação impossível
Print(__FUNCSIG__,": Falha para multiplicar duas matrizes, formato não é compatível "
"- o número de colunas no primeiro fator deveria ser igual ao número de linhas na segun
return(res);
}
//--- Array auxiliar
double arr[];
ArrayResize(arr,cols1);
//--- Preencher as linhas na multiplicação da matriz
for(int i=0;i<rows1;i++)// Atravessar as linhas
{
//--- Restabelecer o array recebido
ArrayInitialize(arr,0);
//--- Atravessar elementos na linha
for(int k=0;k<cols1;k++)
{
//--- Levar valores da coluna k da matriz m para CRow
CRow column=m.GetColumnAsRow(k);
//--- Multiplicar duas linhas e escrever o resultado da multiplicação escalar dos vetroes
arr[k]=this[i]*column;
}
//--- colocar array arr[] na linha i-th da matriz
res[i]=arr;
}
//--- Retornar o produto das duas matrizes
return(res);
}
//+------------------------------------------------------------------+
//| Operação de atribuição |
//+------------------------------------------------------------------+
CMatrix *CMatrix::operator=(const CMatrix &m)
{
//--- Preencher e defineir o número de linhas
int rows=m.Rows();
ArrayResize(m_rows,rows);
//--- Preencher nossas linhas com valores das linhas da matriz anterior
for(int i=0;i<rows;i++) this[i]=m[i];
//---
return(GetPointer(this));
}
//+------------------------------------------------------------------+
//| Representação string da matriz |
//+------------------------------------------------------------------+
string CMatrix::String(void) const
{
string out="";
int rows=Rows();
//--- Formar string por string
for(int i=0;i<rows;i++)
{
out=out+this[i].String()+"\r\n";
}
//--- Resultado
return(out);
}
Também Veja
Sobrecarga, Operações Aritméticas, Sobrecarga de Função, R egras de Precedência
Exemplos:
#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
Com a ajuda do import, é fácil descrever funções que são chamadas de DLL externas ou de bibliotecas
(libraries) EX5 compiladas. Bibliotecas (libraries) EX5 são arquivos ex5 compilados, que têm a
propriedade library. Somente funções descritas com o modificador export pode ser importadas de
bibliotecas (libraries) EX5.
Lembre-se de que as bibliotecas DLL e EX5 devem ter nomes diferentes (independentemente dos
diretórios em que estão localizados) se forem importados juntos. T odas as funções importadas têm a
resolução de escopo correspondente à biblioteca " file name" .
Exemplo:
#import "kernel32.dll"
int GetLastError();
#import "lib.ex5"
int GetLastError();
#import
class CFoo
{
public:
int GetLastError() { return(12345); }
void func()
{
Print(GetLastError()); // Chamada do método de classe
Print(::GetLastError()); // chamar a função MQL5
Print(kernel32::GetLastError()); // Chamada da função de biblioteca DLL a partir do kernel32.
Print(lib::GetLastError()); // Chamada da função da biblioteca EX5 lib.ex5
}
};
void OnStart()
{
CFoo foo;
foo.func();
}
Também Veja
Sobrecarga (Overload), Funções Virtuais, Polimorfismo
Exportação de Funções
Uma função declarada em um programa MQL5 com o pós -modificador export pode ser usada em um
outro programa MQL5. T al função é chamada exportável, e ela pode ser chamada de outros programas
após compilação.
Este modificador ordena o compilador a adicionar a função na tabela de funções EX5 exportada por
este arquivo ex5. Somente funções com tal modificador podem ser acessíveis (" visíveis " ) a partir de
outros programas MQL5.
A propriedade library diz ao compilador que o arquivo-EX5 será uma biblioteca (library), e o compilador
o exibirá no cabeçalho da EX5.
T odas as função que são planejadas a serem exportáveis devem ser marcadas com o modificador
export.
Também Veja
Sobrecarga (Overload), Funções Virtuais, Polimorfismo
O handler (manipulador) de evento do terminal cliente identifica funções, manipulando este ou aquela
evento, pelo tipo de valor de retorno e tipo de parâmetros. Se outros parâmetros, que não
correspondem às descrições abaixo, são especificadas para uma função correspondente, ou outro tipo
de retorno é indicado para ela, tal função não será usada como um handler (manipulador) de evento.
OnStart
A função OnStart() é o handler (manipulador) do evento Start ,que é automaticamente gerado
somente para execuções de scripts. Ela dever ser do tipo void, sem parâmetros :
void OnStart();
OnInit
A função OnInit() é o handler (manipulador) do evento Init. Ela deve ser do tipo void ou int, sem
parâmetros :
void OnInit();
O evento Init é gerado imediatamente após um Expert Advisor ou um indicador ser baixado; este
evento não é gerado para scripts. A função OnInit() é usada para inicialização. Se OnInit() tiver o tipo
int de valor de retorno, o código de retorno não-zero significa inicialização sem sucesso e é gerado o
evento Deinit com o código do motivo da desinicialização R EASON_INITFAILED.
ENUM_INIT_RETCODE
Identificador Descrição
INIT_S UCCEEDED Inicialização bem sucedida, teste do Expert
Advisor pode continuar.
Este código significa o mesmo que um valor null
= o Expert Advisor foi inicializado com sucesso
no Provador de Estratégia.
OnDeinit
A função OnDeinit() é chamada durante a desinicialização e é o handler (manipulador) do evento
Deinit. Ela deve ser declarada com o tipo void e ter um parâmetro do tipo const int, que contém o
código do motivo da desinicialização. Se um tipo diferente é declarado, o compilador gerará um aviso
e a função não será chamada. Para scripts o evento Deinit não é gerado e portanto a função
OnDeInit() não pode ser usada em scripts.
O evento Deinit é gerado para Expert Advisors e indicadores nos seguintes casos :
· antes de uma reinicialização devido à mudança de ativo (s ymbol) ou período do gráfico no qual o
programa MQL5 está anexado;
· antes de uma reinicialização devido à mudança de parâmetros de entrada;
· antes de descarregar o programa MQL5.
OnTic k
O evento NewT ick é gerado para Expert Advisors somente quanto um novo preço (tick ) para um ativo
é recebido pelo gráfico no qual o Expert Advisor está anexado. É inútil definir a função OnT ick () num
indicador personalizado ou script, porque o evento NewT ick não é gerado para eles.
O evento T ick é gerado apenas para Expert Advisors, mas isso não significa que Expert Advisors
requer a função OnT ick (), uma vez que não são apenas os eventos NewT ick gerados para Expert
Advisors, mas também são gerados os eventos de T imer, Book Event e ChartEvent. Ela deve ser
declarada com o tipo void, sem parâmetros :
void OnTick();
OnTimer
A função OnT imer() é chamada quando o evento T imer ocorre, que é gerado pelo timer do sistema
somente para Expert Advisors e indicadores - ela não pode ser usada em scprits. A freqüência de
ocorrência do evento é definida na subscrição de notificações deste evento através da função
EventSetT imer().
Você pode desfazer a subscrição de receber eventos de timer para um Expert Advisor particular usando
a função EventKillT imer(). A função de ser definida com o tipo void, sem parâmetros :
void OnTimer();
É recomendável chamar a função EventSetT imer() uma vez na função OnInit(), e a função
EventKillT imer() deve ser chamada uma vez em OnDeinit().
T odo Expert Advisor, assim como todo indicador funciona com seu próprio timer e recebe eventos
apenas a partir dele. T ão logo um programa MQL5 para de funcionar, o timer é destruído de forma
forçada, se ele foi criado mas não desabilitado pela função EventKillT imer().
OnTrade
A função é chamada quando o evento T rade ocorre, que surge quando você muda a lista de ordens
postadas e posições abertas, o histórico de ordens e histórico de operações (deals). Quando uma
atividade de negociação (trade) é realizada (abertura de ordem pendente, abertura/fechamento de
posição, definição de stop, disparo de ordem pendente, etc.) o histórico de ordens e operações (deals)
e/ou a lista de posições e ordens correntes são por conseqüência alterados.
void OnTrade();
OnTradeTransaction
Ao realizar algumas ações específicas em uma conta de negociação, seu estado muda. T ais ações
includem:
· Envio de uma solicitação de negociação a partir de algum aplicativo MQL5 no terminal usando as
funções OrderSend e OrderSendAs ync e sua posterior execução.
· Envio de uma solicitação de negociação por meio da interface gráfica do terminal e sua posterior
execução.
· mudança de posições
Por exemplo, ao enviar uma ordem de compra de mercado, ela é tratada, uma ordem de compra
apropriada é criada para a conta, a ordem é então executada e removida da lista de ordens em
aberto, e então ela é adicionada ao histórico de ordens, uma apropriada operação (deal) é adicionada
ao histórico e uma nova posição é criada. T odas estas ações são transações de negociação. A chegada
de tal transação no terminal é um evento T radeT ransaction. Ele chama o handler (manipulador) de
evento OnT radeT ransaction.
void OnTradeTransaction(
const MqlTradeTransaction& trans, // estrutura das transações de negócios
const MqlTradeRequest& request, // estrutura solicitada
const MqlTradeResult& result // resultado da estrutura
);
Os últimos dois parâmetros, request e result, são preenchidos por valores somente para uma
transação de tipo TR ADE_TR ANSACTION_R EQUES T , dados sobre uma transação podem ser recebidos a
partir do parâmetro do tipo da variável trans. Note que neste caso, o campo request_id na variável
result contém o ID da solicitação de negócio, após a execução da transação de negociação, descrita
na variável trans, ter sido realizada. O identificador da solicitação (R equest ID) permite associar a
ação realizada (chamada de funções OrderSend ou OrderSendAs ync) com o resultado da ação enviado
para OnT radeT ransaction().
Após aplicar transações de negociação em uma conta de cliente, elas são consistentemente postadas
na fila de transações de negócio do terminal, a partir da qual são consistentemente enviados para o
ponto de entrada OnT radeT ransaction na ordem de chegada no terminal.
Ao tratar transações de negociação por um Expert Advisor usando o handler OnT radeT ransaction
(Manipulador sobre T ransação de Comércio), o terminal continua manipulando as transações de
negociação recém chegadas. Portanto, o estado de uma conta de negociação pode mudar durante uma
operação OnT radeT ransaction. Por exemplo, enquanto um programa MQL5 manipula um evento para
adicionar uma nova ordem, ela pode ser executada, deletada da lista das abertas e movida para o
histórico. Mais adiante, o aplicativo será notificado destes eventos.
O comprimento da fila de transações compreende 1024 elementos. Se OnT radeT ransaction tratar uma
nova transação por muito tempo, as transações mais antigas na fila podem ser substituídas pelas
novas.
· De forma geral, não existe um proporção precisa entre o número de chamadas de OnT rade e
OnT radeT ransactions. Uma chamada OnT rade corresponde a uma ou v árias chamadas
OnT radeT ransactions.
· OnT rade é chamada após apropriadas chamadas OnT radeT ransaction.
OnTester
A função OnT ester() é o handler (manipulador) do evento T ester que é automaticamente gerado após
um teste de histórico de um Expert Advisor no intervalo escolhido ter terminado. A função deve estar
definida com o tipo double, sem parâmetros :
double OnTester();
A função é chamada logo antes da chamada de OnDeinit() e tem o mesmo tipo do valor de retorno -
double. OnT ester() pode ser usado apenas no teste de Expert Advisors. Seu principal propósito é
calcular um certo valor que é usado como o critério max customizado na otimização genética de
parâmetros de entrada.
Na otimização genética, a ordenação descendente é aplica aos resultados de uma geração. Isto é, do
ponto de vista do critério de otimização, os melhores resultados são aqueles com o maiores valores
(os valores do critério de otimização max customizado retornados pela função OnT ester são levados
OnTesterInit
A função OnT esterInit() é o handler( manipulador) do evento T esterInit, que é automaticamente
gerado antes de iniciar a otimização do Expert Advisor no Provador de Estratégia. A função deve ser
definida com o tipo void. Ele não tem parâmetros :
void OnTesterInit();
Com o início da otimização, um Expert Advisor com o handler (manipulador) OnT esterInit() ou
OnT esterPass() é automaticamente carregado em um gráfico separado do terminal com o ativo e
período especificados no Provador de Estratégia, e recebe o evento T esterInit. A função é usada para
inicializar o Expert Advisor antes de iniciar a otimização para posterior processamento dos resultados
da otimização.
OnTesterPass
A função OnT esterPass() é um handler (manipulador) do evento T esterPass, que é automaticamente
gerado quanto um plano é recebido durando a otimização de um Expert Advisor no Provador de
Estratégia. A função deve ser definida com o tipo void. Ele não tem parâmetros :
void OnTesterPass();
OnTesterDeinit
OnT esterDeinit() é um handler (manipulador) do T esterDeinit, que é automaticamente gerada após o
fim da optimização de um Expert Advisor no Provador de Estratégia. A função deve ser definida com o
tipo void. Ele não tem parâmetros :
void OnTesterDeinit();
OnBoo kEvent
A função OnBook Event() é o handler (manipulador) do Book Event. Book Event é gerado para Expert
Advisors e indicadores somente quando a Profundidade do Mercado muda. Ela deve do tipo void e ter
um parâmetro do tipo string :
Para receber eventos Book Event para qualquer ativo (s ymbol), você apenas precisa fazer uma pré-
subscrição pra receber eventos para este ativo usando a função Mark etBook Add(). A fim de desfazer a
subscrição de recebimento de eventos Book Event para um particular ativo, chame
Mark etBookR elease().
Diferente de outros eventos, o evento Book Event é por difusão (broadcast). Isso significa que se um
Expert Advisor subscreve para receber eventos Book Event usando Mark etBook Add, todos os outros
Experts Advisors que tem o handler (manipulador) OnBook Event() receberão este evento. É portanto
necess ário analisar o nome do ativo, que é passado para o handler (manipulador) através dos
parâmetros const string& symbol.
OnChartEvent
OnChartEvent() é o handler (manipulador) de um grupo de eventos ChartEvent:
· CH ART EVENT_KEYDOWN — evento de uma teclada, quando a janela do gráfico está com foco;
A função pode ser chamada somente em Expert Advisors e indicadores. A função deve ser de tipo void
com 4 parâmetros :
Para cada tipo de evento, os parâmetros de entrada da função OnChartEvent() têm valores definidos
que são requeridos para o processamento deste evento. Os eventos e valores passados através destes
parâmetros são listados na tabela abaixo.
OnCalculate
A função OnCalculate() é chamada somente em indicadores customizados quando é necess ário calcular
os valores do indicador pelo evento Calculate. Isso geralmente acontece quando um novo preço (tick ) é
recebido para o ativo, de cujo indicador é calculado. Não é necess ário que este indicador esteja
anexado a qualquer gráfico de preço deste ativo.
A função OnCalculate() deve retornar um tipo int. Existem duas possíveis definições. Dentro de um
indicador você não pode usar ambas as vers ões da função.
A primeira forma é destinado para aqueles indicadores que podem ser calculados com um único buffer
de dados. Um exemplo de tal indicador é a Média Móvel Customizada (Custom Moving Average).
Assim como o array price[], uma das série de preço ou um buffer calculado de algum indicador pode
ser passado. Para determinar a direção da indexação no array price[], chame ArrayGetAsSeries(). A
fim de não depender de valores default, você deve incondicionalmente chamar a função
ArraySetAsSeries() para aqueles arrays que você espera utilizar.
Uma série de tempo necess ária ou um indicador, para ser usado como o array price[], deve ser
selecionado pelo usuário na guia " Parâmetros " ao iniciar o indicador. Para fazer isso, você deve
especificar o necess ário item no lista drop-down do campo " Aplicar a" .
Para receber valores de um indicador customizado a partir outros programas mql5, a função iCustom()
é usada, que retorna o manuseio do indicador para operações subseqüentes. Você pode também
especificar o price[] array apropriado ou o manuseio de outro indicador. Este parâmetro deve ser
transmitido por último na lista de variáveis de entrada do indicador customizado.
Exemplo:
void OnStart()
{
//---
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("Pode abrir ou não o arquivo EX5 '"+terminal_path+"\\MQL5\\Indicators\\"+"Custom Moving
}
Outro exemplo que mostra a passagem de um handler (manipulador) de indicador como o último
parâmetro para especificar o array price[], é dado na descrição da função iCustom().
A segunda forma é destinada para todos os outros indicadores, na qual mais de uma série de tempo é
usada nos cálculos.
int OnCalculate (const int rates_total, // tamanho da série de preços de entrada series
Os parâmetros open[], high[], low[] and close[] contém os arrays com preços de abertura, preços de
máximo e mínimo e preços de fechamento da janela de tempo corrente. O parâmetro time[] contém
um array com valores de hora de abertura, o parâmetro spread[] tem um array contendo o histórico de
spreads (se algum spread é fornecido para o ativo negociado). Os parâmetros volume[] e
tick_volume[] contêm o histórico de volume de negociação e tick , respectivamente.
Par determinar a direção de indexação de time[], open[], high[], low[], close[], tick_volume[],
volume[] e spread[], chame ArrayGetAsSeries(). A fim de não depender de valores default, você deve
incondicionalmente chamar a função ArraySetAsSeries() para aqueles arrays que você esperar utilizar.
O primeiro parâmetro rates _total contém o número de barras disponíveis no indicador para cálculo, e
corresponde ao número de barras disponíveis no gráfico.
Devemos notat a conexão entre o valor de retorno de OnCalculate() e o segundo parâmetro de entrada
prev _calculated. Durante a chamada da função, o parâmetro prev _calculated contém um valor
retornado pelo OnCalculate() durante a chamada anterior. Isso permite que algoritmos eficientes
calculem o indicador customizado de forma a evitar cálculos repetidos naquelas barras que não
tiveram mudança deste a execução anterior desta função.
Para isso, é geralmente suficiente retornar o valor do parâmetro rates _total, que contém o número de
barras da chamada corrente da função. Se desde a última chamada da função OnCalculate() os dados
de preço mudarem (um histórico mais antigo baixado ou brancos no histórico preenchidos), o valor do
parâmetro de entrada prev _calculated será definido para zero pelo terminal.
Observação: se OnCalculate retornar zero, então os valores do indicador não são mostrados na Janela
de Dados do terminal cliente.
Para entender isso melhor, seria útil iniciar o indicador, cujo código está anexado abaixo.
Exemplo indicador:
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1
//---- plotar Linha
#property indicator_label1 "Line"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrDarkBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- buffers do indicador
double LineBuffer[];
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado |
//+------------------------------------------------------------------+
int OnInit()
{
//--- mapeamento de buffers do indicador
SetIndexBuffer(0,LineBuffer,INDICATOR_DATA);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
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[])
{
//--- Obtenção do número de barras disponíveis para o ativo corrente e período do gráfico
int bars=Bars(Symbol(),0);
Print("Bars = ",bars,", rates_total = ",rates_total,", prev_calculated = ",prev_calculated);
Print("time[0] = ",time[0]," time[rates_total-1] = ",time[rates_total-1]);
//--- valor retorno de prev_calculated para a próxima chamada
return(rates_total);
}
//+------------------------------------------------------------------+
Também Veja
Programas em Execução, Eventos do T erminal Cliente, T rabalhando com Eventos
Variáveis
Declarando Variáveis
Variáveis devem ser declaradas antes de serem usadas. Nomes únicos são usados para identificar
variáveis. Para declarar uma variável, você deve especificar o seu tipo e um único nome. Declaração
de variável não é um operador.
· datetime – a data e hora, um inteiro sem sinal (unsigned) contendo o número de segundos desde a 0
hora de 1 de Janeiro de 1970;
· bool – valores booleanos true e false;
Exemplos:
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; // Variável previamente declarada da estrutura MyTime
Não se pode declarar variáveis do tipo estrutura até que se declare a estrutura.
Arrays
Somente um inteiro pode ser um índice de array. Não são permitidos arrays com mais que quatro
dimens ões. A numeração de elementos de um array começa com 0. O último elemento de um array de
uma dimensão tem o número do índice que é 1 a menos que o tamanho do array. Isso significa que
chamar pelo último elemento de um array constituído de 50 aparecerá como a[49]. O mesmo acontece
a arrays multidimensionais : Um dimensão é indexada de 0 ao tamanho da dimensão menos 1. O último
elemento de um array de duas dimens ões do exemplo aparecerá como m[6][49].
Arrays estáticos não podem ser representados como séries de tempo, isto é, a
funçãoArraySetAsSeries(), que defini o acesso aos elementos de um array do fim para o começo, não
pode ser aplicado a eles. Se você desejar ter acesso a um array da mesma forma que uma série de
tempo, use o objeto de array dinâmico.
Se houver uma tentativa de acesso fora da faixa do array, a execução do subsistema gerará um erro
crítico e o programa será interrompido.
Especificadores de Acesso
Especificadores de acesso definem como o compilador pode acessar variáveis, membros de estruturas
ou classes.
O especificador const declara uma variável como uma constante, e não permite modificar esta
variável durante o tempo de execução. Uma inicialização simples de uma variável é permitida ao
declará-la.
Exemplo:
int OnCalculate (const int rates_total, // tamanho do array price[]
const int prev_calculated, // barras tratadas na chamada anterior
const int begin, // a partir de onde começam os dados significativos
const double& price[] // array a ser calculado
);
· protected – permite acesso a partir dos métodos desta classe, bem como a partir dos métodos de
classes publicamente herdadas. Outro acesso é impossível;
· private – permite acesso às variáveis e métodos da classe somente a partir dos métodos da mesma
classe.
· virtual – aplica-se apenas a métodos de classe (não a métodos de estrutura) e diz ao compilador que
este método deve se colocado na tabela de funções virtuais da classe.
Classes de Armazenamento
Existem três classes de armazenamento: static, input e extern. Estes modificadores de classe de
armazenamento explicitamente indicam ao compilador que as variáveis correspondentes estão
distribuídas em uma área pré-alocada de memória, que é chamada de global pool. Além disso, estes
modificadores indicam um processamento especial dos dados da variável. Se uma variável declarada
em nível local não for uma variável estática, a memória para tal variável é alocada automaticamente
em uma pilha de programa. A liberação de memória alocada para um array não estático (non-static) é
também realizada automaticamente quando se passa além da área de visibilidade do bloco em que o
array está declarado.
Também Veja
T ipos de Dados, Encapsulamento e Extensibilidade de T ipos,Inicialização de Variáveis, Visibilidade
Escopo e T empo de Vida de Variáveis, Criação e Exclusão de Objetos, Membros Estáticos de uma
Classe
Variáveis Locais
Uma variável declarada dentro de uma função é local. O escopo de uma variável local é limitado a
região dentro da função na qual a variável está declarada. Uma variável local pode ser inicializada pelo
resultado de qualquer expressão. T oda chamada da função inicializa uma variável local. Variáveis
locais são armazenadas na área de memória da correspondente função.
Exemplo:
int somefunc()
{
int ret_code=0;
...
return(ret_code);
}
Escopo de uma variável é uma parte de um programa, na qual uma variável pode ser referenciada.
Variáveis declaradas dentro de um bloco (a nível interno), possuem o bloco como seu escopo. O escopo
de bloco começa com a declaração da variável e termina com a chave direita final.
Variáveis locais declaradas no começo de uma função também têm escopo de bloco, bem como
parâmetros de função, que são variáveis locais. Qualquer bloco pode conter declarações de variáveis.
Se blocos estiverem aninhados e um identificador no bloco externo tiver o mesmo nome que um
identificador no bloco interno, o identificador no bloco externo é oculto, até que a operação do bloco
interno seja finalizado.
Exemplo:
void OnStart()
{
//---
int i=5; // variável local da função
{
int i=10; // variável de função
Print("Dentro do bloco i = ",i); // resultado é i=10;
}
Print("Fora do bloco i = ",i); // resultado é i=5;
}
Isso significa que enquanto o bloco interno está rodando, ele v ê os valores de seus próprios
identificadores locais, e não os valores dos identificadores com nomes idênticos no bloco externo.
Exemplo:
void OnStart()
{
//---
int i=5; // variável local da função
for(int i=0;i<3;i++)
Print("Dentro for i = ",i);
Print("Fora do bloco i = ",i);
}
/* Resultado da execução
Dentro for i = 0
Dentro for i = 1
Dentro for i = 2
Fora do bloco i = 5
*/
Variáveis locais declaradas como estáticas (static) têm escopo de bloco, apesar do fato de elas
existirem desde o início do programa.
Pilha (Stack)
Em todo programa MQL5, uma área especial de memória chamada pilha é alocada para armazenar
variáveis locais de funções que são criadas automaticamente. Só uma pilha é alocada para todas as
funções e, por padrão, seu tamanho é de 1 M B. Em Advisors e scripts, o tamanho da pilha pode ser
gerenciado usando a diretiva de compilação #property stack size (define o tamanho da pilha em bytes),
por padrão, para eles são alocados 8M B.
Variáveis locais estáticas (static) são armazenadas no mesmo lugar onde outras variáveis estáticas e
globais são armazenadas - em uma área especial de memória, que existe separadamente da pilha.
Variáveis criadas dinamicamente também usam uma área de memória separada da pilha.
A cada chamada de função, um lugar na pilha é alocado para variáveis internas não estáticas. Após
sair da função, a memória fica disponível para uso novamente.
Se da primeira função, uma segunda função for chamada, então a segunda função ocupa o tamanho
requerido da memória restante da pilha para suas variáveis. Portanto, ao usar funções incluídas, a
memória da pilha será seqüencialmente ocupada por cada função. Isso pode levar a uma falta de
memória durante uma das chamadas de função, tal situação é chamada de estouro de pilha (stack
overflow).
Portanto, para grandes dados é melhor usar memória dinâmica - ao entrar em uma função, aloque a
memória que é requerida para as necessidades locais (new, ArrayR esize()), e ao sair da função, libere
a memória (delete, ArrayFree()).
Também Veja
T ipos de Dados, Encapsulamento e Extensibilidade de T ipos, Inicialização de Variáveis, Visibilidade
Escopo e T empo de Vida de Variáveis, Criando e Excluindo Objetos
Parâmetros Formais
Parâmetros passados para a função são locais. O escopo é de bloco de função. Parâmetros formais
devem ter nomes diferentes de variáveis externas e variáveis locais definidas dentro de uma função.
Alguns valores podem ser atribuídos a parâmetros formais no bloco de função. Se um parâmetro
formal é declarado com o modificador const , seu valor não pode ser modificado dentro da função.
Exemplo:
void func(const int & x[], double y, bool z)
{
if(y>0.0 && !z)
Print(x[0]);
...
}
Parâmetros formais podem ser inicializados por constantes. Neste caso, o valor de inicialização é
considerado como o valor default (padrão). Parâmetros, próximos ao parâmetro inicializado, também
devem ser inicializados.
Exemplo:
void func(int x, double y = 0.0, bool z = true)
{
...
}
Ao chamar tal função, os parâmetros inicializados podem ser omitidos, os valores default serão usados
no lugar deles.
Exemplo:
func(123, 0.5);
Parâmetros de tipos simples são passados por valor, isto é, modificações da correspondente variável
local deste tipo dentro da função chamada não irá se refletir na função chamadora. Arrays de qualquer
tipo e dados do tipo estrutura são passados sempre por referência. Se for necess ário proibir
modificações no conteúdo de um array ou estrutura, os parâmetros destes tipos devem ser declarados
com a palavra-chava const.
Existe a possibilidade de passar parâmetros de tipos simples por referência. Neste caso, modificações
nestes parâmetros de dentro da função chamada afetarão as variáveis correspondentes passadas por
referência. A fim de indicar que um parâmetro é passado por referência, coloque o modificador & após
do tipo do parâmetro.
Exemplo:
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;
}
Parâmetros passados por referência não podem ser inicializados por valores default.
Também Veja
Variáveis de Entrada, T ipo de Dados, Encapsulamento e Extensibilidade de T ipos, Inicialização de
Variáveis, Visibilidade Escopo e T empo de Vida de Variáveis, Criando e Excluindo Objetos
Variáveis Estáticas
A classe de armazenamento estático (static) define uma variável estática. O modificador static é
indicado antes do tipo do dado.
Exemplo:
int somefunc()
{
static int flag=10;
...
return(flag);
}
Uma variável estática pode ser inicializada por uma constante ou expressão constante correspondente
ao seu tipo, diferentemente de uma variável local simples, que pode ser inicializada por qualquer
expressão.
Variáveis estáticas existem a partir do momento de execução do programa e são inicializados somente
uma vez antes que a função especializada OnInit() seja chamada. Se valores iniciais não forem
especificados, variáveis da classe de armazenamento estático assumem valores iniciais zero.
Variáveis locais declarados com a palavra-chave static retém seus valores durante todo o tempo de
vida da função. A cada próxima chamada da função, tais variáveis locais contêm os valores que elas
tinham durante a chamada anterior.
Quaisquer variáveis em um bloco, exceto parâmetros formais de uma função, podem ser definidas
como estáticas. Se uma variável declarada em nível local não for uma variável estática, a memória
para tal variável é alocada automaticamente em uma pilha de programa.
Exemplo:
int Counter()
{
static int count;
count++;
if(count%100==0) Print("A função Counter tem sido chamada ",count," tempos");
return count;
}
void OnStart()
{
//---
int c=345;
for(int i=0;i<1000;i++)
{
int c=Counter();
}
Print("c =",c);
}
Também Veja
Variáveis Globais
Variáveis globais são criadas colocando suas declarações fora de descrições da função. Variáveis
globais são definidas no mesmo nível que funções, isto é, elas não são locais de algum bloco.
Exemplo:
int GlobalFlag=10; // Variável global
int OnStart()
{
...
}
O escopo de variáveis globais é o programa inteiro. Variáveis globais são acessíveis a partir de todas
as funções definidas no programa. Elas são inicializadas com zero a menos que um outro valor inicial
seja explicitamente definido. Uma variável global pode ser inicializada somente por uma constante, ou
expressão de constante que corresponde ao tipo dela.
As variáveis globais são inicializadas apenas uma vez após o programa ser carregado na memória do
terminal do cliente e antes da primeira manipulação do evento Init. Para as variáveis globais que
representam objetos de classe, durante sua inicialização os construtores correspondentes são
chamados. Em scripts, as variáveis globais são inicializadas antes de manipular o evento Start.
Observação: Variáveis declaradas em nível global não devem ser confundidas com variáveis globais do
terminal cliente que podem ser acessadas usando as funções GlobalVariable...().
Também Veja
T ipos de Dados, Encapsulamento e Extensibilidade de T ipos, Inicialização de Variáveis, Visibilidade
Escopo e T empo de Vida de Variáveis, Criando e Excluindo Objetos
Variáveis de Entrada
A classe de armazenamento input define uma variável externa. O modificador input é indicada antes
do tipo de dado. Uma variável com o modificador input não pode ser modificada dentro de programas
mql5, tais variáveis podem ser acessadas somente para leitura. Valores de variáveis de entrada
podem ser modificados pelo usuário somente a partir da janela de propriedades do programa. Le
variabili esterne vengono sempre reinizializzate immediatamente prima che OnInit() venga chiamato.
Exemplo:
//--- parâmetros de entrada
input int MA_Period=13;
input int MA_Shift=0;
input ENUM_MA_METHOD MA_Method=MODE_SMMA;
É possível definir uma outra forma de exibir nomes de parâmetros de entrada na aba Parâmetros de
Entrada. Para fazer isso, um comentário string é usado, que deve estar localizado após a descrição de
um parâmetro de entrada na mesma linha. Assim, nomes mais compreensivos para o usuário podem
ser associados aos parâmetros de entrada.
Exemplo:
//--- parâmetros de entrada
input int InpMAPeriod=13; // Período suavizado
Observação:Arrays e variáveis de tipos complexos não podem agir como variáveis de entrada.
Observação:O comprimento de um comentário string para as variáveis de entrada não pode exceder
63 caracteres.
Observação: Para variáveis input do tipo string a limitação do comprimento do valor (o comprimento
da string) é especificada pelas seguintes condições :
Assim, o tamanho máximo da string para um parâmetro de string pode ser calculado pela fórmula:
parameter_value_length=total_length_max-parameter_name_length=254-parameter_name_length
Se o indicador customizado usar a função OnCalculate do primeiro tipo (isto é, o indicador é calculado
usando o mesmo array dos dados), então um dos valores ENUM _APPL IED_PRICE ou o manuseio de um
outro indicador deve ser usado como o último parâmetro ao chamar tal indicador customizado. T odos
os parâmetros correspondentes às variáveis de entrada devem ser claramente indicados.
Exemplo:
#property script_show_inputs
//--- dias da semana
enum dayOfWeek
{
S=0, // Domingo
M=1, // Segunda-feira
T=2, // Terça-feira
W=3, // Quarta-feira
Th=4, // Quinta-feira
Fr=5, // Sexta-feira,
St=6, // Sábado
};
//--- parâmetros de entrada
input dayOfWeek swapday=W;
A fim de permitir a um usuário selecionar um valor necess ário da janela de propriedades durante o
início da execução de um script, nós usamos o comando de pré-processamento #property script show
inputs. Iniciamos o script e podemos escolher um dos valores da enumeração dayOfW eek da lista.
Iniciamos o script EnumInInput e vamos para a aba Parâmetros de Entrada. Por default, o valor de
swapday (dia de cobrança tripla de swap) é W ednesday (W = 3), mas nós podemos especificar qualquer
outro valor, e usar este valor para mudar a operação do programa.
O número de possíveis valores de uma enumeração é limitada. A fim de obter o código de erro, a
função GetLastError() deve ser chamada. Nomes mnemônicos de membros da enumeração são usados
para valores exibidos na lista. Se um comentário é associado com um nome mnemônico, como
mostrado no exemplo, o conteúdo do comentário é usado ao invés do nome mnemônico.
Cada valor da enumeração dayOfW eek tem seu valor de 0 a 6, mas na lista de parâmetros, os
comentários especificados para cada valor será exibido. Isso fornece flexibilidade adicional para
escrever programas com descrições mais claras dos parâmetros de entrada.
Algumas vezes, é necess ário excluir alguns parâmetros externos do programa da área total de passos
do Provador de Estratégia. O modificador de memória sinput foi introduzido para tais casos. sinput
significa declaração de variável externa estática (sinput = static input). Significa que a declaração
seguinte em um código Expert Advisor
O Expert Advisor mostrado acima tem 5 parâmetros externos. "Número de camadas " é declarado para
ser sinput e igual a 6. Este parâmetro não pode ser modificado durante um otimização de estratégia
de negociação. Podemos especificar o valor necess ário para ele ser usado mais adiante. Os campos
Iniciar, Passo, Parar não ficam disponíveis para tal variável.
Portanto, usuários não serão capazes de otimizar este parâmetro após especificarmos o modificador
sinput para a variável. Em outras palavras, o usuário do terminal não será capaz de definir os valores
inicial e final para ele no Provador de Estratégia para enumeração automática na faixa especificada
durante uma otimização.
Porém, existe uma exceção a esta regra: variáveis sinput podem variar em tarefas de optimização
usando a função ParameterSetR ange(). Esta função foi introduzida especificamente para o programa
controlar os conjuntos de valores disponíveis para qualquer variável input, incluindo aquelas
declaradas como static input (sinput). A função ParameterGetR ange() permite receber os valores
variáveis de entrada quando a otimização é iniciada (com o manipulador OnT esterInit()) e redefine
uma alteração do valor do passo e um intervalo, no qual uma otimização dos valores dos parâmetros
serão enumerados.
Desta forma, ao combinando o modificador sinput com duas funções que trabalham com parâmetros
de entrada, isso permite criar regras flexíveis para definir intervalos de otimização de parâmetros de
entrada que dependem dos valores de outros parâmetros de entrada.
T odos os parâmetros de entrada após essa declaração são visualmente agrupados no grupo
especificado, facilitando para o usuário do programa MQL5 configurar parâmetros ao executar no
gráfico ou no testador de estratégia. A indicação de cada grupo é v álida até que apareça uma
declaração do grupo:
Ao iniciar este EA no testador de estratégia, você pode clicar duas vezes no nome do grupo para
recolher e expandir o bloco de parâmetros de entrada, além de selecionar todos os seus parâmetros
com um clique na caixa de seleção do grupo para otimização.
Veja Também
iCustom, Enumerações, Propriedades de Programas
Variáveis Externas
A palavra-chave extern é usado para declarar identificadores de variáveis como identificadores da
classe de armazenamento estática (estático) com tempo de vida global. Estas variáveis existem a
partir do inicio do programa e a memória para elas é alocada e inicializada imediatamente após o
inicio do programa.
Você pode criar programas que consistem de múltiplos arquivos fontes ; neste caso a diretiva para o
preprocessador #include é usada. Variáveis declaradas como extern com o mesmo tipo e identificador
podem existir em arquivos fontes diferentes de um projeto.
Ao compilar o projeto inteiro, todas as variáveis extern com o mesmo tipo e identificador são
associados com uma parte da memória do conjunto (pool) de variáveis globais. Variáveis extern são
úteis para compilação separada de arquivos fontes. Variáveis externas podem ser inicializadas, mas
apenas uma vez - a existência de v árias variáveis externas inicializadas do mesmo tipo e com o
mesmo identificador é proibida.
Também Veja
T ipos de Dados, Encapsulamento e Extensibilidade de T ipos, Inicialização de Variáveis, Visibilidade
Escopo e T empo de Vida de Variáveis, Criando e Excluindo Objetos
Inicialização de Variáveis
Qualquer variável pode ser inicializada durante a definição. Se uma variável não é inicializada
explicitamente, o valor armazenado nesta variável pode ser qualquer coisa. Inicialização implícita não
é usada.
Variáveis globais e estáticas podem ser inicializadas uma vez por uma constante do tipo
correspondente ou uma expressão constante. Variáveis locais podem ser inicializados por qualquer
expressão, não apenas por uma constante.
Exemplos:
int n = 1;
string s = "Olá";
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 } };
//--- de tetris
int right[4]={WIDTH_IN_PIXELS+VERT_BORDER,WIDTH_IN_PIXELS+VERT_BORDER,
WIDTH_IN_PIXELS+VERT_BORDER,WIDTH_IN_PIXELS+VERT_BORDER};
//--- inicialização de todos os campos da estrutura com valores zero
MqlTradeRequest request={};
A lista de valores dos elementos de um array devem estar entre chaves. Seqüências de inicializações
faltantes são consideradas iguais a 0.
Se o tamanho do array inicializado não é especificado, ele é determinado pelo compilador, baseado no
tamanho da seqüência de inicialização.
Exemplos:
struct str3
{
int low_part;
int high_part;
};
struct str10
{
str3 s3;
double d1[10];
int i3;
};
void OnStart()
{
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]);
Para variável de tipo estrutura, inicialização parcial é permitida, bem como para arrays estáticos.
Pode-se inicializar um ou mais primeiros elementos de uma estrutura ou array, os demais elementos
serão inicializados com zeros neste caso.
Também Veja
T ipos de Dados, Encapsulamento e T ipo de Extensibilidade, Visibilidade Escopo e T empo de Vida de
Variáveis, Criando e Excluindo Objetos
Uma variável declarada fora de todas as funções está localizada no escopo global. O acesso a tais
variáveis pode ser feito de qualquer lugar no programa. Estas variáveis são localizadas no conjunto
(pool) global de memória, assim seus tempos de vida coincidem com o tempo de vida do programa.
Uma variável declarada dentro de um bloco (parte do código entre chaves) pertence ao escopo local.
T al variável não é visível (e portanto não é disponível) fora do bloco no qual está definida. O caso
mais comum de declaração local é uma variável declarada dentro de uma função. Uma variável
declarada localmente está localizada na pilha (stack ), e o tempo de vida de tal variável é igual ao
tempo de vida da função.
Já que o escopo de uma variável local é o bloco em que ela está declarada, é possível declarar
variáveis com o mesmo nome que variáveis declaradas em outros blocos, mesmo aquelas declaradas
em níveis mais acima, até o nível global.
Exemplo:
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;
//--- define valor vazio para primeiras barras limite
for(i=0; i<limit; i++) LineBuffer[i]=0.0;
//--- calcula primeiro valor visível
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;
Seu escopo é somente o ciclo do for; fora deste ciclo existe uma outra variável com o mesmo nome,
declarada no começo da função. Além disso, a variável k está declarada no corpo do loop, seu escopo é
o corpo do loop.
Variáveis locais podem ser declarados com o especificador de acesso static. Neste caso, o compilador
tem uma variável no conjunto (pool) global de memória. Portanto, o tempo de vida de uma variável
estática é igual ao tempo de vida do programa. Aqui o escopo de tal variável é limitado ao bloco no
qual ela está declarada.
Também Veja
Data Types, Encapsulation and Extensibility of Types,Initialization of Variables, Creating and
Deleting Objects
Apesar do fato de que variáveis estáticas serem geralmente declaradas em um nível local, a memória
para estas variáveis é pré-alocada, e a inicialização é realizada logo após um programa ser carregado;
o mesmo para variáveis globais.
Variáveis locais são desinicializados no final do bloco do programa, no qual elas foram declaradas, e na
ordem oposta de suas declarações. Um bloco de programa é um operador de composição que pode ser
uma parte de um operador de seleção switch, operador de ciclo (for, while, do-while), um corpo de
função ou uma parte do operador if-else.
Variáveis locais são inicializados somente no momento em que a execução do programa encontra a
declaração da variável. Se durante a execução do programa o bloco, no qual a variável está declarada,
não for executada, tal variável não é inicializada.
Ponteiros podem ser declarados em nível local ou global; e eles podem ser inicializados pelo valor vazio
de NULL ou pelo valor do ponteiro do mesmo ou herdado tipo. Se o operador new é chamado para um
ponteiro declarado em um nível local, o operador delete para este ponteiro deve ser chamado antes de
sair do nível. Caso contrário, o ponteiro estará perdido e a exclusão explícita do objeto falhará.
T odos os objetos criados pela expressão object_pointer=new Class_name, devem ser então excluídos
pelo operador delete(object_pointer). Se por algum razão tal variável não for excluída por meio do
operador delete quando o programa estiver concluído, a correspondente entrada aparecerá no diário
" Experts " . Pode-se declarar v árias variáveis e atribuir um ponteiro de um objeto para todas elas.
Se um objeto criado dinamicamente tiver um construtor, este construtor será chamado no momento
da execução do operador new. Se um objeto tiver um destrutor, ele será chamado durante a execução
do operador delete.
Assim objetos colocados dinamicamente são criados somente no momento em que são criados pelo
operador new, e são certamente excluídos tanto pelo operador delete ou automaticamente pelo
sistema de execução do MQL5 durante a descarga do programa. A ordem de declaração de ponteiros
criados dinamicamente não influenciam na ordem de suas inicializações. A ordem de inicialização e
desinicialização é totalmente controlada pelo programador.
Também Veja
T ipos de Dados, Encapsulamento e T ipos de Extensibilidade, Inicialização de Variáveis, Visibilidade
Escope e T empo de Vida de Variáveis
Preprocessador
Preprocessador é um subsistema especial do compilador MQL5 que é destinado à preparação do código
fonte do programa imediatamente antes do programa ser compilado.
O preprocessador permite melhorar a legibilidade do código fonte. O código pode ser estruturado por
meio de inclusão de arquivos específicos contendo códigos fonte de programas -mql5. A possibilidade
de atribuir nomes mnemônicos a constantes específicas contribui para melhoria da legibilidade do
código.
· Declarar constantes
· I mportar funções
· Conditional compilation
Cada diretiva é descrita por um registro separado e opera antes da mudança de linha. Não se podem
utilizar v árias diretivas num só registro. Se o registro da diretiva for muito grande, ele pode ser
dividido em v árias linhas usando a barra invertida '\', neste caso, a próxima linha é considerada uma
continuação do registro da diretiva.
//+------------------------------------------------------------------+
//| pseudo-operador foreach |
//+------------------------------------------------------------------+
#define ForEach(index, array) for (int index = 0, \
max_##index=ArraySize((array)); \
index<max_##index; index++)
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
string array[]={"12","23","34","45"};
//--- rastreamento da matriz usando o ForEach
ForEach(i,array)
{
PrintFormat("%d: array[%d]=%s",i,i,array[i]);
}
}
//+------------------------------------------------------------------+
/* Resultado de saída
0: array[0]=12
1: array[1]=23
2: array[2]=34
3: array[3]=45
*/
Para o compilador, estas três linhas da diretiva #define aparecerão como uma linha longa. Neste
exemplo, também é usado o caractere duplo do jogo da velha ##, ele é chamado operador de fusão e é
usado nas macros #define, para combinar dois tok ens numa macro. O operador de fusão de tok ens não
pode ser o primeiro ou o último na definição de macro.
Cada diretiva é descrita por um registro separado e opera antes da mudança de linha. Não se podem
utilizar v árias diretivas num só registro. Se o registro da diretiva for muito grande, ele pode ser
dividido em v árias linhas usando a barra invertida '\', neste caso, a próxima linha é considerada uma
continuação do registro da diretiva.
A diretiva #define pode ser usada para atribuir nomes mnemônicos a constantes. Existem duas
formas :
O identificador de constante é governado pelas mesmas regras de nomes de variáveis. O valor pode
ser de qualquer tipo:
Uma expressão pode consistir de v ários símbolos (tok ens), tais como palavras chave, constantes,
express ões constantes e não-constantes. Uma expressão termina com o fim da linha e não pode ser
transferida para a próxima linha.
Exemplo:
#define TWO 2
#define THREE 3
#define INCOMPLETE TWO+THREE
#define COMPLETE (TWO+THREE)
void OnStart()
{
Print("2 + 3*2 = ",INCOMPLETE*2);
Print("(2 + 3)*2 = ",COMPLETE*2);
}
// Resultado
// 2 + 3*2 = 8
// (2 + 3)*2 = 10
double c=MUL(A,B);
Print("c=",c);
/*
expressão double c=MUL(A,B);
é equivalente a double c=((2+3)*(5-1));
*/
// Resultado
// c=20
Se assegure de colocar os parâmetros entre parênteses ao usar os parâmetros na expressão, uma vez
que isso ajudará a evitar erros não óbvios que são difíceis de encontrar. Se reescrevermos o código
sem o uso de parêntesis, o resultado será diferente:
double c=MUL(A,B);
Print("c=",c);
/*
expressão double c=MUL(A,B);
é equivalente a double c=2+3*5-1;
*/
// Resultado
// c=16
Example:
#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();
}
/* Resultado:
MACRO is defined in func1
MACRO is not defined in func2
*/
Também Veja
Identificador, Constantes de Caractere
A propriedade
tester_everytick_calculate permite
- durante o teste - ativar
forçosamente o modo de cálculo do
indicador em cada tick .
Os indicadores no testador de
estratégia também são contados
forçosamente em cada tick nos
seguintes casos :
· ao testar em modo visual;
· se no indicador houver as
funções EventChartCustom,
OnChartEvent, OnT imer;
· se o indicador for criado
pelo compilador com número
de compilação abaixo de
1916.
Exemplos especificando um rótulo separado para cada buffer do indicador ( " 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"
Exemplos:
#include <WinUser32.mqh>
#include "mylib.mqh"
Se o nome do arquivo é colocado entre aspas, a procura é feita no diretório corrente (que contém o
arquivo fonte principal). O diretório padrão não é visível.
Também Veja
Standard Library, Importando Funções
#import "file_name"
func1 define;
func2 define;
...
funcN define;
#import
Funções importadas podem ter qualquer nome. Funções importadas podem ter qualquer nome. Você
pode importar simultaneamente módulos - de diferentes funções - com o mesmo nome. Funções
importadas podem ter nomes que coincidem com os nomes de funções internas. A operação de
resolução de contexto determina quais das funções devem ser chamadas.
Já que funções importadas estão do lado de fora do módulo compilado, o compilador não pode
verificar a validade dos parâmetros passados. Portanto, para evitar erros em tempo de execução,
deve-se descrever com precisão a composição e ordem dos parâmetros passados para funções
importadas. Parâmetros passados para funções importadas (tanto de EX5, como de módulo DLL)
podem ter valores por padrão.
· pointers (*);
Nas funções importadas da DLL, você não pode passar - como parâmetros - classes, arrays de string
ou objetos complexos contendo strings e/ou arrays dinâmicos de qualquer tipo.
Exemplos:
#import "stdlib.ex5"
string ErrorDescription(int error_code);
int RGB(int red_value,int green_value,int blue_value);
bool CompareDoubles(double number1,double number2);
string DoubleToStrMorePrecision(double number,int precision);
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
Para importar funções durante a execução de um programa mql5, é usada vinculação inicial (early
binding). Isso significa que a biblioteca é carregada durante a carga de um programa usando seu
programa ex5.
Não é recomendado que usar o nome completo do módulo a carregar, como Drive:
\Directory\FileName.Ext. Bibiliotecas MQ5 são carregadas a partir da pasta
terminal_dir\MQL5\Libraries .
Se a função importada tiver diferentes opções de chamada para as vers ões de 32 e 64 bits do
W indows, você deverá importar ambas e chamar explicitamente a variante de função desejada com
ajuda da variável _Is X64.
Exemplo:
#import "user32.dll"
//--- para um sistema de 32 bits
int MessageBoxW(uint hWnd,string lpText,string lpCaption,uint uType);
//--- para um sistema de 64 bits
int MessageBoxW(ulong hWnd,string lpText,string lpCaption,uint uType);
#import
//+------------------------------------------------------------------+
//| MessageBox_32_64_bit usa a variação correta do MessageBoxW() |
//+------------------------------------------------------------------+
int MessageBox_32_64_bit()
{
int res=-1;
// --- se tivermos o Windows de 64 bits
if(_IsX64)
{
ulong hwnd=0;
res=MessageBoxW(hwnd,"Exemplo de como chamar a versão de 64 bits do MessageBoxW","MessageBoxW
}
else // temos o Windows de 32 bits
{
uint hwnd=0;
res=MessageBoxW(hwnd,"Exemplo de chamada de uma versão de 32 bits do MessageBoxW","MessageBox
}
return (res);
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//---
int ans=MessageBox_32_64_bit();
PrintFormat("MessageBox_32_64_bit returned %d",ans);
}
· Estruturas simples (POD, plain old data), isto é, estruturas que contêm apenas tipos de dados
simples.
· Funções estáticas públicas cujos parâmetros usam apenas tipos simples e estruturas de POD ou seus
arrays.
#import "TestLib.dll"
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
int x=41;
TestClass::Inc(x);
Print(x);
}
Veja Também
Incluindo Arquivos
Cada diretiva é descrita por um registro separado e opera antes da mudança de linha. Não se podem
utilizar v árias diretivas num só registro. Se o registro da diretiva for muito grande, ele pode ser
dividido em v árias linhas usando a barra invertida '\', neste caso, a próxima linha é considerada uma
continuação do registro da diretiva.
#ifdef identifier
// O código aqui é compilado se o identificador já tiver sido definido para o pré-processador na
#endif
#ifndef identifier
// O código localizado aqui é compilado se o identificador não está definido atualmente pelo pré
#endif
Qualquer uma das diretrizes de compilação condicional pode ser seguida por qualquer número de linhas
possivelmente contendo a diretiva #else e terminando com #endif. Se a condição verificada for
verdadeira, as linhas entre #else e #endif serão ignoradas. Se a condição verificada não for cumprida,
todas as linhas entre a verificação e a diretiva #else (ou a diretiva #endif se a primeira estiver
ausente) serão ignoradas.
Exemplo:
#ifndef TestMode
#define TestMode
#endif
//+------------------------------------------------------------------+
//| Função de início do programa script |
//+------------------------------------------------------------------+
void OnStart()
{
#ifdef TestMode
Print("Test mode");
#else
Print("Normal mode");
#endif
}
__MQL5__ macro é definido ao compilar o arquivo *.mq5, __MQL 4__ macro é definido ao compilar o
*.mq4.
Exemplo:
//+------------------------------------------------------------------+
//| Função de início do programa script |
//+------------------------------------------------------------------+
void OnStart()
{
#ifdef __MQL5__
#ifdef _DEBUG
Print("Olá do compilador MQL5 [DEBUG]");
#else
#ifdef _RELEASE
Print("Olá do compilador MQL5 [RELEASE]");
#endif
#endif
#else
#ifdef __MQL4__
#ifdef _DEBUG
Print("Olá do compilador MQL4 [DEBUG]");
#else
#ifdef _RELEASE
Print("Olá do compilador MQL4 [RELEASE]");
#endif
#endif
#endif
#endif
}
· H erança
· Polimorfismo
· Sobrecarga
· Funções virtuais
Assim, este jogo de fácil entendimento requer a criação de v ários modelos - modelo de forma, modelo
de peça, modelo de movimentação da figura, e assim por diante. T odas estes modelos são abstrações,
representadas por cálculos no computador. Para descrever estes modelos, o conceito de T ipo de Dados
Abstratos, ADT (tipo de dados complexos), é usado. Estritamente falando, o modelo do movimento
das " formas " no jogo não é um tipo de dado, mas é um conjunto de operações sobre o tipo de dado
" forma" , usando as restrições do tipo de dado " peça" .
Objetos são variáveis de classe. A programação orientada a objetos permite a você facilmente criar e
usar ADT . A programação orientada a objetos usa o mecanismo de herança. O benefício da herança
está no fato de permitir obter tipos derivados a partir de tipos de dados já definidos por um usuário.
Por exemplo, para criar formas T etris, é conveniente primeiro criar uma classe base Forma. As outras
classes representando todos os sete possíveis tipos de forma podem ser derivadas desta base. O
comportamento das figuras é definido na classe base, enquanto que a implementação do
comportamento de cada figura separada é definida em classes derivadas.
Em OOP, objetos são respons áveis por seu comportamento. O desenvolvedor de ADT deve incluir um
código para descrever qualquer comportamento que normalmente seria esperado dos objetos
correspondentes. O fato do objeto ser respons ável por seu comportamento, simplifica enormemente a
tarefa de programação deste objeto pelo usuário.
Se quiséssemos desenhar uma figura na tela, precisaríamos conhecer onde o centro desta figura
estaria e como desenhá-la. Se um forma separada sabe como se desenhar, o programador deve enviar
uma mensagem de " desenhe" ao usar tal forma.
A linguagem MQL5 é semelhante ao C++, e ela também tem mecanismos de encapsulamento para a
implementação de ADT . Por um lado, o encapsulamento esconde os detalhes internos da
implementação de um tipo particular, e por outro lado, torna acessível externamente funções que
podem influenciar objetos deste tipo. Detalhes de implementação podem ser inacessíveis a um
programa que usa este tipo.
Alguns destes conceitos são bastante vagos, alguns são abstratos, outros são gerais.
Um tipo de dado abstrato (ADT ), por exemplo, uma string, é uma descrição do ideal, bem conhecido
tipo de comportamento.
O usuário de string sabe que as operações de string, tais como concatenação ou impressão, têm um
certo comportamento. Operações de concatenação e impressão são chamados métodos.
Uma certa implementação de ADT pode ter algumas restrições, por exemplo, strings podem ser
limitados no comprimento. Estas limitações afetam o comportamento aberto a todos. Ao mesmo
tempo, detalhes da implementação privada ou interna não afetam diretamente a jeito como o usuário
v ê o objeto. Por exemplo, a string é freqüentemente implementado como um array, enquanto o
endereço de base interno deste array e seu nome não são essenciais para o usuário.
A palavra-chave public mostra que o acesso aos membros que ficam depois dela, é aberto sem
restrições. Sem esta palavra-chave, membros de classe ficariam bloqueados por default. Membros
privados são acessíveis somente por funções membro de sua própria classe.
Funções de classe protegidas são disponíveis para funções de classe não apenas em sua classe, mas
também em suas classes herdeiras. Funções de classe publicas são disponíveis para qualquer função
dentro do escopo da declaração da classe. A proteção torna possível ocultar parte da implementação
da classe, evitando assim mudanças inesperadas na estrutura dos dados. R estrição de acesso ou
ocultamento de dados é uma característica da programação orientada a objetos.
Geralmente, funções de classe são protegidas e declaradas com o modificador protected, a leitura e a
escrita de valores são realizadas por meio do uso de métodos especiais chamados set e get que são
definidos por meio do modificador de acesso public.
Exemplo:
class CPerson
{
protected:
string first_name; // nome
public:
void SetName(string n){m_name=n;}// atribui o nome
string GetName(){return (m_name);} // retorna o nome
};
Esta abordagem oferece v árias vantagens. Primeiro, por meio do nome da função nós podemos
entender o que ela faz - define (sets) ou obtém (gets) o valor de um membro de classe. Segundo,
talvez no futuro precisemos modificar o tipo da variável m_name na classe CPerson ou em qualquer de
suas classes derivadas.
Neste caso, necessitaríamos apenas alterar a implementação das funções SetName() e GetName(),
enquanto que objetos da classe CPerson estariam disponíveis para uso em um programa sem nenhuma
alteração de código, porque o usuário nem ao menos saberia que o tipo de dado do m_name foi
alterado.
Exemplo:
struct Name
{
string first_name; // nome
string last_name; // último nome
};
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);
}
Também Veja
T ipos de Dados
Herança
O principal característica da OOP é o incentivo à reutilização de código através de herança. Uma nova
classe é feita a partir de uma já existente, que é chamada de classe base. A classe derivada usa os
membros da classe base, mas também pode modificar e complementá-los.
Muitos tipos são variações de tipos já existentes. É muitas vezes tedioso desenvolver um novo código
para cada um deles. Além disso, um novo código implica em novos erros. A classe derivada herda a
descrição da classe base, assim qualquer re-desenvolvimento e re-teste de código é desnecess ário. As
relações de herança são hierárquicas.
H ierarquia é um método que permite copiar os elementos em toda a sua diversidade e complexidade.
Ela introduz a classificação de objetos. Por exemplo, a tabela periódica de elementos tem gases. Eles
possuem propriedades inerentes a todos os elementos periódicos.
Gases inertes constituem a próxima importante subclasse. A hierarquia é que o g ás inerte, como
árgon, é um g ás, e um g ás, por sua vez, é parte do sistema. T al hierarquia permite interpretar o
comportamento dos gases inertes com facilidade. Sabemos que seus átomos contêm prótons e
elétrons, o que é verdade para todos os outros elementos.
Sabemos que eles estão no estado gasoso à temperatura ambiente, como todos os gases. Sabemos
que nenhum g ás da subclasse de gases inertes entra usualmente em reações químicas com outros
elementos, e isso é uma propriedade de todos os gases inertes.
Vamos criar uma classe base CShape, que contém apenas a maioria dos membros comuns que
descrevem a forma. Estes membros descrevem propriedades que são características de qualquer
forma - o tipo da forma e as coordenadas do ponto de ancoragem principal.
Exemplo:
//--- A classe base da forma (Shape)
class CShape
{
protected:
int m_type; // Tipo de Forma
int m_xpos; // X - coordenada do ponto base
int m_ypos; // Y - coordenada do ponto base
public:
CShape(){m_type=0; m_xpos=0; m_ypos=0;} // construtor
void SetXPos(int x){m_xpos=x;} // define X
void SetYPos(int y){m_ypos=y;} // define Y
};
Sem seguida, criamos novas classes derivadas da classe base, nas quais adicionaremos campos
necess ários, cada um especificando uma certa classe. Para a forma Círculo, é necess ário adicionar um
membro que contém o valor do raio. A forma Quadrado é caracterizada pelo valor do lado. Portanto,
classes derivadas, herdadas da classe base CShape, serão declaradas como se segue:
public:
CCircle(){m_type=1;}// construtor, tipo 1
};
public:
CSquare(){m_type=2;} // construtor, tipo 2
};
Deve-se notar que enquanto um objeto é criado, o construtor da classe base é chamado primeiro, e
então o construtor da classe derivada é chamado. Quando um objeto é destruído, primeiro o destrutor
da classe derivada é chamado, e então o destrutor da classe base é chamado.
Assim, ao declarar a maioria do membros gerais na classe base, podemos acrescentar membros
adicionais nas classes derivadas que especificam uma classe particular. A herança permite criar
bibliotecas de código poderosas que podem ser reutilizadas muitas vezes.
A sintaxe para criar uma classe derivada a partir de uma classe já existente é a seguinte:
class class_name :
(public | protected | private) opt base_class_name
{
declaração de membros de classe
};
Os membros privados da classe base não são disponíveis para a classe derivada. A herança pública
também significa que classes derivadas (CCircle e CSquare) são CShapes. Isto é, o Quadrado
(CSquare) é uma Forma (CShape), mas a Forma não necessariamente tem que ser um Quadrado.
A classe derivada é uma modificação da classe base, ele herda os membros protegidos e públicos da
classe base. Os construtores e destrutores da classe base não podem ser herdados. Além de membros
da classe base, novos membros são adicionados em uma classe derivada.
A classe derivada pode incluir a implementação de funções membro, diferentes da classe base. Isso
não tem nada a ver com uma sobrecarga, quando o significado de um mesmo nome de uma função
pode ser diferente para diferentes assinaturas.
Em herança protegida, membros públicos e protegidos da classe base tornam-se membros protegidos
da classe derivada. Em herança privada, os membros públicos e protegidos da classe base tornam-se
membros privados da classe derivada.
Em herança protegida e privada, a relação " o objeto de uma classe derivada é objeto da classe base"
não é verdade. Os tipos protegido e privado de herança são raros, e cada um deles precisam ser
usados com cautela.
Deve ser entendido que o tipo de herança (public, protected ou private) não afeta a forma de acessar
os membros de classes base na hierarquia de herança a partir de uma classe derivada. Para
qualquer tipo de herança, somente membros da classe base declarados com especificadores de acesso
public e protected estarão disponíveis fora das classes derivadas. Vamos verificar isso no seguinte
exemplo:
};
//+------------------------------------------------------------------+
//| Classe derivada com erros |
//+------------------------------------------------------------------+
class CDerived: public CBaseClass // especificação da herença pública pode ser omitido, uma vez que
{
public:
void Func() // Na classe derivada, defina uma função com chamadas aos membros da classe base
{
//--- Uma tentativa de alterar um membro privado da classe base
m_member=0; // Erro, o membro privado da classe base não é disponível
Member(0); // Erro, o método privado da classe base não é disponível em classes deriv
//--- Leitura do membro da classe base
Print(m_member); // Erro, o membro privado da classe base não é disponível
Print(Member()); // Sem erro, método protegido é acessível a partir da classe base e suas c
}
};
No exemplo acima, CBaseClass tem apenas um método público - o construtor. Construtores são
chamados automaticamente na criação de um objeto de classe. Portanto, o membro privado
m_member e o método protegido Member() não podem ser chamados do lado de fora. Mas no caso de
herança pública, o membro Member() da classe base estará disponível a partir de classes derivadas.
No caso de herança protegida, todos os membros da classe base com acessos público e protegido
tornam-se protegidos. Isso significa que membros de dados e métodos públicos da classe base, com
herança protegida eles passam a ser disponíveis somente a partir de classes derivadas e de suas
derivadas seguintes.
//+------------------------------------------------------------------+
//| Exemplo de classe com alguns tipos de acesso |
//+------------------------------------------------------------------+
class CBaseMathClass
{
private: //--- O membro privado não é disponível a partir de classe derivada
double m_Pi;
public: //--- Obtendo e definindo um valor para m_Pi
void SetPI(double v){m_Pi=v;return;};
double GetPI(){return m_Pi;};
public: // O construtor de classe é disponível para todos os membros
CBaseMathClass() {SetPI(3.14); PrintFormat("%s",__FUNCTION__);};
};
//+------------------------------------------------------------------+
//| Uma classe derivada, em que m_Pi não pode ser modificada |
//+------------------------------------------------------------------+
class CProtectedChildClass: protected CBaseMathClass // Herança protegida
{
private:
double m_radius;
public: //--- Métodos públicos na classe derivada
void SetRadius(double r){m_radius=r; return;};
double GetCircleLength(){return GetPI()*m_radius;};
};
//+------------------------------------------------------------------+
//| Função de inicialização de script |
//+------------------------------------------------------------------+
void OnStart()
{
//--- Ao criar uma classe derivada, o construtor da classe base será chamada automaticamente
CProtectedChildClass pt;
//--- Especifica o raio
pt.SetRadius(10);
PrintFormat("Length=%G",pt.GetCircleLength());
//--- Se comentar a string abaixo, obteremos um erro na etapa de compilação, já que SetPi() é agora
// pt.SetPI(3);
//--- Agora declare um variável da classe base e tente definir a constante Pi igual a 10
CBaseMathClass bc;
bc.SetPI(10);
//--- Aqui está o resultado
PrintFormat("bc.GetPI()=%G",bc.GetPI());
}
O exemplo mostra que os métodos SetPI() e GetPI() na classe base CBaseMathClasse estão abertos e
disponíveis para chamadas a partir de qualquer lugar do programa. Mas ao mesmo tempo, para
CProtectedChildClasse, que é derivada dela, estes métodos podem ser chamados somente a partir de
métodos da classe CProtectedChildClass ou suas classes derivadas.
No caso de herança privada, todos os membros da classe base com acesso público e protegido tornam-
se privados, e chamá-los torná-se impossível em herança posterior.
Também Veja
Estruturas e Classes
Polimorfismo
Polimorfismo é uma oportunidade para diferentes classes de objetos, relacionadas através de herança,
de responder de v árias formas quando o mesmo elemento de função for chamado. Isso ajuda a criar
um mecanismo universal descrevendo o comportamento não apenas da classe base, mas também das
classes descendentes.
Vamos continuar a desenvolver uma classe base CShape, e definir uma função membro GetArea(),
destinado a calcular a área de uma forma. Em todas as classes descendentes, produzidas por herança
a partir da classe base, nós redefinimos esta função de acordo com as regras de cálculo de área de
uma forma (shape) particular.
Para um quadrado (classe CSquare), a área é calculada através de seu lado, para um círculo (classe
CCircle), a área é expressa através de seu raio, etc. Nós podemos criar um array para armazenas
objetos do tipo CShape, no qual tanto objetos da classe base como todos os objetos de classes
descendentes podem ser armazenados. Mais adiante, podemos chamar a mesma função para cada
elemento do array.
Exemplo:
//--- Classe Base
class CShape
{
protected:
int m_type; // tipo da forma
int m_xpos; // X - coordenada do ponto base
int m_ypos; // Y - coordenada do ponto de base
public:
void CShape(){m_type=0;}; // construtor, tipo=0
int GetType(){return(m_type);};// retorna o tipo da forma
virtual
double GetArea(){return (0); }// retorna a área da forma
};
Agora, todas as classes derivadas têm uma função membro getArea(), que retorna o valor zero. A
implementação desta função em cada descendente não será a mesma.
public:
void CCircle(){m_type=1;}; // construtor, tipo=1
void SetRadius(double r){m_radius=r;};
virtual double GetArea(){return (3.14*m_radius*m_radius);}// área do círculo
};
class CSquare : public CShape // Depois do dois pontos definimos a classe base
{ // a partir do qual a herança é feita
private:
double m_square_side; // lado do quadrado
public:
void CSquare(){m_type=2;}; // construtor, tipo=2
void SetSide(double s){m_square_side=s;};
virtual double GetArea(){return (m_square_side*m_square_side);}// área quadrada
};
Para calcular a área do quadrado e círculo, precisamos dos correspondentes valores de m_radius e
m_square_side, por isso nós adicionamos as funções SetR adius() e SetSide() na declaração da
correspondente classe.
Assumimos que objetos de diferentes tipos (CCircle e CSquare) derivados do tipo base CShape são
usados em nosso programa. Polimorfismo permite criar um array de objetos da classe base CShape,
mas ao declarar este array, estes objetos são desconhecidos e o tipo deles é indefinido.
A decisão sobre que tipo de objeto estará contido em cada elemento do array será tomada
diretamente durante a execução do programa. Isso envolve a criação dinâmica de objetos das classes
apropriadas, e portanto a necessidade do uso de ponteiros de objeto ao invés de objetos.
O operador new é usado para criação dinâmica de objetos. Cada um destes objetos devem ser
individualmente e explicitamente excluídos usando o operador delete. Portanto declararemos um array
de ponteiros do tipo CShape, e criaremos um objeto de um tipo apropriado para cada elemento (new
Class_Name), como mostrado no exemplo de script seguinte:
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
//--- Declararmos um array de ponteiros de objeto do tipo base
CShape *shapes[5]; // Um array de ponteiros para objetos CShape
//circle.SetRadius(10);
//shapes[2]=circle;
}
}
Favor notar que ao excluir um objeto usando o operador delete, o tipo de seu ponteiro deve ser
verificado. Somente objetos com ponteiro do tipo POINT ER_DYNAM IC podem ser excluídos usando
delete. Para ponteiros de outros tipos, um erro será retornado.
Também Veja
Standard Library
Sobrecarga (Overload)
Dentro de uma classe é possível definir dois ou mais métodos que usam o mesmo nome, mas tem
número diferente de parâmetros. Quando isso ocorre, estes métodos são chamados de
sobrecarregados e tal processo é referido como sobrecarga de método.
Se a função chamada não tem correspondência exata, o compilador busca por uma função adequada
em três níveis seqüencialmente:
Se não houver correspondência exata em todos os níveis, mas v árias funções adequadas em
diferentes níveis foram encontradas, a função encontrada no menor nível é usada. Dentro de um nível,
não pode haver mais de uma função adequada.
Também Veja
R ecarregando Funções
Funções Virtuais
A palavra-chave virtual é o especificador de função que fornece um mecanismo para selecionar
dinamicamente em tempo de execução uma função-membro apropriada entre as funções de classes
base e derivadas. Estrutura não podem ter funções virtuais. Pode ser usado para alterar as
declarações de funções -membro somente.
A função virtual, assim como uma função comum, deve ter um corpo executável. Ao ser chamada, sua
semântica é a mesma que das outras funções.
Uma função virtual pode ser sobreposta (overridden) em um classe derivada. A escolha de qual
definição de função deve ser chamada para uma função virtual é feita dinamicamente (em tempo de
execução). Um caso típico é quando uma classe base contém uma função virtual, e as classes
derivadas têm sua própria versão desta função.
O ponteiro para a classe base pode indicar tanto um objeto da classe base quanto um objeto de uma
classe derivada. A escolha da função-membro a ser chamada será executada em tempo de execução e
dependerá do tipo do objeto, não do tipo do ponteiro. Se não houver nenhum membro de um tipo
derivado, a função virtual da classe base é usada por default.
Destrutores são sempre virtuais, independentemente se elas estão declaradas com a palavra-chave
virtual ou não.
Vamos considerar o uso de funções virtuais no exemplo do M T 5_T etris.mq5. A classe base
CT etrisShape com a função virtual de desenhar é definjida na inclusão do arquivo
M T 5_T etisShape.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; }
Mais adiante, para cada classe derivada, esta função é implementada de acordo com as características
da classe descendente. Por exemplo, a primeira forma CT etrisShape1 tem sua implementação própria
da função Draw():
A forma Quadrado é descrita por meio da classe CT etrisShape6 e tem sua implementação própria do
método Draw():
Dependendo da classe da qual o objeto criado pertence, é chamada a função virtual desta ou daquela
classe derivada.
void CTetrisField::NewShape()
{
//--- criando uma dos 7 possíveis formas aleatoriamente
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;
}
//--- desenhar
m_shape.Draw();
//---
}
Modificador override
O modificador override indica que a função declarada deve substituir o método da classe pai. O uso
deste modificador permite evitar erros durante as substituições, por exemplo, durante uma alteração
aleatória na assinatura do método. Ou, por exemplo, na classe base, está definido o método func, ele
é usado como argumento da variável do tipo int:
class CFoo
{
void virtual func(int x) const { }
};
No entanto, no caso de haver um erro, o tipo de argumento é alterado de int para short. De fato, aqui
acontece uma sobrecarga do método. Agindo em conformidade com o algoritmo de estabelecimento da
função sobrecarregada, em determinadas situações, o compilador pode selecionar o método definido
na classe base, em vez de escolher o método de substituição.
Para evitar esses erros, é necess ário adicionar o modificador override ao método de substituição.
Se, durante a substituição, for alterada a assinatura do método, o compilador não conseguirá
encontrar, na classe pai, o método com essa mesma assinatura e emitir o erro de compilação:
'CBar::func' method is declared with 'override' specifier but does not override any base class meth
Modificador final
Ao contrário do anterior, o modificador final proíbe a substituição do método em classes de herança.
Se a implementação do método for auto-suficiente e concluída na sua totalidade, declare esse fato
usando o modificador final, para ele não ser alterado em conseqüência.
class CFoo
{
void virtual func(int x) final { }
};
Como no exemplo acima, ao tentar substituir o método usando o modificador final, o compilador irá
emitir um erro:
Veja Também
Standard Library
A incapacidade de declarar membros estáticos de uma classe teria levado a necessidade de declarar
estes dados no nível global do programa. Isso quebraria a relação entre os dados e a classe deles, e
não seria consistente com o paradigma básico da OOP - juntar dados e métodos para manipulá-los em
uma classe. O membro estático permite que dados de classe não específicos a uma particular instância
existam no escopo da classe.
Desde que um membro de classe estática não dependa de uma particular instância, a referência a ele
é como se segue:
class_name::variable
Como se v ê, para acessar o membro estático de uma classe, o operador de resolução de contexto :: é
usado. Ao acessar um membro estático de dentro de métodos da classe, o operador de contexto é
opcional.
Membro estático de uma classe deve ser explicitamente inicializado com o valor desejado. Para isso,
deve ser declarado e inicializado em escopo global. A sequência de inicialização dos membros
estáticos corresponderá a sequência de sua declaração em escopo global.
Por exemplo, temos a classe CParser usado para separar o texto, e precisamos contar o número total
de palavras e caracteres processados. Nós só precisamos declarar os membros de classe necess ários
como estáticos e inicializá-los no nível global. Então todas as instâncias da classe usarão um contador
comum para palavras e caracteres.
//+------------------------------------------------------------------+
//| Classe "Analisador de Texto" |
//+------------------------------------------------------------------+
class CParser
{
public:
static int s_words;
static int s_symbols;
//--- Construtor e destrutor
CParser(void);
~CParser(void){};
};
...
//--- Inicialização de membros estáticos da classe Parser no nível global
int CParser::s_words=0;
int CParser::s_symbols=0;
Um membro de classe estático pode ser declarado com a palavra-chave const. T ais constantes
estáticas devem ser inicializadas no nível global com a palavra-chave const:
//+------------------------------------------------------------------+
//| Classe "Stack" para armazenar dados processados |
//+------------------------------------------------------------------+
class CStack
{
public:
CStack(void);
~CStack(void){};
...
private:
static const int s_max_length; // Capacidade máxima da pilha
};
Ponteiro this
A palavra-chave this denota um ponteiro implicitamente declarado para si mesmo – para uma instância
específica da classe, no contexto do qual o método é executado. Pode ser usado somente em métodos
não estáticos da classe. O ponteiro this é um membro não estático implícito de qualquer classe.
Em funções estáticas você pode acessar somente membros /métodos estáticos de uma classe.
Métodos Estáticos
Em MQL5, funções membro do tipo estático podem ser usadas. O modificador static deve preceder o
tipo do retorno de uma função na declaração dentro de uma classe.
class CStack
{
public:
//--- Construtor e destrutor
CStack(void){};
~CStack(void){};
//--- Capacidade mбxima da pilha
static int Capacity();
private:
int m_length; // O nъmero de elementos na pilha
static const int s_max_length; // Capacidade mбxima da pilha
};
//+------------------------------------------------------------------+
//| Retorna o nъmero mбximo de elementos armazenados na pilha |
//+------------------------------------------------------------------+
int CStack::Capacity(void)
{
return(s_max_length);
}
//--- Inicializaзгo da constante estбtica da classe CStack
const int CStack::s_max_length=1000;
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- declare CStack type variable
CStack stack;
//--- call the object's static method
Print("CStack.s_max_length=",stack.Capacity());
//--- it can also be called the following way, as the method is static and does not require the pre
Print("CStack.s_max_length=",CStack::Capacity());
}
Um método com o modificador const é chamado de constante e não pode alterar membros implícitos
de sua classe. A declaração de funções constantes de uma classe e parâmetros constantes é chamado
de controle const-correção. Através deste controle pode-se assegurar que o compilador garantirá a
consistência de valores de objetos e retornará um erro durante a compilação se existir algo errado.
O modificador const é colocado após a lista de argumentos dentro de uma declaração de classe. A
definição do lado de fora de uma classe deve também incluir o modificador const:
//+------------------------------------------------------------------+
//| Class "Retângulo" |
//+------------------------------------------------------------------+
class CRectangle
{
private:
double m_width; // Largura
double m_height; // Altura
public:
//--- Construtor e destrutor
CRectangle(void):m_width(0),m_height(0){};
CRectangle(const double w,const double h):m_width(w),m_height(h){};
~CRectangle(void){};
//--- Calculando a área
double Square(void) const;
static double Square(const double w,const double h);// { return(w*h); }
};
//+------------------------------------------------------------------+
//| Retorna a área do objeto "Retângulo" |
//+------------------------------------------------------------------+
double CRectangle::Square(void) const
{
return(Square(m_width,m_height));
}
//+------------------------------------------------------------------+
//| Retorna o produto de duas variáveis |
//+------------------------------------------------------------------+
static double CRectangle::Square(const double w,const double h)
{
return(w*h);
}
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
//--- Criar um retângulo reto com os lados iguais a 5 e 6
CRectangle rect(5,6);
//--- Procurar a área do retângulo usando um método constante
PrintFormat("rect.Square()=%.2f",rect.Square());
//--- Procurar o produto de números usando o método estático da classe CRectangle
PrintFormat("CRectangle::Square(2.0,1.5)=%f",CRectangle::Square(2.0,1.5));
}
Um argumento adicional a favor do uso do controle de constância é o fato de que neste caso, o
compilador gera uma otimização especial, por exemplo, coloca um objeto constante na memória de
somente-leitura.
Uma função estática não pode ser determinada com o modificador const, porque este modificar
garante a constância dos membros de instância quando chamar esta função. Mas, como mencionado
acima, a função estática não pode acessar membros de classe não estática.
Também Veja
Variáveis Estáticas, Variáveis, R eferências. Modificador & e Palavra-chave this
Templates de Função
Funções sobrecarregadas são normalmente usadas para realizar operações similares em v ários tipos
de dados. ArraySize() é um exemplo simples de tal função em MQL5. Ela retorna o tamanho de
qualquer tipo de array. De fato, esta função de sistema é sobrecarregada e a implementação completa
de tal sobrecarga é escondida dos desenvolvedores de aplicativos MQL5:
int ArraySize(
void& array[] // array verificado
);
Isso significa que o compilador da linguagem MQL5 insere a implementação necess ária para cada
chamada desta função. Por exemplo, é assim que é implementado para arrays de tipo inteiro:
int ArraySize(
int& array[] // array com elementos de tipo int
);
A função ArraySize() pode ser exibida da seguinte forma para array de tipo MqlR ates para trabalhar
com cotações em formato de dados históricos :
int ArraySize(
MqlRates& array[] // array preenchido com valores de tipo MqlRates
);
Assim, é muito conveniente usar a mesma função para trabalhar com tipos diferentes. No entanto,
todo trabalho preliminar deve ser realizado - a função necess ária deve ser sobrecarregada para todos
os tipos de dados com os quais a função deve trabalhar corretamente.
Existe uma solução conveniente. Se operações similares devem ser executadas para cada tipo de
dado, é possível usar templates de função. Neste caso, um programador precisa escrever somente
uma descrição de template de função. Ao descrever o template de tal forma, nós devemos especificar
somente alguns parâmetros formais ao invés de alguns tipos de dados definidos com os quais a função
deve trabalhar. O compilador automaticamente gerará v árias funções para o apropriado handling de
cada tipo baseado nos tipos de argumentos usados ao chamar a função.
A definição de template de função começa com a palavra-chave template seguida pela lista de
parâmetros entre chaves angulares. Cada parâmetro formal é precedido pela palavra-chave typename.
T ipos de parâmetros formais são tipos incorporados ou definidos pelo usuário. Eles são usados :
O número de parâmetros de template não pode exceder oito. Cada parâmetro formal na definição de
template deve aparecer na lista de parâmetros da função pelo menos uma vez. Cada nome de um
parâmetro formal deve ser único.
Abaixo está um exemplo de um template de função para buscar do valor mais alto em um array de
qualquer tipo numérico (números inteiros ou reais):
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);
}
Este template define a função que encontra o valor mais alto no array passado e retorna este valor
como resultado. Lembre-se que a função ArrayMaximum() construída em MQL5 retorna apenas o
índice do valor mais alto que pode ser usado para encontrar o valor em si. Por exemplo:
Assim, nós realizamos dois passos para obter obter o valor mais alto no array. Com o template de
função ArrayMax(), nós podemos obter o resultado do tipo necess ário apenas passando o array de tipo
apropriado para esta função. Isso significa que ao invés das últimas duas linhas :
nós podemos usar somente uma linha, cujo resultado retornado tem o mesmo tipo que o array passado
para a função:
Neste caso, o tipo do resultado retornado pela função ArrayMax() corresponderá automaticamente ao
tipo do array.
Use a palavra chave typename para obter o tipo do argumento como uma string a fim de criar métodos
de propósito geral para trabalhar com v ários tipos de dados. Vamos considerar um exemplo específico
da função que retorna tipo de dado como uma string :
#include <Trade\Trade.mqh>
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void OnStart()
{
//---
CTrade trade;
double d_value=M_PI;
int i_value=INT_MAX;
Print("d_value: tipo=",GetTypeName(d_value), ", valor=", d_value);
Print("i_value: tipo=",GetTypeName(i_value), ", valor=", i_value);
Print("trade: tipo=",GetTypeName(trade));
//---
}
//+------------------------------------------------------------------+
//| Tipo é retornado como uma linha |
//+------------------------------------------------------------------+
template<typename T>
string GetTypeName(const T &t)
{
//--- retorna o tipo como uma linha
return(typename(T));
//---
}
T emplates de função podem também serem usados para métodos de classe, por exemplo:
class CFile
{
...
public:
...
template<typename T>
uint WriteStruct(T &data);
};
template<typename T>
uint CFile::WriteStruct(T &data)
{
...
return(FileWriteStruct(m_handle,data));
}
Os templates de função não deve ser declarados com as palavras -chave export, virtual e #import.
//+------------------------------------------------------------------+
//| Função de modelo |
//+------------------------------------------------------------------+
template<typename T1,typename T2>
string Assign(T1 &var1,T2 var2)
{
var1=(T1)var2;
return(__FUNCSIG__);
}
//+------------------------------------------------------------------+
//| Sobrecarga especial para o caso bool+string |
//+------------------------------------------------------------------+
string Assign(bool &var1,string var2)
{
var1=(StringCompare(var2,"true",false) || StringToInteger(var2)!=0);
return(__FUNCSIG__);
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
int i;
bool b;
Print(Assign(i,"test"));
Print(Assign(b,"test"));
}
Como resultado da execução deste código, vemos que, para o par int+string, foi usada a função de
modelo Assign(), enquanto, após a segunda chamada, para o par bool+string, já foi usada a versão
sobrecarregada.
string Assign<int,string>(int&,string)
string Assign(bool&,string)
Veja também
Sobrecarga
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);
Neste caso, o parâmetro formal T especifica o tipo de dados utilizados, durante a compilação, ele é
substituído pelo tipo real utilizado, ou seja, o compilador gera automaticamente uma função separada
para cada tipo, isto é, double, datetime e assim por diante. Da mesma forma, na linguagem MQL5,
você pode criar modelos de classes usando todas as vantagens de tal abordagem.
Modelos de classes
O modelo de classe é declarado usando a palavra-chave template, seguida pelos colchetes angulares
<>, nos quais são listados os parâmetros formais com a palavra-chave typename. Este registro indica
ao compilador que está perante uma classe genérica na com o parâmetro formal T que especifica o
tipo real da variável ao implementar a classe. Por exemplo, criamos uma classe vector para armazenar
a matriz com elementos do tipo T :
Em seguida, no programa, criamos de maneiras diferentes três objetos TArray para trabalhar com
diferentes tipos
void OnStart()
{
TArray<double> double_array; // por padrão, o tamanho do vetor é 10
TArray<int> int_array(15); // o tamanho do vetor é 15
TArray<string> *string_array; // ponteiro para o vetor TArray<string>
//--- criamos o objeto dinâmico
string_array=new TArray<string>(20);
//--- no Diário, exibimos o nome do objeto, tipo de dados e tamanho do vetor
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());
//--- excluímos o objeto dinâmico antes de encerrar o programa
delete(string_array);
}
R esultado do script:
double_array (double:10)
int_array (int:15)
string_array (string:20)
Como resultado, foram criados 3 vetores com diferentes tipos de dados : double, int e string.
Os modelos de classes são adequados para desenvolver recipientes, isto é, os objetos destinados a
encapsular qualquer tipo de objeto. Os objetos dos recipientes são coleções que já contêm objetos de
um tipo particular. Normalmente, o recipiente imediatamente é integrado e implementado para
trabalhar com dados que são armazenados nele.
Por exemplo, é possível criar um modelo de classe que não permita acessar um elemento fora da
matriz e, assim, evitar o erro crítico " out of range" .
//+------------------------------------------------------------------+
// | Classe para acessar com segurança um elemento da matriz |
//+------------------------------------------------------------------+
template<typename T>
class TSafeArray
{
protected:
T m_array[];
public:
//--- construtor por padrão
void TSafeArray(void){}
//--- construtor para criar a matriz do tamanho especificado
void TSafeArray(int size){ArrayResize(m_array,size);}
//--- tamanho de matriz
int Size(void){return(ArraySize(m_array));}
//--- alteração do tamanho da matriz
int Resize(int size,int reserve){return(ArrayResize(m_array,size,reserve));}
//--- libertação da matriz
void Erase(void){ZeroMemory(m_array);}
//--- operador de acesso ao elemento da matriz de acordo com o índice
T operator[](int index);
//--- operador de atribuição para obter imediatamente todos os elementos a partir da matriz
void operator=(const T &array[]); // matriz do tipo T
};
//+------------------------------------------------------------------+
//| Operação de obtenção do elemento segundo o índice |
//+------------------------------------------------------------------+
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 index %d is not in range (0-%d)!",__FUNCTION__,index,max);
return(invalid_value);
}
//---
return(m_array[index]);
}
//+------------------------------------------------------------------+
//| Operação de atribuição para a matriz |
//+------------------------------------------------------------------+
template<typename T>
void TSafeArray::operator=(const T &array[])
{
int size=ArraySize(array);
ArrayResize(m_array,size);
//--- o tipo T deve suportar o operador de cópia
for(int i=0;i<size;i++)
m_array[i]=array[i];
//---
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
int copied,size=15;
MqlRates rates[];
//--- copiamos a matriz de cotações
if((copied=CopyRates(_Symbol,_Period,0,size,rates))!=size)
{
PrintFormat("CopyRates(%s,%s,0,%d) retornou o código de erro %d",
_Symbol,EnumToString(_Period),size,GetLastError());
return;
}
//--- criamos o recipiente e colocamos nele a matriz dos valores MqlRates
TSafeArray<MqlRates> safe_rates;
safe_rates=rates;
//--- índice nos limites da matriz
int index=3;
PrintFormat("Close[%d]=%G",index,safe_rates[index].close);
//--- índice fora dos limites da matriz
index=size;
PrintFormat("Close[%d]=%G",index,safe_rates[index].close);
}
Note-se que, na descrição dos métodos fora da declaração da classe, também é necess ário utilizar a
declaração de modelo:
template<typename T>
T TSafeArray::operator[](int index)
{
...
}
template<typename T>
void TSafeArray::operator=(const T &array[])
{
...
}
Os modelos de classes e funções permitem especificar v ários parâmetros formais, separados por
vírgulas, por exemplo, coleção Map para armazenar os pares " chave - valor":
Veja também
Modelos de funções, Sobrecarga
Uma classe, que contenha pelo menos uma função meramente virtual, é abstrata. Portanto, as classes
derivadas da classe abstrata devem implementar todas as suas funções meramente virtuais, caso
contrário, elas serão também classes abstratas.
A função virtual é declarada como " pura" utilizando a sintaxe do especificador de pureza.
Consideremos, como exemplo, uma classe CAnimal, criada apenas para fornecer funções comuns - são
os próprios objetos do tipo CAnimal que têm um caráter demasiado geral para um uso prático. Assim,
a classe CAnimal é uma boa candidata para classe abstrata:
class CAnimal
{
public:
CAnimal(); // construtor
virtual void Sound() = 0; // função meramente virtual (pura)
private:
double m_legs_count; // número de patas do animal
};
Aqui a função Sound() é meramente virtual, porque é declarada com o especificador da função
meramente virtual PUR E (=0).
São funções meramente virtuais apenas aquelas funções virtuais para as quais é exibido o
especificador de pureza PUR E, nomeadamente: (=NULL) ou (=0). Exemplo de declaração e utilização de
uma classe abstrata:
class CAnimal
{
public:
virtual void Sound()=NULL; // PURE method, deve ser substituído no descendente, a própri
};
//--- descendente a partir da classe abstrata
class CCat : public CAnimal
{
public:
virtual void Sound() { Print("Myau"); } // PURE é substituída, classe CCat não é abstrata
};
//+------------------------------------------------------------------+
//| Classe básica abstrata |
//+------------------------------------------------------------------+
class CAnimal
{
public:
//--- função virtual única
virtual void Sound(void)=NULL;
//--- função
void CallSound(void) { Sound(); }
//--- construtor
CAnimal()
{
//--- chamada explícita para um método virtual
Sound();
//--- chamada implícita (através de uma terceira função)
CallSound();
//--- no construtor e/ou destruidor sempre são chamadas suas funções,
//--- apesar da virtualidade e substituíção da função chamada no descendente
//--- se a função chamada for meramente virutal (pura), então,
//--- a chamada irá resultar no erro de execução: "pure virtual function call"
}
};
Espaços de nomes
O namespace (espaço para nome) é uma área especialmente declarada dentro da qual são definidos
v ários identificadores : variáveis, funções, classes, etc. A. È definido com ajuda da palavra-chave
namespace:
namespace nome_espaço {
// lista de definições de funções, de classes e de variáveis
}
namespace ProjectData
{
class DataManager
{
public:
void LoadData() {}
};
void Func(DataManager& manager) {}
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- trabalhando com o namespace ProjectData
ProjectData::DataManager mgr;
mgr.LoadData();
ProjectData::Func(mgr);
}
Os namespace são usados para organizar o código como grupos lógicos e para evitar conflitos de
nomes que podem ocorrer quando são usadas v árias bibliotecas em um programa. Nesses casos, cada
biblioteca pode ser declarada em seu namespace, para que possa acessar explicitamente as funções e
classes necess árias de cada biblioteca.
Um namespace pode ser declarado em v ários blocos em um ou em v ários arquivos. O compilador reúne
todas as partes durante o pré-processamento e namespace resultante contém todos os membros
declarados em todas as partes. Suponhamos que implementemos a classe A no arquivo incluído
Sample.mqh:
//+------------------------------------------------------------------+
//| Sample.mqh |
//+------------------------------------------------------------------+
class A
{
public:
A() {Print(__FUNCTION__);}
};
Queremos usar essa classe em nosso projeto, mas já temos a classe A. Para poder usar as duas
classes e evitar conflitos de identidade, basta agrupar o arquivo incluído em um namespace:
/*
Resultado:
A::A
Library::A::A
Library::B::B
*/
Os namespace podem ser aninhados. Um namespace aninhado tem acesso ilimitado aos membros do
seu espaço pai, mas os membros do espaço pai não têm acesso ilimitado ao espaço para nome
aninhado.
namespace General
{
int Func();
namespace Details
{
int Counter;
int Refresh() {return Func(); }
}
Namespace global
Se o identificador não for declarado explicitamente no namespace, ele é implicitamente considerado
parte do namespace global. Para especificar explicitamente um identificador global, use operador de
escopo de resolução sem nome. Isso permite distinguir esse identificador de qualquer outro elemento
com o mesmo nome localizado em um namespace diferente. Por exemplo, ao importar uma função:
#import "lib.dll"
int Func();
#import
//+------------------------------------------------------------------+
//| Alguma das nossas funções |
//+------------------------------------------------------------------+
int Func()
{
return(0);
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//+--- chamada de função impotada
Print(lib::Func());
//+--- chamada de nossa função
Print(::Func());
}
Nesse caso, todas as funções importadas da DLL são incluídas no namespace com o mesmo nome. Isso
permite que o compilador determine exclusivamente qual função chamar.
Véase también
Variáveis Globais, Variáveis Locais, Visibilidade Escopo e T empo de Vida de Variáveis, Criação e
Exclusão de Objetos
· Constantes de Gráfico são usadas ao trabalhar com gráficos de preços : abertura, navegação,
definição de parâmetros ;
· Constantes de objetos são destinadas para processar objetos gráficos que podem ser criados e
exibidos em gráficos ;
· Constantes de indicadores são usadas para trabalhar com indicadores padrões ou customizadas ;
Constantes de Gráfico
As constantes descrevendo v árias propriedades de gráficos são agrupadas na seguinte forma:
· Propriedades de gráfico – identificadores que são usados como parâmetros de funções de gráfico;
ENUM_CHART_EVENT
ID Descrição
CH ART EVENT_KEYDOWN T eclada
Para cada tipo de evento, os parâmetros de entrada da função OnChartEvent() têm valores definidos
que são requeridos para o processamento deste evento. Os eventos e valores passados através destes
parâmetros são listados na tabela abaixo.
Exemplo:
#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
//+------------------------------------------------------------------+
//| Função de inicialização do Expert |
//+------------------------------------------------------------------+
int OnInit()
{
//---
Print("O expert com nome ",MQL5InfoString(MQL5_PROGRAM_NAME)," está executando");
//--- Ativar eventos de criação de objetos
ChartSetInteger(ChartID(),CHART_EVENT_OBJECT_CREATE,true);
//--- Ativar eventos de exclusão de objetos
ChartSetInteger(ChartID(),CHART_EVENT_OBJECT_DELETE,true);
//--- A atualização forçada das propriedades do gráfico garante a prontidão para o processamento de
ChartRedraw();
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Funções ChartEvent |
//+------------------------------------------------------------------+
void OnChartEvent(const int id, // Identificador de evento
const long& lparam, // Parâmetro de evento de tipo long
const double& dparam, // Parâmetro de evento de tipo double
const string& sparam // Parâmetro de evento de tipo string
)
{
//--- o botão esquerdo do mouse foi pressionado no gráfico
if(id==CHARTEVENT_CLICK)
{
Print("As coordenadas do clique do mouse sobre o gráfico são: x = ",lparam," y = ",dparam);
}
//--- o mouse foi clicado sobre o objeto gráfico
if(id==CHARTEVENT_OBJECT_CLICK)
{
Print("O mouse foi clicado sobre o objeto com o nome '"+sparam+"'");
}
//--- a tecla foi pressionada
if(id==CHARTEVENT_KEYDOWN)
{
switch(lparam)
{
case KEY_NUMLOCK_LEFT: Print("O KEY_NUMLOCK_LEFT foi pressionado"); break;
case KEY_LEFT: Print("O KEY_LEFT foi pressionado"); break;
case KEY_NUMLOCK_UP: Print("O KEY_NUMLOCK_UP foi pressionado"); break;
case KEY_UP: Print("O KEY_UP foi pressionado"); break;
case KEY_NUMLOCK_RIGHT: Print("O KEY_NUMLOCK_RIGHT foi pressionado"); break;
case KEY_RIGHT: Print("O KEY_RIGHT foi pressionado"); break;
case KEY_NUMLOCK_DOWN: Print("O KEY_NUMLOCK_DOWN foi pressionado"); break;
case KEY_DOWN: Print("O KEY_DOWN foi pressionado"); break;
case KEY_NUMPAD_5: Print("O KEY_NUMPAD_5 foi pressionado"); break;
Para o evento CH ART EVENT_MOUSE_MOVE, o parâmetro string sparam Contém informações sobre o
estado do teclado e botões do mouse:
Bit Descrição
1 Estado do botão esquerdo do mouse
Exemplo:
//+------------------------------------------------------------------+
//| Função de inicialização do Expert |
//+------------------------------------------------------------------+
void OnInit()
{
//--- habilitar mensagens do CHART_EVENT_MOUSE_MOVE
ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,1);
// --- desativar o menu de contexto do gráfico (à direita)
ChartSetInteger(0,CHART_CONTEXT_MENU,0);
// --- desativar a cruz (pelo botão do meio)
ChartSetInteger(0,CHART_CROSSHAIR_TOOL,0);
//--- a atualização forçada das propriedades do gráfico garante a prontidão para o processamento de
ChartRedraw();
}
//+------------------------------------------------------------------+
//| MouseState |
//+------------------------------------------------------------------+
string MouseState(uint state)
{
string res;
res+="\nML: " +(((state& 1)== 1)?"DN":"UP"); // mouse esquerdo
res+="\nMR: " +(((state& 2)== 2)?"DN":"UP"); // mouse direito
res+="\nMM: " +(((state&16)==16)?"DN":"UP"); // mouse do meio
res+="\nMX: " +(((state&32)==32)?"DN":"UP"); // mouse primeiro X key
res+="\nMY: " +(((state&64)==64)?"DN":"UP"); // mouse segundo X key
res+="\nSHIFT: "+(((state& 4)== 4)?"DN":"UP"); // shift key
res+="\nCTRL: " +(((state& 8)== 8)?"DN":"UP"); // control key
return(res);
}
//+------------------------------------------------------------------+
//| Funções ChartEvent |
//+------------------------------------------------------------------+
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));
}
Para o evento CH ART EVENT_MOUSE_WH EEL, os parâmetros lparam e dparam contêm informações
sobre o estado da tecla Ctrl, Shift, dos botões do mouse, coordenadas da cursor e dimensão da
rolagem da roda do mouse. Para entender melhor o funcionamento deste Expert Advisor no gráfico,
role a roda do mouse pressionando os diversos botões e teclas descritos no código.
//--- a atualização forçada das propriedades do gráfico garante a prontidão para o processamento de
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)
{
//--- analisemos o estado dos botões e da roda do mouse para este evento
int flg_keys = (int)(lparam>>32); // sinalizador de estado de teclas Ctrl, Shift e d
int x_cursor = (int)(short)lparam; // coordenada X, em que acontece o evento da roda
int y_cursor = (int)(short)(lparam>>16); // coordenada Y, em que acontece o evento de roda
int delta = (int)dparam; // valor total de rolagem da roda, é ativado ao al
//--- processamos o sinalizador
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
}
}
//+------------------------------------------------------------------+ /*
Exemplo de saída
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 */
Veja Também
Funções de Manipulação de Evento, T rabalhando com eventos
ENUM_TIMEFRAMES
ID Descrição
PERIOD_CURR ENT Janela de tempo corrente
PERIOD_M 1 1 minuto
PERIOD_M 2 2 minutos
PERIOD_M 3 3 minutos
PERIOD_M 4 4 minutos
PERIOD_M5 5 minutos
PERIOD_M 6 6 minutos
PERIOD_M 10 10 minutos
PERIOD_M 12 12 minutos
PERIOD_M 15 15 minutos
PERIOD_M 20 20 minutos
PERIOD_M 30 30 minutos
PERIOD_H1 1 hora
PERIOD_H2 2 horas
PERIOD_H3 3 horas
PERIOD_H4 4 horas
PERIOD_H6 6 horas
PERIOD_H8 8 horas
PERIOD_H12 12 horas
PERIOD_D1 1 dia
PERIOD_W1 1 semana
PERIOD_M N1 1 mês
Exemplo:
string chart_name="test_Object_Chart";
Print("Vamos tentar criar um objeto gráfico com o nome ",chart_name);
//--- Se tal objeto não existir - criá-lo
if(ObjectFind(0,chart_name)<0)ObjectCreate(0,chart_name,OBJ_CHART,0,0,0,0,0);
//--- Define o ativo
ObjectSetString(0,chart_name,OBJPROP_SYMBOL,"EURUSD");
//--- Define a coordenada X do ponto de ancoragem
ObjectSetInteger(0,chart_name,OBJPROP_XDISTANCE,100);
//--- Define a coordenada Y do ponto de ancoragem
ObjectSetInteger(0,chart_name,OBJPROP_YDISTANCE,100);
//--- Define a largura do gráfico
ObjectSetInteger(0,chart_name,OBJPROP_XSIZE,400);
//--- Define a altura
ObjectSetInteger(0,chart_name,OBJPROP_YSIZE,300);
//--- Define a janela de tempo
ObjectSetInteger(0,chart_name,OBJPROP_PERIOD,PERIOD_D1);
//--- Define escala (de 0 a 5)
ObjectSetDouble(0,chart_name,OBJPROP_SCALE,4);
//--- Desativa a seleção por mouse
ObjectSetInteger(0,chart_name,OBJPROP_SELECTABLE,false);
Identificadores de timeseries
Identificadores de timeseries são usados nas funções iH ighest() e iLowest(). Pode ser um dos valores
da enumeração
ENUM_SERIESMODE
Identificador Descrição
MODE_OPEN Preço de abertura
Veja Também
PeriodSeconds, Period, Data e H ora, Visibilidade de objetos
Propriedades de Gráfico
Identificadores de enumeradores ENUM _CH ART_PR OPERTY são usados como parâmetros de funções
para trabalhar com gráficos. A abreviatura de r/o na coluna "T ipo de Propriedade" significa que esta
propriedade é somente de leitura e não pode ser alterada. A abreviatura w/o na coluna "T ipo de
Propriedade" significa que esta propriedade é somente leitura e não pode ser recebida. Ao acessar
certas propriedades, é necess ário especificar um parâmetro adicional, que serve para indicar o
número da sub-janela do gráfico. 0 significa a janela principal.
As funções que definem as propriedades do gráfico são realmente utilizadas para enviar comandos de
alteração no gráfico. Se essas funções forem executadas com êxito, o comando será incluído na fila
comum dos eventos do gráfico. As alterações são implementadas para o gráfico ao manipular a fila
dos eventos gráficos.
Assim, não espere uma atualização visual imediata do gráfico após chamar essas funções.
Geralmente, o gráfico é atualizado automaticamente pelo terminal após os eventos de alteração - uma
nova chegada de cotação, redimensionando a janela do gráfico, etc. Use a função ChartR edraw() Para
forçar a atualizar do gráfico.
ENUM_CHART_PROPERTY_INTEGER
CH ART_CR OSS H AIR_T OOL H abilitar/desabilitar o acesso bool (valor por padrão true)
ao instrumento " Cruz"
pressionando o botão do meio
do mouse.
CH ART_EVENT_MOUSE_WH EEL Envio de todos os programas bool (valor por padrão true)
mql5 para o gráfico de
notificações sobre eventos da
roda do mouse
(CH ART EVENT_MOUSE_WH EEL)
CH ART_S H OW_ONE_CL ICK Showing the " One click trading " bool
panel on a chart
ENUM_CHART_PROPERTY_DOUBLE
ENUM_CHART_PROPERTY_STRING
Exemplo:
int chartMode=ChartGetInteger(0,CHART_MODE);
switch(chartMode)
{
case(CHART_BARS): Print("CHART_BARS"); break;
case(CHART_CANDLES): Print("CHART_CANDLES");break;
default:Print("CHART_LINE");
}
bool shifted=ChartGetInteger(0,CHART_SHIFT);
if(shifted) Print("CHART_SHIFT = true");
else Print("CHART_SHIFT = false");
bool autoscroll=ChartGetInteger(0,CHART_AUTOSCROLL);
if(autoscroll) Print("CHART_AUTOSCROLL = true");
else Print("CHART_AUTOSCROLL = false");
int chartHandle=ChartGetInteger(0,CHART_WINDOW_HANDLE);
Print("CHART_WINDOW_HANDLE = ",chartHandle);
int windows=ChartGetInteger(0,CHART_WINDOWS_TOTAL);
Print("CHART_WINDOWS_TOTAL = ",windows);
if(windows>1)
{
for(int i=0;i<windows;i++)
{
int height=ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS,i);
double priceMin=ChartGetDouble(0,CHART_PRICE_MIN,i);
double priceMax=ChartGetDouble(0,CHART_PRICE_MAX,i);
Print(i+": CHART_HEIGHT_IN_PIXELS = ",height," pixels");
Print(i+": CHART_PRICE_MIN = ",priceMin);
Print(i+": CHART_PRICE_MAX = ",priceMax);
}
}
Veja Também
Exemplos de como trabalhar com um gráfico
Constantes de Posicionamento
T rês identificadores a partir da lista ENUM _CH ART_POS ITION são os possíveis valores do parâmetro
de posição para a função ChartNavigate().
ENUM_CHART_POSITION
ID Descrição
CH ART_BEGIN Começo do gráfico (o preço mais antigo)
Exemplo:
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("Navegar falhou. Erro = ",GetLastError());
ChartRedraw();
}
Representação de Gráfico
Os gráficos de preço podem ser exibidos de três maneiras :
· como barras ;
· como candles ;
· como um linha.
ENUM_CHART_MODE
ID Descrição
CH ART_BAR S Exibe como uma seqüência de barras
ENUM_CHART_VOLUME_MODE
ID Descrição
CH ART_VOL UME_HIDE Volumes não são exibidos
Exemplo:
//--- Obtém o manuseio do gráfico corrente
long handle=ChartID();
if(handle>0) // Se bem sucedido, customiza adicionalmente
{
//--- Desativa auto-rolagem
ChartSetInteger(handle,CHART_AUTOSCROLL,false);
//--- Define o encaixe da borda direita do gráfico
ChartSetInteger(handle,CHART_SHIFT,true);
//--- Exibe como candles
ChartSetInteger(handle,CHART_MODE,CHART_CANDLES);
//--- Rola por 100 barras a partir do começo do histórico
ChartNavigate(handle,CHART_CURRENT_POS,100);
//--- Define o modo de exibição de volume de tick
ChartSetInteger(handle,CHART_SHOW_VOLUMES,CHART_VOLUME_TICK);
}
Também Veja
ChartOpen, ChartID
a imagem abaixo mostra o painel gráfico ilustrando como modificara propriedade do gráficomudando
sua aparência. Clicando próximo botão permite definir o novo valor da propriedade apropriada e
visualizar as alterações na janela do gráfico.
//+--------------------------------------------------------------------------+
//| A função define se a rolagem do gráfico usando o botão esquerdo do mouse |
//| está habilitado. |
//+--------------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Verificar se mudança de eventos e cliques de mouse |
//| são enviadas para todas as aplicações mql5 no gráfico. |
//+------------------------------------------------------------------+
bool ChartEventMouseMoveGet(bool &result,const long chart_ID=0)
{
//--- preparar a variável para obter o valor da propriedade
long value;
//+---------------------------------------------------------------------+
//| Verificar se é mensagens do evento da criação de um objeto gráfico |
//| são enviadas para todas as aplicações mql5 no gráfico. |
//+---------------------------------------------------------------------+
bool ChartEventObjectCreateGet(bool &result,const long chart_ID=0)
{
//--- preparar a variável para obter o valor da propriedade
long value;
//--- redefine o valor de erro
ResetLastError();
//--- receber o valor da propriedade
if(!ChartGetInteger(chart_ID,CHART_EVENT_OBJECT_CREATE,0,value))
{
//--- exibe uma mensagem para o diário Experts
Print(__FUNCTION__+", Código de erro = ",GetLastError());
return(false);
}
//--- armazenar o valor da propriedade do gráfico na memória
result=value;
//--- sucesso na execução
return(true);
}
//+--------------------------------------------------------------------------+
//| A função habilita/desabilita o modo de envio de mensagens sobre |
//| o evento da criação do objeto gráfico para aplicações mql5 no |
//| gráfico. |
//+--------------------------------------------------------------------------+
bool ChartEventObjectCreateSet(const bool value,const long chart_ID=0)
{
//--- redefine o valor de erro
ResetLastError();
//--- define valor de propriedade
if(!ChartSetInteger(chart_ID,CHART_EVENT_OBJECT_CREATE,0,value))
{
//--- exibe uma mensagem para o diário Experts
Print(__FUNCTION__+", Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+---------------------------------------------------------------------+
//| Verificar se mensagens é do evento da exclusão de um objeto gráfico |
//| são enviadas para todas as aplicações mql5 no gráfico. |
//+---------------------------------------------------------------------+
bool ChartEventObjectDeleteGet(bool &result,const long chart_ID=0)
{
//--- preparar a variável para obter o valor da propriedade
long value;
//--- redefine o valor de erro
ResetLastError();
//--- receber o valor da propriedade
if(!ChartGetInteger(chart_ID,CHART_EVENT_OBJECT_DELETE,0,value))
{
//--- exibe uma mensagem para o diário Experts
}
//+------------------------------------------------------------------+
//| Define tipo de gráfico (candles, barras ou |
//| linha). |
//+------------------------------------------------------------------+
bool ChartModeSet(const long value,const long chart_ID=0)
{
//--- redefine o valor de erro
ResetLastError();
//--- define valor de propriedade
if(!ChartSetInteger(chart_ID,CHART_MODE,value))
{
//--- exibe uma mensagem para o diário Experts
Print(__FUNCTION__+", Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
if(!ChartSetInteger(chart_ID,CHART_SHIFT,0,value))
{
//--- exibe uma mensagem para o diário Experts
Print(__FUNCTION__+", Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
bool ChartScaleFixGet(bool &result,const long chart_ID=0)
{
//--- preparar a variável para obter o valor da propriedade
long value;
//--- redefine o valor de erro
ResetLastError();
//--- receber o valor da propriedade
if(!ChartGetInteger(chart_ID,CHART_SCALEFIX,0,value))
{
//--- exibe uma mensagem para o diário Experts
Print(__FUNCTION__+", Código de erro = ",GetLastError());
return(false);
}
//--- armazenar o valor da propriedade do gráfico na memória
result=value;
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| A função habilita/desabilita o modo de fixar a escala. |
//+------------------------------------------------------------------+
bool ChartScaleFixSet(const bool value,const long chart_ID=0)
{
//--- redefine o valor de erro
ResetLastError();
//--- define valor de propriedade
if(!ChartSetInteger(chart_ID,CHART_SCALEFIX,0,value))
{
//--- exibe uma mensagem para o diário Experts
Print(__FUNCTION__+", Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
}
//--- armazenar o valor da propriedade do gráfico na memória
result=value;
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------------------------+
//| A função habilita/desabilita o modo de definir a escala do gráfico em pontos por |
//| barra. |
//+------------------------------------------------------------------------------------+
bool ChartScalePerBarSet(const bool value,const long chart_ID=0)
{
//--- redefine o valor de erro
ResetLastError();
//--- define valor de propriedade
if(!ChartSetInteger(chart_ID,CHART_SCALE_PT_PER_BAR,0,value))
{
//--- exibe uma mensagem para o diário Experts
Print(__FUNCTION__+", Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
}
//+--------------------------------------------------------------------------+
//| A função habilita/desabilita o modo de exibição dos valores OHLC no |
//| canto superior esquerdo do gráfico. |
//+--------------------------------------------------------------------------+
bool ChartShowOHLCSet(const bool value,const long chart_ID=0)
{
//--- redefine o valor de erro
ResetLastError();
//--- define valor de propriedade
if(!ChartSetInteger(chart_ID,CHART_SHOW_OHLC,0,value))
{
//--- exibe uma mensagem para o diário Experts
Print(__FUNCTION__+", Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
· CHART_SHOW_BID_LINE – a propriedade mostra o valor Bid como uma linha horizontal no gráfico.
//+-----------------------------------------------------------------------------+
//| A função define se é o modo de exibição da linha do valor Bid no gráfico |
//| está habilitado. |
//+-----------------------------------------------------------------------------+
bool ChartShowBidLineGet(bool &result,const long chart_ID=0)
{
//--- preparar a variável para obter o valor da propriedade
long value;
//--- redefine o valor de erro
ResetLastError();
//--- receber o valor da propriedade
if(!ChartGetInteger(chart_ID,CHART_SHOW_BID_LINE,0,value))
{
//--- exibe uma mensagem para o diário Experts
Print(__FUNCTION__+", Código de erro = ",GetLastError());
return(false);
}
//--- armazenar o valor da propriedade do gráfico na memória
result=value;
//--- sucesso na execução
return(true);
}
//+--------------------------------------------------------------------+
//| A função habilita/desabilita o modo de exibição da linha Bid no |
//| gráfico. |
//+--------------------------------------------------------------------+
//+-----------------------------------------------------------------------+
//| A função define se é o modo de exibição da linha de valor Ask no |
//| gráfico. |
//+-----------------------------------------------------------------------+
bool ChartShowAskLineGet(bool &result,const long chart_ID=0)
{
//--- preparar a variável para obter o valor da propriedade
long value;
//--- redefine o valor de erro
ResetLastError();
//--- receber o valor da propriedade
if(!ChartGetInteger(chart_ID,CHART_SHOW_ASK_LINE,0,value))
{
//--- exibe uma mensagem para o diário Experts
Print(__FUNCTION__+", Código de erro = ",GetLastError());
return(false);
}
//--- armazenar o valor da propriedade do gráfico na memória
result=value;
//--- sucesso na execução
return(true);
}
//+-----------------------------------------------------------------------+
//| A função habibita/desabilita o modo de exibição da linha ASk no |
//| gráfico. |
//+-----------------------------------------------------------------------+
bool ChartShowAskLineSet(const bool value,const long chart_ID=0)
{
//--- redefine o valor de erro
ResetLastError();
//+---------------------------------------------------------------------------------+
//| A função define se o modo da exibição da linha para a última execução |
//| do preço de negociação está habilitada. |
//+---------------------------------------------------------------------------------+
bool ChartShowLastLineGet(bool &result,const long chart_ID=0)
{
//--- preparar a variável para obter o valor da propriedade
long value;
//--- redefine o valor de erro
ResetLastError();
//--- receber o valor da propriedade
if(!ChartGetInteger(chart_ID,CHART_SHOW_LAST_LINE,0,value))
{
//--- exibe uma mensagem para o diário Experts
Print(__FUNCTION__+", Código de erro = ",GetLastError());
return(false);
}
//--- armazenar o valor da propriedade do gráfico na memória
result=value;
//--- sucesso na execução
return(true);
}
//+--------------------------------------------------------------------------------------+
//| A função habilita/desabilita o modo da exibição da linha para a última execução |
//| do preço de negociação. |
//+--------------------------------------------------------------------------------------+
bool ChartShowLastLineSet(const bool value,const long chart_ID=0)
{
//--- redefine o valor de erro
ResetLastError();
//--- define valor de propriedade
if(!ChartSetInteger(chart_ID,CHART_SHOW_LAST_LINE,0,value))
{
//--- exibe uma mensagem para o diário Experts
//+------------------------------------------------------------------+
//| A função define se o modo da exibição dos separadores vertical |
//| entre os períodos adjacentes está habilitado. |
//+------------------------------------------------------------------+
bool ChartShowPeriodSeparatorGet(bool &result,const long chart_ID=0)
{
//--- preparar a variável para obter o valor da propriedade
long value;
//--- redefine o valor de erro
ResetLastError();
//--- receber o valor da propriedade
if(!ChartGetInteger(chart_ID,CHART_SHOW_PERIOD_SEP,0,value))
{
//--- exibe uma mensagem para o diário Experts
Print(__FUNCTION__+", Código de erro = ",GetLastError());
return(false);
}
//--- armazenar o valor da propriedade do gráfico na memória
result=value;
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| A função habilita/desabilita o modo de exibição dos separadores |
//| vertical entre os períodos adjacentes. |
//+------------------------------------------------------------------+
bool ChartShowPeriodSepapatorSet(const bool value,const long chart_ID=0)
{
//--- redefine o valor de erro
ResetLastError();
//--- define valor de propriedade
if(!ChartSetInteger(chart_ID,CHART_SHOW_PERIOD_SEP,0,value))
{
//--- exibe uma mensagem para o diário Experts
Print(__FUNCTION__+", Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//| A função define se os volumes são exibidos no gráfico (ou não são |
//| mostrados, ticks são mostrados, os atuais são mostrados). |
//+------------------------------------------------------------------------+
ENUM_CHART_VOLUME_MODE ChartShowVolumesGet(const long chart_ID=0)
{
//--- preparar a variável para obter o valor da propriedade
long result=WRONG_VALUE;
//--- redefine o valor de erro
ResetLastError();
//--- receber o valor da propriedade
if(!ChartGetInteger(chart_ID,CHART_SHOW_VOLUMES,0,result))
{
//--- exibe uma mensagem para o diário Experts
Print(__FUNCTION__+", Código de erro = ",GetLastError());
}
//--- retorna o valor da propriedade do gráfico
return((ENUM_CHART_VOLUME_MODE)result);
}
//+------------------------------------------------------------------+
//| A função define o mode de exibição dos volumes no gráfico. |
//+------------------------------------------------------------------+
bool ChartShowVolumesSet(const long value,const long chart_ID=0)
{
//--- redefine o valor de erro
ResetLastError();
//--- define valor de propriedade
if(!ChartSetInteger(chart_ID,CHART_SHOW_VOLUMES,value))
{
//--- exibe uma mensagem para o diário Experts
Print(__FUNCTION__+", Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
· CHART_VISIBLE_BARS define o número de barras no gráfico que são disponibilizadas para exibição.
//+-----------------------------------------------------------------------+
//| A função recebe o número de barras que são mostradas (visíveis) |
//| na janela do gráfico. |
//+-----------------------------------------------------------------------+
int ChartVisibleBars(const long chart_ID=0)
{
//--- preparar a variável para obter o valor da propriedade
long result=-1;
//--- redefine o valor de erro
ResetLastError();
//--- receber o valor da propriedade
if(!ChartGetInteger(chart_ID,CHART_VISIBLE_BARS,0,result))
{
//--- exibe uma mensagem para o diário Experts
Print(__FUNCTION__+", Código de erro = ",GetLastError());
}
//--- retorna o valor da propriedade do gráfico
return((int)result);
}
· CHART_W INDOW S_TOTAL define o número total de janelas do gráfico incluindo sub-janelas do
indicador.
//+--------------------------------------------------------------------------+
//| A função obtém o número total de janelas do gráfico incluindo |
//| subjanelas do indicador. |
//+--------------------------------------------------------------------------+
int ChartWindowsTotal(const long chart_ID=0)
{
//--- preparar a variável para obter o valor da propriedade
long result=-1;
//--- redefine o valor de erro
ResetLastError();
//--- receber o valor da propriedade
if(!ChartGetInteger(chart_ID,CHART_WINDOWS_TOTAL,0,result))
{
//--- exibe uma mensagem para o diário Experts
Print(__FUNCTION__+", Código de erro = ",GetLastError());
}
//--- retorna o valor da propriedade do gráfico
return((int)result);
}
· CHART_W INDOW_Y DISTANCE define a distância em pixels entre a quadro superior do sub-janela do
indicador e o quadro superior da janela principal do gráfico.
//+------------------------------------------------------------------+
//| A função obtém a distância em pixels entre a quadro superior da |
//| sub-janela e o quadro superior da janela principal do gráfico. |
//+------------------------------------------------------------------+
int ChartWindowsYDistance(const long chart_ID=0,const int sub_window=0)
{
//--- preparar a variável para obter o valor da propriedade
long result=-1;
//--- redefine o valor de erro
ResetLastError();
//--- receber o valor da propriedade
if(!ChartGetInteger(chart_ID,CHART_WINDOW_YDISTANCE,sub_window,result))
{
//--- exibe uma mensagem para o diário Experts
Print(__FUNCTION__+", Código de erro = ",GetLastError());
}
//--- retorna o valor da propriedade do gráfico
return((int)result);
}
//+---------------------------------------------------------------------------------------+
//| A função recebe o número da primeira barra visível no gráfico. |
//| Indexação é executada como em séries temporais, as últimas barras têm índices menores |
//+---------------------------------------------------------------------------------------+
int ChartFirstVisibleBar(const long chart_ID=0)
{
//--- preparar a variável para obter o valor da propriedade
long result=-1;
//--- redefine o valor de erro
ResetLastError();
//--- receber o valor da propriedade
if(!ChartGetInteger(chart_ID,CHART_FIRST_VISIBLE_BAR,0,result))
{
//--- exibe uma mensagem para o diário Experts
Print(__FUNCTION__+", Código de erro = ",GetLastError());
}
//--- retorna o valor da propriedade do gráfico
return((int)result);
}
return(true);
}
{
//--- preparar a variável para receber a cor
long result=clrNONE;
//--- redefine o valor de erro
ResetLastError();
//--- receber a cor da grade do gráfico
if(!ChartGetInteger(chart_ID,CHART_COLOR_GRID,0,result))
{
//--- exibe uma mensagem para o diário Experts
Print(__FUNCTION__+", Código de erro = ",GetLastError());
}
//--- retorna o valor da propriedade do gráfico
return((color)result);
}
//+------------------------------------------------------------------+
//| A função configura a cor da grade do gráfico. |
//+------------------------------------------------------------------+
bool ChartGridColorSet(const color clr,const long chart_ID=0)
{
//--- redefine o valor de erro
ResetLastError();
//--- configurar a cor da grade do gráfico
if(!ChartSetInteger(chart_ID,CHART_COLOR_GRID,clr))
{
//--- exibe uma mensagem para o diário Experts
Print(__FUNCTION__+", Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| A função recebe cor da barra de alta, a sua sombra e |
//| o limite do corpo do candlestick de alta. |
//+------------------------------------------------------------------+
color ChartUpColorGet(const long chart_ID=0)
{
//--- preparar a variável para receber a cor
long result=clrNONE;
//--- redefine o valor de erro
ResetLastError();
//--- recebe cor da barra de alta, a sua sombra e o limite do corpo do candlestick de alta
if(!ChartGetInteger(chart_ID,CHART_COLOR_CHART_UP,0,result))
{
//--- exibe uma mensagem para o diário Experts
Print(__FUNCTION__+", Código de erro = ",GetLastError());
}
//--- retorna o valor da propriedade do gráfico
return((color)result);
}
//+------------------------------------------------------------------+
//| A função configura cor da barra de alta, sua sombra e |
//+------------------------------------------------------------------+
//| A função recebe cor da barra de alta, a sua sombra e |
//| limite do corpo do candlestick de baixa. |
//+------------------------------------------------------------------+
color ChartDownColorGet(const long chart_ID=0)
{
//--- preparar a variável para receber a cor
long result=clrNONE;
//--- redefine o valor de erro
ResetLastError();
//--- recebe cor da barra de baixa, a sua sombra e o limite do corpo do candlestick de baixa
if(!ChartGetInteger(chart_ID,CHART_COLOR_CHART_DOWN,0,result))
{
//--- exibe uma mensagem para o diário Experts
Print(__FUNCTION__+", Código de erro = ",GetLastError());
}
//--- retorna o valor da propriedade do gráfico
return((color)result);
}
//+------------------------------------------------------------------+
//| A função configura a cor da barra de baixa, sua sombra e |
//| limite do corpo do candlestick de baixa. |
//+------------------------------------------------------------------+
bool ChartDownColorSet(const color clr,const long chart_ID=0)
{
//--- redefine o valor de erro
ResetLastError();
//--- configurar a cor da barra de baixa, sua sombra e e o limite do corpo do candlestick de baixa
if(!ChartSetInteger(chart_ID,CHART_COLOR_CHART_DOWN,clr))
{
//--- exibe uma mensagem para o diário Experts
Print(__FUNCTION__+", Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------------+
//| A função recebe cor da linha do gráfico e candlesticks Doji. |
//+------------------------------------------------------------------------+
color ChartLineColorGet(const long chart_ID=0)
{
//--- preparar a variável para receber a cor
long result=clrNONE;
//--- redefine o valor de erro
ResetLastError();
//--- receber cor da linha do gráfico e candlesticks Doji.
if(!ChartGetInteger(chart_ID,CHART_COLOR_CHART_LINE,0,result))
{
//--- exibe uma mensagem para o diário Experts
Print(__FUNCTION__+", Código de erro = ",GetLastError());
}
//--- retorna o valor da propriedade do gráfico
return((color)result);
}
//+------------------------------------------------------------------+
//| A função configura a cor da linha do gráfico e |
//| candlesticks Doji. |
//+------------------------------------------------------------------+
bool ChartLineColorSet(const color clr,const long chart_ID=0)
{
//--- redefine o valor de erro
ResetLastError();
//--- configurar a cor da linha do gráfico e candlesticks Doji
if(!ChartSetInteger(chart_ID,CHART_COLOR_CHART_LINE,clr))
{
//--- exibe uma mensagem para o diário Experts
Print(__FUNCTION__+", Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
//+------------------------------------------------------------------+
//| A função recebe a cor do corpo do candlestick de alta. |
//+------------------------------------------------------------------+
color ChartBullColorGet(const long chart_ID=0)
{
//--- preparar a variável para receber a cor
long result=clrNONE;
//--- redefine o valor de erro
ResetLastError();
//--- receber a cor do corpo do candlestick de alta
if(!ChartGetInteger(chart_ID,CHART_COLOR_CANDLE_BULL,0,result))
{
//--- exibe uma mensagem para o diário Experts
Print(__FUNCTION__+", Código de erro = ",GetLastError());
}
//--- retorna o valor da propriedade do gráfico
return((color)result);
}
//+------------------------------------------------------------------+
//| A função configura a cor do corpo do candlestick de alta. |
//+------------------------------------------------------------------+
bool ChartBullColorSet(const color clr,const long chart_ID=0)
{
//--- redefine o valor de erro
ResetLastError();
//--- configurar a cor do corpo do candlestick de alta.
if(!ChartSetInteger(chart_ID,CHART_COLOR_CANDLE_BULL,clr))
{
//--- exibe uma mensagem para o diário Experts
Print(__FUNCTION__+", Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| A função recebe a cor do corpo do candlestick de baixa. |
//+------------------------------------------------------------------+
//+---------------------------------------------------------------------+
//| A função define se níveis de negociação são exibidos no gráfico. |
//+---------------------------------------------------------------------+
bool ChartShowTradeLevelsGet(bool &result,const long chart_ID=0)
{
//--- preparar a variável para obter o valor da propriedade
long value;
//--- redefine o valor de erro
ResetLastError();
//--- receber o valor da propriedade
if(!ChartGetInteger(chart_ID,CHART_SHOW_TRADE_LEVELS,0,value))
{
//--- exibe uma mensagem para o diário Experts
Print(__FUNCTION__+", Código de erro = ",GetLastError());
return(false);
}
//--- armazenar o valor da propriedade do gráfico na memória
result=value;
//--- sucesso na execução
return(true);
}
//+----------------------------------------------------------------------+
//| A função habilita/desabilita o modo de exibição níveis de negociação |
//+----------------------------------------------------------------------+
bool ChartShowTradeLevelsSet(const bool value,const long chart_ID=0)
{
//--- redefine o valor de erro
ResetLastError();
//--- define valor de propriedade
if(!ChartSetInteger(chart_ID,CHART_SHOW_TRADE_LEVELS,0,value))
{
//--- exibe uma mensagem para o diário Experts
Print(__FUNCTION__+", Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+---------------------------------------------------------------------------+
//| Função define se arrastar os níveis de negociação no gráfico com o mouse |
//| é permitido. |
//+---------------------------------------------------------------------------+
bool ChartDragTradeLevelsGet(bool &result,const long chart_ID=0)
{
//--- preparar a variável para obter o valor da propriedade
long value;
return(true);
}
//+----------------------------------------------------------------------------+
//| A função habilita/desabilita o modo de exibir a escala de preços no |
//| gráfico. |
//+----------------------------------------------------------------------------+
bool ChartShowPriceScaleSet(const bool value,const long chart_ID=0)
{
//--- redefine o valor de erro
ResetLastError();
//--- define valor de propriedade
if(!ChartSetInteger(chart_ID,CHART_SHOW_PRICE_SCALE,0,value))
{
//--- exibe uma mensagem para o diário Experts
Print(__FUNCTION__+", Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
{
//--- exibe uma mensagem para o diário Experts
Print(__FUNCTION__+", Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
· CHART_FIX ED_POSITION – posição fixa do gráfico a partir da borda esquerda em valor percentual.
//+--------------------------------------------------------------------------+
//| A função recebe a a localização da posição fixa do gráfico de limite |
//| esquerdo em valor percentual. |
//+--------------------------------------------------------------------------+
double ChartFixedPositionGet(const long chart_ID=0)
{
//--- preparar a variável para obter o resultado
double result=EMPTY_VALUE;
//--- redefine o valor de erro
ResetLastError();
//--- receber o valor da propriedade
if(!ChartGetDouble(chart_ID,CHART_FIXED_POSITION,0,result))
{
//--- exibe uma mensagem para o diário Experts
Print(__FUNCTION__+", Código de erro = ",GetLastError());
}
//--- retorna o valor da propriedade do gráfico
return(result);
}
//+---------------------------------------------------------------------+
//| Função configura a localização da posição fixa do gráfico de limite |
//| esquerdo em valor percentual. Para visualizar a localização da |
//| posição fixa do gráfico, o valor de propriedade |
//| CHART_AUTOSCROLL deve ser definida como falsa. |
//+---------------------------------------------------------------------+
bool ChartFixedPositionSet(const double value,const long chart_ID=0)
{
//--- redefine o valor de erro
ResetLastError();
//--- define valor de propriedade
if(!ChartSetDouble(chart_ID,CHART_FIXED_POSITION,value))
{
//--- exibe uma mensagem para o diário Experts
Print(__FUNCTION__+", Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
ResetLastError();
//--- receber o valor da propriedade
if(!ChartGetDouble(chart_ID,CHART_POINTS_PER_BAR,0,result))
{
//--- exibe uma mensagem para o diário Experts
Print(__FUNCTION__+", Código de erro = ",GetLastError());
}
//--- retorna o valor da propriedade do gráfico
return(result);
}
//+----------------------------------------------------------------------+
//| Função configura o valor da escala do gráfico em pontos por barra. |
//| Para ver o resultado da mudança do valor dessa propriedade, |
//| o valor de propriedade |
//| CHART_SCALE_PT_PER_BAR deve ser preliminarmente definido como true. |
//+----------------------------------------------------------------------+
bool ChartPointsPerBarSet(const double value,const long chart_ID=0)
{
//--- redefine o valor de erro
ResetLastError();
//--- define valor de propriedade
if(!ChartSetDouble(chart_ID,CHART_POINTS_PER_BAR,value))
{
//--- exibe uma mensagem para o diário Experts
Print(__FUNCTION__+", Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
}
//--- retorna o valor da propriedade do gráfico
return(result);
}
//+------------------------------------------------------------------+
//| função determina se a janela do gráfica está minimizada |
//+------------------------------------------------------------------+
bool ChartWindowsIsMinimized(bool &result,const long chart_ID=0)
{
//--- preparamos a variável para obter o valor da propriedade
long value;
//--- restauramos o valor de erro
ResetLastError();
//--- obtemos o valor da propriedade
if(!ChartGetInteger(chart_ID,CHART_IS_MINIMIZED))
{
//--- exibimos a mensagem de erro no diário do "Expert"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- memorizamos na variável o valor dos gráficos
result=value;
//--- implementação bem-sucedida
return(true);
}
int index=(int)StringToInteger(obj_name[1]);
//--- desfazer pressionando o botão
ExtButtons[index].State(false);
//--- definir o novo valor da propriedade dependendo do seu tipo
if(ExtDataTypes[index]=='I')
ChangeIntegerProperty(index);
if(ExtDataTypes[index]=='D')
ChangeDoubleProperty(index);
if(ExtDataTypes[index]=='S')
ChangeStringProperty(index);
}
}
//--- re-desenhar valores de propriedades
RedrawProperties();
ChartRedraw();
}
//+------------------------------------------------------------------+
//| Alterar a propriedade inteira do gráfico |
//+------------------------------------------------------------------+
void ChangeIntegerProperty(const int index)
{
//--- receber o valor atual da propriedade
long value=ChartGetInteger(0,(ENUM_CHART_PROPERTY_INTEGER)ExtNumbers[index]);
//--- definir o seguinte valor da propriedade
switch(ExtDrawTypes[index])
{
case 'C':
value=GetNextColor((color)value);
break;
default:
value=(long)GetNextValue((double)value,index);
break;
}
//--- definir o novo valor de propriedade
ChartSetInteger(0,(ENUM_CHART_PROPERTY_INTEGER)ExtNumbers[index],0,value);
}
//+------------------------------------------------------------------+
//| Alterar a propriedade double do gráfico |
//+------------------------------------------------------------------+
void ChangeDoubleProperty(const int index)
{
//--- receber o valor atual da propriedade
double value=ChartGetDouble(0,(ENUM_CHART_PROPERTY_DOUBLE)ExtNumbers[index]);
//--- definir o seguinte valor da propriedade
value=GetNextValue(value,index);
//--- definir o novo valor de propriedade
ChartSetDouble(0,(ENUM_CHART_PROPERTY_DOUBLE)ExtNumbers[index],value);
}
//+------------------------------------------------------------------+
{
case 'I':
//--- receber o valor atual da propriedade
if(!ChartGetInteger(0,(ENUM_CHART_PROPERTY_INTEGER)ExtNumbers[i],0,value))
break;
//--- texto de propriedade inteiro
switch(ExtDrawTypes[i])
{
//--- propriedade color
case 'C':
text=(string)((color)value);
break;
//--- propriedade boolean
case 'B':
text=(string)((bool)value);
break;
//--- propriedade do enumerador ENUM_CHART_MODE
case 'M':
text=EnumToString((ENUM_CHART_MODE)value);
break;
//--- propriedade do enumerador ENUM_CHART_VOLUME_MODE
case 'V':
text=EnumToString((ENUM_CHART_VOLUME_MODE)value);
break;
//--- número tipo int
default:
text=IntegerToString(value);
break;
}
break;
case 'D':
//--- texto de propriedade double
text=DoubleToString(ChartGetDouble(0,(ENUM_CHART_PROPERTY_DOUBLE)ExtNumbers[i]),4);
break;
case 'S':
//--- texto de propriedade string
text=ChartGetString(0,(ENUM_CHART_PROPERTY_STRING)ExtNumbers[i]);
break;
}
//--- mostrar valor de propriedade
ExtLabelsValue[i].Description(text);
}
}
//+------------------------------------------------------------------+
//| Criar o painel para o gerenciamento das propriedades do gráfico |
//+------------------------------------------------------------------+
bool PrepareControls(void)
{
//--- alocar memória para arrays com uma reserva
MemoryAllocation(LAST_PROPERTY_NUMBER+1);
//--- variáveis
int i=0; // loop variável
int col_1=0; // número de propriedades na primeira coluna
int col_2=0; // número de propriedade na segunda coluna
int col_3=0; // múmero de propriedade na terceira coluna
//--- número atual de propriedades - 0
ExtCount=0;
//--- observando propriedades no loop
while(i<=LAST_PROPERTY_NUMBER)
{
//--- armazenar o número atual de propriedades
ExtNumbers[ExtCount]=i;
//--- incrementar o valor da variável do loop
i++;
//--- verificar se existe uma propriedade com tal número
if(CheckNumber(ExtNumbers[ExtCount],ExtNames[ExtCount],ExtDataTypes[ExtCount],ExtGroupTypes[E
{
//--- criar elementos de controle para a propriedade
switch(ExtGroupTypes[ExtCount])
{
case 1:
//--- criar etiquetas e um botão para a propriedade
if(!ShowProperty(ExtCount,0,X_PROPERTY_NAME_1,X_PROPERTY_VALUE_1,X_BUTTON_1,Y_PROPER
return(false);
//--- número de elementos na primeira coluna foi incrementado
col_1++;
break;
case 2:
//--- criar etiquetas e um botão para a propriedade
if(!ShowProperty(ExtCount,1,X_PROPERTY_NAME_2,X_PROPERTY_VALUE_2,X_BUTTON_2,Y_PROPER
return(false);
//--- número de elementos na segunda coluna foi incrementado
col_2++;
break;
case 3:
//--- criar apenas etiquetas para a propriedade
if(!ShowProperty(ExtCount,2,X_PROPERTY_NAME_2,X_PROPERTY_VALUE_2,0,Y_PROPERTY_2+col_
return(false);
//--- número de elementos na terceira coluna foi incrementado
col_3++;
break;
}
//--- definir o máximo e o mínimo do valor e da etapa da propriedade
GetMaxMinStep(ExtNumbers[ExtCount],ExtMaxValue[ExtCount],ExtMinValue[ExtCount],ExtStep[Ext
//--- incrementar o número de propriedades
ExtCount++;
}
}
case CHART_WIDTH_IN_BARS:
case CHART_WIDTH_IN_PIXELS:
draw_type='I';
break;
//--- propriedades double
case CHART_PRICE_MIN:
case CHART_PRICE_MAX:
draw_type='D';
break;
//--- na verdade, esta propriedade é um comando para exibir o gráfico em cima de todos os
//--- não há necessidade de aplicar este painel, como a janela sempre será
//--- em cima das outras antes de a usarmos
case CHART_BRING_TO_TOP:
draw_type=' ';
break;
//--- propriedade não pertencem ao terceiro grupo
default:
return(false);
}
//--- propriedade pertencem ao terceiro grupo
group_type=3;
return(true);
}
//+----------------------------------------------------------------------+
//| A função verifica se a propriedade pertence ao segundo grupo e |
//| define o seu tipo display no caso de uma resposta positiva |
//+----------------------------------------------------------------------+
bool CheckSecondGroup(const int property_number,uint &group_type,uchar &draw_type)
{
//--- verificar se a propriedade pertence ao segundo grupo
switch(property_number)
{
//--- propriedade de tipo ENUM_CHART_MODE
case CHART_MODE:
draw_type='M';
break;
//--- propriedade de tipo ENUM_CHART_VOLUME_MODE
case CHART_SHOW_VOLUMES:
draw_type='V';
break;
//--- propriedade string
case CHART_COMMENT:
draw_type='S';
break;
//--- propriedade color
case CHART_COLOR_BACKGROUND:
case CHART_COLOR_FOREGROUND:
case CHART_COLOR_GRID:
case CHART_COLOR_VOLUME:
case CHART_COLOR_CHART_UP:
case CHART_COLOR_CHART_DOWN:
case CHART_COLOR_CHART_LINE:
case CHART_COLOR_CANDLE_BULL:
case CHART_COLOR_CANDLE_BEAR:
case CHART_COLOR_BID:
case CHART_COLOR_ASK:
case CHART_COLOR_LAST:
case CHART_COLOR_STOP_LEVEL:
draw_type='C';
break;
//--- propriedade não pertence ao segundo grupo
default:
return(false);
}
//--- propriedade pertence ao segundo grupo
group_type=2;
return(true);
}
//+-----------------------------------------------------------------------+
//| Esta função é chamada apenas se ela já é conhecida |
//| a propriedade não é do segundo e terceiro grupos de propriedades |
//+-----------------------------------------------------------------------+
void CheckFirstGroup(const int property_number,uint &group_type,uchar &draw_type)
{
//--- a propriedade pertence ao primeiro grupo
group_type=1;
//--- definir a propriedade tipo display
switch(property_number)
{
//--- propriedades inteiro
case CHART_SCALE:
case CHART_HEIGHT_IN_PIXELS:
draw_type='I';
return;
//--- propriedades double
case CHART_SHIFT_SIZE:
case CHART_FIXED_POSITION:
case CHART_FIXED_MAX:
case CHART_FIXED_MIN:
case CHART_POINTS_PER_BAR:
draw_type='D';
return;
//--- ficaram apenas as propriedades boolean
default:
draw_type='B';
return;
}
}
//+------------------------------------------------------------------+
//| Criar uma etiqueta e um botão para a propriedade |
//+------------------------------------------------------------------+
bool ShowProperty(const int ind,const int type,const int x1,const int x2,
const int xb,const int y,const bool btn)
{
//--- array estático para comutar dentro do array de cor ExtColors
static uint color_index[3]={1,1,1};
//--- alterar o índice para receber uma outra cor
color_index[type]=1-color_index[type];
//--- etiquetas display e um botão (se btn = true) para a propriedade
if(!LabelCreate(ExtLabelsName[ind],"name_"+(string)ind,ExtNames[ind],ExtColors[color_index[type]
return(false);
if(!LabelCreate(ExtLabelsValue[ind],"value_"+(string)ind,"",ExtColors[color_index[type]],x2,y))
return(false);
if(btn && !ButtonCreate(ExtButtons[ind],(string)ind,xb,y+1))
return(false);
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| criar um rótulo |
//+------------------------------------------------------------------+
bool LabelCreate(CChartObjectLabel &lbl,const string name,const string text,
const color clr,const int x,const int y)
{
if(!lbl.Create(0,"Label_"+name,0,x,y)) return(false);
if(!lbl.Description(text)) return(false);
if(!lbl.FontSize(10)) return(false);
if(!lbl.Color(clr)) return(false);
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Criar o botão |
//+------------------------------------------------------------------+
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("Próximo")) 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);
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
step=30;
break;
//--- valores padrão
default:
max=1;
min=0;
step=1;
}
}
Constantes de Objetos
Existem 44 objetos gráficos que podem ser criados e exibidos no gráfico de preços. T odas as
constantes para se trabalhar com objetos estão divididos em 9 grupos :
· Canto de vinculação – uma indicação do ângulo da tabela, que está posicionada sobre o objeto;
Tipos de Objeto
Quando um objeto gráfico é criado usando a função ObjectCreate(), é necess ário especificar o tipo de
objeto a ser criado, que pode ser um dos valores da enumeração ENUM _OBJECT . Especificações
adicionais de propriedades de objetos são possíveis usando funções para trabalhar com objetos
gráficos.
ENUM_OBJECT
ID Descrição
OBJ_VL INE Linha Vertical
OBJ_TRIANGLE T riângulo
OBJ_ARR OW Seta
OBJ_LABEL R ótulo
OBJ_BUTT ON Botão
OBJ_EDIT Edição
OBJ_VLINE
Linha vertical.
Observação
Ao desenhar uma linha vertical, é possível definir o modo de exibição de linha para todas as janelas
do (propriedade OBJPR OP_R AY).
Exemplo
O seguinte script cria e move a linha vertical no gráfico. Funções especiais têm sido desenvolvidas
para criar e alterar as propriedades do objeto gráfico. Você pode utilizar estas funções " as is " em
seus próprios aplicativos.
//--- descrição
#property description "Script desenha objeto gráfico \" Linha Vertical\"."
#property description "Coordenadas do ponto de ancoragem é configurado em porcentagem da"
#property description "largura da janela do gráfico em barras."
//--- janela de exibição dos parâmetros de entrada durante inicialização do script
#property script_show_inputs
//--- entrada de parâmetros do script
input string InpName="VLine"; // Nome da Linha
input int InpDate=25; // Data do Evento, %
input color InpColor=clrRed; // Cor da linha
input ENUM_LINE_STYLE InpStyle=STYLE_DASH; // Estilo da linha
input int InpWidth=3; // Largura da linha
input bool InpBack=false; // Linha de fundo
input bool InpSelection=true; // Destaque para mover
input bool InpRay=true; // Continuação da linha para baixo
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Mover a linha vertical |
//+------------------------------------------------------------------+
bool VLineMove(const long chart_ID=0, // ID do gráfico
const string name="VLine", // nome da linha
datetime time=0) // tempo da linha
{
//--- se o tempo de linha não está definido, mover a linha para a última barra
if(!time)
time=TimeCurrent();
//--- redefine o valor de erro
ResetLastError();
//--- mover a linha vertical
if(!ObjectMove(chart_ID,name,0,time,0))
{
Print(__FUNCTION__,
": falhou ao mover a linha vertical! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Excluir a linha vertical |
//+------------------------------------------------------------------+
bool VLineDelete(const long chart_ID=0, // ID do gráfico
const string name="VLine") // nome da linha
{
//--- redefine o valor de erro
ResetLastError();
//--- excluir a linha vertical
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": falha ao deletar a linha vertical! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
OBJ_HLINE
Linha H orizontal.
Exemplo
O seguinte script cria e move uma linha horizontal no gráfico. Funções especiais têm sido
desenvolvidas para criar e alterar as propriedades do objeto gráfico. Você pode utilizar estas
funções " as is " em seus próprios aplicativos.
//--- descrição
#property description "Script desenha o objeto gráfico \"Linha Horizontal\"."
#property description "Ponto de ancoragem do preço está definido em percentagem da altura do"
#property description "janela do gráfico."
//--- janela de exibição dos parâmetros de entrada durante inicialização do script
#property script_show_inputs
//--- entrada de parâmetros do script
input string InpName="HLine"; // Nome da linha
input int InpPrice=25; // Preço da linha, %
input color InpColor=clrRed; // Cor da linha
input ENUM_LINE_STYLE InpStyle=STYLE_DASH; // Estilo da linha
input int InpWidth=3; // Largura da linha
input bool InpBack=false; // Linha de fundo
input bool InpSelection=true; // Destaque para mover
input bool InpHidden=true; // Ocultar na lista de objeto
input long InpZOrder=0; // Prioridade para clicar no mouse
//+------------------------------------------------------------------+
//| Criar a linha horizontal |
//+------------------------------------------------------------------+
//---
}
OBJ_TREND
Linha de T endência.
Observação
Para Linha de T endência, é possível especificar o modo de continuação da sua exibição para a
direita e/ou à esquerda (de acordo com as propriedadesOBJPR OP_R AY_RIGHT e
OBJPR OP_R AY_LEFT ).
Exemplo
O script a seguir cria e movimenta a linha de tendência no gráfico. Funções especiais têm sido
desenvolvidas para criar e alterar as propriedades do objeto gráfico. Você pode utilizar estas
funções " as is " em seus próprios aplicativos.
//--- descrição
#property description "Script desenha o objeto gráfico \"Linha de Tendência\"."
#property description "Coordenadas de ponto de ancoragem são definidas em porcentagem de"
#property description "tamanho da janela do gráfico."
//--- janela de exibição dos parâmetros de entrada durante inicialização do script
#property script_show_inputs
//--- entrada de parâmetros do script
input string InpName="Trend"; // Nome da linha
input int InpDate1=35; // Data do 1º ponto, %
input int InpPrice1=60; // Preço do 1º ponto, %
input int InpDate2=65; // Data do 2º ponto, %
input int InpPrice2=40; // Preço do 2º ponto, %
input color InpColor=clrRed; // Cor da linha
//--- destacado e movimentado por padrão. Dentro deste método, o parâmetro de seleção
//--- é verdade por padrão, tornando possível destacar e mover o objeto
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- habilitar (true) ou desabilitar (false) o modo de continuação da exibição da linha à esquerda
ObjectSetInteger(chart_ID,name,OBJPROP_RAY_LEFT,ray_left);
//--- habilitar (true) ou desabilitar (false) o modo de continuação da exibição da linha à direita
ObjectSetInteger(chart_ID,name,OBJPROP_RAY_RIGHT,ray_right);
//--- ocultar (true) ou exibir (false) o nome do objeto gráfico na lista de objeto
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- definir a prioridade para receber o evento com um clique do mouse no gráfico
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Mover o ponto de ancoragem da linha de tendência |
//+------------------------------------------------------------------+
bool TrendPointChange(const long chart_ID=0, // ID do gráfico
const string name="TrendLine", // nome da linha
const int point_index=0, // índice do ponto de ancoragem
datetime time=0, // coordenada do ponto de ancoragem de tempo
double price=0) // coordenada do ponto de ancoragem de preço
{
//--- se a posição do ponto não está definida, mover para a barra atual tendo o preço Bid
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- redefine o valor de erro
ResetLastError();
//--- mover ponto de ancoragem da linha de tendência
if(!ObjectMove(chart_ID,name,point_index,time,price))
{
Print(__FUNCTION__,
": falha ao mover o ponto de ancoragem! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| A função exclui a linha de tendência do gráfico. |
//+------------------------------------------------------------------+
bool TrendDelete(const long chart_ID=0, // ID do gráfico
const string name="TrendLine") // nome da linha
{
//--- redefine o valor de erro
ResetLastError();
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- tamanho do array de preço
int accuracy=1000;
//--- arrays para armazenar data e valores de preço para serem usados
//--- para definir e alterar as coordenadas de pontos de ancoragem da linha
datetime date[];
double price[];
//--- alocação de memória
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- preencher o array das datas
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Falha ao copiar valores de tempo! Código de erro = ",GetLastError());
return;
}
//--- preencher o array de preços
//--- encontrar os maiores e menores valores do gráfico
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- definir uma etapa de mudança de um preço e preencher o array
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- definir os pontos para desenhar a linha
int d1=InpDate1*(bars-1)/100;
int d2=InpDate2*(bars-1)/100;
int p1=InpPrice1*(accuracy-1)/100;
int p2=InpPrice2*(accuracy-1)/100;
//--- criar uma linha de tendência
if(!TrendCreate(0,InpName,0,date[d1],price[p1],date[d2],price[p2],InpColor,InpStyle,
InpWidth,InpBack,InpSelection,InpRayLeft,InpRayRight,InpHidden,InpZOrder))
{
return;
}
//--- redesenhar o gráfico e esperar por um segundo
ChartRedraw();
Sleep(1000);
//--- agora, mover os pontos de ancoragem da linha
//--- contador de loop
int v_steps=accuracy/5;
//--- mover o primeiro ponto de ancoragem vertical
for(int i=0;i<v_steps;i++)
{
//--- usar o seguinte valor
if(p1>1)
p1-=1;
//--- mover o ponto
if(!TrendPointChange(0,InpName,0,date[d1],price[p1]))
return;
//--- verificar se o funcionamento do script foi desativado a força
if(IsStopped())
return;
//--- redesenhar o gráfico
ChartRedraw();
}
//--- mover o segundo ponto de ancoragem vertical
for(int i=0;i<v_steps;i++)
{
//--- usar o seguinte valor
if(p2<accuracy-1)
p2+=1;
//--- mover o ponto
if(!TrendPointChange(0,InpName,1,date[d2],price[p2]))
return;
//--- verificar se o funcionamento do script foi desativado a força
if(IsStopped())
return;
//--- redesenhar o gráfico
ChartRedraw();
}
//--- meio segundo de atraso
Sleep(500);
//--- contador de loop
int h_steps=bars/2;
//--- mover ambos os pontos de ancoragem na horizontal, ao mesmo tempo
for(int i=0;i<h_steps;i++)
{
//--- usar os seguintes valores
if(d1<bars-1)
d1+=1;
if(d2>1)
d2-=1;
//--- deslocar os pontos
if(!TrendPointChange(0,InpName,0,date[d1],price[p1]))
return;
if(!TrendPointChange(0,InpName,1,date[d2],price[p2]))
return;
//--- verificar se o funcionamento do script foi desativado a força
if(IsStopped())
return;
//--- redesenhar o gráfico
ChartRedraw();
// 0.03 segundos de atraso
Sleep(30);
}
//--- 1 segundo de atraso
Sleep(1000);
//--- excluir uma linha de tendência
TrendDelete(0,InpName);
ChartRedraw();
//--- 1 segundo de atraso
Sleep(1000);
//---
}
OBJ_TRENDBYANGLE
Linha de T endência Por Ângulo.
Observação
Para Linha de T endência Por Angulo, é possível determinar o modo de continuação da sua exibição
para a direita e/ou à esquerda (de acordo com as propriedades OBJPR OP_R AY_RIGHT e
OBJPR OP_R AY_LEFT ).
T anto ângulo e coordenadas do segundo ponto de ancoragem podem ser usados para definir a
inclinação da linha.
Exemplo
O script a seguir cria e movimenta a linha de tendência no gráfico. Funções especiais têm sido
desenvolvidas para criar e alterar as propriedades do objeto gráfico. Você pode utilizar estas
funções " as is " em seus próprios aplicativos.
//--- descrição
#property description "Script desenha objeto gráfico \"Linha de Tendência Por Ângulo\"."
#property description "Coordenadas dos pontos de ancoragem são definidos em percentagem do tamanho
#property description "janela do gráfico."
//--- janela de exibição dos parâmetros de entrada durante inicialização do script
#property script_show_inputs
//--- entrada de parâmetros do script
input string InpName="Trend"; // Nome da linha
input int InpDate1=50; // Data do 1º ponto, %
input int InpPrice1=75; // Preço do 1º ponto, %
input int InpAngle=0; // Ângulo de inclinação da linha
datetime second_point_time[10];
CopyTime(Symbol(),Period(),time1,10,second_point_time);
time2=second_point_time[0];
price2=price1;
}
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
//--- verificar a exatidão dos parâmetros de entrada
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100)
{
Print("Erro! Valores incorretos dos parâmetros de entrada!");
return;
}
//--- número de barras visíveis na janela do gráfico
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- tamanho do array de preço
int accuracy=1000;
//--- arrays para armazenar data e valores de preço para serem usados
//--- para definir e alterar as coordenadas de pontos de ancoragem da linha
datetime date[];
double price[];
//--- alocação de memória
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- preencher o array das datas
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Falha ao copiar valores de tempo! Código de erro = ",GetLastError());
return;
}
//--- preencher o array de preços
//--- encontrar os maiores e menores valores do gráfico
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- definir uma etapa de mudança de um preço e preencher o array
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- definir os pontos para desenhar a linha
int d1=InpDate1*(bars-1)/100;
int p1=InpPrice1*(accuracy-1)/100;
//--- criar uma linha de tendência
if(!TrendByAngleCreate(0,InpName,0,date[d1],price[p1],InpAngle,InpColor,InpStyle,
InpWidth,InpBack,InpSelection,InpRayLeft,InpRayRight,InpHidden,InpZOrder))
{
return;
}
//--- redesenhar o gráfico e esperar por um segundo
ChartRedraw();
Sleep(1000);
//--- agora, mover e girar a linha
//--- contador de loop
int v_steps=accuracy/2;
//--- mover o ponto de ancoragem e alterar o ângulo de inclinação da linha
for(int i=0;i<v_steps;i++)
{
//--- usar o seguinte valor
if(p1>1)
p1-=1;
//--- mover o ponto
if(!TrendPointChange(0,InpName,date[d1],price[p1]))
return;
if(!TrendAngleChange(0,InpName,18*(i+1)))
return;
//--- verificar se o funcionamento do script foi desativado a força
if(IsStopped())
return;
//--- redesenhar o gráfico
ChartRedraw();
}
//--- 1 segundo de atraso
Sleep(1000);
//--- excluir a partir do gráfico
TrendDelete(0,InpName);
ChartRedraw();
//--- 1 segundo de atraso
Sleep(1000);
//---
}
OBJ_CYCLES
Linhas Cycle.
Observação
A distância entre as linhas é definida por coordenadas de tempo de dois pontos de ancoragem do
objeto.
Exemplo
O seguinte script cria e move a linha cycle no gráfico. Funções especiais têm sido desenvolvidas
para criar e alterar as propriedades do objeto gráfico. Você pode utilizar estas funções " as is " em
seus próprios aplicativos.
//--- descrição
#property description "script cria a linha cycle no gráfico."
#property description "Coordenadas de ponto de ancoragem são definidas em porcentagem de"
#property description "porcentagem do tamanho da janela de gráfico."
//--- janela de exibição dos parâmetros de entrada durante inicialização do script
#property script_show_inputs
//--- entrada de parâmetros do script
input string InpName="Cycles"; // Nome do objeto
input int InpDate1=10; // Data do 1º ponto, %
input int InpPrice1=45; // Preço do 1º ponto, %
input int InpDate2=20; // Data do 2º ponto, %
input int InpPrice2=55; // Preço do 2º ponto, %
input color InpColor=clrRed; // Cor das linhas cycle
input ENUM_LINE_STYLE InpStyle=STYLE_DOT; // Estilo das linhas cycle
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- definir a prioridade para receber o evento com um clique do mouse no gráfico
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Mover ponto de ancoragem |
//+------------------------------------------------------------------+
bool CyclesPointChange(const long chart_ID=0, // ID do gráfico
const string name="Cycles", // nome do objeto
const int point_index=0, // índice do ponto de ancoragem
datetime time=0, // coordenada do ponto de ancoragem do tempo
double price=0) // coordenada do ponto de ancoragem de preço
{
//--- se a posição do ponto não está definida, mover para a barra atual tendo o preço Bid
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- redefine o valor de erro
ResetLastError();
//--- mover o ponto de ancoragem
if(!ObjectMove(chart_ID,name,point_index,time,price))
{
Print(__FUNCTION__,
": falha ao mover o ponto de ancoragem! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Excluir as linhas cycle |
//+------------------------------------------------------------------+
bool CyclesDelete(const long chart_ID=0, // ID do gráfico
const string name="Cycles") // nome do objeto
{
//--- redefine o valor de erro
ResetLastError();
//--- excluir as linhas cycle
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": falha ao excluir linhas cycle! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+-----------------------------------------------------------------------+
//| Ver os valores de pontos de ancoragem das linhas cycle e definir |
//| valores padrão para valores vazios |
//+-----------------------------------------------------------------------+
void ChangeCyclesEmptyPoints(datetime &time1,double &price1,
datetime &time2,double &price2)
{
//--- se o tempo do primeiro ponto não está definido, será na barra atual
if(!time1)
time1=TimeCurrent();
//--- se o preço do primeiro ponto não está definido, ele terá valor Bid
if(!price1)
price1=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- se o tempo do segundo ponto não está definido, está localizado a 9 barras deixadas a partir d
if(!time2)
{
//--- array para receber o tempo de abertura das últimos 10 barras
datetime temp[10];
CopyTime(Symbol(),Period(),time1,10,temp);
//--- definir o segundo ponto 9 barras a esquerda do primeiro
time2=temp[0];
}
//--- se o preço do segundo ponto não está definido, é igual ao primeiro ponto
if(!price2)
price2=price1;
}
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
//--- verificar a exatidão dos parâmetros de entrada
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
InpDate2<0 || InpDate2>100 || InpPrice2<0 || InpPrice2>100)
{
Print("Erro! Valores incorretos dos parâmetros de entrada!");
return;
}
//--- número de barras visíveis na janela do gráfico
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- tamanho do array de preço
int accuracy=1000;
//--- arrays para armazenar data e valores de preço para serem usados
//--- para definir e alterar as coordenadas dos pontos de ancoragem das linhas cycle
datetime date[];
double price[];
//--- alocação de memória
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- preencher o array das datas
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Falha ao copiar valores de tempo! Código de erro = ",GetLastError());
return;
}
//--- preencher o array de preços
//--- encontrar os maiores e menores valores do gráfico
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- definir uma etapa de mudança de um preço e preencher o array
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- definir os pontos para desenhar as linhas cycle
int d1=InpDate1*(bars-1)/100;
int d2=InpDate2*(bars-1)/100;
int p1=InpPrice1*(accuracy-1)/100;
int p2=InpPrice2*(accuracy-1)/100;
//--- criar uma linha de tendência
if(!CyclesCreate(0,InpName,0,date[d1],price[p1],date[d2],price[p2],InpColor,
InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- redesenhar o gráfico e esperar por um segundo
ChartRedraw();
Sleep(1000);
//--- agora, mover os pontos de ancoragem
//--- contador de loop
int h_steps=bars/5;
//--- mover o segundo ponto de ancoragem
for(int i=0;i<h_steps;i++)
{
//--- usar o seguinte valor
if(d2<bars-1)
d2+=1;
//--- mover o ponto
if(!CyclesPointChange(0,InpName,1,date[d2],price[p2]))
return;
//--- verificar se o funcionamento do script foi desativado a força
if(IsStopped())
return;
//--- redesenhar o gráfico
ChartRedraw();
// 0.05 segundos de atraso
Sleep(50);
}
//--- 1 segundo de atraso
Sleep(1000);
//--- contador de loop
h_steps=bars/4;
//--- mover o primeiro ponto de ancoragem
for(int i=0;i<h_steps;i++)
{
//--- usar o seguinte valor
if(d1<bars-1)
d1+=1;
//--- mover o ponto
if(!CyclesPointChange(0,InpName,0,date[d1],price[p1]))
return;
//--- verificar se o funcionamento do script foi desativado a força
if(IsStopped())
return;
//--- redesenhar o gráfico
ChartRedraw();
// 0.05 segundos de atraso
Sleep(50);
}
//--- 1 segundo de atraso
Sleep(1000);
//--- excluir a etiqueta do gráfico
CyclesDelete(0,InpName);
ChartRedraw();
//--- 1 segundo de atraso
Sleep(1000);
//---
}
OBJ_ARROW ED_LINE
Linha de seta.
Exemplo
O seguinte script cria e move uma linha de seta no gráfico. Funções especiais têm sido
desenvolvidas para criar e alterar as propriedades do objeto gráfico. Você pode utilizar estas
funções " as is " em seus próprios aplicativos.
//--- descrição
#property description "Script desenha objeto gráfico \" linha Arrowed\"."
#property description "Coordenadas de ponto de ancoragem são definidas em porcentagem de"
#property description "tamanho da janela do gráfico."
//--- janela de exibição dos parâmetros de entrada durante inicialização do script
#property script_show_inputs
//--- entrada de parâmetros do script
input string InpName="ArrowedLine"; // Nome da linha
input int InpDate1=35; // Data do 1º ponto, %
input int InpPrice1=60; // Preço do 1º ponto, %
input int InpDate2=65; // Data do 2º ponto, %
input int InpPrice2=40; // Preço do 2º ponto, %
input color InpColor=clrRed; // Cor da linha
input ENUM_LINE_STYLE InpStyle=STYLE_DASH; // Estilo da linha
input int InpWidth=2; // Largura da linha
input bool InpBack=false; // Linha de fundo
input bool InpSelection=true; // Destaque para mover
input bool InpHidden=true; // Ocultar na lista de objeto
input long InpZOrder=0; // Prioridade para clicar no mouse
//+------------------------------------------------------------------+
//| Criar uma linha de setas pelas coordenadas determinadas |
//+------------------------------------------------------------------+
bool ArrowedLineCreate(const long chart_ID=0, // ID do gráfico
const string name="ArrowedLine", // nome da linha
const int sub_window=0, // índice da sub-janela
datetime time1=0, // primeiro ponto de tempo
double price1=0, // primeiro ponto de preço
datetime time2=0, // segundo ponto de tempo
double price2=0, // segundo ponto de preço
const color clr=clrRed, // cor da linha
const ENUM_LINE_STYLE style=STYLE_SOLID, // estilo da linha
const int width=1, // largura da linha
const bool back=false, // no fundo
const bool selection=true, // destacar para mover
const bool hidden=true, // ocultar na lista de objeto
const long z_order=0) // prioridade para clicar no mouse
{
//--- definir coordenadas de pontos de ancoragem, se eles não estão definidos
ChangeArrowedLineEmptyPoints(time1,price1,time2,price2);
//--- redefine o valor de erro
ResetLastError();
//--- criar uma linha de setas pelas coordenadas determinadas
if(!ObjectCreate(chart_ID,name,OBJ_ARROWED_LINE,sub_window,time1,price1,time2,price2))
{
Print(__FUNCTION__,
": falha ao criar uma linha de seta! Código de erro = ",GetLastError());
return(false);
}
//--- definir cor da linha
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- definir o estilo de exibição da linha
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- definir a largura da linha
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- exibir em primeiro plano (false) ou fundo (true)
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- habilitar (true) ou desabilitar (false) o modo do movimento da seta com o mouse
//--- ao criar um objeto gráfico usando a função ObjectCreate, o objeto não pode ser
//--- destacado e movimentado por padrão. Dentro deste método, o parâmetro de seleção
//--- é verdade por padrão, tornando possível destacar e mover o objeto
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- ocultar (true) ou exibir (false) o nome do objeto gráfico na lista de objeto
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- definir a prioridade para receber o evento com um clique do mouse no gráfico
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Mover o ponto de ancoragem da linha de seta |
//+------------------------------------------------------------------+
bool ArrowedLinePointChange(const long chart_ID=0, // ID do gráfico
const string name="ArrowedLine", // nome da linha
const int point_index=0, // índice do ponto de ancoragem
datetime time=0, // coordenada do ponto de ancoragem de
double price=0) // coordenada do ponto de ancoragem de
{
//--- se a posição do ponto não está definida, mover para a barra atual tendo o preço Bid
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- redefine o valor de erro
ResetLastError();
//--- mover ponto de ancoragem da linha
if(!ObjectMove(chart_ID,name,point_index,time,price))
{
Print(__FUNCTION__,
": falha ao mover o ponto de ancoragem! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| A função remove a linha de setas a partir do gráfico |
//+------------------------------------------------------------------+
bool ArrowedLineDelete(const long chart_ID=0, // ID do gráfico
const string name="ArrowedLine") // nome da linha
{
//--- redefine o valor de erro
ResetLastError();
//--- deletar uma linha de seta
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": falha ao criar uma linha de seta! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Conferir valores dos pontos de ancoragem e definir valores padrão|
//| para aqueles vazios |
//+------------------------------------------------------------------+
OBJ_CHANNEL
Canal Eqüidistante
Observação
Para um canal eqüidistante, é possível especificar o modo de sua continuação para a direita e/ou
esquerda (de acordo com as propriedades (OBJPR OP_R AY_RIGHT e OBJPR OP_R AY_LEFT ). O modo de
preenchimento colorido do canal também pode ser definido.
Exemplo
O seguinte script cria e move um canal eqüidistante no gráfico. Funções especiais têm sido
desenvolvidas para criar e alterar as propriedades do objeto gráfico. Você pode utilizar estas
funções " as is " em seus próprios aplicativos.
//--- descrição
#property description "Script desenha um objeto gráfico tipo \"canal eqüidistante\"."
#property description "Coordenadas dos pontos de ancoragem são definidos em percentagem do tamanho
#property description "janela do gráfico."
//--- janela de exibição dos parâmetros de entrada durante inicialização do script
#property script_show_inputs
//--- entrada de parâmetros do script
input string InpName="Channel"; // Nome do canal
input int InpDate1=25; // Data do 1º ponto, %
input int InpPrice1=60; // Preço do 1º ponto, %
input int InpDate2=65; // Data do 2º ponto, %
input int InpPrice2=80; // Preço do 2º ponto, %
input int InpDate3=30; // Data do 3º ponto, %
//+------------------------------------------------------------------+
//| Excluir o canal |
//+------------------------------------------------------------------+
bool ChannelDelete(const long chart_ID=0, // ID do gráfico
const string name="Channel") // nome do canal
{
//--- redefine o valor de erro
ResetLastError();
//--- excluir o canal
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": falha ao excluir o canal! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+-------------------------------------------------------------------------+
//| Ver os valores de pontos de ancoragem do canal e definir valores padrão |
//| para aqueles que estão vazios |
//+-------------------------------------------------------------------------+
void ChangeChannelEmptyPoints(datetime &time1,double &price1,datetime &time2,
double &price2,datetime &time3,double &price3)
{
//--- se o tempo do segundo ponto (a direita)não está definido, será na barra atual
if(!time2)
time2=TimeCurrent();
//--- se o preço do segundo ponto não está definido, ele terá valor Bid
if(!price2)
price2=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- se o tempo do primeiro ponto (a esquerda) não está definido, está localizado 9 barras a esque
if(!time1)
{
//--- array para receber o tempo de abertura das últimos 10 barras
datetime temp[10];
CopyTime(Symbol(),Period(),time2,10,temp);
//--- definir o primeiro ponto 9 barras a esquerda do segundo
time1=temp[0];
}
//--- se o preço do primeiro ponto não está definido, mover 300 pontos a mais do que o segundo
if(!price1)
price1=price2+300*SymbolInfoDouble(Symbol(),SYMBOL_POINT);
//--- se o tempo do terceiro ponto não está definido,ele coincide com o tempo do primeiro ponto
if(!time3)
time3=time1;
//--- se o preço do terceiro ponto não está definido, é igual ao preço do segundo ponto
if(!price3)
price3=price2;
}
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
//--- verificar a exatidão dos parâmetros de entrada
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("Erro! Valores incorretos dos parâmetros de entrada!");
return;
}
//--- número de barras visíveis na janela do gráfico
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- tamanho do array de preço
int accuracy=1000;
//--- arrays para armazenar data e valores de preço para serem usados
//--- para definir e alterar as coordenadas de pontos de ancoragem do canal
datetime date[];
double price[];
//--- alocação de memória
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- preencher o array das datas
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Falha ao copiar valores de tempo! Código de erro = ",GetLastError());
return;
}
//--- preencher o array de preços
//--- encontrar os maiores e menores valores do gráfico
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- definir uma etapa de mudança de um preço e preencher o array
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- definir pontos para desenhar o canal
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;
//--- criar o canal eqüidistante
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;
}
//--- redesenhar o gráfico e esperar por um segundo
ChartRedraw();
Sleep(1000);
//--- agora, mover os pontos de ancoragem do canal
//--- contador de loop
int h_steps=bars/6;
//--- mover o segundo ponto de ancoragem
for(int i=0;i<h_steps;i++)
{
//--- usar o seguinte valor
if(d2<bars-1)
d2+=1;
//--- mover o ponto
if(!ChannelPointChange(0,InpName,1,date[d2],price[p2]))
return;
//--- verificar se o funcionamento do script foi desativado a força
if(IsStopped())
return;
//--- redesenhar o gráfico
ChartRedraw();
// 0.05 segundos de atraso
Sleep(50);
}
//--- 1 segundo de atraso
Sleep(1000);
//--- mover o primeiro ponto de ancoragem
for(int i=0;i<h_steps;i++)
{
//--- usar o seguinte valor
if(d1>1)
d1-=1;
//--- mover o ponto
if(!ChannelPointChange(0,InpName,0,date[d1],price[p1]))
return;
//--- verificar se o funcionamento do script foi desativado a força
if(IsStopped())
return;
//--- redesenhar o gráfico
ChartRedraw();
// 0.05 segundos de atraso
Sleep(50);
}
//--- 1 segundo de atraso
Sleep(1000);
//--- contador de loop
int v_steps=accuracy/10;
//--- mover o terceiro ponto de ancoragem
for(int i=0;i<v_steps;i++)
{
//--- usar o seguinte valor
if(p3>1)
p3-=1;
//--- mover o ponto
if(!ChannelPointChange(0,InpName,2,date[d3],price[p3]))
return;
//--- verificar se o funcionamento do script foi desativado a força
if(IsStopped())
return;
//--- redesenhar o gráfico
ChartRedraw();
}
//--- 1 segundo de atraso
Sleep(1000);
//--- excluir o canal do gráfico
ChannelDelete(0,InpName);
ChartRedraw();
//--- 1 segundo de atraso
Sleep(1000);
//---
}
OBJ_STDDEVCHANNEL
Desvio Padrão do Canal.
Observação
Para Desvio Padrão do Canal, é possível determinar o modo da continuação da sua exibição para a
direita e/ou à esquerda (de acordo com as propriedades OBJPR OP_R AY_RIGHT e
OBJPR OP_R AY_LEFT ). O modo de preenchimento colorido do canal também pode ser definido.
Exemplo
O seguinte script cria e move um Desvio Padrão do Canal no gráfico. Funções especiais têm sido
desenvolvidas para criar e alterar as propriedades do objeto gráfico. Você pode utilizar estas
funções " as is " em seus próprios aplicativos.
//--- descrição
#property description "Script desenha objeto gráfico \"Desvio Padrão do Canal\"."
#property description "Coordenadas dos pontos de ancoragem são definidos em percentagem do tamanho
#property description "janela do gráfico."
//--- janela de exibição dos parâmetros de entrada durante inicialização do script
#property script_show_inputs
//--- entrada de parâmetros do script
input string InpName="StdDevChannel"; // Nome do canal
input int InpDate1=10; // Data do 1º ponto, %
input int InpDate2=40; // Data do 2º ponto, %
input double InpDeviation=1.0; // Desvio
input color InpColor=clrRed; // Cor do canal
ObjectSetInteger(chart_ID,name,OBJPROP_FILL,fill);
//--- exibir em primeiro plano (false) ou fundo (true)
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- habilitar (true) ou desabilitar (false) o modo de preenchimento do canal
//--- ao criar um objeto gráfico usando a função ObjectCreate, o objeto não pode ser
//--- destacado e movimentado por padrão. Dentro deste método, o parâmetro de seleção
//--- é verdade por padrão, tornando possível destacar e mover o objeto
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- habilitar (true) ou desabilitar (false) o modo de continuação da exibição do canal a esquerda
ObjectSetInteger(chart_ID,name,OBJPROP_RAY_LEFT,ray_left);
//--- habilitar (true) ou desabilitar (false) o modo de continuação da exibição do canal a direita
ObjectSetInteger(chart_ID,name,OBJPROP_RAY_RIGHT,ray_right);
//--- ocultar (true) ou exibir (false) o nome do objeto gráfico na lista de objeto
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- definir a prioridade para receber o evento com um clique do mouse no gráfico
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Mover ponto de ancoragem |
//+------------------------------------------------------------------+
bool StdDevChannelPointChange(const long chart_ID=0, // Id do Gráfico
const string name="Channel", // nome do canal
const int point_index=0, // índice do ponto de ancoragem
datetime time=0) // coordenada do ponto de ancoragem do t
{
//--- se o tempo de ponto não está definido, mover o ponto para o barra atual
if(!time)
time=TimeCurrent();
//--- redefine o valor de erro
ResetLastError();
//--- mover o ponto de ancoragem
if(!ObjectMove(chart_ID,name,point_index,time,0))
{
Print(__FUNCTION__,
": falha ao mover o ponto de ancoragem! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Alterar o desvio do canal |
//+------------------------------------------------------------------+
bool StdDevChannelDeviationChange(const long chart_ID=0, // ID do gráfico
const string name="Channel", // nome do canal
const double deviation=1.0) // desvio
{
//--- redefine o valor de erro
ResetLastError();
//--- mudar o ângulo de inclinação da linha de tendência
if(!ObjectSetDouble(chart_ID,name,OBJPROP_DEVIATION,deviation))
{
Print(__FUNCTION__,
": falha ao mudar o desvio de canal! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Excluir o canal |
//+------------------------------------------------------------------+
bool StdDevChannelDelete(const long chart_ID=0, // ID do gráfico
const string name="Channel") // nome do canal
{
//--- redefine o valor de erro
ResetLastError();
//--- excluir o canal
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": falha ao excluir o canal! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+-------------------------------------------------------------------------+
//| Ver os valores de pontos de ancoragem do canal e definir valores padrão |
//| para aqueles que estão vazios |
//+-------------------------------------------------------------------------+
void ChangeChannelEmptyPoints(datetime &time1,datetime &time2)
{
//--- se o tempo do primeiro ponto não está definido, será na barra atual
if(!time2)
time2=TimeCurrent();
//--- se o tempo do primeiro ponto não está definido, está localizado 9 barras a esquerda partir da
if(!time1)
{
//--- array para receber o tempo de abertura das últimos 10 barras
datetime temp[10];
CopyTime(Symbol(),Period(),time2,10,temp);
//--- definir o primeiro ponto 9 barras a esquerda do segundo
time1=temp[0];
}
}
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
//--- verificar a exatidão dos parâmetros de entrada
if(InpDate1<0 || InpDate1>100 ||
InpDate2<0 || InpDate2>100)
{
Print("Erro! Valores incorretos dos parâmetros de entrada!");
return;
}
//--- número de barras visíveis na janela do gráfico
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- tamanho do array de preço
int accuracy=1000;
//--- arrays para armazenar data e valores de preço para serem usados
//--- para definir e alterar as coordenadas de pontos de ancoragem do canal
datetime date[];
double price[];
//--- alocação de memória
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- preencher o array das datas
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Falha ao copiar valores de tempo! Código de erro = ",GetLastError());
return;
}
//--- preencher o array de preços
//--- encontrar os maiores e menores valores do gráfico
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- definir uma etapa de mudança de um preço e preencher o array
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- definir pontos para desenhar o canal
int d1=InpDate1*(bars-1)/100;
int d2=InpDate2*(bars-1)/100;
//--- criar desvio padrão do canal
if(!StdDevChannelCreate(0,InpName,0,date[d1],date[d2],InpDeviation,InpColor,InpStyle,
InpWidth,InpFill,InpBack,InpSelection,InpRayLeft,InpRayRight,InpHidden,InpZOrder))
{
return;
}
//--- redesenhar o gráfico e esperar por um segundo
ChartRedraw();
Sleep(1000);
//--- agora, o canal horizontal para a direita e expandi-lo
//--- contador de loop
int h_steps=bars/2;
//--- mover o canal
for(int i=0;i<h_steps;i++)
{
//--- usar os seguintes valores
if(d1<bars-1)
d1+=1;
if(d2<bars-1)
d2+=1;
//--- mover os pontos de ancoragem
if(!StdDevChannelPointChange(0,InpName,0,date[d1]))
return;
if(!StdDevChannelPointChange(0,InpName,1,date[d2]))
return;
//--- verificar se o funcionamento do script foi desativado a força
if(IsStopped())
return;
//--- redesenhar o gráfico
ChartRedraw();
// 0.05 segundos de atraso
Sleep(50);
}
//--- 1 segundo de atraso
Sleep(1000);
//--- contador de loop
double v_steps=InpDeviation*2;
//--- expandir o canal
for(double i=InpDeviation;i<v_steps;i+=10.0/accuracy)
{
if(!StdDevChannelDeviationChange(0,InpName,i))
return;
//--- verificar se o funcionamento do script foi desativado a força
if(IsStopped())
return;
//--- redesenhar o gráfico
ChartRedraw();
}
//--- 1 segundo de atraso
Sleep(1000);
//--- excluir o canal do gráfico
StdDevChannelDelete(0,InpName);
ChartRedraw();
//--- 1 segundo de atraso
Sleep(1000);
//---
OBJ_REGRESSION
R egressão Linear do Canal.
Observação
Para R egressão Linear do Canal, é possível determinar o modo da continuação da sua exibição para
a direita e/ou à esquerda (de acordo com as propriedades OBJPR OP_R AY_RIGHT e
OBJPR OP_R AY_LEFT ). O modo de preenchimento colorido do canal também pode ser definido.
Exemplo
O seguinte script cria e move uma R egressão Linear do Canal no gráfico. Funções especiais têm sido
desenvolvidas para criar e alterar as propriedades do objeto gráfico. Você pode utilizar estas
funções " as is " em seus próprios aplicativos.
//--- descrição
#property description "Script desenha objeto gráfico \"Regressão Linear do Canal\"."
#property description "Coordenadas dos pontos de ancoragem são definidos em percentagem do tamanho
#property description "janela do gráfico."
//--- janela de exibição dos parâmetros de entrada durante inicialização do script
#property script_show_inputs
//--- entrada de parâmetros do script
input string InpName="Regression"; // Nome do canal
input int InpDate1=10; // Data do 1º ponto, %
input int InpDate2=40; // Data do 2º ponto, %
input color InpColor=clrRed; // Cor do canal
input ENUM_LINE_STYLE InpStyle=STYLE_DASH; // Estilo das linhas do canal
input int InpWidth=2; // Largura das linhas do canal
//--- destacado e movimentado por padrão. Dentro deste método, o parâmetro de seleção
//--- é verdade por padrão, tornando possível destacar e mover o objeto
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- habilitar (true) ou desabilitar (false) o modo de continuação da exibição do canal a esquerda
ObjectSetInteger(chart_ID,name,OBJPROP_RAY_LEFT,ray_left);
//--- habilitar (true) ou desabilitar (false) o modo de continuação da exibição do canal a direita
ObjectSetInteger(chart_ID,name,OBJPROP_RAY_RIGHT,ray_right);
//--- ocultar (true) ou exibir (false) o nome do objeto gráfico na lista de objeto
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- definir a prioridade para receber o evento com um clique do mouse no gráfico
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Mover ponto de ancoragem |
//+------------------------------------------------------------------+
bool RegressionPointChange(const long chart_ID=0, // ID do gráfico
const string name="Channel", // nome do canal
const int point_index=0, // índice do ponto de ancoragem
datetime time=0) // coordenada do ponto de ancoragem do temp
{
//--- se o tempo de ponto não está definido, mover o ponto para o barra atual
if(!time)
time=TimeCurrent();
//--- redefine o valor de erro
ResetLastError();
//--- mover o ponto de ancoragem
if(!ObjectMove(chart_ID,name,point_index,time,0))
{
Print(__FUNCTION__,
": falha ao mover o ponto de ancoragem! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Excluir o canal |
//+------------------------------------------------------------------+
bool RegressionDelete(const long chart_ID=0, // ID do gráfico
const string name="Channel") // nome do canal
{
//--- redefine o valor de erro
ResetLastError();
//--- excluir o canal
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": falha ao excluir o canal! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+-------------------------------------------------------------------------+
//| Ver os valores de pontos de ancoragem do canal e definir valores padrão |
//| para aqueles que estão vazios |
//+-------------------------------------------------------------------------+
void ChangeRegressionEmptyPoints(datetime &time1,datetime &time2)
{
//--- se o tempo do primeiro ponto não está definido, será na barra atual
if(!time2)
time2=TimeCurrent();
//--- se o tempo do primeiro ponto não está definido, está localizado 9 barras a esquerda partir da
if(!time1)
{
//--- array para receber o tempo de abertura das últimos 10 barras
datetime temp[10];
CopyTime(Symbol(),Period(),time2,10,temp);
//--- definir o primeiro ponto 9 barras a esquerda do segundo
time1=temp[0];
}
}
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
//--- verificar a exatidão dos parâmetros de entrada
if(InpDate1<0 || InpDate1>100 ||
InpDate2<0 || InpDate2>100)
{
Print("Erro! Valores incorretos dos parâmetros de entrada!");
return;
}
//--- número de barras visíveis na janela do gráfico
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- tamanho do array de preço
int accuracy=1000;
//--- arrays para armazenar data e valores de preço para serem usados
//--- para definir e alterar as coordenadas de pontos de ancoragem do canal
datetime date[];
double price[];
//--- alocação de memória
ArrayResize(date,bars);
ArrayResize(price,accuracy);
Sleep(50);
}
//--- 1 segundo de atraso
Sleep(1000);
//--- excluir o canal do gráfico
RegressionDelete(0,InpName);
ChartRedraw();
//--- 1 segundo de atraso
Sleep(1000);
//---
}
OBJ_PITCHFORK
T ridente Andrews.
Observação
Para T ridente Andrews, é possível determinar o modo da continuação da sua exibição para a direita
e/ou à esquerda (de acordo com as propriedades OBJPR OP_R AY_RIGHT e OBJPR OP_R AY_LEFT ).
Você também pode especificar o número de linhas de níveis, os seus valores e cores.
Exemplo
O seguinte script cria e move o T ridente Andrews no gráfico. Funções especiais têm sido
desenvolvidas para criar e alterar as propriedades do objeto gráfico. Você pode utilizar estas
funções " as is " em seus próprios aplicativos.
//--- descrição
#property description "Script desenha o objeto gráfico \"Tridente Andrews\"."
#property description "Coordenadas de ponto de ancoragem são definidas em porcentagem de"
#property description "tamanho da janela do gráfico."
//--- janela de exibição dos parâmetros de entrada durante inicialização do script
#property script_show_inputs
//--- entrada de parâmetros do script
input string InpName="Pitchfork"; // Nome do Tridente
input int InpDate1=14; // Data do 1º ponto, %
input int InpPrice1=40; // Preço do 1º ponto, %
input int InpDate2=18; // Data do 2º ponto, %
input int InpPrice2=50; // Preço do 2º ponto, %
input int InpDate3=18; // Data do 3º ponto, %
input int InpPrice3=30; // Preço do 3º ponto, %
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- habilitar (true) ou desabilitar (false) o modo de destaque para mover o tridente
//--- ao criar um objeto gráfico usando a função ObjectCreate, o objeto não pode ser
//--- destacado e movimentado por padrão. Dentro deste método, o parâmetro de seleção
//--- é verdade por padrão, tornando possível destacar e mover o objeto
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- habilitar (true) ou desabilitar (false) o modo de continuação da exibição do tridente à esque
ObjectSetInteger(chart_ID,name,OBJPROP_RAY_LEFT,ray_left);
//--- habilitar (true) ou desabilitar (false) o modo de continuação da exibição do tridente à direi
ObjectSetInteger(chart_ID,name,OBJPROP_RAY_RIGHT,ray_right);
//--- ocultar (true) ou exibir (false) o nome do objeto gráfico na lista de objeto
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- definir a prioridade para receber o evento com um clique do mouse no gráfico
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Definir o número de níveis do Andrews e seus parâmetros |
//+------------------------------------------------------------------+
bool PitchforkLevelsSet(int levels, // número de linhas dos níveis
double &values[], // valores de linhas dos níveis
color &colors[], // cor das linhas dos níveis
ENUM_LINE_STYLE &styles[], // estilo das linhas dos níveis
int &widths[], // largura das linhas dos níveis
const long chart_ID=0, // ID do gráfico
const string name="Pitchfork") // nome do tridente
{
//--- verificar tamanhos do array
if(levels!=ArraySize(colors) || levels!=ArraySize(styles) ||
levels!=ArraySize(widths) || levels!=ArraySize(widths))
{
Print(__FUNCTION__,": comprimento do array não corresponder ao número de níveis, erro!");
return(false);
}
//--- definir o número de níveis
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELS,levels);
//--- definir as propriedades de níveis no loop
for(int i=0;i<levels;i++)
{
//--- valor do nível
ObjectSetDouble(chart_ID,name,OBJPROP_LEVELVALUE,i,values[i]);
//--- cor do nível
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELCOLOR,i,colors[i]);
//--- estilo de nível
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELSTYLE,i,styles[i]);
//--- largura de nível
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELWIDTH,i,widths[i]);
}
//+----------------------------------------------------------------------+
//| Ver valores dos pontos de ancoragem do Tridente Andrews e definir |
//| valores para aqueles vazios |
//+----------------------------------------------------------------------+
void ChangeChannelEmptyPoints(datetime &time1,double &price1,datetime &time2,
double &price2,datetime &time3,double &price3)
{
//--- se o tempo do segundo ponto (acima direita) não está definido, será na barra atual
if(!time2)
time2=TimeCurrent();
//--- se o preço do segundo ponto não está definido, ele terá valor Bid
if(!price2)
price2=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- se o tempo do primeiro ponto (a esquerda) não está definido, está localizado 9 barras a esque
if(!time1)
{
//--- array para receber o tempo de abertura das últimos 10 barras
datetime temp[10];
CopyTime(Symbol(),Period(),time2,10,temp);
//--- definir o primeiro ponto 9 barras a esquerda do segundo
time1=temp[0];
}
//--- se o preço do primeiro ponto não está definido, mover 200 pontos a mais do que o segundo
if(!price1)
price1=price2-200*SymbolInfoDouble(Symbol(),SYMBOL_POINT);
//--- se o tempo do terceiro ponto não está definido, ele coincide com o tempo do segundo ponto
if(!time3)
time3=time2;
//--- se o preço do primeiro ponto não está definido, mover 200 pontos a mais do que o primeiro
if(!price3)
price3=price1-200*SymbolInfoDouble(Symbol(),SYMBOL_POINT);
}
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
//--- verificar a exatidão dos parâmetros de entrada
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("Erro! Valores incorretos dos parâmetros de entrada!");
return;
}
//--- número de barras visíveis na janela do gráfico
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- tamanho do array de preço
int accuracy=1000;
//--- arrays para armazenar data e valores de preço para serem usados
//--- para definir e alterar as coordenadas dos pontos de ancoragem do Tridente Andrews
datetime date[];
double price[];
//--- alocação de memória
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- preencher o array das datas
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Falha ao copiar valores de tempo! Código de erro = ",GetLastError());
return;
}
//--- preencher o array de preços
//--- encontrar os maiores e menores valores do gráfico
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- definir uma etapa de mudança de um preço e preencher o array
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- definir pontos para desenhar o Tridente Andrews
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;
//--- criar o tridente
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;
}
//--- redesenhar o gráfico e esperar por um segundo
ChartRedraw();
Sleep(1000);
//--- agora, mover os pontos de ancoragem do tridente
//--- contador de loop
int v_steps=accuracy/10;
//--- mover o primeiro ponto de ancoragem
for(int i=0;i<v_steps;i++)
{
//--- usar o seguinte valor
if(p1>1)
p1-=1;
//--- mover o ponto
if(!PitchforkPointChange(0,InpName,0,date[d1],price[p1]))
return;
//--- verificar se o funcionamento do script foi desativado a força
if(IsStopped())
return;
//--- redesenhar o gráfico
ChartRedraw();
}
//--- 1 segundo de atraso
Sleep(1000);
//--- contador de loop
int h_steps=bars/8;
//--- mover o terceiro ponto de ancoragem
for(int i=0;i<h_steps;i++)
{
//--- usar o seguinte valor
if(d3<bars-1)
d3+=1;
//--- mover o ponto
if(!PitchforkPointChange(0,InpName,2,date[d3],price[p3]))
return;
//--- verificar se o funcionamento do script foi desativado a força
if(IsStopped())
return;
//--- redesenhar o gráfico
ChartRedraw();
//--- redesenhar o gráfico
ChartRedraw();
// 0.05 segundos de atraso
Sleep(50);
}
//--- 1 segundo de atraso
Sleep(1000);
//--- contador de loop
v_steps=accuracy/10;
//--- mover o segundo ponto de ancoragem
for(int i=0;i<v_steps;i++)
{
//--- usar o seguinte valor
if(p2>1)
p2-=1;
//--- mover o ponto
if(!PitchforkPointChange(0,InpName,1,date[d2],price[p2]))
return;
//--- verificar se o funcionamento do script foi desativado a força
if(IsStopped())
return;
//--- redesenhar o gráfico
ChartRedraw();
}
//--- 1 segundo de atraso
Sleep(1000);
//--- excluir a tridente do gráfico
PitchforkDelete(0,InpName);
ChartRedraw();
//--- 1 segundo de atraso
Sleep(1000);
//---
}
OBJ_GANNLINE
Linha Gann.
Observação
Para Linha Gann, é possível determinar o modo da continuação da sua exibição para a direita e/ou à
esquerda (de acordo com as propriedades OBJPR OP_R AY_RIGHT e OBJPR OP_R AY_LEFT ).
Ambos ângulo de Gann com uma escala e as coordenadas do segundo ponto de ancoragem podem ser
usados para definir a inclinação da linha.
Exemplo
O seguinte script cria e move o Linha Gann no gráfico. Funções especiais têm sido desenvolvidas
para criar e alterar as propriedades do objeto gráfico. Você pode utilizar estas funções " as is " em
seus próprios aplicativos.
//--- descrição
#property description "Script desenha objeto gráfico \"Linha Gann\"."
#property description "Coordenadas de ponto de ancoragem são definidas em porcentagem de"
#property description "tamanho da janela do gráfico."
//--- janela de exibição dos parâmetros de entrada durante inicialização do script
#property script_show_inputs
//--- entrada de parâmetros do script
input string InpName="GannLine"; // Nome da linha
input int InpDate1=20; // Data do 1º ponto, %
input int InpPrice1=75; // Preço do 1º ponto, %
input int InpDate2=80; // Data do 2º ponto, %
input double InpAngle=0.0; // Angulo Gann
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- definir o estilo de exibição da linha
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- definir a largura da linha
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- exibir em primeiro plano (false) ou fundo (true)
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- habilitar (true) ou desabilitar (false) o modo de destaque para mover as linhas
//--- ao criar um objeto gráfico usando a função ObjectCreate, o objeto não pode ser
//--- destacado e movimentado por padrão. Dentro deste método, o parâmetro de seleção
//--- é verdade por padrão, tornando possível destacar e mover o objeto
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- habilitar (true) ou desabilitar (false) o modo de continuação da exibição da linha à esquerda
ObjectSetInteger(chart_ID,name,OBJPROP_RAY_LEFT,ray_left);
//--- habilitar (true) ou desabilitar (false) o modo de continuação da exibição da linha à direita
ObjectSetInteger(chart_ID,name,OBJPROP_RAY_RIGHT,ray_right);
//--- ocultar (true) ou exibir (false) o nome do objeto gráfico na lista de objeto
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- definir a prioridade para receber o evento com um clique do mouse no gráfico
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Mover ponto de ancoragem do Linha Gann |
//+------------------------------------------------------------------+
bool GannLinePointChange(const long chart_ID=0, // ID do gráfico
const string name="GannLine", // nome da linha
const int point_index=0, // índice do ponto de ancoragem
datetime time=0, // coordenada do ponto de ancoragem de tempo
double price=0) // coordenada do ponto de ancoragem de preço
{
//--- se a posição do ponto não está definida, mover para a barra atual tendo o preço Bid
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- redefine o valor de erro
ResetLastError();
//--- mover ponto de ancoragem da linha
if(!ObjectMove(chart_ID,name,point_index,time,price))
{
Print(__FUNCTION__,
": falha ao mover o ponto de ancoragem! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Alterar angulo Gann |
//+------------------------------------------------------------------+
bool GannLineAngleChange(const long chart_ID=0, // ID do gráfico
const string name="GannLine", // nome da linha
const double angle=1.0) // angulo Gann
{
//--- redefine o valor de erro
ResetLastError();
//--- alterar angulo Gann
if(!ObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,angle))
{
Print(__FUNCTION__,
": falha ao alterar o angulo Gann! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Alterar escala Gann Line |
//+------------------------------------------------------------------+
bool GannLineScaleChange(const long chart_ID=0, // ID do gráfico
const string name="GannLine", // nome da linha
const double scale=1.0) // escala
{
//--- redefine o valor de erro
ResetLastError();
//--- alterar a escala (número de pips por barra)
if(!ObjectSetDouble(chart_ID,name,OBJPROP_SCALE,scale))
{
Print(__FUNCTION__,
": falha ao alterar a escala! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| A função remove a Linha Gann gráfico |
//+------------------------------------------------------------------+
bool GannLineDelete(const long chart_ID=0, // ID do gráfico
const string name="GannLine") // nome da linha
{
//--- redefine o valor de erro
ResetLastError();
//--- excluir linha Gann
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": falha ao excluir \"Linha Gann\"! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Ver valores pontos de ancoragem da linha Gann e definir |
//| valores padrão para aqueles vazios |
//+------------------------------------------------------------------+
void ChangeGannLineEmptyPoints(datetime &time1,double &price1,datetime &time2)
{
//--- se o tempo do primeiro ponto não está definido, será na barra atual
if(!time2)
time2=TimeCurrent();
//--- se o tempo do primeiro ponto não está definido, está localizado 9 barras a esquerda partir da
if(!time1)
{
//--- array para receber o tempo de abertura das últimos 10 barras
datetime temp[10];
CopyTime(Symbol(),Period(),time2,10,temp);
//--- definir o primeiro ponto 9 barras a esquerda do segundo
time1=temp[0];
}
//--- se o preço do primeiro ponto não está definido, ele terá valor Bid
if(!price1)
price1=SymbolInfoDouble(Symbol(),SYMBOL_BID);
}
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
//--- verificar a exatidão dos parâmetros de entrada
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
InpDate2<0 || InpDate2>100)
{
Print("Erro! Valores incorretos dos parâmetros de entrada!");
return;
}
//--- número de barras visíveis na janela do gráfico
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- tamanho do array de preço
int accuracy=1000;
//--- arrays para armazenar data e valores de preço para serem usados
//--- para definir e alterar as coordenadas de pontos de ancoragem da linha
datetime date[];
double price[];
//--- alocação de memória
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- preencher o array das datas
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Falha ao copiar valores de tempo! Código de erro = ",GetLastError());
return;
}
//--- preencher o array de preços
//--- encontrar os maiores e menores valores do gráfico
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- definir uma etapa de mudança de um preço e preencher o array
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- definir os pontos para desenhar a linha Gann
int d1=InpDate1*(bars-1)/100;
int d2=InpDate2*(bars-1)/100;
int p1=InpPrice1*(accuracy-1)/100;
//--- criar Linha Gann
if(!GannLineCreate(0,InpName,0,date[d1],price[p1],date[d2],InpAngle,InpScale,InpColor,
InpStyle,InpWidth,InpBack,InpSelection,InpRayLeft,InpRayRight,InpHidden,InpZOrder))
{
return;
}
//--- redesenhar o gráfico e esperar por um segundo
ChartRedraw();
Sleep(1000);
//--- agora, mover o ponto de ancoragem da linha e mudar o angulo
//--- contador de loop
int v_steps=accuracy/2;
//--- mover o primeiro ponto de ancoragem vertical
for(int i=0;i<v_steps;i++)
{
//--- usar o seguinte valor
if(p1>1)
p1-=1;
//--- mover o ponto
if(!GannLinePointChange(0,InpName,0,date[d1],price[p1]))
return;
//--- verificar se o funcionamento do script foi desativado a força
if(IsStopped())
return;
//--- redesenhar o gráfico
ChartRedraw();
}
//--- meio segundo de atraso
Sleep(500);
//--- definir o valor atual de angulo Gann (alterar
//--- depois de mover o primeiro ponto de ancoragem)
double curr_angle;
if(!ObjectGetDouble(0,InpName,OBJPROP_ANGLE,0,curr_angle))
return;
//--- contador de loop
v_steps=accuracy/8;
//--- alterar angulo Gann
for(int i=0;i<v_steps;i++)
{
if(!GannLineAngleChange(0,InpName,curr_angle-0.05*i))
return;
//--- verificar se o funcionamento do script foi desativado a força
if(IsStopped())
return;
//--- redesenhar o gráfico
ChartRedraw();
}
//--- 1 segundo de atraso
Sleep(1000);
//--- excluir a linha do gráfico
GannLineDelete(0,InpName);
ChartRedraw();
//--- 1 segundo de atraso
Sleep(1000);
//---
}
OBJ_GANNFAN
Gann Fan.
Observação
Para Gann Fan, é possível determinar o tipo de tendência a partir enumeração
ENUM _GANN_DIR ECTION. Ao ajustar o valor da escala(OBJPR OP_SCALE), é possível alterar o ângulo
de inclinação das linhas do fan.
Exemplo
O seguinte script cria e move o Gann Fan no gráfico. Funções especiais têm sido desenvolvidas para
criar e alterar as propriedades do objeto gráfico. Você pode utilizar estas funções " as is " em seus
próprios aplicativos.
//--- descrição
#property description "Script desenha o objeto gráfico tipo \"Gann Fan\"."
#property description "Coordenadas de ponto de ancoragem são definidas em porcentagem de"
#property description "tamanho da janela do gráfico."
//--- janela de exibição dos parâmetros de entrada durante inicialização do script
#property script_show_inputs
//--- entrada de parâmetros do script
input string InpName="GannFan"; // Nome do fan
input int InpDate1=15; // Data do 1º ponto, %
input int InpPrice1=25; // Preço do 1º ponto, %
input int InpDate2=85; // Data do 2º ponto, %
input double InpScale=2.0; // Escala
input bool InpDirection=false; // Direção da tendência
//--- habilitar (true) ou desabilitar (false) o modo de destaque para mover o fan
//--- ao criar um objeto gráfico usando a função ObjectCreate, o objeto não pode ser
//--- destacado e movimentado por padrão. Dentro deste método, o parâmetro de seleção
//--- é verdade por padrão, tornando possível destacar e mover o objeto
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- ocultar (true) ou exibir (false) o nome do objeto gráfico na lista de objeto
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- definir a prioridade para receber o evento com um clique do mouse no gráfico
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Mover ponto de ancoragem do Gann Fan |
//+------------------------------------------------------------------+
bool GannFanPointChange(const long chart_ID=0, // ID do gráfico
const string name="GannFan", // nome do fan
const int point_index=0, // índice do ponto de ancoragem
datetime time=0, // coordenada do ponto de ancoragem de tempo
double price=0) // coordenada do ponto de ancoragem do preço
{
//--- se a posição do ponto não está definida, mover para a barra atual tendo o preço Bid
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- redefine o valor de erro
ResetLastError();
//--- mover ponto de ancoragem do fan
if(!ObjectMove(chart_ID,name,point_index,time,price))
{
Print(__FUNCTION__,
": falha ao mover o ponto de ancoragem! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Alterar a escala Gann Fan |
//+------------------------------------------------------------------+
bool GannFanScaleChange(const long chart_ID=0, // ID do gráfico
const string name="GannFan", // nome do fan
const double scale=1.0) // escala
{
//--- redefine o valor de erro
ResetLastError();
//--- alterar a escala (número de pips por barra)
if(!ObjectSetDouble(chart_ID,name,OBJPROP_SCALE,scale))
{
Print(__FUNCTION__,
": falha ao alterar a escala! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Alterar a direção de tendência Gann Fan |
//+------------------------------------------------------------------+
bool GannFanDirectionChange(const long chart_ID=0, // ID do gráfico
const string name="GannFan", // nome do fan
const bool direction=true) // direção da tendência
{
//--- redefine o valor de erro
ResetLastError();
//--- alterar a direção de tendência Gann Fan
if(!ObjectSetInteger(chart_ID,name,OBJPROP_DIRECTION,direction))
{
Print(__FUNCTION__,
": falha ao alterar a direção de tendência! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| A função remove o Gann Fan do gráfico |
//+------------------------------------------------------------------+
bool GannFanDelete(const long chart_ID=0, // ID do gráfico
const string name="GannFan") // nome do fan
{
//--- redefine o valor de erro
ResetLastError();
//--- excluir Gann Fan
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": falha ao excluir \"Gann Fan\"! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Ver valores dos pontos de ancoragem do Gann Fan e definir |
//| valores padrão para aqueles vazios |
//+------------------------------------------------------------------+
void ChangeGannFanEmptyPoints(datetime &time1,double &price1,datetime &time2)
{
//--- se o tempo do primeiro ponto não está definido, será na barra atual
if(!time2)
time2=TimeCurrent();
//--- se o tempo do primeiro ponto não está definido, está localizado 9 barras a esquerda partir da
if(!time1)
{
//--- array para receber o tempo de abertura das últimos 10 barras
datetime temp[10];
CopyTime(Symbol(),Period(),time2,10,temp);
//--- definir o primeiro ponto 9 barras a esquerda do segundo
time1=temp[0];
}
//--- se o preço do primeiro ponto não está definido, ele terá valor Bid
if(!price1)
price1=SymbolInfoDouble(Symbol(),SYMBOL_BID);
}
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
//--- verificar a exatidão dos parâmetros de entrada
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
InpDate2<0 || InpDate2>100)
{
Print("Erro! Valores incorretos dos parâmetros de entrada!");
return;
}
//--- número de barras visíveis na janela do gráfico
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- tamanho do array de preço
int accuracy=1000;
//--- arrays para armazenar data e valores de preço para serem usados
//--- para definir e alterar as coordenadas dos pontos de ancoragem do fan
datetime date[];
double price[];
//--- alocação de memória
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- preencher o array das datas
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Falha ao copiar valores de tempo! Código de erro = ",GetLastError());
return;
}
ChartRedraw();
//--- 1 segundo de atraso
Sleep(1000);
//---
}
OBJ_GANNGRID
Grade Gann.
Observação
Para Grade Gann, é possível determinar o tipo de tendência a partir do enumerador
ENUM _GANN_DIR ECTION. Ao ajustar o valor da escala(OBJPR OP_SCALE), é possível alterar o ângulo
de inclinação das linhas do grade.
Exemplo
O seguinte script cria e move o Grade Gann no gráfico. Funções especiais têm sido desenvolvidas
para criar e alterar as propriedades do objeto gráfico. Você pode utilizar estas funções " as is " em
seus próprios aplicativos.
//--- descrição
#property description "Script desenha o objeto gráfico tipo \"Grade Gann\"."
#property description "Coordenadas dos pontos de ancoragem do grade são definidos em percentagem do
#property description "tamanho da janela do gráfico."
//--- janela de exibição dos parâmetros de entrada durante inicialização do script
#property script_show_inputs
//--- entrada de parâmetros do script
input string InpName="GannGrid"; // Nome do grade
input int InpDate1=15; // Data do 1º ponto, %
input int InpPrice1=25; // Preço do 1º ponto, %
input int InpDate2=35; // Data do 2º ponto, %
input double InpScale=3.0; // Escala
input bool InpDirection=false; // Direção da tendência
//--- habilitar (true) ou desabilitar (false) o modo de destaque para mover o grid
//--- ao criar um objeto gráfico usando a função ObjectCreate, o objeto não pode ser
//--- destacado e movimentado por padrão. Dentro deste método, o parâmetro de seleção
//--- é verdade por padrão, tornando possível destacar e mover o objeto
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- ocultar (true) ou exibir (false) o nome do objeto gráfico na lista de objeto
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- definir a prioridade para receber o evento com um clique do mouse no gráfico
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Mover ponto de ancoragem do Grade Gann |
//+------------------------------------------------------------------+
bool GannGridPointChange(const long chart_ID=0, // ID do gráfico
const string name="GannGrid", // nome do grade
const int point_index=0, // índice do ponto de ancoragem
datetime time=0, // coordenada do ponto de ancoragem de tempo
double price=0) // coordenada do ponto de ancoragem de preço
{
//--- se a posição do ponto não está definida, mover para a barra atual tendo o preço Bid
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- redefine o valor de erro
ResetLastError();
//--- mover ponto de ancoragem do grade
if(!ObjectMove(chart_ID,name,point_index,time,price))
{
Print(__FUNCTION__,
": falha ao mover o ponto de ancoragem! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Alterar a escala Grade Gann |
//+------------------------------------------------------------------+
bool GannGridScaleChange(const long chart_ID=0, // ID do gráfico
const string name="GannGrid", // nome do grade
const double scale=1.0) // escala
{
//--- redefine o valor de erro
ResetLastError();
//--- alterar a escala (número de pips por barra)
if(!ObjectSetDouble(chart_ID,name,OBJPROP_SCALE,scale))
{
Print(__FUNCTION__,
": falha ao alterar a escala! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Alterar a direção de tendência Grade Gann |
//+------------------------------------------------------------------+
bool GannGridDirectionChange(const long chart_ID=0, // ID do gráfico
const string name="GannGrid", // nome do grade
const bool direction=true) // direção da tendência
{
//--- redefine o valor de erro
ResetLastError();
//--- alterar a direção de tendência Grade Gann
if(!ObjectSetInteger(chart_ID,name,OBJPROP_DIRECTION,direction))
{
Print(__FUNCTION__,
": falha ao alterar a direção de tendência! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| A função remove o Gann Fan do gráfico |
//+------------------------------------------------------------------+
bool GannGridDelete(const long chart_ID=0, // ID do gráfico
const string name="GannGrid") // nome do grade
{
//--- redefine o valor de erro
ResetLastError();
//--- excluir Grade Gann
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": falha ao excluir \"Grade Gann\"! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Ver valores dos pontos de ancoragem do Grade Gann e definir |
//| valores padrão para aqueles vazios |
//+------------------------------------------------------------------+
void ChangeGannGridEmptyPoints(datetime &time1,double &price1,datetime &time2)
{
//--- se o tempo do primeiro ponto não está definido, será na barra atual
if(!time2)
time2=TimeCurrent();
//--- se o tempo do primeiro ponto não está definido, está localizado 9 barras a esquerda partir da
if(!time1)
{
//--- array para receber o tempo de abertura das últimos 10 barras
datetime temp[10];
CopyTime(Symbol(),Period(),time2,10,temp);
//--- definir o primeiro ponto 9 barras a esquerda do segundo
time1=temp[0];
}
//--- se o preço do primeiro ponto não está definido, ele terá valor Bid
if(!price1)
price1=SymbolInfoDouble(Symbol(),SYMBOL_BID);
}
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
//--- verificar a exatidão dos parâmetros de entrada
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
InpDate2<0 || InpDate2>100)
{
Print("Erro! Valores incorretos dos parâmetros de entrada!");
return;
}
//--- número de barras visíveis na janela do gráfico
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- tamanho do array de preço
int accuracy=1000;
//--- arrays para armazenar data e valores de preço para serem usados
//--- para definir e alterar as coordenadas de pontos de ancoragem do grade
datetime date[];
double price[];
//--- alocação de memória
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- preencher o array das datas
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Falha ao copiar valores de tempo! Código de erro = ",GetLastError());
return;
}
return;
//--- verificar se o funcionamento do script foi desativado a força
if(IsStopped())
return;
//--- redesenhar o gráfico
ChartRedraw();
// 0.05 segundos de atraso
Sleep(50);
}
//--- 1 segundo de atraso
Sleep(1000);
//--- alterar a direção tendência do grade para um descendente
GannGridDirectionChange(0,InpName,true);
//--- redesenhar o gráfico
ChartRedraw();
//--- 1 segundo de atraso
Sleep(1000);
//--- excluir o grade do gráfico
GannGridDelete(0,InpName);
ChartRedraw();
//--- 1 segundo de atraso
Sleep(1000);
//---
}
OBJ_FIBO
R etração Fibonacci.
Observação
Para "R etração Fibonacci" , é possível determinar o modo da continuação da sua exibição para a
direita e/ou à esquerda (de acordo com a propriedade OBJPR OP_R AY_RIGHT e
OBJPR OP_R AY_LEFT ).
Você também pode especificar o número de linhas de níveis, os seus valores e cores.
Exemplo
O seguinte script cria e move a R etração Fibonacci no gráfico. Funções especiais têm sido
desenvolvidas para criar e alterar as propriedades do objeto gráfico. Você pode utilizar estas
funções " as is " em seus próprios aplicativos.
//--- descrição
[parcial]#property description "Script desenha objeto gráfico \"Retração Fibonacci\"."
#property description "Coordenadas de ponto de ancoragem são definidas em porcentagem de"
#property description "tamanho da janela do gráfico."
//--- janela de exibição dos parâmetros de entrada durante inicialização do script
#property script_show_inputs
//--- entrada de parâmetros do script
input string InpName="FiboLevels"; // Nome do objeto
input int InpDate1=10; // Data do 1º ponto, %
input int InpPrice1=65; // Preço do 1º ponto, %
input int InpDate2=90; // Data do 2º ponto, %
input int InpPrice2=85; // Preço do 2º ponto, %
//--- ao criar um objeto gráfico usando a função ObjectCreate, o objeto não pode ser
//--- destacado e movimentado por padrão. Dentro deste método, o parâmetro de seleção
//--- é verdade por padrão, tornando possível destacar e mover o objeto
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- habilitar (true) ou desabilitar (false) o modo de continuação da exibição do objeto à esquerd
ObjectSetInteger(chart_ID,name,OBJPROP_RAY_LEFT,ray_left);
//--- habilitar (true) ou desabilitar (false) o modo de continuação da exibição do objeto à direita
ObjectSetInteger(chart_ID,name,OBJPROP_RAY_RIGHT,ray_right);
//--- ocultar (true) ou exibir (false) o nome do objeto gráfico na lista de objeto
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- definir a prioridade para receber o evento com um clique do mouse no gráfico
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Definir o número de níveis e seus parâmetros |
//+------------------------------------------------------------------+
bool FiboLevelsSet(int levels, // número de linhas dos níveis
double &values[], // valores de linhas dos níveis
color &colors[], // cor das linhas dos níveis
ENUM_LINE_STYLE &styles[], // estilo das linhas dos níveis
int &widths[], // largura das linhas dos níveis
const long chart_ID=0, // ID do gráfico
const string name="FiboLevels") // nome do objeto
{
//--- verificar tamanhos do array
if(levels!=ArraySize(colors) || levels!=ArraySize(styles) ||
levels!=ArraySize(widths) || levels!=ArraySize(widths))
{
Print(__FUNCTION__,": comprimento do array não corresponder ao número de níveis, erro!");
return(false);
}
//--- definir o número de níveis
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELS,levels);
//--- definir as propriedades de níveis no loop
for(int i=0;i<levels;i++)
{
//--- valor do nível
ObjectSetDouble(chart_ID,name,OBJPROP_LEVELVALUE,i,values[i]);
//--- cor do nível
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELCOLOR,i,colors[i]);
//--- estilo de nível
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELSTYLE,i,styles[i]);
//--- largura de nível
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELWIDTH,i,widths[i]);
//--- descrição de nível
ObjectSetString(chart_ID,name,OBJPROP_LEVELTEXT,i,DoubleToString(100*values[i],1));
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Mover ponto de ancoragem da Retração Fibonacci |
//+------------------------------------------------------------------+
bool FiboLevelsPointChange(const long chart_ID=0, // ID do gráfico
const string name="FiboLevels", // nome do objeto
const int point_index=0, // índice do ponto de ancoragem
datetime time=0, // coordenada do ponto de ancoragem do t
double price=0) // coordenada do ponto de ancoragem de p
{
//--- se a posição do ponto não está definida, mover para a barra atual tendo o preço Bid
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- redefine o valor de erro
ResetLastError();
//--- mover o ponto de ancoragem
if(!ObjectMove(chart_ID,name,point_index,time,price))
{
Print(__FUNCTION__,
": falha ao mover o ponto de ancoragem! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Excluir Retração Fibonacci |
//+------------------------------------------------------------------+
bool FiboLevelsDelete(const long chart_ID=0, // ID do gráfico
const string name="FiboLevels") // nome do objeto
{
//--- redefine o valor de erro
ResetLastError();
//--- excluir o objeto
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": falha ao excluir \"Retração Fibonacci\"! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Falha ao copiar valores de tempo! Código de erro = ",GetLastError());
return;
}
//--- preencher o array de preços
//--- encontrar os maiores e menores valores do gráfico
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- definir uma etapa de mudança de um preço e preencher o array
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- definir os pontos para desenhar Retração 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;
//--- criar um objeto
if(!FiboLevelsCreate(0,InpName,0,date[d1],price[p1],date[d2],price[p2],InpColor,
InpStyle,InpWidth,InpBack,InpSelection,InpRayLeft,InpRayRight,InpHidden,InpZOrder))
{
return;
}
//--- redesenhar o gráfico e esperar por um segundo
ChartRedraw();
Sleep(1000);
//--- agora, mover os pontos de ancoragem
//--- contador de loop
int v_steps=accuracy*2/5;
//--- mover o primeiro ponto de ancoragem
for(int i=0;i<v_steps;i++)
{
//--- usar o seguinte valor
if(p1>1)
p1-=1;
//--- mover o ponto
if(!FiboLevelsPointChange(0,InpName,0,date[d1],price[p1]))
return;
//--- verificar se o funcionamento do script foi desativado a força
if(IsStopped())
return;
//--- redesenhar o gráfico
ChartRedraw();
}
//--- 1 segundo de atraso
Sleep(1000);
//--- contador de loop
v_steps=accuracy*4/5;
//--- mover o segundo ponto de ancoragem
for(int i=0;i<v_steps;i++)
{
//--- usar o seguinte valor
if(p2>1)
p2-=1;
//--- mover o ponto
if(!FiboLevelsPointChange(0,InpName,1,date[d2],price[p2]))
return;
//--- verificar se o funcionamento do script foi desativado a força
if(IsStopped())
return;
//--- redesenhar o gráfico
ChartRedraw();
}
//--- 1 segundo de atraso
Sleep(1000);
//--- excluir a etiqueta do gráfico
FiboLevelsDelete(0,InpName);
ChartRedraw();
//--- 1 segundo de atraso
Sleep(1000);
//---
}
OBJ_FIBOTIMES
Fibonacci Zonas de T empo.
Observação
Para "Fibonacci Zonas de T empo" , é possível determinar o número de linhas de níveis, os seus
valores e cores.
Exemplo
O seguinte script cria e move a Fibonacci Zonas de T empo no gráfico. Funções especiais têm sido
desenvolvidas para criar e alterar as propriedades do objeto gráfico. Você pode utilizar estas
funções " as is " em seus próprios aplicativos.
//--- descrição
#property description "Script desenha objeto gráfico \"Fibonacci Zonas de Tempo\"."
#property description "Coordenadas dos pontos de ancoragem são definidos em percentagem do tamanho
#property description "janela do gráfico."
//--- janela de exibição dos parâmetros de entrada durante inicialização do script
#property script_show_inputs
//--- entrada de parâmetros do script
input string InpName="FiboTimes"; // Nome do objeto
input int InpDate1=10; // Data do 1º ponto, %
input int InpPrice1=45; // Preço do 1º ponto, %
input int InpDate2=20; // Data do 2º ponto, %
input int InpPrice2=55; // Preço do 2º ponto, %
input color InpColor=clrRed; // Cor do objeto
input ENUM_LINE_STYLE InpStyle=STYLE_DASHDOTDOT; // Estilo da linha
input int InpWidth=2; // Largura da linha
//--- definir a prioridade para receber o evento com um clique do mouse no gráfico
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Definir o número de níveis e seus parâmetros |
//+------------------------------------------------------------------+
bool FiboTimesLevelsSet(int levels, // número de linhas dos níveis
double &values[], // valores de linhas dos níveis
color &colors[], // cor das linhas dos níveis
ENUM_LINE_STYLE &styles[], // estilo das linhas dos níveis
int &widths[], // largura das linhas dos níveis
const long chart_ID=0, // ID do gráfico
const string name="FiboTimes") // nome do objeto
{
//--- verificar tamanhos do array
if(levels!=ArraySize(colors) || levels!=ArraySize(styles) ||
levels!=ArraySize(widths) || levels!=ArraySize(widths))
{
Print(__FUNCTION__,": comprimento do array não corresponder ao número de níveis, erro!");
return(false);
}
//--- definir o número de níveis
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELS,levels);
//--- definir as propriedades de níveis no loop
for(int i=0;i<levels;i++)
{
//--- valor do nível
ObjectSetDouble(chart_ID,name,OBJPROP_LEVELVALUE,i,values[i]);
//--- cor do nível
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELCOLOR,i,colors[i]);
//--- estilo de nível
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELSTYLE,i,styles[i]);
//--- largura de nível
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELWIDTH,i,widths[i]);
//--- descrição de nível
ObjectSetString(chart_ID,name,OBJPROP_LEVELTEXT,i,DoubleToString(values[i],1));
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Mover pontos de ancoragem da Fibonacci Zonas de Tempo |
//+------------------------------------------------------------------+
bool FiboTimesPointChange(const long chart_ID=0, // ID gráfico
const string name="FiboTimes", // nome do objeto
const int point_index=0, // índice do ponto de ancoragem
datetime time=0, // coordenada do ponto de ancoragem de tem
price1=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- se o tempo do segundo ponto não está definido, está localizado 2 barras deixadas a partir da
if(!time2)
{
//--- array para receber o tempo de abertura das últimos 3 barras
datetime temp[3];
CopyTime(Symbol(),Period(),time1,3,temp);
//--- definir o primeiro ponto 2 barras a esquerda do segundo
time2=temp[0];
}
//--- se o preço do segundo ponto não está definido, é igual ao primeiro ponto
if(!price2)
price2=price1;
}
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
//--- verificar a exatidão dos parâmetros de entrada
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
InpDate2<0 || InpDate2>100 || InpPrice2<0 || InpPrice2>100)
{
Print("Erro! Valores incorretos dos parâmetros de entrada!");
return;
}
//--- número de barras visíveis na janela do gráfico
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- tamanho do array de preço
int accuracy=1000;
//--- arrays para armazenar data e valores de preço para serem usados
//--- para definir e alterar as coordenadas dos pontos de ancoragem da Fibonacci Zonas de Tempo
datetime date[];
double price[];
//--- alocação de memória
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- preencher o array das datas
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Falha ao copiar valores de tempo! Código de erro = ",GetLastError());
return;
}
//--- preencher o array de preços
//--- encontrar os maiores e menores valores do gráfico
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- definir uma etapa de mudança de um preço e preencher o array
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- define pontos para desenhar Fibonacci Zonas de Tempo
int d1=InpDate1*(bars-1)/100;
int d2=InpDate2*(bars-1)/100;
int p1=InpPrice1*(accuracy-1)/100;
int p2=InpPrice2*(accuracy-1)/100;
//--- criar um objeto
if(!FiboTimesCreate(0,InpName,0,date[d1],price[p1],date[d2],price[p2],
InpColor,InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- redesenhar o gráfico e esperar por um segundo
ChartRedraw();
Sleep(1000);
//--- agora, mover os pontos de ancoragem
//--- contador de loop
int h_steps=bars*2/5;
//--- mover o segundo ponto de ancoragem
for(int i=0;i<h_steps;i++)
{
//--- usar o seguinte valor
if(d2<bars-1)
d2+=1;
//--- mover o ponto
if(!FiboTimesPointChange(0,InpName,1,date[d2],price[p2]))
return;
//--- verificar se o funcionamento do script foi desativado a força
if(IsStopped())
return;
//--- redesenhar o gráfico
ChartRedraw();
// 0.05 segundos de atraso
Sleep(50);
}
//--- 1 segundo de atraso
Sleep(1000);
//--- contador de loop
h_steps=bars*3/5;
//--- mover o primeiro ponto de ancoragem
for(int i=0;i<h_steps;i++)
{
//--- usar o seguinte valor
if(d1<bars-1)
d1+=1;
//--- mover o ponto
if(!FiboTimesPointChange(0,InpName,0,date[d1],price[p1]))
return;
//--- verificar se o funcionamento do script foi desativado a força
if(IsStopped())
return;
//--- redesenhar o gráfico
ChartRedraw();
// 0.05 segundos de atraso
Sleep(50);
}
//--- 1 segundo de atraso
Sleep(1000);
//--- excluir a etiqueta do gráfico
FiboTimesDelete(0,InpName);
ChartRedraw();
//--- 1 segundo de atraso
Sleep(1000);
//---
}
OBJ_FIBOFAN
Fibonacci Fan.
Observação
Para "Fibonacci Fan" , é possível determinar o número de linhas de níveis, os seus valores e cores.
Exemplo
O seguinte script cria e move o Fibonacci Fan no gráfico. Funções especiais têm sido desenvolvidas
para criar e alterar as propriedades do objeto gráfico. Você pode utilizar estas funções " as is " em
seus próprios aplicativos.
//--- descrição
#property description "Script desenha o objeto gráfico tipo \"Fibonacci Fan\"."
#property description "Coordenadas de ponto de ancoragem são definidas em porcentagem de"
#property description "tamanho da janela do gráfico."
//--- janela de exibição dos parâmetros de entrada durante inicialização do script
#property script_show_inputs
//--- entrada de parâmetros do script
input string InpName="FiboFan"; // Nome do fan
input int InpDate1=10; // Data do 1º ponto, %
input int InpPrice1=25; // Preço do 1º ponto, %
input int InpDate2=30; // Data do 2º ponto, %
input int InpPrice2=50; // Preço do 2º ponto, %
input color InpColor=clrRed; // Cor da linha fan
input ENUM_LINE_STYLE InpStyle=STYLE_DASHDOTDOT; // Estilo da linha
input int InpWidth=2; // Largura da linha
//--- definir a prioridade para receber o evento com um clique do mouse no gráfico
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Definir o número de níveis e seus parâmetros |
//+------------------------------------------------------------------+
bool FiboFanLevelsSet(int levels, // número de linhas dos níveis
double &values[], // valores de linhas dos níveis
color &colors[], // cor das linhas dos níveis
ENUM_LINE_STYLE &styles[], // estilo das linhas dos níveis
int &widths[], // largura das linhas dos níveis
const long chart_ID=0, // ID do gráfico
const string name="FiboFan") // nome do fan
{
//--- verificar tamanhos do array
if(levels!=ArraySize(colors) || levels!=ArraySize(styles) ||
levels!=ArraySize(widths) || levels!=ArraySize(widths))
{
Print(__FUNCTION__,": comprimento do array não corresponder ao número de níveis, erro!");
return(false);
}
//--- definir o número de níveis
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELS,levels);
//--- definir as propriedades de níveis no loop
for(int i=0;i<levels;i++)
{
//--- valor do nível
ObjectSetDouble(chart_ID,name,OBJPROP_LEVELVALUE,i,values[i]);
//--- cor do nível
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELCOLOR,i,colors[i]);
//--- estilo de nível
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELSTYLE,i,styles[i]);
//--- largura de nível
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELWIDTH,i,widths[i]);
//--- descrição de nível
ObjectSetString(chart_ID,name,OBJPROP_LEVELTEXT,i,DoubleToString(100*values[i],1));
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Mover ponto de ancoragem da Fibonacci Fan |
//+------------------------------------------------------------------+
bool FiboFanPointChange(const long chart_ID=0, // ID do gráfico
const string name="FiboFan", // nome do fan
const int point_index=0, // índice do ponto de ancoragem
datetime time=0, // coordenada do ponto de ancoragem de tempo
price2=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- se o tempo do primeiro ponto não está definido, está localizado 9 barras a esquerda partir da
if(!time1)
{
//--- array para receber o tempo de abertura das últimos 10 barras
datetime temp[10];
CopyTime(Symbol(),Period(),time2,10,temp);
//--- definir o primeiro ponto 9 barras a esquerda do segundo
time1=temp[0];
}
//--- se o preço do primeiro ponto não está definido, mover 200 pontos a mais do que o segundo
if(!price1)
price1=price2-200*SymbolInfoDouble(Symbol(),SYMBOL_POINT);
}
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
//--- verificar a exatidão dos parâmetros de entrada
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
InpDate2<0 || InpDate2>100 || InpPrice2<0 || InpPrice2>100)
{
Print("Erro! Valores incorretos dos parâmetros de entrada!");
return;
}
//--- número de barras visíveis na janela do gráfico
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- tamanho do array de preço
int accuracy=1000;
//--- arrays para armazenar data e valores de preço para serem usados
//--- para definir e alterar as coordenadas dos pontos de ancoragem da Fibonacci Fan
datetime date[];
double price[];
//--- alocação de memória
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- preencher o array das datas
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Falha ao copiar valores de tempo! Código de erro = ",GetLastError());
return;
}
//--- preencher o array de preços
//--- encontrar os maiores e menores valores do gráfico
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- definir uma etapa de mudança de um preço e preencher o array
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- definir os pontos para desenhar a Fibonacci Fan
int d1=InpDate1*(bars-1)/100;
int d2=InpDate2*(bars-1)/100;
int p1=InpPrice1*(accuracy-1)/100;
int p2=InpPrice2*(accuracy-1)/100;
//--- criar um objeto
if(!FiboFanCreate(0,InpName,0,date[d1],price[p1],date[d2],price[p2],
InpColor,InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- redesenhar o gráfico e esperar por um segundo
ChartRedraw();
Sleep(1000);
//--- agora, mover os pontos de ancoragem do fan
//--- contador de loop
int v_steps=accuracy/2;
//--- mover o primeiro ponto de ancoragem
for(int i=0;i<v_steps;i++)
{
//--- usar o seguinte valor
if(p1<accuracy-1)
p1+=1;
//--- mover o ponto
if(!FiboFanPointChange(0,InpName,0,date[d1],price[p1]))
return;
//--- verificar se o funcionamento do script foi desativado a força
if(IsStopped())
return;
//--- redesenhar o gráfico
ChartRedraw();
}
//--- 1 segundo de atraso
Sleep(1000);
//--- contador de loop
int h_steps=bars/4;
//--- mover o segundo ponto de ancoragem
for(int i=0;i<h_steps;i++)
{
//--- usar o seguinte valor
if(d2<bars-1)
d2+=1;
//--- mover o ponto
if(!FiboFanPointChange(0,InpName,1,date[d2],price[p2]))
return;
//--- verificar se o funcionamento do script foi desativado a força
if(IsStopped())
return;
//--- redesenhar o gráfico
ChartRedraw();
// 0.05 segundos de atraso
Sleep(50);
}
//--- 1 segundo de atraso
Sleep(1000);
//--- excluir a etiqueta do gráfico
FiboFanDelete(0,InpName);
ChartRedraw();
//--- 1 segundo de atraso
Sleep(1000);
//---
}
OBJ_FIBOARC
Arcos Fibonacci.
Observação
Para " Arcos Fibonacci Arcs " , é possível determinar o modo de exibição da elipse inteira. O raio de
curvatura pode ser especificado, alterando a escala e as coordenadas dos pontos de ancoragem.
Você também pode especificar o número de linhas de níveis, os seus valores e cores.
Exemplo
O seguinte script cria e move a Arcos Fibonacci no gráfico. Funções especiais têm sido
desenvolvidas para criar e alterar as propriedades do objeto gráfico. Você pode utilizar estas
funções " as is " em seus próprios aplicativos.
//--- descrição
#property description "Script desenha objeto gráfico \"Arcos Fibonacci\"."
#property description "Coordenadas de ponto de ancoragem são definidas em porcentagem de"
#property description "tamanho da janela do gráfico."
//--- janela de exibição dos parâmetros de entrada durante inicialização do script
#property script_show_inputs
//--- entrada de parâmetros do script
input string InpName="FiboArc"; // Nome do objeto
input int InpDate1=25; // Data do 1º ponto, %
input int InpPrice1=25; // Preço do 1º ponto, %
input int InpDate2=35; // Data do 2º ponto, %
input int InpPrice2=55; // Preço do 2º ponto, %
input double InpScale=3.0; // Escala
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Falha ao copiar valores de tempo! Código de erro = ",GetLastError());
return;
}
//--- preencher o array de preços
//--- encontrar os maiores e menores valores do gráfico
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- definir uma etapa de mudança de um preço e preencher o array
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- definir os pontos para desenhar Arcos 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;
//--- criar um objeto
if(!FiboArcCreate(0,InpName,0,date[d1],price[p1],date[d2],price[p2],InpScale,
InpFullEllipse,InpColor,InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- redesenhar o gráfico e esperar por um segundo
ChartRedraw();
Sleep(1000);
//--- agora, mover os pontos de ancoragem
//--- contador de loop
int v_steps=accuracy/5;
//--- mover o primeiro ponto de ancoragem
for(int i=0;i<v_steps;i++)
{
//--- usar o seguinte valor
if(p1<accuracy-1)
p1+=1;
//--- mover o ponto
if(!FiboArcPointChange(0,InpName,0,date[d1],price[p1]))
return;
//--- verificar se o funcionamento do script foi desativado a força
if(IsStopped())
return;
//--- redesenhar o gráfico
ChartRedraw();
}
//--- 1 segundo de atraso
Sleep(1000);
//--- contador de loop
int h_steps=bars/5;
OBJ_FIBOCHANNEL
Canal Fibonacci.
Observação
Para " Canal Fibonacci" , é possível determinar o modo da continuação da sua exibição para a direita
e/ou à esquerda (de acordo com as propriedades OBJPR OP_R AY_RIGHT e OBJPR OP_R AY_LEFT ).
Você também pode especificar o número de linhas de níveis, os seus valores e cores.
Exemplo
O seguinte script cria e move o Canal Fibonacci no gráfico. Funções especiais têm sido
desenvolvidas para criar e alterar as propriedades do objeto gráfico. Você pode utilizar estas
funções " as is " em seus próprios aplicativos.
//--- descrição
#property description "Script desenha um objeto gráfico tipo \"Canal Fibonacci\"."
#property description "Coordenadas de ponto de ancoragem são definidas em porcentagem de"
#property description "tamanho da janela do gráfico."
//--- janela de exibição dos parâmetros de entrada durante inicialização do script
#property script_show_inputs
//--- entrada de parâmetros do script
input string InpName="FiboChannel"; // Nome do canal
input int InpDate1=20; // Data do 1º ponto, %
input int InpPrice1=10; // Preço do 1º ponto, %
input int InpDate2=60; // Data do 2º ponto, %
input int InpPrice2=30; // Preço do 2º ponto, %
input int InpDate3=20; // Data do 3º ponto, %
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELWIDTH,i,widths[i]);
//--- descrição de nível
ObjectSetString(chart_ID,name,OBJPROP_LEVELTEXT,i,DoubleToString(100*values[i],1));
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Mover ponto de ancoragem do Canal Fibonacci |
//+------------------------------------------------------------------+
bool FiboChannelPointChange(const long chart_ID=0, // ID do gráfico
const string name="FiboChannel", // nome do canal
const int point_index=0, // índice do ponto de ancoragem
datetime time=0, // coordenada do ponto de ancoragem de
double price=0) // coordenada do ponto de ancoragem de
{
//--- se a posição do ponto não está definida, mover para a barra atual tendo o preço Bid
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- redefine o valor de erro
ResetLastError();
//--- mover o ponto de ancoragem
if(!ObjectMove(chart_ID,name,point_index,time,price))
{
Print(__FUNCTION__,
": falha ao mover o ponto de ancoragem! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Excluir o canal |
//+------------------------------------------------------------------+
bool FiboChannelDelete(const long chart_ID=0, // ID do gráfico
const string name="FiboChannel") // nome do canal
{
//--- redefine o valor de erro
ResetLastError();
//--- excluir o canal
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": falha ao excluir \"Canal Fibonacci\"! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Ver valores dos pontos de ancoragem do Canal Fibonacci e |
//| definir os valores padrões estabelecidos para os pontos vazio |
//+------------------------------------------------------------------+
void ChangeFiboChannelEmptyPoints(datetime &time1,double &price1,datetime &time2,
double &price2,datetime &time3,double &price3)
{
//--- se o tempo do segundo ponto (a direita)não está definido, será na barra atual
if(!time2)
time2=TimeCurrent();
//--- se o preço do segundo ponto não está definido, ele terá valor Bid
if(!price2)
price2=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- se o tempo do primeiro ponto (a esquerda) não está definido, está localizado 9 barras a esque
if(!time1)
{
//--- array para receber o tempo de abertura das últimos 10 barras
datetime temp[10];
CopyTime(Symbol(),Period(),time2,10,temp);
//--- definir o primeiro ponto 9 barras a esquerda do segundo
time1=temp[0];
}
//--- se o preço do primeiro ponto não está definido, mover 300 pontos a mais do que o segundo
if(!price1)
price1=price2+300*SymbolInfoDouble(Symbol(),SYMBOL_POINT);
//--- se o tempo do terceiro ponto não está definido,ele coincide com o tempo do primeiro ponto
if(!time3)
time3=time1;
//--- se o preço do terceiro ponto não está definido, é igual ao preço do segundo ponto
if(!price3)
price3=price2;
}
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
//--- verificar a exatidão dos parâmetros de entrada
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("Erro! Valores incorretos dos parâmetros de entrada!");
return;
}
//--- número de barras visíveis na janela do gráfico
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
OBJ_EXPANSION
Fibonacci Expansion.
Observação
Para " Expansão Fibonacci" , é possível determinar o modo da continuação da sua exibição para a
direita e/ou à esquerda (de acordo com a propriedade OBJPR OP_R AY_RIGHT e
OBJPR OP_R AY_LEFT ).
Você também pode especificar o número de linhas de níveis, os seus valores e cores.
Exemplo
O seguinte script cria e move a Expansão Fibonacci no gráfico. Funções especiais têm sido
desenvolvidas para criar e alterar as propriedades do objeto gráfico. Você pode utilizar estas
funções " as is " em seus próprios aplicativos.
//--- descrição
#property description "Script desenha objeto gráfico \"Expansão Fibonacci\"."
#property description "Coordenadas de ponto de ancoragem são definidas em porcentagem de"
#property description "tamanho da janela do gráfico."
//--- janela de exibição dos parâmetros de entrada durante inicialização do script
#property script_show_inputs
//--- entrada de parâmetros do script
input string InpName="FiboExpansion"; // Nome do objeto
input int InpDate1=10; // Data do 1º ponto, %
input int InpPrice1=55; // Preço do 1º ponto, %
input int InpDate2=30; // Data do 2º ponto, %
input int InpPrice2=10; // Preço do 2º ponto, %
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- exibir em primeiro plano (false) ou fundo (true)
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- habilitar (true) ou desabilitar (false) o modo de preenchimento do canal
//--- ao criar um objeto gráfico usando a função ObjectCreate, o objeto não pode ser
//--- destacado e movimentado por padrão. Dentro deste método, o parâmetro de seleção
//--- é verdade por padrão, tornando possível destacar e mover o objeto
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- habilitar (true) ou desabilitar (false) o modo de continuação da exibição do objeto à esquerd
ObjectSetInteger(chart_ID,name,OBJPROP_RAY_LEFT,ray_left);
//--- habilitar (true) ou desabilitar (false) o modo de continuação da exibição do objeto à direita
ObjectSetInteger(chart_ID,name,OBJPROP_RAY_RIGHT,ray_right);
//--- ocultar (true) ou exibir (false) o nome do objeto gráfico na lista de objeto
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- definir a prioridade para receber o evento com um clique do mouse no gráfico
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Definir o número de níveis e seus parâmetros |
//+------------------------------------------------------------------+
bool FiboExpansionLevelsSet(int levels, // número de linhas dos níveis
double &values[], // valores de linhas dos níveis
color &colors[], // cor das linhas dos níveis
ENUM_LINE_STYLE &styles[], // estilo das linhas dos níveis
int &widths[], // largura das linhas dos níveis
const long chart_ID=0, // ID do gráfico
const string name="FiboExpansion") // nome do objeto
{
//--- verificar tamanhos do array
if(levels!=ArraySize(colors) || levels!=ArraySize(styles) ||
levels!=ArraySize(widths) || levels!=ArraySize(widths))
{
Print(__FUNCTION__,": comprimento do array não corresponder ao número de níveis, erro!");
return(false);
}
//--- definir o número de níveis
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELS,levels);
//--- definir as propriedades de níveis no loop
for(int i=0;i<levels;i++)
{
//--- valor do nível
ObjectSetDouble(chart_ID,name,OBJPROP_LEVELVALUE,i,values[i]);
//--- cor do nível
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELCOLOR,i,colors[i]);
//--- estilo de nível
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELSTYLE,i,styles[i]);
if(p1>1)
p1-=1;
//--- mover o ponto
if(!FiboExpansionPointChange(0,InpName,0,date[d1],price[p1]))
return;
//--- verificar se o funcionamento do script foi desativado a força
if(IsStopped())
return;
//--- redesenhar o gráfico
ChartRedraw();
}
//--- 1 segundo de atraso
Sleep(1000);
//--- contador de loop
v_steps=accuracy/2;
//--- mover o terceiro ponto de ancoragem
for(int i=0;i<v_steps;i++)
{
//--- usar o seguinte valor
if(p3>1)
p3-=1;
//--- mover o ponto
if(!FiboExpansionPointChange(0,InpName,2,date[d3],price[p3]))
return;
//--- verificar se o funcionamento do script foi desativado a força
if(IsStopped())
return;
//--- redesenhar o gráfico
ChartRedraw();
}
//--- 1 segundo de atraso
Sleep(1000);
//--- contador de loop
v_steps=accuracy*4/5;
//--- mover o segundo ponto de ancoragem
for(int i=0;i<v_steps;i++)
{
//--- usar o seguinte valor
if(p2<accuracy-1)
p2+=1;
//--- mover o ponto
if(!FiboExpansionPointChange(0,InpName,1,date[d2],price[p2]))
return;
//--- verificar se o funcionamento do script foi desativado a força
if(IsStopped())
return;
//--- redesenhar o gráfico
ChartRedraw();
}
OBJ_ELLIOTW AVE5
Onda Móvel Elliott.
Observação
Para " Onda Móvel Elliott" , é possível habilitar/desabilitar o modo de pontos de conexão das linhas
(propriedade OBJPR OP_DR AW L INES), bem como definir o nível de posicionamento da onda (a partir
da enumeração ENUM _ELL IOT_W AVE_DEGR EE).
Exemplo
[parcial]O seguinte script cria e move onda móvel Elliott no gráfico. Funções especiais têm sido
desenvolvidas para criar e alterar as propriedades do objeto gráfico. Você pode utilizar estas
funções " as is " em seus próprios aplicativos.
//--- descrição
#property description "Script desenha \"Onda Móvel Elliott\"."
#property description "Coordenadas dos pontos de ancoragem são definidos em percentagem do tamanho
#property description "janela do gráfico."
//--- janela de exibição dos parâmetros de entrada durante inicialização do script
#property script_show_inputs
//--- entrada de parâmetros do script
input string InpName="ElliotWave5"; // Nome do objeto
input int InpDate1=10; // Data do 1º ponto, %
input int InpPrice1=90; // Preço do 1º ponto, %
input int InpDate2=20; // Data do 2º ponto, %
input int InpPrice2=40; // Preço do 2º ponto, %
input int InpDate3=30; // Data do 3º ponto, %
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Excluir Onda Móvel Elliott |
//+------------------------------------------------------------------+
bool ElliotWave5Delete(const long chart_ID=0, // ID do gráfico
const string name="ElliotWave5") // nome do objeto
{
//--- redefine o valor de erro
ResetLastError();
//--- excluir o objeto
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": falha ao excluir \""Onda Móvel Elliott"\"! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Verificar valores de pontos de ancoragem da Onda Móvel Elliott |
//| definir os valores padrões estabelecidos para aqueles vazios |
//+------------------------------------------------------------------+
void ChangeElliotWave5EmptyPoints(datetime &time1,double &price1,
datetime &time2,double &price2,
datetime &time3,double &price3,
datetime &time4,double &price4,
datetime &time5,double &price5)
{
//--- array para receber o tempo de abertura das últimas 10 barras
datetime temp[];
ArrayResize(temp,10);
//--- receber dados
CopyTime(Symbol(),Period(),TimeCurrent(),10,temp);
//--- receber o valor de um ponto no gráfico atual
double point=SymbolInfoDouble(Symbol(),SYMBOL_POINT);
//--- se o tempo do primeiro ponto não está definido, serão 9 barras a esquerda a partir da última
if(!time1)
time1=temp[0];
//--- se o preço do primeiro ponto não está definido, ele terá valor Bid
if(!price1)
price1=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- se o tempo do primeiro ponto não está definido, serão 7 barras a esquerda a partir da última
if(!time2)
time2=temp[2];
//--- se o preço do primeiro ponto não está definido, mover 300 pontos a mais do que o segundo
if(!price2)
price2=price1-300*point;
//--- se o tempo do primeiro ponto não está definido, serão 5 barras a esquerda a partir da última
if(!time3)
time3=temp[4];
//--- se o preço do primeiro ponto não está definido, mover 250 pontos a mais do que o primeiro
if(!price3)
price3=price1-250*point;
//--- se o tempo do primeiro ponto não está definido, serão 3 barras a esquerda a partir da última
if(!time4)
time4=temp[6];
//--- se o preço do primeiro ponto não está definido, mover 550 pontos a mais do que o primeiro
if(!price4)
price4=price1-550*point;
//--- se o tempo do primeiro ponto não está definido, será na barra atual
if(!time5)
time5=temp[9];
//--- se o preço do primeiro ponto não está definido, mover 450 pontos a mais do que o primeiro
if(!price5)
price5=price1-450*point;
}
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
//--- verificar a exatidão dos parâmetros de entrada
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("Erro! Valores incorretos dos parâmetros de entrada!");
return;
}
//--- número de barras visíveis na janela do gráfico
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- tamanho do array de preço
int accuracy=1000;
//--- arrays para armazenar data e valores de preço para serem usados
//--- para definir e alterar as coordenadas de pontos de ancoragem
datetime date[];
double price[];
//--- alocação de memória
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- preencher o array das datas
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Falha ao copiar valores de tempo! Código de erro = ",GetLastError());
return;
}
//--- preencher o array de preços
//--- encontrar os maiores e menores valores do gráfico
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- definir uma etapa de mudança de um preço e preencher o array
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- definir os pontos para desenhar a Onda Móvel 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;
//--- Criar Onda Móvel 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;
}
//--- redesenhar o gráfico e esperar por um segundo
ChartRedraw();
Sleep(1000);
//--- agora, mover os pontos de ancoragem
//--- contador de loop
int v_steps=accuracy/5;
//--- mover o quinto ponto de ancoragem
for(int i=0;i<v_steps;i++)
{
//--- usar o seguinte valor
if(p5<accuracy-1)
p5+=1;
//--- mover o ponto
if(!ElliotWave5PointChange(0,InpName,4,date[d5],price[p5]))
return;
//--- verificar se o funcionamento do script foi desativado a força
if(IsStopped())
return;
//--- redesenhar o gráfico
ChartRedraw();
}
//--- 1 segundo de atraso
Sleep(1000);
//--- contador de loop
v_steps=accuracy/5;
//--- mover o segundo e terceiro ponto de ancoragem
for(int i=0;i<v_steps;i++)
{
//--- usar os seguintes valores
if(p2<accuracy-1)
p2+=1;
if(p3>1)
p3-=1;
//--- deslocar os pontos
if(!ElliotWave5PointChange(0,InpName,1,date[d2],price[p2]))
return;
if(!ElliotWave5PointChange(0,InpName,2,date[d3],price[p3]))
return;
//--- verificar se o funcionamento do script foi desativado a força
if(IsStopped())
return;
//--- redesenhar o gráfico
ChartRedraw();
}
//--- 1 segundo de atraso
Sleep(1000);
//--- contador de loop
v_steps=accuracy*4/5;
//--- mover o primeiro e quarto ponto de ancoragem
for(int i=0;i<v_steps;i++)
{
//--- usar os seguintes valores
if(p1>1)
p1-=1;
if(p4<accuracy-1)
p4+=1;
//--- deslocar os pontos
if(!ElliotWave5PointChange(0,InpName,0,date[d1],price[p1]))
return;
if(!ElliotWave5PointChange(0,InpName,3,date[d4],price[p4]))
return;
//--- verificar se o funcionamento do script foi desativado a força
if(IsStopped())
return;
//--- redesenhar o gráfico
ChartRedraw();
}
//--- 1 segundo de atraso
Sleep(1000);
//--- excluir a etiqueta do gráfico
ElliotWave5Delete(0,InpName);
ChartRedraw();
//--- 1 segundo de atraso
Sleep(1000);
//---
}
OBJ_ELLIOTW AVE3
Correção Onda Elliott.
Observação
Para " Correção Onda Elliott" , é possível habilitar/desabilitar o modo de pontos de conexão das linhas
(propriedade OBJPR OP_DR AW L INES), bem como definir o nível de posicionamento da onda (a partir
da enumeração ENUM _ELL IOT_W AVE_DEGR EE).
Exemplo
O seguinte script cria e move a correção da onda Elliott no gráfico. Funções especiais têm sido
desenvolvidas para criar e alterar as propriedades do objeto gráfico. Você pode utilizar estas
funções " as is " em seus próprios aplicativos.
//--- descrição
#property description "Script desenha objeto gráfico \"Correção da Onda Elliott\"."
#property description "Coordenadas dos pontos de ancoragem são definidos em percentagem da janela d
#property description "tamanho."
//--- janela de exibição dos parâmetros de entrada durante inicialização do script
#property script_show_inputs
//--- entrada de parâmetros do script
input string InpName="ElliotWave3"; // Nome do objeto
input int InpDate1=10; // Data do 1º ponto, %
input int InpPrice1=90; // Preço do 1º ponto, %
input int InpDate2=30; // Data do 2º ponto, %
input int InpPrice2=10; // Preço do 2º ponto, %
input int InpPrice2=10; // Data do 3º ponto, %
return;
}
//--- redesenhar o gráfico e esperar por um segundo
ChartRedraw();
Sleep(1000);
//--- agora, mover os pontos de ancoragem
//--- contador de loop
int v_steps=accuracy/5;
//--- mover o terceiro ponto de ancoragem
for(int i=0;i<v_steps;i++)
{
//--- usar o seguinte valor
if(p3<accuracy-1)
p3+=1;
//--- mover o ponto
if(!ElliotWave3PointChange(0,InpName,2,date[d3],price[p3]))
return;
//--- verificar se o funcionamento do script foi desativado a força
if(IsStopped())
return;
//--- redesenhar o gráfico
ChartRedraw();
}
//--- 1 segundo de atraso
Sleep(1000);
//--- contador de loop
v_steps=accuracy*4/5;
//--- movimentar o primeiro e segundo ponto de ancoragem
for(int i=0;i<v_steps;i++)
{
//--- usar os seguintes valores
if(p1>1)
p1-=1;
if(p2<accuracy-1)
p2+=1;
//--- deslocar os pontos
if(!ElliotWave3PointChange(0,InpName,0,date[d1],price[p1]))
return;
if(!ElliotWave3PointChange(0,InpName,1,date[d2],price[p2]))
return;
//--- verificar se o funcionamento do script foi desativado a força
if(IsStopped())
return;
//--- redesenhar o gráfico
ChartRedraw();
}
//--- 1 segundo de atraso
Sleep(1000);
//--- excluir a etiqueta do gráfico
ElliotWave3Delete(0,InpName);
ChartRedraw();
//--- 1 segundo de atraso
Sleep(1000);
//---
}
OBJ_RECTANGLE
R etângulo.
Observação
Para retângulo, o modo de preenchimento com a cor pode ser definida usando a propriedade
OBJPR OP_FILL.
Exemplo
O seguinte script cria e move o retângulo no gráfico. Funções especiais têm sido desenvolvidas para
criar e alterar as propriedades do objeto gráfico. Você pode utilizar estas funções " as is " em seus
próprios aplicativos.
//--- descrição
#property description "Script cria o retângulo no gráfico."
#property description "Coordenadas de ponto de ancoragem são definidas em porcentagem de"
#property description "porcentagem do tamanho da janela de gráfico."
//--- janela de exibição dos parâmetros de entrada durante inicialização do script
#property script_show_inputs
//--- entrada de parâmetros do script
input string InpName="Rectangle"; // Nome do retângulo
input int InpDate1=40; // Data do 1º ponto, %
input int InpPrice1=40; // Preço do 1º ponto, %
input int InpDate2=60; // Data do 2º ponto, %
input int InpPrice2=60; // Preço do 2º ponto, %
input color InpColor=clrRed; // Cor do retângulo
input ENUM_LINE_STYLE InpStyle=STYLE_DASH; // Estilo das linhas do retângulo
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Ver valores pontos de ancoragem do retângulo e definir |
//| valores padrão para aqueles vazios |
//+------------------------------------------------------------------+
void ChangeRectangleEmptyPoints(datetime &time1,double &price1,
datetime &time2,double &price2)
{
//--- se o tempo do primeiro ponto não está definido, será na barra atual
if(!time1)
time1=TimeCurrent();
//--- se o preço do primeiro ponto não está definido, ele terá valor Bid
if(!price1)
price1=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- se o tempo do segundo ponto não está definido, está localizado a 9 barras deixadas a partir d
if(!time2)
{
//--- array para receber o tempo de abertura das últimos 10 barras
datetime temp[10];
CopyTime(Symbol(),Period(),time1,10,temp);
//--- definir o segundo ponto 9 barras a esquerda do primeiro
time2=temp[0];
}
//--- se o preço do primeiro ponto não está definido, mover 300 pontos a mais do que o segundo
if(!price2)
price2=price1-300*SymbolInfoDouble(Symbol(),SYMBOL_POINT);
}
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
//--- verificar a exatidão dos parâmetros de entrada
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
InpDate2<0 || InpDate2>100 || InpPrice2<0 || InpPrice2>100)
{
Print("Erro! Valores incorretos dos parâmetros de entrada!");
return;
}
//--- número de barras visíveis na janela do gráfico
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- tamanho do array de preço
int accuracy=1000;
//--- arrays para armazenar data e valores de preço para serem usados
//--- para definir e alterar as coordenadas de pontos de ancoragem do retângulo
datetime date[];
double price[];
//--- alocação de memória
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- preencher o array das datas
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Falha ao copiar valores de tempo! Código de erro = ",GetLastError());
return;
}
//--- preencher o array de preços
//--- encontrar os maiores e menores valores do gráfico
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- definir uma etapa de mudança de um preço e preencher o array
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- definir pontos para desenhar o retângulo
int d1=InpDate1*(bars-1)/100;
int d2=InpDate2*(bars-1)/100;
int p1=InpPrice1*(accuracy-1)/100;
int p2=InpPrice2*(accuracy-1)/100;
//--- criar o retângulo
if(!RectangleCreate(0,InpName,0,date[d1],price[p1],date[d2],price[p2],InpColor,
InpStyle,InpWidth,InpFill,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- redesenhar o gráfico e esperar por um segundo
ChartRedraw();
Sleep(1000);
//--- agora, mover os pontos de ancoragem do retângulo
//--- contador de loop
int h_steps=bars/2;
//--- mover os pontos de ancoragem
for(int i=0;i<h_steps;i++)
{
//--- usar os seguintes valores
if(d1<bars-1)
d1+=1;
if(d2>1)
d2-=1;
//--- deslocar os pontos
if(!RectanglePointChange(0,InpName,0,date[d1],price[p1]))
return;
if(!RectanglePointChange(0,InpName,1,date[d2],price[p2]))
return;
//--- verificar se o funcionamento do script foi desativado a força
if(IsStopped())
return;
//--- redesenhar o gráfico
ChartRedraw();
// 0.05 segundos de atraso
Sleep(50);
}
//--- 1 segundo de atraso
Sleep(1000);
//--- contador de loop
int v_steps=accuracy/2;
//--- mover os pontos de ancoragem
for(int i=0;i<v_steps;i++)
{
//--- usar os seguintes valores
if(p1<accuracy-1)
p1+=1;
if(p2>1)
p2-=1;
//--- deslocar os pontos
if(!RectanglePointChange(0,InpName,0,date[d1],price[p1]))
return;
if(!RectanglePointChange(0,InpName,1,date[d2],price[p2]))
return;
//--- verificar se o funcionamento do script foi desativado a força
if(IsStopped())
return;
//--- redesenhar o gráfico
ChartRedraw();
}
//--- 1 segundo de atraso
Sleep(1000);
//--- excluir o retângulo do gráfico
RectangleDelete(0,InpName);
ChartRedraw();
//--- 1 segundo de atraso
Sleep(1000);
//---
}
OBJ_TRIANGLE
T riângulo.
Observação
Para triângulo, o modo de preenchimento com pode ser definido usando a propriedade
OBJPR OP_FILL.
Exemplo
O seguinte script cria e movimenta o triângulo no gráfico. Funções especiais têm sido desenvolvidas
para criar e alterar as propriedades do objeto gráfico. Você pode utilizar estas funções " as is " em
seus próprios aplicativos.
//--- descrição
#property description "Script cria o triângulo no gráfico."
#property description "Coordenadas de ponto de ancoragem são definidas em porcentagem de"
#property description "porcentagem do tamanho da janela de gráfico."
//--- janela de exibição dos parâmetros de entrada durante inicialização do script
#property script_show_inputs
//--- entrada de parâmetros do script
input string InpName="Triangle"; // Nome do triângulo
input int InpDate1=25; // Data do 1º ponto, %
input int InpPrice1=50; // Preço do 1º ponto, %
input int InpDate2=70; // Data do 2º ponto, %
input int InpPrice2=70; // Preço do 2º ponto, %
input int InpDate3=65; // Data do 3º ponto, %
input int InpPrice3=20; // Preço do 3º ponto, %
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- habilitar (true) ou desabilitar (false) o modo de destacar o triângulo para mover
//--- ao criar um objeto gráfico usando a função ObjectCreate, o objeto não pode ser
//--- destacado e movimentado por padrão. Dentro deste método, o parâmetro de seleção
//--- é verdade por padrão, tornando possível destacar e mover o objeto
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- ocultar (true) ou exibir (false) o nome do objeto gráfico na lista de objeto
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- definir a prioridade para receber o evento com um clique do mouse no gráfico
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Mover a ponto de ancoragem do triângulo |
//+------------------------------------------------------------------+
bool TrianglePointChange(const long chart_ID=0, // ID do grafico
const string name="Triangle", // nome do triângulo
const int point_index=0, // índice do ponto de ancoragem
datetime time=0, // coordenada do ponto de ancoragem de tempo
double price=0) // coordenada do ponto de ancoragem de preço
{
//--- se a posição do ponto não está definida, mover para a barra atual tendo o preço Bid
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- redefine o valor de erro
ResetLastError();
//--- mover o ponto de ancoragem
if(!ObjectMove(chart_ID,name,point_index,time,price))
{
Print(__FUNCTION__,
": falha ao mover o ponto de ancoragem! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Excluir o triângulo |
//+------------------------------------------------------------------+
bool TriangleDelete(const long chart_ID=0, // ID do gráfico
const string name="Triangle") // nome do triângulo
{
//--- redefine o valor de erro
ResetLastError();
//--- excluir o triângulo
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": falha ao deletar o triângulo! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Confira valores dos pontos de ancoragem do triângulo |
//| e definir padrão valores padrão para aqueles vazios |
//+------------------------------------------------------------------+
void ChangeTriangleEmptyPoints(datetime &time1,double &price1,
datetime &time2,double &price2,
datetime &time3,double &price3)
{
//--- se o tempo do primeiro ponto não está definido, será na barra atual
if(!time1)
time1=TimeCurrent();
//--- se o preço do primeiro ponto não está definido, ele terá valor Bid
if(!price1)
price1=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- se o tempo do segundo ponto não está definido, está localizado a 9 barras deixadas a partir d
if(!time2)
{
//--- array para receber o tempo de abertura das últimos 10 barras
datetime temp[10];
CopyTime(Symbol(),Period(),time1,10,temp);
//--- definir o segundo ponto 9 barras a esquerda do primeiro
time2=temp[0];
}
//--- se o preço do primeiro ponto não está definido, mover 300 pontos a mais do que o segundo
if(!price2)
price2=price1-300*SymbolInfoDouble(Symbol(),SYMBOL_POINT);
//--- se o tempo do terceiro ponto não está definido,ele coincide com o tempo do segundo ponto
if(!time3)
time3=time2;
//--- se o preço do terceiro ponto não está definido, é igual aquele do primeiro ponto
if(!price3)
price3=price1;
}
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
//--- verificar a exatidão dos parâmetros de entrada
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
if(!TrianglePointChange(0,InpName,2,date[d3],price[p3]))
return;
//--- verificar se o funcionamento do script foi desativado a força
if(IsStopped())
return;
//--- redesenhar o gráfico
ChartRedraw();
}
//--- 1 segundo de atraso
Sleep(1000);
//--- excluir triângulo do gráfico
TriangleDelete(0,InpName);
ChartRedraw();
//--- 1 segundo de atraso
Sleep(1000);
//---
}
OBJ_ELLIPSE
Elipse.
Observação
Para elipse, o modo de preenchimento com a cor pode ser definida usando a propriedade
OBJPR OP_FILL.
Exemplo
O seguinte script cria e move a Elipse no gráfico. Funções especiais têm sido desenvolvidas para
criar e alterar as propriedades do objeto gráfico. Você pode utilizar estas funções " as is " em seus
próprios aplicativos.
//--- descrição
#property description "Script cria a Elipse no gráfico."
#property description "Coordenadas dos pontos de ancoragem são definidas"
#property description "em porcentagem do tamanho da janela de gráfico."
//--- janela de exibição dos parâmetros de entrada durante inicialização do script
#property script_show_inputs
//--- entrada de parâmetros do script
input string InpName="Ellipse"; // Nome da elipse
input int InpDate1=30; // Data do 1º ponto, %
input int InpPrice1=20; // Preço do 1º ponto, %
input int InpDate2=70; // Data do 2º ponto, %
input int InpPrice2=80; // Preço do 2º ponto, %
input int InpDate3=50; // Data do 3º ponto, %
input int InpPrice3=60; // Preço do 3º ponto, %
input color InpColor=clrRed; // Cor da elipse
//--- habilitar (true) ou desabilitar (false) o modo de destaque para mover a elipse
//--- ao criar um objeto gráfico usando a função ObjectCreate, o objeto não pode ser
//--- destacado e movimentado por padrão. Dentro deste método, o parâmetro de seleção
//--- é verdade por padrão, tornando possível destacar e mover o objeto
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- ocultar (true) ou exibir (false) o nome do objeto gráfico na lista de objeto
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- definir a prioridade para receber o evento com um clique do mouse no gráfico
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Mover ponto de ancoragem da elipse |
//+------------------------------------------------------------------+
bool EllipsePointChange(const long chart_ID=0, // ID do gráfico
const string name="Ellipse", // nome da elipse
const int point_index=0, // índice do ponto de ancoragem
datetime time=0, // coordenada do ponto de ancoragem de tempo
double price=0) // coordenada do ponto de ancoragem do preço
{
//--- se a posição do ponto não está definida, mover para a barra atual tendo o preço Bid
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- redefine o valor de erro
ResetLastError();
//--- mover o ponto de ancoragem
if(!ObjectMove(chart_ID,name,point_index,time,price))
{
Print(__FUNCTION__,
": falha ao mover o ponto de ancoragem! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Excluir elipse |
//+------------------------------------------------------------------+
bool EllipseDelete(const long chart_ID=0, // ID do gráfico
const string name="Ellipse") // nome da elipse
{
//--- redefine o valor de erro
ResetLastError();
//--- excluir uma elipse
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": falha ao excluir uma elipse! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Ver valores de pontos âncora da elipse e definir valores padrões |
//| para aqueles vazios |
//+------------------------------------------------------------------+
void ChangeEllipseEmptyPoints(datetime &time1,double &price1,
datetime &time2,double &price2,
datetime &time3,double &price3)
{
//--- se o tempo do primeiro ponto não está definido, será na barra atual
if(!time1)
time1=TimeCurrent();
//--- se o preço do primeiro ponto não está definido, ele terá valor Bid
if(!price1)
price1=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- se o tempo do segundo ponto não está definido, está localizado a 9 barras deixadas a partir d
if(!time2)
{
//--- array para receber o tempo de abertura das últimos 10 barras
datetime temp[10];
CopyTime(Symbol(),Period(),time1,10,temp);
//--- definir o segundo ponto 9 barras a esquerda do primeiro
time2=temp[0];
}
//--- se o preço do primeiro ponto não está definido, mover 300 pontos a mais do que o segundo
if(!price2)
price2=price1-300*SymbolInfoDouble(Symbol(),SYMBOL_POINT);
//--- se o tempo do terceiro ponto não está definido,ele coincide com o tempo do segundo ponto
if(!time3)
time3=time2;
//--- se o preço do terceiro ponto não está definido, é igual aquele do primeiro ponto
if(!price3)
price3=price1;
}
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
//--- verificar a exatidão dos parâmetros de entrada
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
InpDate2<0 || InpDate2>100 || InpPrice2<0 || InpPrice2>100 ||
int v_steps=accuracy/5;
//--- movimentar o primeiro e segundo ponto de ancoragem
for(int i=0;i<v_steps;i++)
{
//--- usar os seguintes valores
if(p1<accuracy-1)
p1+=1;
if(p2>1)
p2-=1;
//--- deslocar os pontos
if(!EllipsePointChange(0,InpName,0,date[d1],price[p1]))
return;
if(!EllipsePointChange(0,InpName,1,date[d2],price[p2]))
return;
//--- verificar se o funcionamento do script foi desativado a força
if(IsStopped())
return;
//--- redesenhar o gráfico
ChartRedraw();
}
//--- 1 segundo de atraso
Sleep(1000);
//--- contador de loop
int h_steps=bars/5;
//--- mover o terceiro ponto de ancoragem
for(int i=0;i<h_steps;i++)
{
//--- usar o seguinte valor
if(d3>1)
d3-=1;
//--- mover o ponto
if(!EllipsePointChange(0,InpName,2,date[d3],price[p3]))
return;
//--- verificar se o funcionamento do script foi desativado a força
if(IsStopped())
return;
//--- redesenhar o gráfico
ChartRedraw();
// 0.05 segundos de atraso
Sleep(50);
}
//--- 1 segundo de atraso
Sleep(1000);
//--- excluir elipse a partir do gráfico
EllipseDelete(0,InpName);
ChartRedraw();
//--- 1 segundo de atraso
Sleep(1000);
//---
OBJ_ARROW_THUMB_UP
Sinal T humbs Up.
Observação
Posição do ponto de ancoragem relativa ao sinal pode ser selecionado a partir do enumerador
ENUM _ARR OW_ANCH OR .
Sinais de grande porte (mais de 5) somente serão criados, definindo corretamente o valor da
propriedade OBJPR OP_WIDTH ao escrever um código no MetaEditor.
Exemplo
O seguinte script cria e move sinal T humbs Up no gráfico. Funções especiais têm sido desenvolvidas
para criar e alterar as propriedades do objeto gráfico. Você pode utilizar estas funções " as is " em
seus próprios aplicativos.
//--- descrição
#property description "Script desenha sinal \"Thumbs Up\"."
#property description "Coordenadas do ponto de ancoragem é configurado em porcentagem do"
#property description "tamanho da janela do gráfico."
//--- janela de exibição dos parâmetros de entrada durante inicialização do script
#property script_show_inputs
//--- entrada de parâmetros do script
input string InpName="ThumbUp"; // Nome do sinal
input int InpDate=75; // Ponto de ancoragem da data em %
input int InpPrice=25; // Ponto de ancoragem do preço em %
input ENUM_ARROW_ANCHOR InpAnchor=ANCHOR_TOP; // Tipo de ancoragem
input color InpColor=clrRed; // Cor do sinal
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- ocultar (true) ou exibir (false) o nome do objeto gráfico na lista de objeto
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- definir a prioridade para receber o evento com um clique do mouse no gráfico
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Mover ponto de ancoragem |
//+------------------------------------------------------------------+
bool ArrowThumbUpMove(const long chart_ID=0, // ID do gráfico
const string name="ThumbUp", // nome do objeto
datetime time=0, // coordenada do ponto de ancoragem de tempo
double price=0) // coordenada do ponto de ancoragem do preço
{
//--- se a posição do ponto não está definida, mover para a barra atual tendo o preço Bid
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- redefine o valor de erro
ResetLastError();
//--- mover o ponto de ancoragem
if(!ObjectMove(chart_ID,name,0,time,price))
{
Print(__FUNCTION__,
": falha ao mover o ponto de ancoragem! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Alterar tipo de ancoragem do sinal Thumbs Up |
//+------------------------------------------------------------------+
bool ArrowThumbUpAnchorChange(const long chart_ID=0, // ID do Gráfico
const string name="ThumbUp", // nome do objeto
const ENUM_ARROW_ANCHOR anchor=ANCHOR_TOP) // tipo de ancoragem
{
//--- redefine o valor de erro
ResetLastError();
//--- alterar tipo de ancoragem
if(!ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor))
{
Print(__FUNCTION__,
": falha para alterar o tipo de ancoragem! Código de erro = ",GetLastError());
return(false);
}
//--- arrays para armazenar data e valores de preço para serem usados
//--- para definir e alterar sinal das coordenadas do ponto de ancoragem
datetime date[];
double price[];
//--- alocação de memória
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- preencher o array das datas
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Falha ao copiar valores de tempo! Código de erro = ",GetLastError());
return;
}
//--- preencher o array de preços
//--- encontrar os maiores e menores valores do gráfico
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- definir uma etapa de mudança de um preço e preencher o array
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- definir os pontos para desenhar o sinal
int d=InpDate*(bars-1)/100;
int p=InpPrice*(accuracy-1)/100;
//--- criar sinal Thumbs Up no gráfico
if(!ArrowThumbUpCreate(0,InpName,0,date[d],price[p],InpAnchor,InpColor,
InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- redesenhar o gráfico e esperar por um segundo
ChartRedraw();
Sleep(1000);
//--- agora, mover o ponto de ancoragem e alterar sua posição em relação ao sinal
//--- contador de loop
int h_steps=bars/4;
//--- mover o ponto de ancoragem
for(int i=0;i<h_steps;i++)
{
//--- usar o seguinte valor
if(d>1)
d-=1;
//--- mover o ponto
if(!ArrowThumbUpMove(0,InpName,date[d],price[p]))
return;
//--- verificar se o funcionamento do script foi desativado a força
if(IsStopped())
return;
OBJ_ARROW_THUMB_DOW N
Sinal T humbs Down.
Observação
Posição do ponto de ancoragem relativa ao sinal pode ser selecionado a partir do enumerador
ENUM _ARR OW_ANCH OR .
Sinais de grande porte (mais de 5) somente serão criados, definindo corretamente o valor da
propriedade OBJPR OP_WIDTH ao escrever um código no MetaEditor.
Exemplo
O seguinte script cria e move o sinal T humbs Down no gráfico. Funções especiais têm sido
desenvolvidas para criar e alterar as propriedades do objeto gráfico. Você pode utilizar estas
funções " as is " em seus próprios aplicativos.
//--- descrição
#property description "Script desenha sinal \"Thumbs Down\"."
#property description "Coordenadas do ponto de ancoragem é configurado em porcentagem do"
#property description "tamanho da janela do gráfico."
//--- janela de exibição dos parâmetros de entrada durante inicialização do script
#property script_show_inputs
//--- entrada de parâmetros do script
input string InpName="ThumbDown"; // nome do sinal
input int InpDate=25; // Ponto de ancoragem da data em %
input int InpPrice=75; // Ponto de ancoragem do preço em %
input ENUM_ARROW_ANCHOR InpAnchor=ANCHOR_BOTTOM; // Tipo de ancoragem
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- ocultar (true) ou exibir (false) o nome do objeto gráfico na lista de objeto
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- definir a prioridade para receber o evento com um clique do mouse no gráfico
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Mover ponto de ancoragem |
//+------------------------------------------------------------------+
bool ArrowThumbDownMove(const long chart_ID=0, // ID do gráfico
const string name="ThumbDown", // nome do objeto
datetime time=0, // coordenada do ponto de ancoragem de tempo
double price=0) // coordenada do ponto de ancoragem de tempo
{
//--- se a posição do ponto não está definida, mover para a barra atual tendo o preço Bid
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- redefine o valor de erro
ResetLastError();
//--- mover o ponto de ancoragem
if(!ObjectMove(chart_ID,name,0,time,price))
{
Print(__FUNCTION__,
": falha ao mover o ponto de ancoragem! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Alterar tipo de ancoragem do sinal Thumbs Down |
//+------------------------------------------------------------------+
bool ArrowThumbDownAnchorChange(const long chart_ID=0, // ID do gráfico
const string name="ThumbDown", // nome do objeto
const ENUM_ARROW_ANCHOR anchor=ANCHOR_TOP) // tipo de ancoragem
{
//--- redefine o valor de erro
ResetLastError();
//--- alterar tipo de ancoragem
if(!ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor))
{
Print(__FUNCTION__,
": falha para alterar o tipo de ancoragem! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Excluir sinal Thumbs Down |
//+------------------------------------------------------------------+
bool ArrowThumbDownDelete(const long chart_ID=0, // ID do gráfico
const string name="ThumbDown") // nome do sinal
{
//--- redefine o valor de erro
ResetLastError();
//--- excluir o sinal
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": falha ao excluir o sinal \"Thumbs Down\"! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Verificar valores de ponto de ancoragem e definir valores padrão |
//| para aqueles vazios |
//+------------------------------------------------------------------+
void ChangeArrowEmptyPoint(datetime &time,double &price)
{
//--- se o tempo do ponto não está definido, será na barra atual
if(!time)
time=TimeCurrent();
//--- se o preço do ponto não está definido, ele terá valor Bid
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
}
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
//--- verificar a exatidão dos parâmetros de entrada
if(InpDate<0 || InpDate>100 || InpPrice<0 || InpPrice>100)
{
Print("Erro! Valores incorretos dos parâmetros de entrada!");
return;
}
//--- número de barras visíveis na janela do gráfico
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- tamanho do array de preço
int accuracy=1000;
//--- arrays para armazenar data e valores de preço para serem usados
//--- para definir e alterar sinal das coordenadas do ponto de ancoragem
datetime date[];
double price[];
//--- alocação de memória
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- preencher o array das datas
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Falha ao copiar valores de tempo! Código de erro = ",GetLastError());
return;
}
//--- preencher o array de preços
//--- encontrar os maiores e menores valores do gráfico
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- definir uma etapa de mudança de um preço e preencher o array
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- definir os pontos para desenhar o sinal
int d=InpDate*(bars-1)/100;
int p=InpPrice*(accuracy-1)/100;
//--- criar sinal Thumbs Down no gráfico
if(!ArrowThumbDownCreate(0,InpName,0,date[d],price[p],InpAnchor,InpColor,
InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- redesenhar o gráfico e esperar por um segundo
ChartRedraw();
Sleep(1000);
//--- agora, mover o ponto de ancoragem e alterar sua posição em relação ao sinal
//--- contador de loop
int h_steps=bars/4;
//--- mover o ponto de ancoragem
for(int i=0;i<h_steps;i++)
{
//--- usar o seguinte valor
if(d<bars-1)
d+=1;
//--- mover o ponto
if(!ArrowThumbDownMove(0,InpName,date[d],price[p]))
return;
//--- verificar se o funcionamento do script foi desativado a força
if(IsStopped())
return;
//--- redesenhar o gráfico
ChartRedraw();
// 0.05 segundos de atraso
Sleep(50);
}
//--- 1 segundo de atraso
Sleep(1000);
//--- contador de loop
int v_steps=accuracy/4;
//--- mover o ponto de ancoragem
for(int i=0;i<v_steps;i++)
{
//--- usar o seguinte valor
if(p>1)
p-=1;
//--- mover o ponto
if(!ArrowThumbDownMove(0,InpName,date[d],price[p]))
return;
//--- verificar se o funcionamento do script foi desativado a força
if(IsStopped())
return;
//--- redesenhar o gráfico
ChartRedraw();
}
//--- alterar a localização do ponto de ancoragem relativa ao sinal
ArrowThumbDownAnchorChange(0,InpName,ANCHOR_TOP);
//--- redesenhar o gráfico
ChartRedraw();
//--- 1 segundo de atraso
Sleep(1000);
//--- deletar o sinal do gráfico
ArrowThumbDownDelete(0,InpName);
ChartRedraw();
//--- 1 segundo de atraso
Sleep(1000);
//---
}
OBJ_ARROW_UP
Sinal Arrow Up.
Observação
Posição do ponto de ancoragem relativa ao sinal pode ser selecionado a partir do enumerador
ENUM _ARR OW_ANCH OR .
Sinais de grande porte (mais de 5) somente serão criados, definindo corretamente o valor da
propriedade OBJPR OP_WIDTH ao escrever um código no MetaEditor.
Exemplo
O seguinte script cria e move sinal Arrow Up no gráfico. Funções especiais têm sido desenvolvidas
para criar e alterar as propriedades do objeto gráfico. Você pode utilizar estas funções " as is " em
seus próprios aplicativos.
//--- descrição
#property description "Script desenha sinal \"Arrow Up\"."
#property description "Coordenadas do ponto de ancoragem é definido em"
#property description "porcentagem do tamanho da janela de gráfico."
//--- janela de exibição dos parâmetros de entrada durante inicialização do script
#property script_show_inputs
//--- entrada de parâmetros do script
input string InpName="ArrowUp"; // Nome do sinal
input int InpDate=25; // Ponto de ancoragem da data em %
input int InpPrice=25; // Ponto de ancoragem do preço em %
input ENUM_ARROW_ANCHOR InpAnchor=ANCHOR_TOP; // Tipo de ancoragem
input color InpColor=clrRed; // Cor do sinal
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- ocultar (true) ou exibir (false) o nome do objeto gráfico na lista de objeto
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- definir a prioridade para receber o evento com um clique do mouse no gráfico
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Mover ponto de ancoragem |
//+------------------------------------------------------------------+
bool ArrowUpMove(const long chart_ID=0, // ID do gráfico
const string name="ArrowUp", // nome do objeto
datetime time=0, // coordenada do ponto de ancoragem de tempo
double price=0) // coordenada do ponto de ancoragem de preço
{
//--- se a posição do ponto não está definida, mover para a barra atual tendo o preço Bid
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- redefine o valor de erro
ResetLastError();
//--- mover o ponto de ancoragem
if(!ObjectMove(chart_ID,name,0,time,price))
{
Print(__FUNCTION__,
": falha ao mover o ponto de ancoragem! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Alterar o tipo de ancoragem do sinal Arrow Down |
//+------------------------------------------------------------------+
bool ArrowUpAnchorChange(const long chart_ID=0, // ID do gráfico
const string name="ArrowUp", // nome do objeto
const ENUM_ARROW_ANCHOR anchor=ANCHOR_TOP) // tipo de ancoragem
{
//--- redefine o valor de erro
ResetLastError();
//--- alterar a ancoragem do ponto de locação
if(!ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor))
{
Print(__FUNCTION__,
": falha para alterar o tipo de ancoragem! Código de erro = ",GetLastError());
return(false);
}
//--- arrays para armazenar data e valores de preço para serem usados
//--- para definir e alterar sinal das coordenadas do ponto de ancoragem
datetime date[];
double price[];
//--- alocação de memória
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- preencher o array das datas
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Falha ao copiar valores de tempo! Código de erro = ",GetLastError());
return;
}
//--- preencher o array de preços
//--- encontrar os maiores e menores valores do gráfico
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- definir uma etapa de mudança de um preço e preencher o array
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- definir os pontos para desenhar o sinal
int d=InpDate*(bars-1)/100;
int p=InpPrice*(accuracy-1)/100;
//--- criar sinal Arrow Up no gráfico
if(!ArrowUpCreate(0,InpName,0,date[d],price[p],InpAnchor,InpColor,
InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- redesenhar o gráfico e esperar por um segundo
ChartRedraw();
Sleep(1000);
//--- agora, mover o ponto de ancoragem e alterar sua posição em relação ao sinal
//--- contador de loop
int v_steps=accuracy/2;
//--- mover o ponto de ancoragem
for(int i=0;i<v_steps;i++)
{
//--- usar o seguinte valor
if(p<accuracy-1)
p+=1;
//--- mover o ponto
if(!ArrowUpMove(0,InpName,date[d],price[p]))
return;
//--- verificar se o funcionamento do script foi desativado a força
if(IsStopped())
return;
OBJ_ARROW_DOW N
Sinal Arrow Down.
Observação
Posição do ponto de ancoragem relativa ao sinal pode ser selecionado a partir do enumerador
ENUM _ARR OW_ANCH OR .
Sinais de grande porte (mais de 5) somente serão criados, definindo corretamente o valor da
propriedade OBJPR OP_WIDTH ao escrever um código no MetaEditor.
Exemplo
O seguinte script cria e move sinal Arrow Down no gráfico. Funções especiais têm sido
desenvolvidas para criar e alterar as propriedades do objeto gráfico. Você pode utilizar estas
funções " as is " em seus próprios aplicativos.
//--- descrição
#property description "Script desenha sinal \"Arrow Down\"."
#property description "Coordenadas do ponto de ancoragem é definido em"
#property description "porcentagem do tamanho da janela de gráfico."
//--- janela de exibição dos parâmetros de entrada durante inicialização do script
#property script_show_inputs
//--- entrada de parâmetros do script
input string InpName="ArrowDown"; // Nome do Sinal
input int InpDate=75; // Ponto de ancoragem da data em %
input int InpPrice=75; // Ponto de ancoragem do preço em %
input ENUM_ARROW_ANCHOR InpAnchor=ANCHOR_BOTTOM; // Tipo de Ancoragem
input color InpColor=clrRed; // Cor do sinal
input ENUM_LINE_STYLE InpStyle=STYLE_DOT; // Estilo de linha da borda
//--- ocultar (true) ou exibir (false) o nome do objeto gráfico na lista de objeto
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- definir a prioridade para receber o evento com um clique do mouse no gráfico
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Mover ponto de ancoragem |
//+------------------------------------------------------------------+
bool ArrowDownMove(const long chart_ID=0, // ID do gráfico
const string name="ArrowDown", // nome do objeto
datetime time=0, // coordenada do ponto de ancoragem de tempo
double price=0) // coordenada do ponto de ancoragem de preço
{
//--- se a posição do ponto não está definida, mover para a barra atual tendo o preço Bid
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- redefine o valor de erro
ResetLastError();
//--- mover o ponto de ancoragem
if(!ObjectMove(chart_ID,name,0,time,price))
{
Print(__FUNCTION__,
": falha ao mover o ponto de ancoragem! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Alterar o tipo de ancoragem do sinal Arrow Down |
//+------------------------------------------------------------------+
bool ArrowDownAnchorChange(const long chart_ID=0, // ID do gráfico
const string name="ArrowDown", // nome do objeto
const ENUM_ARROW_ANCHOR anchor=ANCHOR_TOP) // tipo de ancoragem
{
//--- redefine o valor de erro
ResetLastError();
//--- alterar a ancoragem do ponto de locação
if(!ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor))
{
Print(__FUNCTION__,
": falha para alterar o tipo de ancoragem! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Excluir sinal Arrow Down |
//+------------------------------------------------------------------+
bool ArrowDownDelete(const long chart_ID=0, // ID do gráfico
const string name="ArrowDown") // nome do sinal
{
//--- redefine o valor de erro
ResetLastError();
//--- excluir o sinal
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": falha ao excluir o sinal\"Arrow Down\"! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Verificar valores de ponto de ancoragem e definir valores padrão |
//| para aqueles vazios |
//+------------------------------------------------------------------+
void ChangeArrowEmptyPoint(datetime &time,double &price)
{
//--- se o tempo do ponto não está definido, será na barra atual
if(!time)
time=TimeCurrent();
//--- se o preço do ponto não está definido, ele terá valor Bid
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
}
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
//--- verificar a exatidão dos parâmetros de entrada
if(InpDate<0 || InpDate>100 || InpPrice<0 || InpPrice>100)
{
Print("Erro! Valores incorretos dos parâmetros de entrada!");
return;
}
//--- número de barras visíveis na janela do gráfico
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- tamanho do array de preço
int accuracy=1000;
//--- arrays para armazenar data e valores de preço para serem usados
ChartRedraw();
}
//--- 1 segundo de atraso
Sleep(1000);
//--- alterar a localização do ponto de ancoragem relativa ao sinal
ArrowDownAnchorChange(0,InpName,ANCHOR_TOP);
//--- redesenhar o gráfico
ChartRedraw();
//--- 1 segundo de atraso
Sleep(1000);
//--- deletar o sinal do gráfico
ArrowDownDelete(0,InpName);
ChartRedraw();
//--- 1 segundo de atraso
Sleep(1000);
//---
}
OBJ_ARROW_STOP
Sinal Stop.
Observação
Posição do ponto de ancoragem relativa ao sinal pode ser selecionado a partir do enumerador
ENUM _ARR OW_ANCH OR .
Sinais de grande porte (mais de 5) somente serão criados, definindo corretamente o valor da
propriedade OBJPR OP_WIDTH ao escrever um código no MetaEditor.
Exemplo
O seguinte script cria e move sinal Stop no gráfico. Funções especiais têm sido desenvolvidas para
criar e alterar as propriedades do objeto gráfico. Você pode utilizar estas funções " as is " em seus
próprios aplicativos.
//--- descrição
#property description "Script desenha sinal\"Stop\"."
#property description "Coordenadas do ponto de ancoragem é definido em"
#property description "porcentagem do tamanho da janela de gráfico."
//--- janela de exibição dos parâmetros de entrada durante inicialização do script
#property script_show_inputs
//--- entrada de parâmetros do script
input string InpName="ArrowStop"; // Nome do sinal
input int InpDate=10; // Ponto de ancoragem da data em %
input int InpPrice=50; // Ponto de ancoragem do preço em %
input ENUM_ARROW_ANCHOR InpAnchor=ANCHOR_BOTTOM; // Tipo de ancoragem
input color InpColor=clrRed; // Cor do sinal
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- ocultar (true) ou exibir (false) o nome do objeto gráfico na lista de objeto
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- definir a prioridade para receber o evento com um clique do mouse no gráfico
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Mover ponto de ancoragem |
//+------------------------------------------------------------------+
bool ArrowStopMove(const long chart_ID=0, // ID do gráfico
const string name="ArrowStop", // nome do objeto
datetime time=0, // coordenada do ponto de ancoragem de tempo
double price=0) // coordenada do ponto de ancoragem de preço
{
//--- se a posição do ponto não está definida, mover para a barra atual tendo o preço Bid
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- redefine o valor de erro
ResetLastError();
//--- mover o ponto de ancoragem
if(!ObjectMove(chart_ID,name,0,time,price))
{
Print(__FUNCTION__,
": falha ao mover o ponto de ancoragem! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Alterar tipo de ancoragem do sinal Stop |
//+------------------------------------------------------------------+
bool ArrowStopAnchorChange(const long chart_ID=0, // ID do gráfico
const string name="ArrowStop", // nome do objeto
const ENUM_ARROW_ANCHOR anchor=ANCHOR_TOP) // posição do ponto de ancora
{
//--- redefine o valor de erro
ResetLastError();
//--- alterar tipo de ancoragem
if(!ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor))
{
Print(__FUNCTION__,
": falha para alterar o tipo de ancoragem! Código de erro = ",GetLastError());
return(false);
}
//--- arrays para armazenar data e valores de preço para serem usados
//--- para definir e alterar sinal das coordenadas do ponto de ancoragem
datetime date[];
double price[];
//--- alocação de memória
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- preencher o array das datas
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Falha ao copiar valores de tempo! Código de erro = ",GetLastError());
return;
}
//--- preencher o array de preços
//--- encontrar os maiores e menores valores do gráfico
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- definir uma etapa de mudança de um preço e preencher o array
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- definir os pontos para desenhar o sinal
int d=InpDate*(bars-1)/100;
int p=InpPrice*(accuracy-1)/100;
//--- criar sinal Stop no gráfico
if(!ArrowStopCreate(0,InpName,0,date[d],price[p],InpAnchor,InpColor,
InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- redesenhar o gráfico e esperar por um segundo
ChartRedraw();
Sleep(1000);
//--- agora, mover o ponto de ancoragem e alterar sua posição em relação ao sinal
//--- contador de loop
int h_steps=bars*2/5;
//--- mover o ponto de ancoragem
for(int i=0;i<h_steps;i++)
{
//--- usar o seguinte valor
if(d<bars-1)
d+=1;
//--- mover o ponto
if(!ArrowStopMove(0,InpName,date[d],price[p]))
return;
//--- verificar se o funcionamento do script foi desativado a força
if(IsStopped())
return;
OBJ_ARROW_CHECK
Check sign.
Observação
Posição do ponto de ancoragem relativa ao sinal pode ser selecionado a partir do enumerador
ENUM _ARR OW_ANCH OR .
Sinais de grande porte (mais de 5) somente serão criados, definindo corretamente o valor da
propriedade OBJPR OP_WIDTH ao escrever um código no MetaEditor.
Exemplo
O script seguinte cria e move o sinal Check no gráfico. Funções especiais têm sido desenvolvidas
para criar e alterar as propriedades do objeto gráfico. Você pode utilizar estas funções " as is " em
seus próprios aplicativos.
//--- descrição
#property description "Script desenha o sinal \"Check\"."
#property description "Coordenadas do ponto de ancoragem é definido em"
#property description "porcentagem do tamanho da janela de gráfico."
//--- janela de exibição dos parâmetros de entrada durante inicialização do script
#property script_show_inputs
//--- entrada de parâmetros do script
input string InpName="ArrowCheck"; // Nome do sinal
input int InpDate=10; // Ponto de ancoragem da data em %
input int InpPrice=50; // Ponto de ancoragem do preço em %
input ENUM_ARROW_ANCHOR InpAnchor=ANCHOR_TOP; // Tipo de ancoragem
input color InpColor=clrRed; // Cor do sinal
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- ocultar (true) ou exibir (false) o nome do objeto gráfico na lista de objeto
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- definir a prioridade para receber o evento com um clique do mouse no gráfico
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Mover ponto de ancoragem |
//+------------------------------------------------------------------+
bool ArrowCheckMove(const long chart_ID=0, // ID do gráfico
const string name="ArrowCheck", // nome do objeto
datetime time=0, // coordenada do ponto de ancoragem do tempo
double price=0) // coordenada do ponto de ancoragem do preço
{
//--- se a posição do ponto não está definida, mover para a barra atual tendo o preço Bid
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- redefine o valor de erro
ResetLastError();
//--- mover o ponto de ancoragem
if(!ObjectMove(chart_ID,name,0,time,price))
{
Print(__FUNCTION__,
": falha ao mover o ponto de ancoragem! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Alterar o tipo de ancoragem Check |
//+------------------------------------------------------------------+
bool ArrowCheckAnchorChange(const long chart_ID=0, // ID do gráfico
const string name="ArrowCheck", // nome do objeto
const ENUM_ARROW_ANCHOR anchor=ANCHOR_TOP) // tipo de ancoragem
{
//--- redefine o valor de erro
ResetLastError();
//--- alterar tipo de ancoragem
if(!ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor))
{
Print(__FUNCTION__,
": falha para alterar o tipo de ancoragem! Código de erro = ",GetLastError());
return(false);
}
//--- arrays para armazenar data e valores de preço para serem usados
//--- para definir e alterar sinal das coordenadas do ponto de ancoragem
datetime date[];
double price[];
//--- alocação de memória
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- preencher o array das datas
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Falha ao copiar valores de tempo! Código de erro = ",GetLastError());
return;
}
//--- preencher o array de preços
//--- encontrar os maiores e menores valores do gráfico
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- definir uma etapa de mudança de um preço e preencher o array
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- definir os pontos para desenhar o sinal
int d=InpDate*(bars-1)/100;
int p=InpPrice*(accuracy-1)/100;
//--- criar o sinal Check no gráfico
if(!ArrowCheckCreate(0,InpName,0,date[d],price[p],InpAnchor,InpColor,
InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- redesenhar o gráfico e esperar por um segundo
ChartRedraw();
Sleep(1000);
//--- agora, mover o ponto de ancoragem e alterar sua posição em relação ao sinal
//--- contador de loop
int h_steps=bars*2/5;
//--- mover o ponto de ancoragem
for(int i=0;i<h_steps;i++)
{
//--- usar o seguinte valor
if(d<bars-1)
d+=1;
//--- mover o ponto
if(!ArrowCheckMove(0,InpName,date[d],price[p]))
return;
//--- verificar se o funcionamento do script foi desativado a força
if(IsStopped())
return;
OBJ_ARROW_LEFT_PRICE
Etiqueta de Preço à Esquerda
Exemplo
O seguinte script cria e move a Etiqueta Preço Lado Esquerdo no gráfico. Funções especiais têm
sido desenvolvidas para criar e alterar as propriedades do objeto gráfico. Você pode utilizar estas
funções " as is " em seus próprios aplicativos.
//--- descrição
#property description "Script cria a Etiqueta Preço Lado Esquerdo no gráfico."
#property description "Coordenadas do ponto de ancoragem é definido em"
#property description "porcentagem do tamanho da janela de gráfico."
//--- janela de exibição dos parâmetros de entrada durante inicialização do script
#property script_show_inputs
//--- entrada de parâmetros do script
input string InpName="LeftPrice"; // Nome da Etiqueta Preço
input int InpDate=100; // Ponto de ancoragem da data em %
input int InpPrice=10; // Ponto de ancoragem do preço em %
input color InpColor=clrRed; // Cor da Etiqueta Preço
input ENUM_LINE_STYLE InpStyle=STYLE_SOLID; // Estilo de linha da borda
input int InpWidth=2; // Tamanho da Etiqueta Preço
input bool InpBack=false; // Fundo Etiqueta
input bool InpSelection=true; // Destaque para mover
input bool InpHidden=true; // Ocultar na lista de objetos
input long InpZOrder=0; // Prioridade para clicar no mouse
//+------------------------------------------------------------------+
//| Criar Etiqueta Preço Lado Esquerdo |
//+------------------------------------------------------------------+
bool ArrowLeftPriceCreate(const long chart_ID=0, // ID do gráfico
const string name="LeftPrice", // nome da etiqueta de preço
const int sub_window=0, // índice da sub-janela
datetime time=0, // ponto de ancoragem do tempo
double price=0, // ponto de ancoragem do preço
const color clr=clrRed, // cor da etiqueta de preço
const ENUM_LINE_STYLE style=STYLE_SOLID, // estilo de linha da borda
const int width=1, // tamanho da etiqueta de preço
const bool back=false, // no fundo
const bool selection=true, // destaque para mover
const bool hidden=true, // ocultar na lista de objetos
const long z_order=0) // prioridade para clicar no mou
{
//--- definir as coordenadas de pontos de ancoragem, se eles não estão definidos
ChangeArrowEmptyPoint(time,price);
//--- redefine o valor de erro
ResetLastError();
//--- criar uma etiqueta de preço
if(!ObjectCreate(chart_ID,name,OBJ_ARROW_LEFT_PRICE,sub_window,time,price))
{
Print(__FUNCTION__,
": falha ao criar a etiqueta preço lado esquerdo! Código de erro = ",GetLastError());
return(false);
}
//--- definir a cor da etiqueta
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- definir o estilo da linha da borda
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- definir o tamanho da etiqueta
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- exibir em primeiro plano (false) ou fundo (true)
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- Habilitar (true) ou desabilitar (false) o modo de movimento da etiqueta pelo mouse
//--- ao criar um objeto gráfico usando a função ObjectCreate, o objeto não pode ser
//--- destacado e movimentado por padrão. Dentro deste método, o parâmetro de seleção
//--- é verdade por padrão, tornando possível destacar e mover o objeto
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- ocultar (true) ou exibir (false) o nome do objeto gráfico na lista de objeto
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- definir a prioridade para receber o evento com um clique do mouse no gráfico
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Mover ponto de ancoragem |
//+------------------------------------------------------------------+
//--- se o preço do ponto não está definido, ele terá valor Bid
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
}
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
//--- verificar a exatidão dos parâmetros de entrada
if(InpDate<0 || InpDate>100 || InpPrice<0 || InpPrice>100)
{
Print("Erro! Valores incorretos dos parâmetros de entrada!");
return;
}
//--- número de barras visíveis na janela do gráfico
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- tamanho do array de preço
int accuracy=1000;
//--- arrays para armazenar data e valores de preço para serem usados
//--- para configuração e alteração das coordenadas do ponto de ancoragem da etiqueta
datetime date[];
double price[];
//--- alocação de memória
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- preencher o array das datas
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Falha ao copiar valores de tempo! Código de erro = ",GetLastError());
return;
}
//--- preencher o array de preços
//--- encontrar os maiores e menores valores do gráfico
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- definir uma etapa de mudança de um preço e preencher o array
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- definir os pontos por desenhar a etiqueta
int d=InpDate*(bars-1)/100;
int p=InpPrice*(accuracy-1)/100;
//--- criar etiqueta preço lado esquerdo no gráfico
if(!ArrowLeftPriceCreate(0,InpName,0,date[d],price[p],InpColor,
InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- redesenhar o gráfico e esperar por um segundo
ChartRedraw();
Sleep(1000);
//--- agora, mover o ponto de ancoragem
//--- contador de loop
int v_steps=accuracy*4/5;
//--- mover o ponto de ancoragem
for(int i=0;i<v_steps;i++)
{
//--- usar o seguinte valor
if(p<accuracy-1)
p+=1;
//--- mover o ponto
if(!ArrowLeftPriceMove(0,InpName,date[d],price[p]))
return;
//--- verificar se o funcionamento do script foi desativado a força
if(IsStopped())
return;
//--- redesenhar o gráfico
ChartRedraw();
}
//--- 1 segundo de atraso
Sleep(1000);
//--- excluir a etiqueta do gráfico
ArrowLeftPriceDelete(0,InpName);
ChartRedraw();
//--- 1 segundo de atraso
Sleep(1000);
//---
}
OBJ_ARROW_RIGHT_PRICE
Etiqueta Preço Lado Direito.
Exemplo
O seguinte script cria e move a Etiqueta Preço Lado Direito no gráfico. Funções especiais têm sido
desenvolvidas para criar e alterar as propriedades do objeto gráfico. Você pode utilizar estas
funções " as is " em seus próprios aplicativos.
//--- descrição
#property description "Script cria a Etiqueta Preço Lado Direito no gráfico."
#property description "Coordenadas do ponto de ancoragem é definido em"
#property description "porcentagem do tamanho da janela de gráfico."
//--- janela de exibição dos parâmetros de entrada durante inicialização do script
#property script_show_inputs
//--- entrada de parâmetros do script
input string InpName="RightPrice"; // Nome da Etiqueta Preço
input int InpDate=0; // Ponto de ancoragem da data em %
input int InpPrice=90; // Ponto de ancoragem do preço em %
input color InpColor=clrRed; // Cor da Etiqueta Preço
input ENUM_LINE_STYLE InpStyle=STYLE_SOLID; // Estilo de linha da borda
input int InpWidth=2; // Tamanho da Etiqueta Preço
input bool InpBack=false; // Fundo Etiqueta
input bool InpSelection=true; // Destaque para mover
input bool InpHidden=true; // Ocultar na lista de objetos
input long InpZOrder=0; // Prioridade para clicar no mouse
//+------------------------------------------------------------------+
//| Criar a etiqueta preço lado direito |
//+------------------------------------------------------------------+
bool ArrowRightPriceCreate(const long chart_ID=0, // ID do gráfico
const string name="RightPrice", // nome do preço da etiqueta
const int sub_window=0, // índice da sub-janela
datetime time=0, // ponto de ancoragem do tempo
double price=0, // ponto de ancoragem do preço
const color clr=clrRed, // cor da etiqueta de preço
const ENUM_LINE_STYLE style=STYLE_SOLID, // estilo de linha da borda
const int width=1, // tamanho da etiqueta de preço
const bool back=false, // no fundo
const bool selection=true, // destaque para mover
const bool hidden=true, // ocultar na lista de objetos
const long z_order=0) // prioridade para clicar no mo
{
//--- definir as coordenadas de pontos de ancoragem, se eles não estão definidos
ChangeArrowEmptyPoint(time,price);
//--- redefine o valor de erro
ResetLastError();
//--- criar uma etiqueta de preço
if(!ObjectCreate(chart_ID,name,OBJ_ARROW_RIGHT_PRICE,sub_window,time,price))
{
Print(__FUNCTION__,
": falha ao criar a etiqueta de preço lado direito! Código de erro = ",GetLastError());
return(false);
}
//--- definir a cor da etiqueta
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- definir o estilo da linha da borda
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- definir o tamanho da etiqueta
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- exibir em primeiro plano (false) ou fundo (true)
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- Habilitar (true) ou desabilitar (false) o modo de movimento da etiqueta pelo mouse
//--- ao criar um objeto gráfico usando a função ObjectCreate, o objeto não pode ser
//--- destacado e movimentado por padrão. Dentro deste método, o parâmetro de seleção
//--- é verdade por padrão, tornando possível destacar e mover o objeto
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- ocultar (true) ou exibir (false) o nome do objeto gráfico na lista de objeto
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- definir a prioridade para receber o evento com um clique do mouse no gráfico
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Mover ponto de ancoragem |
//+------------------------------------------------------------------+
//--- se o preço do ponto não está definido, ele terá valor Bid
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
}
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
//--- verificar a exatidão dos parâmetros de entrada
if(InpDate<0 || InpDate>100 || InpPrice<0 || InpPrice>100)
{
Print("Erro! Valores incorretos dos parâmetros de entrada!");
return;
}
//--- número de barras visíveis na janela do gráfico
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- tamanho do array de preço
int accuracy=1000;
//--- arrays para armazenar data e valores de preço para serem usados
//--- para configuração e alteração das coordenadas do ponto de ancoragem da etiqueta
datetime date[];
double price[];
//--- alocação de memória
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- preencher o array das datas
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Falha ao copiar valores de tempo! Código de erro = ",GetLastError());
return;
}
//--- preencher o array de preços
//--- encontrar os maiores e menores valores do gráfico
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- definir uma etapa de mudança de um preço e preencher o array
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- definir os pontos por desenhar a etiqueta
int d=InpDate*(bars-1)/100;
int p=InpPrice*(accuracy-1)/100;
//--- criar a etiqueta de preço lado direito
if(!ArrowRightPriceCreate(0,InpName,0,date[d],price[p],InpColor,
InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- redesenhar o gráfico e esperar por um segundo
ChartRedraw();
Sleep(1000);
//--- agora, mover o ponto de ancoragem
//--- contador de loop
int v_steps=accuracy*4/5;
//--- mover o ponto de ancoragem
for(int i=0;i<v_steps;i++)
{
//--- usar o seguinte valor
if(p>1)
p-=1;
//--- mover o ponto
if(!ArrowRightPriceMove(0,InpName,date[d],price[p]))
return;
//--- verificar se o funcionamento do script foi desativado a força
if(IsStopped())
return;
//--- redesenhar o gráfico
ChartRedraw();
}
//--- 1 segundo de atraso
Sleep(1000);
//--- excluir a etiqueta do gráfico
ArrowRightPriceDelete(0,InpName);
ChartRedraw();
//--- 1 segundo de atraso
Sleep(1000);
//---
}
OBJ_ARROW_BUY
Sinal Buy.
Exemplo
O seguinte script cria e move o sinal Buy no gráfico. Funções especiais têm sido desenvolvidas para
criar e alterar as propriedades do objeto gráfico. Você pode utilizar estas funções " as is " em seus
próprios aplicativos.
//--- descrição
#property description "Script desenha sinais \"Buy\" na janela do gráfico."
//--- janela de exibição dos parâmetros de entrada durante inicialização do script
#property script_show_inputs
//--- entrada de parâmetros do script
input color InpColor=C'3,95,172'; // Cores dos sinais
//+------------------------------------------------------------------+
//| Criar sinal Buy |
//+------------------------------------------------------------------+
bool ArrowBuyCreate(const long chart_ID=0, // ID de gráfico
const string name="ArrowBuy", // nome do sinal
const int sub_window=0, // índice da sub-janela
datetime time=0, // ponto de ancoragem do tempo
double price=0, // ponto de ancoragem do preço
const color clr=C'3,95,172', // cor do sinal
const ENUM_LINE_STYLE style=STYLE_SOLID, // estilo de linha (quando destacada)
const int width=1, // tamanho da linha (quando destacada)
const bool back=false, // no fundo
const bool selection=false, // destaque para mover
{
Print(__FUNCTION__,
": falha ao mover o ponto de ancoragem! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Excluir sinal Buy |
//+------------------------------------------------------------------+
bool ArrowBuyDelete(const long chart_ID=0, // ID do gráfico
const string name="ArrowBuy") // nome do sinal
{
//--- redefine o valor de erro
ResetLastError();
//--- excluir o sinal
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": falha ao excluir o sinal \"Buy\"! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Verificar valores de ponto de ancoragem e definir valores padrão |
//| para aqueles vazios |
//+------------------------------------------------------------------+
void ChangeArrowEmptyPoint(datetime &time,double &price)
{
//--- se o tempo do ponto não está definido, será na barra atual
if(!time)
time=TimeCurrent();
//--- se o preço do ponto não está definido, ele terá valor Bid
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
}
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
datetime date[]; // array para armazenar datas das barras visíveis
double low[]; // array para armazenar preços Baixos das barras visíveis
double high[]; // array para armazenar preços Altos das barras visíveis
//--- número de barras visíveis na janela do gráfico
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
OBJ_ARROW_SELL
Sell sign.
Exemplo
O seguinte script cria e move o sinal Sell no gráfico. Funções especiais têm sido desenvolvidas para
criar e alterar as propriedades do objeto gráfico. Você pode utilizar estas funções " as is " em seus
próprios aplicativos.
//--- descrição
#property description "Script desenha sinal \"Sell\" na janela do gráfico."
//--- janela de exibição dos parâmetros de entrada durante inicialização do script
#property script_show_inputs
//--- entrada de parâmetros do script
input color InpColor=C'225,68,29'; // Cor do sinal
//+------------------------------------------------------------------+
//| Criar sinal Sell |
//+------------------------------------------------------------------+
bool ArrowSellCreate(const long chart_ID=0, // ID do gráfico
const string name="ArrowSell", // nome do sinal
const int sub_window=0, // índice da sub-janela
datetime time=0, // ponto de ancoragem do tempo
double price=0, // ponto de ancoragem do preço
const color clr=C'225,68,29', // cor do sinal
const ENUM_LINE_STYLE style=STYLE_SOLID, // estilo de linha (quando destacado)
const int width=1, // tamanho da linha (quando destacada
const bool back=false, // no fundo
const bool selection=false, // destaque para mover
{
Print(__FUNCTION__,
": falha ao mover o ponto de ancoragem! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Excluir sinal Sell |
//+------------------------------------------------------------------+
bool ArrowSellDelete(const long chart_ID=0, // ID do gráfico
const string name="ArrowSell") // nome do sinal
{
//--- redefine o valor de erro
ResetLastError();
//--- excluir o sinal
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": falha ao excluir o sinal\"Sell\"! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Verificar valores de ponto de ancoragem e definir valores padrão |
//| para aqueles vazios |
//+------------------------------------------------------------------+
void ChangeArrowEmptyPoint(datetime &time,double &price)
{
//--- se o tempo do ponto não está definido, será na barra atual
if(!time)
time=TimeCurrent();
//--- se o preço do ponto não está definido, ele terá valor Bid
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
}
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
datetime date[]; // array para armazenar datas das barras visíveis
double low[]; // array para armazenar preços Baixos das barras visíveis
double high[]; // array para armazenar preços Altos das barras visíveis
//--- número de barras visíveis na janela do gráfico
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
OBJ_ARROW
Objeto Seta.
Observação
Posição do ponto de ancoragem relativo ao objeto será selecionado a partir do
ENUM _ARR OW_ANCH OR .
As setas grandes (mais do que 5) somente serão criadas pela configuração de valores apropriados da
propriedade OBJPR OP_WIDTH quando escrever um código no MetaEditor.
O tipo de seta necess ário podem ser selecionado, definindo um dos códigos dos símbolos da fonte
W ingdings.
Exemplo
O seguinte script cria um objeto Seta no gráfico e altera seu tipo. Funções especiais têm sido
desenvolvidas para criar e alterar as propriedades do objeto gráfico. Você pode utilizar estas
funções " as is " em seus próprios aplicativos.
//--- descrição
#property description "Script cria uma seta aleatória na janela do gráfico."
#property description "Coordenadas do ponto de ancoragem é definido em"
#property description "porcentagem do tamanho da janela de gráfico."
//--- janela de exibição dos parâmetros de entrada durante inicialização do script
#property script_show_inputs
//--- entrada de parâmetros do script
input string InpName="Arrow"; // Nome da seta
input int InpDate=50; // Ponto de ancoragem da data em %
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- habilitar (true) ou desabilitar (true) o modo do movimento da seta com o mouse
//--- ao criar um objeto gráfico usando a função ObjectCreate, o objeto não pode ser
//--- destacado e movimentado por padrão. Dentro deste método, o parâmetro de seleção
//--- é verdade por padrão, tornando possível destacar e mover o objeto
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- ocultar (true) ou exibir (false) o nome do objeto gráfico na lista de objeto
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- definir a prioridade para receber o evento com um clique do mouse no gráfico
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Mover ponto de ancoragem |
//+------------------------------------------------------------------+
bool ArrowMove(const long chart_ID=0, // ID do gráfico
const string name="Arrow", // nome do objeto
datetime time=0, // coordenada do ponto de ancoragem de tempo
double price=0) // coordenada do ponto de ancoragem de preço
{
//--- se a posição do ponto não está definida, mover para a barra atual tendo o preço Bid
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- redefine o valor de erro
ResetLastError();
//--- mover o ponto de ancoragem
if(!ObjectMove(chart_ID,name,0,time,price))
{
Print(__FUNCTION__,
": falha ao mover o ponto de ancoragem! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Alterar o código da seta |
//+------------------------------------------------------------------+
bool ArrowCodeChange(const long chart_ID=0, // ID do gráfico
const string name="Arrow", // nome do objeto
const uchar code=252) // código da seta
{
//--- redefine o valor de erro
ResetLastError();
//--- alterar o código da seta
if(!ObjectSetInteger(chart_ID,name,OBJPROP_ARROWCODE,code))
{
Print(__FUNCTION__,
": falha ao alterar o código da seta! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Alterar tipo de ancoragem |
//+------------------------------------------------------------------+
bool ArrowAnchorChange(const long chart_ID=0, // ID do gráfico
const string name="Arrow", // nome do objeto
const ENUM_ARROW_ANCHOR anchor=ANCHOR_TOP) // tipo de ancoragem
{
//--- redefine o valor de erro
ResetLastError();
//--- alterar tipo de ancoragem
if(!ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor))
{
Print(__FUNCTION__,
": falha para alterar o tipo de ancoragem! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Excluir uma seta |
//+------------------------------------------------------------------+
bool ArrowDelete(const long chart_ID=0, // ID do gráfico
const string name="Arrow") // nome da seta
{
//--- redefine o valor de erro
ResetLastError();
//--- excluir uma seta
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": falha ao excluir uma seta! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Verificar valores de ponto de ancoragem e definir valores padrão |
//| para aqueles vazios |
//+------------------------------------------------------------------+
void ChangeArrowEmptyPoint(datetime &time,double &price)
{
//--- se o tempo do ponto não está definido, será na barra atual
if(!time)
time=TimeCurrent();
//--- se o preço do ponto não está definido, ele terá valor Bid
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
}
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
//--- verificar a exatidão dos parâmetros de entrada
if(InpDate<0 || InpDate>100 || InpPrice<0 || InpPrice>100)
{
Print("Erro! Valores incorretos dos parâmetros de entrada!");
return;
}
//--- número de barras visíveis na janela do gráfico
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- tamanho do array de preço
int accuracy=1000;
//--- arrays para armazenar data e valores de preço para serem usados
//--- para definir e alterar sinal das coordenadas do ponto de ancoragem
datetime date[];
double price[];
//--- alocação de memória
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- preencher o array das datas
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Falha ao copiar valores de tempo! Código de erro = ",GetLastError());
return;
}
//--- preencher o array de preços
//--- encontrar os maiores e menores valores do gráfico
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- definir uma etapa de mudança de um preço e preencher o array
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- definir pontos para desenhar a seta
int d=InpDate*(bars-1)/100;
int p=InpPrice*(accuracy-1)/100;
//--- criar uma seta no gráfico
if(!ArrowCreate(0,InpName,0,date[d],price[p],32,InpAnchor,InpColor,
InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- redesenhar o gráfico
ChartRedraw();
//--- analisar todos os casos de criação de setas no loop
for(int i=33;i<256;i++)
{
if(!ArrowCodeChange(0,InpName,(uchar)i))
return;
//--- verificar se o funcionamento do script foi desativado a força
if(IsStopped())
return;
//--- redesenhar o gráfico
ChartRedraw();
// meio segundo de atraso
Sleep(500);
}
//--- 1 segundo de atraso
Sleep(1000);
//--- excluir a seta do gráfico
ArrowDelete(0,InpName);
ChartRedraw();
//--- 1 segundo de atraso
Sleep(1000);
//---
}
OBJ_TEXT
Objeto T exto.
Observação
Posição de ponto de ancoragem em relação ao texto pode ser selecionado a partir do enumerador
ENUM _ANCH OR_POINT . Você também pode alterar o ângulo de inclinação de texto usando a
propriedade OBJPR OP_ANGLE.
Exemplo
O seguinte o script cria v ários objetos de texto no gráfico. Funções especiais têm sido
desenvolvidas para criar e alterar as propriedades do objeto gráfico. Você pode utilizar estas
funções " as is " em seus próprios aplicativos.
//--- descrição
#property description "Script cria objeto gráfico de \"Texto\"."
//--- janela de exibição dos parâmetros de entrada durante inicialização do script
#property script_show_inputs
//--- entrada de parâmetros do script
input string InpFont="Arial"; // Fonte
input int InpFontSize=10; // Tamanho da fonte
input color InpColor=clrRed; // Cor
input double InpAngle=90.0; // Ângulo de inclinação em graus
input ENUM_ANCHOR_POINT InpAnchor=ANCHOR_LEFT; // Tipo de ancoragem
input bool InpBack=false; // Objeto de fundo
input bool InpSelection=false; // Destaque para mover
input bool InpHidden=true; // Ocultar na lista de objetos
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- definir a prioridade para receber o evento com um clique do mouse no gráfico
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Mover ponto de ancoragem |
//+------------------------------------------------------------------+
bool TextMove(const long chart_ID=0, // ID do gráfico
const string name="Text", // nome do objeto
datetime time=0, // coordenada do ponto de ancoragem do tempo
double price=0) // coordenada do ponto de ancoragem do preço
{
//--- se a posição do ponto não está definida, mover para a barra atual tendo o preço Bid
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- redefine o valor de erro
ResetLastError();
//--- mover o ponto de ancoragem
if(!ObjectMove(chart_ID,name,0,time,price))
{
Print(__FUNCTION__,
": falha ao mover o ponto de ancoragem! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Alterar o texto do objeto |
//+------------------------------------------------------------------+
bool TextChange(const long chart_ID=0, // ID do Gráfico
const string name="Text", // nome do objeto
const string text="Text") // texto
{
//--- redefine o valor de erro
ResetLastError();
//--- alterar texto do objeto
if(!ObjectSetString(chart_ID,name,OBJPROP_TEXT,text))
{
Print(__FUNCTION__,
": falha ao alterar texto! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Excluir objeto Texto |
//+------------------------------------------------------------------+
bool TextDelete(const long chart_ID=0, // Id do Gráfico
const string name="Text") // nome do objeto
{
//--- redefine o valor de erro
ResetLastError();
//--- excluir o objeto
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": falha ao excluir o objeto \"Texto\"! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Verificar valores de ponto de ancoragem e definir valores padrão |
//| para aqueles vazios |
//+------------------------------------------------------------------+
void ChangeTextEmptyPoint(datetime &time,double &price)
{
//--- se o tempo do ponto não está definido, será na barra atual
if(!time)
time=TimeCurrent();
//--- se o preço do ponto não está definido, ele terá valor Bid
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
}
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
datetime date[]; // array para armazenar datas das barras visíveis
double low[]; // array para armazenar preços Baixos das barras visíveis
double high[]; // array para armazenar preços Altos das barras visíveis
//--- número de barras visíveis na janela do gráfico
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- alocação de memória
ArrayResize(date,bars);
ArrayResize(low,bars);
ArrayResize(high,bars);
//--- preencher o array das datas
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Falha ao copiar valores de tempo! Código de erro = ",GetLastError());
return;
}
//--- preencher o array dos preços Baixos
if(CopyLow(Symbol(),Period(),0,bars,low)==-1)
{
Print("Falha ao copiar os valores dos preços Baixos! Código de erro = ",GetLastError());
return;
}
//--- preencher o array dos preços Altos
if(CopyHigh(Symbol(),Period(),0,bars,high)==-1)
{
Print("Falha ao copiar os valores dos preços Altos! Código de erro = ",GetLastError());
return;
}
//--- definir a forma como muitas vezes os textos serão exibidos
int scale=(int)ChartGetInteger(0,CHART_SCALE);
//--- definir o passo
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;
}
//--- criar textos para os valores de barras de Alta e de Baixa (com intervalos)
for(int i=0;i<bars;i+=step)
{
//--- criar os textos
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
Objeto Etiqueta.
Observação
Posição do ponto de ancoragem relativa a etiqueta pode ser selecionada do enumerador
ENUM _ANCH OR_POINT . Coordenadas do ponto de ancoragem são em pixels.
Você também pode selecionar uma ancoragem de etiqueta de texto no canto a partir do enumerador
ENUM _BASE_CORNER .
Exemplo
O seguinte script cria e move o objeto Edit no gráfico. Funções especiais têm sido desenvolvidas
para criar e alterar as propriedades do objeto gráfico. Você pode utilizar estas funções " as is " em
seus próprios aplicativos.
//--- descrição
#property description "Script cria objeto gráfico \"Etiqueta\"."
//--- janela de exibição dos parâmetros de entrada durante inicialização do script
#property script_show_inputs
//--- entrada de parâmetros do script
input string InpName="Label"; // Nome etiqueta
input int InpX=150; // distância do eixo X
input int InpY=150; // distância do eixo Y
input string InpFont="Arial"; // Fonte
input int InpFontSize=14; // Tamanho da fonte
input color InpColor=clrRed; // Cor
input double InpAngle=0.0; // Ângulo de inclinação em graus
//+------------------------------------------------------------------+
void OnStart()
{
//--- armazenar as coordenadas das etiquetas nas variáveis locais
int x=InpX;
int y=InpY;
//--- tamanho da janela do gráfico
long x_distance;
long y_distance;
//--- definir tamanho da janela
if(!ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0,x_distance))
{
Print("Falha ao obter a largura do gráfico! Código de erro = ",GetLastError());
return;
}
if(!ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS,0,y_distance))
{
Print("Falha ao obter a altura do gráfico! Código de erro = ",GetLastError());
return;
}
//--- verificar a exatidão dos parâmetros de entrada
if(InpX<0 || InpX>x_distance-1 || InpY<0 || InpY>y_distance-1)
{
Print("Erro! Valores incorretos dos parâmetros de entrada!");
return;
}
//--- preparar texto inicial para a etiqueta
string text;
StringConcatenate(text,"Canto inferior direito: ",x,",",y);
//--- criar uma etiqueta de texto no gráfico
if(!LabelCreate(0,InpName,0,InpX,InpY,CORNER_LEFT_UPPER,text,InpFont,InpFontSize,
InpColor,InpAngle,InpAnchor,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- redesenhar o gráfico e esperar por um segundo
ChartRedraw();
Sleep(500);
//--- mover a etiqueta e alterar o seu texto simultaneamente
//--- número de iterações por eixos
int h_steps=(int)(x_distance/2-InpX);
int v_steps=(int)(y_distance/2-InpY);
//--- mover a etiqueta para baixo
for(int i=0;i<v_steps;i++)
{
//--- alterar a coordenada
y+=2;
//--- mover a etiqueta e alterar o seu texto
MoveAndTextChange(x,y,"Canto superior esquerdo: ");
}
//--- meio segundo de atraso
Sleep(500);
//--- mover a etiqueta para a direita
for(int i=0;i<h_steps;i++)
{
//--- alterar a coordenada
x+=2;
//--- mover a etiqueta e alterar o seu texto
MoveAndTextChange(x,y,"Canto superior esquerdo: ");
}
//--- meio segundo de atraso
Sleep(500);
//--- mover a etiqueta para cima
for(int i=0;i<v_steps;i++)
{
//--- alterar a coordenada
y-=2;
//--- mover a etiqueta e alterar o seu texto
MoveAndTextChange(x,y,"Canto superior esquerdo: ");
}
//--- meio segundo de atraso
Sleep(500);
//--- mover a etiqueta para a esquerda
for(int i=0;i<h_steps;i++)
{
//--- alterar a coordenada
x-=2;
//--- mover a etiqueta e alterar o seu texto
MoveAndTextChange(x,y,"Canto superior esquerdo: ");
}
//--- meio segundo de atraso
Sleep(500);
//--- agora, mover o ponto para mudar o canto de ancoragem
//--- mover para o canto inferior esquerdo
if(!LabelChangeCorner(0,InpName,CORNER_LEFT_LOWER))
return;
//--- alterar texto da etiqueta
StringConcatenate(text,"Canto inferior direito: ",x,",",y);
if(!LabelTextChange(0,InpName,text))
return;
//--- redesenhar o gráfico e esperar por dois segundos
ChartRedraw();
Sleep(2000);
//--- mover para o canto inferior direito
if(!LabelChangeCorner(0,InpName,CORNER_RIGHT_LOWER))
return;
//--- alterar texto da etiqueta
StringConcatenate(text,"Canto direito inferior: ",x,",",y);
if(!LabelTextChange(0,InpName,text))
return;
//--- redesenhar o gráfico e esperar por dois segundos
ChartRedraw();
Sleep(2000);
//--- mover para o canto superior direito
if(!LabelChangeCorner(0,InpName,CORNER_RIGHT_UPPER))
return;
//--- alterar texto da etiqueta
StringConcatenate(text,"Canto inferior direito: ",x,",",y);
if(!LabelTextChange(0,InpName,text))
return;
//--- redesenhar o gráfico e esperar por dois segundos
ChartRedraw();
Sleep(2000);
//--- mover para o canto superior esquerdo
if(!LabelChangeCorner(0,InpName,CORNER_LEFT_UPPER))
return;
//--- alterar texto da etiqueta
StringConcatenate(text,"Canto inferior direito: ",x,",",y);
if(!LabelTextChange(0,InpName,text))
return;
//--- redesenhar o gráfico e esperar por dois segundos
ChartRedraw();
Sleep(2000);
//--- excluir a etiqueta
LabelDelete(0,InpName);
//--- redesenhar o gráfico e esperar por um segundo
ChartRedraw();
Sleep(500);
//---
}
//+------------------------------------------------------------------+
//| A função movimenta o objeto e altera o seu texto |
//+------------------------------------------------------------------+
bool MoveAndTextChange(const int x,const int y,string text)
{
//--- mover a etiqueta
if(!LabelMove(0,InpName,x,y))
return(false);
//--- alterar texto da etiqueta
StringConcatenate(text,text,x,",",y);
if(!LabelTextChange(0,InpName,text))
return(false);
//--- verificar se o funcionamento do script foi desativado a força
if(IsStopped())
return(false);
//--- redesenhar o gráfico
ChartRedraw();
OBJ_BUTTON
Objeto Botão.
Observação
Coordenadas do ponto de ancoragem são em pixels. Você pode selecionar o botão de ancoragem de
canto a partir da ENUM _BASE_CORNER .
Exemplo
O seguinte script cria e move o objeto Botão no gráfico. Funções especiais têm sido desenvolvidas
para criar e alterar as propriedades do objeto gráfico. Você pode utilizar estas funções " as is " em
seus próprios aplicativos.
//--- descrição
#property description "Script cria o Botão no gráfico."
//--- janela de exibição dos parâmetros de entrada durante inicialização do script
#property script_show_inputs
//--- entrada de parâmetros do script
input string InpName="Button"; // Nome do Botão
input ENUM_BASE_CORNER InpCorner=CORNER_LEFT_UPPER; // Canto do gráfico para ancoragem
input string InpFont="Arial"; // Fonte
input int InpFontSize=14; // Tamanho da fonte
input color InpColor=clrBlack; // Cor do texto
input color InpBackColor=C'236,233,216'; // Fundo da cor
input color InpBorderColor=clrNONE; // Cor da Borda
input bool InpState=false; // Pressionado/Liberado
input bool InpBack=false; // Objeto de Fundo
input bool InpSelection=false; // Destaque para mover
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- definir a cor de fundo
ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,back_clr);
//--- definir a cor da borda
ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_COLOR,border_clr);
//--- exibir em primeiro plano (false) ou fundo (true)
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- set button state
ObjectSetInteger(chart_ID,name,OBJPROP_STATE,state);
//--- habilitar (true) ou desabilitar (false) o modo do movimento do botão com o mouse
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- ocultar (true) ou exibir (false) o nome do objeto gráfico na lista de objeto
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- definir a prioridade para receber o evento com um clique do mouse no gráfico
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Mover o botão |
//+------------------------------------------------------------------+
bool ButtonMove(const long chart_ID=0, // ID do gráfico
const string name="Button", // nome do botão
const int x=0, // coordenada X
const int y=0) // coordenada Y
{
//--- redefine o valor de erro
ResetLastError();
//--- mover o botão
if(!ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x))
{
Print(__FUNCTION__,
": falha para mover coordenada X do botão! Código de erro = ",GetLastError());
return(false);
}
if(!ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y))
{
Print(__FUNCTION__,
": falha para mover coordenada Y do botão! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Alterar o tamanho do botão |
//+------------------------------------------------------------------+
bool ButtonChangeSize(const long chart_ID=0, // ID do gráfico
ResetLastError();
//--- alterar texto do objeto
if(!ObjectSetString(chart_ID,name,OBJPROP_TEXT,text))
{
Print(__FUNCTION__,
": falha ao alterar texto! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Excluir o botão |
//+------------------------------------------------------------------+
bool ButtonDelete(const long chart_ID=0, // ID do gráfico
const string name="Button") // nome do botão
{
//--- redefine o valor de erro
ResetLastError();
//--- excluir o botão
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": falha ao excluir o botão! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
//--- tamanho da janela do gráfico
long x_distance;
long y_distance;
//--- definir tamanho da janela
if(!ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0,x_distance))
{
Print("Falha ao obter a largura do gráfico! Código de erro = ",GetLastError());
return;
}
if(!ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS,0,y_distance))
{
Print("Falha ao obter a altura do gráfico! Código de erro = ",GetLastError());
return;
}
//--- definir a etapa de alterar o tamanho do botão
int x_step=(int)x_distance/32;
int y_step=(int)y_distance/32;
//--- definir as coordenadas botão e seu tamanho
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;
//--- criar o botão
if(!ButtonCreate(0,InpName,0,x,y,x_size,y_size,InpCorner,"Press",InpFont,InpFontSize,
InpColor,InpBackColor,InpBorderColor,InpState,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- redesenhar o gráfico
ChartRedraw();
//--- reduzir o botão no loop
int i=0;
while(i<13)
{
//--- meio segundo de atraso
Sleep(500);
//--- mudar o botão para o estado pressionado
ObjectSetInteger(0,InpName,OBJPROP_STATE,true);
//--- redesenhar o gráfico e esperar por 0.2 segundos
ChartRedraw();
Sleep(200);
//--- redefinir as coordenadas e tamanho do botão
x+=x_step;
y+=y_step;
x_size-=x_step*2;
y_size-=y_step*2;
//--- reduzir o botão
ButtonMove(0,InpName,x,y);
ButtonChangeSize(0,InpName,x_size,y_size);
//--- trazer o botão de volta ao estado liberado
ObjectSetInteger(0,InpName,OBJPROP_STATE,false);
//--- redesenhar o gráfico
ChartRedraw();
//--- verificar se o funcionamento do script foi desativado a força
if(IsStopped())
return;
//--- incrementar um contador de loop
i++;
}
//--- meio segundo de atraso
Sleep(500);
//--- excluir o botão
ButtonDelete(0,InpName);
ChartRedraw();
OBJ_CHART
Objeto Chart.
Observação
Coordenadas do ponto de ancoragem são em pixels. Você também pode selecionar uma ancoragem
do bitmap no canto a partir do enumerador ENUM _BASE_CORNER .
Símbolo, período e escala podem ser selecionados para o objeto Chart. Escala de preço e modo de
exibição de data também pode ser habilitado/desabilitado.
Exemplo
O seguinte script cria e move o objeto Chart no gráfico. Funções especiais têm sido desenvolvidas
para criar e alterar as propriedades do objeto gráfico. Você pode utilizar estas funções " as is " em
seus próprios aplicativos.
//--- descrição
#property description "Script cria objeto \"Chart\"."
//--- janela de exibição dos parâmetros de entrada durante inicialização do script
#property script_show_inputs
//--- entrada de parâmetros do script
input string InpName="Chart"; // Nome do objeto
input string InpSymbol="EURUSD"; // Símbolo
input ENUM_TIMEFRAMES InpPeriod=PERIOD_H1; // Período
input ENUM_BASE_CORNER InpCorner=CORNER_LEFT_UPPER; // Canto de ancoragem
input int InpScale=2; // Escala
input bool InpDateScale=true; // Exibição da escala de tempo
input bool InpPriceScale=true; // Exibição da escala de preço
ObjectSetString(chart_ID,name,OBJPROP_SYMBOL,symbol);
//--- definir o período
ObjectSetInteger(chart_ID,name,OBJPROP_PERIOD,period);
//--- definir a escala
ObjectSetInteger(chart_ID,name,OBJPROP_CHART_SCALE,scale);
//--- exibir (true) ou ocultar (false) a escala de tempo
ObjectSetInteger(chart_ID,name,OBJPROP_DATE_SCALE,date_scale);
//--- exibir (true) ou ocultar (false) a escala de preço
ObjectSetInteger(chart_ID,name,OBJPROP_PRICE_SCALE,price_scale);
//--- definir a cor da borda quando o modo de destaque do objeto é habilitado
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- definir o estilo de linha quando o modo de destaque do objeto é habilitado
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- definir o tamanho do ponto de ancoragem para movimentar o objeto
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,point_width);
//--- exibir em primeiro plano (false) ou fundo (true)
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- Habilitar (true) ou desabilitar (false) o modo de movimento da etiqueta pelo mouse
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- ocultar (true) ou exibir (false) o nome do objeto gráfico na lista de objeto
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- definir a prioridade para receber o evento com um clique do mouse no gráfico
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Definir o símbolo e período de tempo do objeto Chart |
//+------------------------------------------------------------------+
bool ObjectChartSetSymbolAndPeriod(const long chart_ID=0, // ID do gráfico (não ob
const string name="Chart", // nome do objeto
const string symbol="EURUSD", // símbolo
const ENUM_TIMEFRAMES period=PERIOD_H1) // período de tempo
{
//--- redefine o valor de erro
ResetLastError();
//--- definir símbolo e período de tempo do objeto Chart
if(!ObjectSetString(chart_ID,name,OBJPROP_SYMBOL,symbol))
{
Print(__FUNCTION__,
": falha para definir o símbolo do objeto \"Chart\"! Código de erro = ",GetLastError())
return(false);
}
if(!ObjectSetInteger(chart_ID,name,OBJPROP_PERIOD,period))
{
Print(__FUNCTION__,
": falha para definir o símbolo do objeto \"Chart\"! Código de erro = ",GetLastError())
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Mover objeto Chart |
//+------------------------------------------------------------------+
bool ObjectChartMove(const long chart_ID=0, // ID do gráfico (não objeto de um Gráfico)
const string name="Chart", // nome do objeto
const int x=0, // coordenada X
const int y=0) // coordenada Y
{
//--- redefine o valor de erro
ResetLastError();
//--- mover o objeto
if(!ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x))
{
Print(__FUNCTION__,
": falha ao mover coordenada X do objeto \"Chart\"! Código de erro = ",GetLastError());
return(false);
}
if(!ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y))
{
Print(__FUNCTION__,
": falha ao mover coordenada Y do objeto \"Chart\"! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Alterar o tamanho do objeto Chart |
//+------------------------------------------------------------------+
bool ObjectChartChangeSize(const long chart_ID=0, // ID do gráfico (não objeto de um Gráfico)
const string name="Chart", // nome do objeto
const int width=300, // largura
const int height=200) // altura
{
//--- redefine o valor de erro
ResetLastError();
//--- alterar o tamanho do objeto
if(!ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width))
{
Print(__FUNCTION__,
": falha ao alterar a largura do objeto \"Chart\" ! Código de erro = ",GetLastError());
return(false);
}
if(!ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height))
{
Print(__FUNCTION__,
": falha ao alterar a altura do objeto \"Chart\" ! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Retorno do ID do objeto Chart |
//+------------------------------------------------------------------+
long ObjectChartGetID(const long chart_ID=0, // ID do gráfico (não objeto de um Gráfico)
const string name="Chart") // nome do objeto
{
//--- preparar a variável para obter o ID do objeto Chart
long id=-1;
//--- redefine o valor de erro
ResetLastError();
//--- obter ID
if(!ObjectGetInteger(chart_ID,name,OBJPROP_CHART_ID,0,id))
{
Print(__FUNCTION__,
": falha ao obter o ID do objeto \"Chart\"! Código de erro = ",GetLastError());
}
//--- retorno do resultado
return(id);
}
//+------------------------------------------------------------------+
//| Deletar o objeto Chart |
//+------------------------------------------------------------------+
bool ObjectChartDelete(const long chart_ID=0, // ID do gráfico (não objeto de um Gráfico)
const string name="Chart") // nome do objeto
{
//--- redefine o valor de erro
ResetLastError();
//--- excluir o botão
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": falha ao deletar objeto \"Chart\"! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
Sleep(1000);
//--- estender objeto Chart
int steps=(int)MathMin(x_distance*7/16,y_distance*7/16);
for(int i=0;i<steps;i++)
{
//--- redimensionar
x_size+=1;
y_size+=1;
if(!ObjectChartChangeSize(0,InpName,x_size,y_size))
return;
//--- verificar se o funcionamento do script foi desativado a força
if(IsStopped())
return;
//--- redesenhar o gráfico e esperar por 0.01 segundos
ChartRedraw();
Sleep(10);
}
//--- meio segundo de atraso
Sleep(500);
//--- alterar período de tempo do gráfico
if(!ObjectChartSetSymbolAndPeriod(0,InpName,InpSymbol,PERIOD_M1))
return;
ChartRedraw();
//--- três segundos de atraso
Sleep(3000);
//--- excluir o objeto
ObjectChartDelete(0,InpName);
ChartRedraw();
//--- esperar por um segundo
Sleep(1000);
//---
}
OBJ_BITMAP
Objeto Bitmap.
Observação
Para objeto Bitmap, você pode selecionar o escopo de visibilidade de uma imagem.
Exemplo
O seguinte script cria v ários bitmaps no gráfico. Funções especiais têm sido desenvolvidas para
criar e alterar as propriedades do objeto gráfico. Você pode utilizar estas funções " as is " em seus
próprios aplicativos.
//--- descrição
#property description "Script cria um bitmap na janela do gráfico."
//--- janela de exibição dos parâmetros de entrada durante inicialização do script
#property script_show_inputs
//--- entrada de parâmetros do script
input string InpFile="\\Images\\dollar.bmp"; // Nome do arquivo Bitmap
input int InpWidth=24; // Coordenada X do escopo de visibilidade
input int InpHeight=24; // Coordenada Y do escopo de visibilidade
input int InpXOffset=4; // Deslocamento do escopo de visibilidade pel
input int InpYOffset=4; // Deslocamento do escopo de visibilidade pel
input color InpColor=clrRed; // Cor da borda quando destacada
input ENUM_LINE_STYLE InpStyle=STYLE_SOLID; // Estilo de linha quando destacada
input int InpPointWidth=1; // Tamanho do ponto para movimento
input bool InpBack=false; // Objeto de Fundo
input bool InpSelection=false; // Destaque para mover
//--- realizar uma mudança a partir desta área de exibição de uma outra parte da imagem
ObjectSetInteger(chart_ID,name,OBJPROP_XOFFSET,x_offset);
ObjectSetInteger(chart_ID,name,OBJPROP_YOFFSET,y_offset);
//--- definir a cor da borda quando o modo de destaque do objeto é habilitado
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- definir o estilo de linha quando o modo de destaque do objeto é habilitado
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- definir o tamanho do ponto de ancoragem para movimentar o objeto
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,point_width);
//--- exibir em primeiro plano (false) ou fundo (true)
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- Habilitar (true) ou desabilitar (false) o modo de movimento da etiqueta pelo mouse
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- ocultar (true) ou exibir (false) o nome do objeto gráfico na lista de objeto
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- definir a prioridade para receber o evento com um clique do mouse no gráfico
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Definir uma nova imagem para o bitmap |
//+------------------------------------------------------------------+
bool BitmapSetImage(const long chart_ID=0, // ID do gráfico
const string name="Bitmap", // nome do bitmap
const string file="") // caminho para o arquivo
{
//--- redefine o valor de erro
ResetLastError();
//--- definir o caminho para o arquivo da imagem
if(!ObjectSetString(chart_ID,name,OBJPROP_BMPFILE,file))
{
Print(__FUNCTION__,
": falha ao carregar a imagem! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Criar um bitmap na janela do gráfico |
//+------------------------------------------------------------------+
bool BitmapMove(const long chart_ID=0, // ID do gráfico
const string name="Bitmap", // nome do bitmap
datetime time=0, // ponto de ancoragem do tempo
double price=0) // ponto de ancoragem do preço
{
//--- se a posição do ponto não está definida, mover para a barra atual tendo o preço Bid
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- redefine o valor de erro
ResetLastError();
//--- mover o ponto de ancoragem
if(!ObjectMove(chart_ID,name,0,time,price))
{
Print(__FUNCTION__,
": falha ao mover o ponto de ancoragem! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Alterar tamanho do escopo de visibilidade (objeto) |
//+------------------------------------------------------------------+
bool BitmapChangeSize(const long chart_ID=0, // ID do gráfico
const string name="Bitmap", // nome do bitmap
const int width=0, // largura do bitmap
const int height=0) // altura do bitmap
{
//--- redefine o valor de erro
ResetLastError();
//--- alterar tamanho do bitmap
if(!ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width))
{
Print(__FUNCTION__,
": falha ao alterar a largura do bitmap! Código de erro = ",GetLastError());
return(false);
}
if(!ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height))
{
Print(__FUNCTION__,
": falha ao alterar a altura do bitmap! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+--------------------------------------------------------------------+
//| Mudar coordenada canto superior esquerdo do escopo de visibilidade |
//+--------------------------------------------------------------------+
bool BitmapMoveVisibleArea(const long chart_ID=0, // ID do gráfico
const string name="Bitmap", // nome do bitmap
const int x_offset=0, // coordenada X do escopo de visibilidade
const int y_offset=0) // coordenada Y do escopo de visibilidade
{
//--- redefine o valor de erro
ResetLastError();
//--- alterar as coordenadas do escopo de visibilidade do bitmap
if(!ObjectSetInteger(chart_ID,name,OBJPROP_XOFFSET,x_offset))
{
Print(__FUNCTION__,
": falha para alterar coordenada X do escopo de visibilidade! Código de erro = ",GetLas
return(false);
}
if(!ObjectSetInteger(chart_ID,name,OBJPROP_YOFFSET,y_offset))
{
Print(__FUNCTION__,
": falha para alterar coordenada Y do escopo de visibilidade! Código de erro = ",GetLas
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Excluir um bitmap |
//+------------------------------------------------------------------+
bool BitmapDelete(const long chart_ID=0, // ID do gráfico
const string name="Bitmap") // nome do bitmap
{
//--- redefine o valor de erro
ResetLastError();
//--- excluir a etiqueta
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": falha ao excluir um bitmap! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Verificar valores de ponto de ancoragem e definir valores padrão |
//| para aqueles vazios |
//+------------------------------------------------------------------+
void ChangeBitmapEmptyPoint(datetime &time,double &price)
{
//--- se o tempo do ponto não está definido, será na barra atual
if(!time)
time=TimeCurrent();
//--- se o preço do ponto não está definido, ele terá valor Bid
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
}
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
datetime date[]; // array para armazenar datas das barras visíveis
double close[]; // array para armazenar Fechamento de preços
//--- nome do arquivo bitmap
string file="\\Images\\dollar.bmp";
//--- número de barras visíveis na janela do gráfico
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- alocação de memória
ArrayResize(date,bars);
ArrayResize(close,bars);
//--- preencher o array das datas
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Falha ao copiar valores de tempo! Código de erro = ",GetLastError());
return;
}
//--- preencher o array dos preços Baixos
if(CopyClose(Symbol(),Period(),0,bars,close)==-1)
{
Print("Falha ao copiar os valores dos preços Baixos! Código de erro = ",GetLastError());
return;
}
//--- definir como frequentemente as imagens devem ser exibidas
int scale=(int)ChartGetInteger(0,CHART_SCALE);
//--- definir o passo
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;
}
//--- criar bitmaps para valores de barra Alta e Baixa (com intervalos)
for(int i=0;i<bars;i+=step)
{
//--- criar os 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;
}
//--- verificar se o funcionamento do script foi desativado a força
if(IsStopped())
return;
//--- redesenhar o gráfico
ChartRedraw();
// 0.05 segundos de atraso
Sleep(50);
}
//--- meio segundo de atraso
Sleep(500);
//--- excluir sinal Sell
for(int i=0;i<bars;i+=step)
{
if(!BitmapDelete(0,"Bitmap_"+(string)i))
return;
if(!BitmapDelete(0,"Bitmap_"+(string)i))
return;
//--- redesenhar o gráfico
ChartRedraw();
// 0.05 segundos de atraso
Sleep(50);
}
//---
}
OBJ_BITMAP_LABEL
Objeto Etiqueta Bitmap.
Observação
Posição do ponto de ancoragem relativa a etiqueta pode ser selecionada do enumerador
ENUM _ANCH OR_POINT . Coordenadas do ponto de ancoragem são em pixels.
Você também pode selecionar uma ancoragem do bitmap no canto a partir da enumeração
ENUM _BASE_CORNER .
Para etiqueta bitmap, você pode selecionar no escopo de visibilidade de uma imagem.
Exemplo
O seguinte script cria v ários bitmaps no gráfico. Funções especiais têm sido desenvolvidas para
criar e alterar as propriedades do objeto gráfico. Você pode utilizar estas funções " as is " em seus
próprios aplicativos.
//--- descrição
#property description "Script criando objeto \"Bitmap Label\"."
//--- janela de exibição dos parâmetros de entrada durante inicialização do script
#property script_show_inputs
//--- entrada de parâmetros do script
input string InpName="BmpLabel"; // Nome etiqueta
input string InpFileOn="\\Images\\dollar.bmp"; // O nome do arquivo para o modo On
input string InpFileOff="\\Images\\euro.bmp"; // O nome do arquivo para o modo Off
input bool InpState=false; // Etiqueta pressionada/liberada
input ENUM_BASE_CORNER InpCorner=CORNER_LEFT_UPPER; // Canto do gráfico para ancoragem
input ENUM_ANCHOR_POINT InpAnchor=ANCHOR_CENTER; // Tipo de ancoragem
{
Print(__FUNCTION__,
": falha para carregar a imagem para o modo Off! Código de erro = ",GetLastError());
return(false);
}
//--- definir coordenadas da etiqueta
ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x);
ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);
//--- definir escopo de visibilidade para a imagem, se os valores da largura ou altura
//--- excederem a largura e a altura (respectivamente) de uma imagem de origem,
//--- não será desenhada, no caso oposto
//--- apenas a parte correspondente a esses valores será desenhada
ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width);
ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height);
//--- definir a parte de uma imagem que está sendo exibida no escopo de visibilidade,
//--- a parte padrão é a área superior esquerda de uma imagem, os valores permitem
//--- realizar uma mudança a partir desta área de exibição de uma outra parte da imagem
ObjectSetInteger(chart_ID,name,OBJPROP_XOFFSET,x_offset);
ObjectSetInteger(chart_ID,name,OBJPROP_YOFFSET,y_offset);
//--- definir os status da etiqueta(pressionada ou liberada)
ObjectSetInteger(chart_ID,name,OBJPROP_STATE,state);
//--- determinar o canto do gráfico onde as coordenadas do ponto são definidas
ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);
//--- tipo de definição de ancoragem
ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);
//--- definir a cor da borda quando o modo de destaque do objeto é habilitado
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- definir o estilo de linha quando o modo de destaque do objeto é habilitado
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- definir o tamanho do ponto de ancoragem para movimentar o objeto
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,point_width);
//--- exibir em primeiro plano (false) ou fundo (true)
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- Habilitar (true) ou desabilitar (false) o modo de movimento da etiqueta pelo mouse
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- ocultar (true) ou exibir (false) o nome do objeto gráfico na lista de objeto
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- definir a prioridade para receber o evento com um clique do mouse no gráfico
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Definir uma nova imagem para objeto etiqueta Bitmap |
//+------------------------------------------------------------------+
bool BitmapLabelSetImage(const long chart_ID=0, // ID do gráfico
const string name="BmpLabel", // nome da etiqueta
const int on_off=0, // modificador (On ou Off)
ResetLastError();
//--- alterar o tamanho do objeto
if(!ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width))
{
Print(__FUNCTION__,
": falha ao alterar a largura do objeto! Código de erro = ",GetLastError());
return(false);
}
if(!ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height))
{
Print(__FUNCTION__,
": falha ao alterar a altura do objeto! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+--------------------------------------------------------------------+
//| Mudar coordenada canto superior esquerdo do escopo de visibilidade |
//+--------------------------------------------------------------------+
bool BitmapLabelMoveVisibleArea(const long chart_ID=0, // ID do grafico
const string name="BmpLabel", // nome da etiqueta
const int x_offset=0, // coordenada X do escopo de visibili
const int y_offset=0) // coordenada Y do escopo de visibili
{
//--- redefine o valor de erro
ResetLastError();
//--- alterar as coordenadas do escopo de visibilidade do objeto
if(!ObjectSetInteger(chart_ID,name,OBJPROP_XOFFSET,x_offset))
{
Print(__FUNCTION__,
": falha para alterar coordenada X do escopo de visibilidade! Código de erro = ",GetLas
return(false);
}
if(!ObjectSetInteger(chart_ID,name,OBJPROP_YOFFSET,y_offset))
{
Print(__FUNCTION__,
": falha para alterar coordenada Y do escopo de visibilidade! Código de erro = ",GetLas
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Excluir o Objeto "Bitmap label" |
//+------------------------------------------------------------------+
bool BitmapLabelDelete(const long chart_ID=0, // ID do gráfico
const string name="BmpLabel") // nome da etiqueta
{
for(int i=0;i<6;i++)
{
//--- alterar o tamanho do escopo
width--;
height--;
if(!BitmapLabelChangeSize(0,InpName,width,height))
return;
//--- verificar se o funcionamento do script foi desativado a força
if(IsStopped())
return;
//--- redesenhar o gráfico
ChartRedraw();
// 0.3 segundos de atraso
Sleep(300);
}
//--- 1 segundo de atraso
Sleep(1000);
//--- alterar as coordenadas do escopo de visibilidade da etiqueta em loop
for(int i=0;i<2;i++)
{
//--- alterar coordenadas do escopo de visibilidade
x_offset++;
y_offset++;
if(!BitmapLabelMoveVisibleArea(0,InpName,x_offset,y_offset))
return;
//--- verificar se o funcionamento do script foi desativado a força
if(IsStopped())
return;
//--- redesenhar o gráfico
ChartRedraw();
// 0.3 segundos de atraso
Sleep(300);
}
//--- 1 segundo de atraso
Sleep(1000);
//--- excluir a etiqueta
BitmapLabelDelete(0,InpName);
ChartRedraw();
//--- 1 segundo de atraso
Sleep(1000);
//---
}
OBJ_EDIT
Objeto Edit.
Observação
Coordenadas do ponto de ancoragem são em pixels. Você também pode selecionar uma ancoragem
do Edit no canto a partir do enumerador ENUM _BASE_CORNER .
Você também pode selecionar um dos tipos de alinhamento de texto dentro de Edit a partir da
enumeração ENUM _AL IGN_MODE.
Exemplo
O seguinte script cria e move o objeto Edit no gráfico. Funções especiais têm sido desenvolvidas
para criar e alterar as propriedades do objeto gráfico. Você pode utilizar estas funções " as is " em
seus próprios aplicativos.
//--- descrição
#property description "Script cria objeto \"Edit\"."
//--- janela de exibição dos parâmetros de entrada durante inicialização do script
#property script_show_inputs
//--- entrada de parâmetros do script
input string InpName="Edit"; // Nome do objeto
input string InpText="Text"; // Texto de objeto
input string InpFont="Arial"; // Fonte
input int InpFontSize=14; // Tamanho da fonte
input ENUM_ALIGN_MODE InpAlign=ALIGN_CENTER; // Tipo de alinhamento de texto
input bool InpReadOnly=false; // Habilidade de editar
input ENUM_BASE_CORNER InpCorner=CORNER_LEFT_UPPER; // Canto do gráfico para ancoragem
input color InpColor=clrBlack; // Cor do texto
}
if(!ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS,0,y_distance))
{
Print("Falha ao obter a altura do gráfico! Código de erro = ",GetLastError());
return;
}
//--- definir o passo para mudar o campo edit
int x_step=(int)x_distance/64;
//--- definir coordenadas do campo edit e seu tamanho
int x=(int)x_distance/8;
int y=(int)y_distance/2;
int x_size=(int)x_distance/8;
int y_size=InpFontSize*2;
//--- armazenar o texto na variável local
string text=InpText;
//--- criar campo de edição
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;
}
//--- redesenhar o gráfico e esperar por um segundo
ChartRedraw();
Sleep(1000);
//--- estender o campo edit
while(x_size-x<x_distance*5/8)
{
//--- aumentar a largura do campo edit
x_size+=x_step;
if(!EditChangeSize(0,InpName,x_size,y_size))
return;
//--- verificar se o funcionamento do script foi desativado a força
if(IsStopped())
return;
//--- redesenhar o gráfico e esperar por 0.05 segundos
ChartRedraw();
Sleep(50);
}
//--- meio segundo de atraso
Sleep(500);
//--- alterar o texto
for(int i=0;i<20;i++)
{
//--- adicionar "+" no início e no final
text="+"+text+"+";
if(!EditTextChange(0,InpName,text))
return;
//--- verificar se o funcionamento do script foi desativado a força
if(IsStopped())
return;
//--- redesenhar o gráfico e esperar por 0.1 segundos
ChartRedraw();
Sleep(100);
}
//--- meio segundo de atraso
Sleep(500);
//--- excluir campo edit
EditDelete(0,InpName);
ChartRedraw();
//--- esperar por um segundo
Sleep(1000);
//---
}
OBJ_EVENT
Objeto Evento.
Observação
Quando mover o mouse sobre o evento, o texto aparece.
Exemplo
O seguinte script cria e move o objeto Evento no gráfico. Funções especiais têm sido desenvolvidas
para criar e alterar as propriedades do objeto gráfico. Você pode utilizar estas funções " as is " em
seus próprios aplicativos.
//--- descrição
#property description "Script desenha objeto gráfico \"Evento\"."
#property description "Coordenadas do ponto de ancoragem é configurado em porcentagem da"
#property description "largura da janela do gráfico em barras."
//--- janela de exibição dos parâmetros de entrada durante inicialização do script
#property script_show_inputs
//--- entrada de parâmetros do script
input string InpName="Event"; // Nome do evento
input int InpDate=25; // Data do Evento, %
input string InpText="Text"; // Texto do Evento
input color InpColor=clrRed; // Cor do Evento
input int InpWidth=1; // Tamanho do ponto quando destacado
input bool InpBack=false; // Evento de Fundo
input bool InpSelection=false; // Destaque para mover
input bool InpHidden=true; // Ocultar na lista de objeto
Print(__FUNCTION__,
": falha ao deletar objeto \"Evento\"! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
//--- verificar a exatidão dos parâmetros de entrada
if(InpDate<0 || InpDate>100)
{
Print("Erro! Valores incorretos dos parâmetros de entrada!");
return;
}
//--- número de barras visíveis na janela do gráfico
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- array para armazenar a data de valores a serem utilizados
//--- para definir e alterar as coordenadas de pontos de ancoragem
datetime date[];
//--- alocação de memória
ArrayResize(date,bars);
//--- preencher o array das datas
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Falha ao copiar valores de tempo! Código de erro = ",GetLastError());
return;
}
//--- definir os pontos para criar um objeto
int d=InpDate*(bars-1)/100;
//--- criar objeto Evento
if(!EventCreate(0,InpName,0,InpText,date[d],InpColor,InpWidth,
InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- redesenhar o gráfico e esperar por um segundo
ChartRedraw();
Sleep(1000);
//--- agora, mover o objeto
//--- contador de loop
int h_steps=bars/2;
//--- mover o objeto
for(int i=0;i<h_steps;i++)
{
OBJ_RECTANGLE_LABEL
Objeto Etiqueta R etangular.
Observação
Coordenadas do ponto de ancoragem são em pixels. É possível a ancoragem no canto de uma
etiqueta retangular a partir do enumerador ENUM _BASE_CORNER . O tipo de borda da etiqueta
retangular pode ser selecionado a partir do enumerador ENUM _BORDER_TYPE.
Exemplo
O seguinte script cria e move o objeto Etiqueta R etangular no gráfico. Funções especiais têm sido
desenvolvidas para criar e alterar as propriedades do objeto gráfico. Você pode utilizar estas
funções " as is " em seus próprios aplicativos.
//--- descrição
#property description "Script cria objeto gráfico \"Etiqueta Retangular\"."
//--- janela de exibição dos parâmetros de entrada durante inicialização do script
#property script_show_inputs
//--- entrada de parâmetros do script
input string InpName="RectLabel"; // Nome etiqueta
input color InpBackColor=clrSkyBlue; // Fundo da cor
input ENUM_BORDER_TYPE InpBorder=BORDER_FLAT; // Tipo de Borda
input ENUM_BASE_CORNER InpCorner=CORNER_LEFT_UPPER; // Canto do gráfico para ancoragem
input color InpColor=clrDarkBlue; // Cor da borda plana (Flat)
input ENUM_LINE_STYLE InpStyle=STYLE_SOLID; // Estilo da borda plana (Flat)
input int InpLineWidth=3; // Largura da borda plana (Flat)
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- definir a largura da borda plana
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,line_width);
//--- exibir em primeiro plano (false) ou fundo (true)
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- Habilitar (true) ou desabilitar (false) o modo de movimento da etiqueta pelo mouse
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- ocultar (true) ou exibir (false) o nome do objeto gráfico na lista de objeto
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- definir a prioridade para receber o evento com um clique do mouse no gráfico
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Mover a etiqueta retangular |
//+------------------------------------------------------------------+
bool RectLabelMove(const long chart_ID=0, // ID do gráfico
const string name="RectLabel", // nome da etiqueta
const int x=0, // coordenada X
const int y=0) // coordenada Y
{
//--- redefine o valor de erro
ResetLastError();
//--- mover a etiqueta retangular
if(!ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x))
{
Print(__FUNCTION__,
": falha para mover coordenada X do objeto! Código de erro = ",GetLastError());
return(false);
}
if(!ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y))
{
Print(__FUNCTION__,
": falha para mover coordenada X do objeto! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Alterar o tamanho da etiqueta retangular |
//+------------------------------------------------------------------+
bool RectLabelChangeSize(const long chart_ID=0, // ID do gráfico
const string name="RectLabel", // nome da etiqueta
const int width=50, // largura da etiqueta
const int height=18) // altura da etiqueta
{
Propriedades do Objeto
Os objetos gráficos podem ter muitas propriedades dependendo do tipo de objeto. A configuração e a
obtenção de valores das propriedades dos objetos são efetuadas de acordo com as funções de trabalho
com objetos gráficos.
T odos os objetos usados na análise técnica são vinculados aos gráficos nas coordenadas de preço e
tempo: linha de tendência, canais, ferramentas de Fibonacci, etc. Mas há uma série de objetos de
apoio projetados para melhorar a interface, e que estão vinculados à parte sempre visível do gráfico
(janela principal ou subjanela do gráfico do indicador):
· X/Y – as coordenadas do ponto âncora são especificadas em pixels em relação a um dos cantos do
gráfico;
· W idth/Height – os objetos têm largura e altura. Se você definir " apenas leitura" , isso significa que
os valores para largura e altura são calculados somente após o processamento do objeto no gráfico;
· Date/Price – as coordenadas do ponto âncora são definidas pelo par data/preço;
· OBJPROP_CORNER – define o ângulo do gráfico, que especifica as coordenadas do ponto de âncora.
Pode ser um dos 4 valores de enumeração ENUM _BASE_CORNER;
· OBJPROP_ANCHOR – define a posição do ponto de âncora no objeto, e pode ser um dos 9 valores de
enumeração ENUM _ANCH OR_POINT . Precisamente a partir desse ponto até ao canto selecionado são
expecificadas as cordenadas em pixels ;
· OBJPROP_ANGLE – define o ângulo de rotação do objeto no sentido anti-horário.
As funções que definem as propriedades dos objetos gráficos, bem como as operações ObjectCreate()
e ObjectMove() para criar e mover objetos ao longo do gráfico são, na verdade, usadas para enviar
comandos para o gráfico. Se essas funções forem executadas com êxito, o comando será incluído na
fila comum dos eventos do gráfico. As mudanças visuais nas propriedades dos objetos gráficos são
implementadas ao lidar com a fila dos eventos do gráfico.
Assim, não espere uma atualização visual imediata de objetos gráficos após chamar essas funções.
Geralmente, os objetos gráficos no gráfico são atualizados automaticamente pelo terminal após a
mudança de eventos - a chegada de uma nova cotação, o redimensionamento da janela de gráfico,
etc. Use a função ChartR edraw() para forçar a atualização dos objetos gráficos.
ENUM_OBJECT_PROPERTY_INTEGER
OBJPR OP_CH ART_SCALE A escala para o objeto Chart int valor na faixa de 0–5
Ao usar operações de gráfico para o objeto " Chart" (OBJ_CH ART ), as seguintes limitações são
impostas :
Para os objetos OBJ_BIT MAP_LABEL e OBJ_BIT MAP, um modo especial de exibição de imagem pode
ser definido por programação. Neste modo, somente parte da imagem original (na qual uma área
visível retangular é aplicada) é exibida, enquanto o resto da imagem fica invisível. O tamanho desta
área deve ser definido usando a propriedade OBJPR OP_XS IZE e OBJPR OP_YS IZE. A área visível pode
ser " movida" somente dentro da imagem original usando as propriedades OBJPR OP_XOFFSET e
OBJPR OP_YOFFSET .
Para objetos de tamanho fixo: OBJ_BUTT ON, OBJ_R ECT ANGLE_LABEL, OBJ_EDIT e OBJ_CH ART
propriedades OBJPR OP_XDIS T ANCE e OBJPR OP_YDIS T ANCE defina a posição do canto superior
esquerdo do ponto do objeto em relação ao canto de gráfico (OBJPR OP_CORNER ), a partir das quais as
coordenadas X e Y serão contadas em pixels.
ENUM_OBJECT_PROPERTY_DOUBLE
ENUM_OBJECT_PROPERTY_STRING
Para o objeto OBJ_R ECT ANGLE_LABEL ("R ótulo de R etângulo" ) um dentre os três modos de design
podem ser definidos, correspondendo aos valores de ENUM _BORDER_TYPE.
ENUM_BORDER_TY PE
Identificador Descrição
BORDER_FLAT Forma lisa
Para o objeto OBJ_EDIT (" Edit" ) e para a função ChartScreenShot(), pode-se especificar o tipo de
alinhamento horizontal usando os valores da enumeração ENUM _AL IGN_MODE.
ENUM_ALIGN_MODE
Identificador Descrição
AL IGN_LEFT Alinhamento a esquerda
Exemplo:
#define UP "\x0431"
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
//---
string label_name="my_OBJ_LABEL_object";
if(ObjectFind(0,label_name)<0)
{
Print("Objeto ",label_name," não encontrado. Código de erro = ",GetLastError());
//--- cria objeto Rótulo
ObjectCreate(0,label_name,OBJ_LABEL,0,0,0);
//--- define coordenada X
ObjectSetInteger(0,label_name,OBJPROP_XDISTANCE,200);
//--- define coordenada Y
ObjectSetInteger(0,label_name,OBJPROP_YDISTANCE,300);
//--- define cor de texto
ObjectSetInteger(0,label_name,OBJPROP_COLOR,clrWhite);
//--- define texto para objeto Rótulo
ObjectSetString(0,label_name,OBJPROP_TEXT,UP);
//--- define fonte
ObjectSetString(0,label_name,OBJPROP_FONT,"Wingdings");
//--- define tamanho de fonte
ObjectSetInteger(0,label_name,OBJPROP_FONTSIZE,10);
//--- rotação de 45 graus em sentido horário
ObjectSetDouble(0,label_name,OBJPROP_ANGLE,-45);
//--- desabilita seleção de mouse
ObjectSetInteger(0,label_name,OBJPROP_SELECTABLE,false);
//--- desenha o objeto no gráfico
ChartRedraw(0);
}
}
· X/Y – as coordenadas do ponto âncora são especificadas em pixels em relação a um dos cantos do
gráfico;
· W idth/Height – os objetos têm largura e altura. Se você definir " apenas leitura" , isso significa que
os valores para largura e altura são calculados somente após o processamento do objeto no gráfico;
· Date/Price – as coordenadas do ponto âncora são definidas pelo par data/preço;
· OBJPROP_CORNER – define o ângulo do gráfico, que especifica as coordenadas do ponto de âncora.
Pode ser um dos 4 valores de enumeração ENUM _BASE_CORNER;
· OBJPROP_ANCHOR – define a posição do ponto de âncora no objeto, e pode ser um dos 9 valores de
enumeração ENUM _ANCH OR_POINT . Precisamente a partir desse ponto até ao canto selecionado são
expecificadas as cordenadas em pixels ;
· OBJPROP_ANGLE – define o ângulo de rotação do objeto no sentido anti-horário.
A variante necess ária pode ser especificada usando a função ObjectSetInteger(chart_handle,
object_name, OBJPR OP_ANCH OR , anchor_point_mode), onde anchor_point_mode é um dos valores de
ENUM _ANCH OR_POINT .
ENUM_ANCHOR_POINT
ID Descrição
ANCH OR_LEFT_UPPER Ponto de ancoragem no canto superior esquerdo
Os objetos OBJ_BUTT ON, OBJ_R ECT ANGLE_LABEL, OBJ_EDIT e OBJ_CH ART possuem um ponto de
ancoragem fixo no canto superior esquerdo (ANCH OR_LEFT_UPPER ).
Exemplo:
string text_name="my_OBJ_TEXT_object";
if(ObjectFind(0,text_name)<0)
{
Print("Objeto ",text_name," não encontrado. Código de erro = ",GetLastError());
//--- Obtém o preço máximo do gráfico
double chart_max_price=ChartGetDouble(0,CHART_PRICE_MAX,0);
//--- Cria o objeto Label (Rótulo)
ObjectCreate(0,text_name,OBJ_TEXT,0,TimeCurrent(),chart_max_price);
//--- Define cor do texto
ObjectSetInteger(0,text_name,OBJPROP_COLOR,clrWhite);
//--- Define cor de fundo
ObjectSetInteger(0,text_name,OBJPROP_BGCOLOR,clrGreen);
//--- Define texto para o objeto Label (Rótulo)
ObjectSetString(0,text_name,OBJPROP_TEXT,TimeToString(TimeCurrent()));
//--- Define fonte de texto
ObjectSetString(0,text_name,OBJPROP_FONT,"Trebuchet MS");
//--- Define tamanho de fonte
ObjectSetInteger(0,text_name,OBJPROP_FONTSIZE,10);
//--- Vincula no canto superior direito
ObjectSetInteger(0,text_name,OBJPROP_ANCHOR,ANCHOR_RIGHT_UPPER);
//--- Gira 90 graus em sentido anti-horário
ObjectSetDouble(0,text_name,OBJPROP_ANGLE,90);
//--- Proíbe a seleção do objeto pelo mouse
ObjectSetInteger(0,text_name,OBJPROP_SELECTABLE,false);
//--- redesenha objeto
ChartRedraw(0);
}
Objetos gráficos de Seta (OBJ_ARR OW ) têm somente 2 formas de link ar suas coordenadas. Os
identificadores estão listados em ENUM _ARR OW_ANCH OR .
ENUM_ARROW_ANCHOR
ID Descrição
ANCH OR_T OP Ancoragem no lado de cima
Exemplo:
void OnStart()
{
//--- Arrays auxiliares
double Ups[],Downs[];
datetime Time[];
//--- Define os arrays como séries de tempo
ArraySetAsSeries(Ups,true);
ArraySetAsSeries(Downs,true);
ArraySetAsSeries(Time,true);
//--- Cria handle do Indicador Fractais
int FractalsHandle=iFractals(NULL,0);
Print("FractalsHandle = ",FractalsHandle);
//--- Define valor do último erro para Zero
ResetLastError();
//--- Tenta copiar os valores do indicador
int copied=CopyBuffer(FractalsHandle,0,0,1000,Ups);
if(copied<=0)
{
Print("Não é possível copiar os fractais de alta. Erro = ",GetLastError());
return;
}
ResetLastError();
//--- Tenta copiar os valores do indicador
copied=CopyBuffer(FractalsHandle,1,0,1000,Downs);
if(copied<=0)
{
Print("Não é possível copiar os fractais de baixa. Erro = ",GetLastError());
return;
}
ResetLastError();
//--- Copia a série de tempo contendo as barras de abertura das últimas 1000 barras
copied=CopyTime(NULL,0,0,1000,Time);
if(copied<=0)
{
Print("Não é possível copiar o tempo de abertura das últimas 1000 barras");
return;
}
· X/Y – as coordenadas do ponto âncora são especificadas em pixels em relação a um dos cantos do
gráfico;
· W idth/Height – os objetos têm largura e altura. Se você definir " apenas leitura" , isso significa que
os valores para largura e altura são calculados somente após o processamento do objeto no gráfico;
· Date/Price – as coordenadas do ponto âncora são definidas pelo par data/preço;
· OBJPROP_CORNER – define o ângulo do gráfico, que especifica as coordenadas do ponto de âncora.
Pode ser um dos 4 valores de enumeração ENUM _BASE_CORNER;
· OBJPROP_ANCHOR – define a posição do ponto de âncora no objeto, e pode ser um dos 9 valores de
enumeração ENUM _ANCH OR_POINT . Precisamente a partir desse ponto até ao canto selecionado são
expecificadas as cordenadas em pixels ;
ENUM_BASE_CORNER
ID Descrição
CORNER_LEFT_UPPER Centro de coordenadas está no canto superior
esquerdo do gráfico
Exemplo:
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("Не удалось создать объект OBJ_LABEL ",name,", Код ошибки = ", 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);
}
Visibilidade de Objetos
A combinação de flags de visibilidade de objeto determina as janelas de tempo de gráfico, onde o
objeto é visível. Para definir/obter o valor da propriedade OBJPR OP_TIMEFR AMES, você pode usar as
funções ObjectSetInteger()/ObjectGetInteger().
ID Valor Descrição
OBJ_NO_PERIODS 0 O objeto não desenhado em
nenhuma janela de tempo
Os flags de visibilidade podem ser combinados usando o símbolo "|" , por exemplo, a combinação de
flags OBJ_PERIOD_M 10|OBJ_PERIOD_H4 significa que o objeto será visível nas janelas de tempo de
10-minutos e 4-horas.
Exemplo:
void OnStart()
{
//---
string highlevel="PreviousDayHigh";
string lowlevel="PreviousDayLow";
double prevHigh; // O Máxima do dia anterior
double prevLow; // O Mínimo do dia anterior
double highs[],lows[]; // Arrays de Máximo e Mínimo
ObjectSetInteger(0,highlevel,OBJPROP_TIMEFRAMES,OBJ_PERIOD_M10|OBJ_PERIOD_H4);
}
else
{
Print("Não foi possível obter preços em lata nos últimos dois dias, Erro = ",GetLastError());
}
Também Veja
PeriodSeconds, Period, Janela de T empo de Gráfico, Data e H ora
ENUM_ELLIOT_W AVE_DEGREE
ID Descrição
ELL IOTT_GR AND_S UPER CYCLE Grande Super-ciclo
Exemplo:
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)))
{
//--- define o nível de marcação para INTERMEDIÁRIO
ObjectSetInteger(0,currobj,OBJPROP_DEGREE,ELLIOTT_INTERMEDIATE);
//--- exibe linhas entre topos de ondas
ObjectSetInteger(0,currobj,OBJPROP_DRAWLINES,true);
//--- define cor de linha
ObjectSetInteger(0,currobj,OBJPROP_COLOR,clrBlue);
//--- define largura de linha
ObjectSetInteger(0,currobj,OBJPROP_WIDTH,5);
//--- define descrição
ObjectSetString(0,currobj,OBJPROP_TEXT,"test script");
}
}
Objetos Gann
Para objetos Gann Fan (OBJ_GANNFAN) e Gann Grade (OBJ_GANNGRID) você pode especificar dois
valores da enumeração ENUM _GANN_DIR ECTION que definem a direção da tendência.
ENUM_GANN_DIRECTION
ID Descrição
GANN_UP_TR END Linha correspondente à tendência de alta
int bars_on_chart=ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- Cria um array, para escrever nele a hora de abertura de cada barra
datetime Time[];
//--- Arruma acesso ao array como o de série de tempo
ArraySetAsSeries(Time,true);
//--- Agora copia dados de barras visíveis no gráfico para dentro deste array
int times=CopyTime(NULL,0,0,bars_on_chart,Time);
if(times<=0)
{
Print("Não foi possível copiar o array com o tempo aberto!");
return;
}
//--- Preparações preliminares concluídas
Cores W eb
As seguintes contantes de cor são definidas para o tipo color:
A cor pode ser definida para um objeto usando a função ObjectSetInteger(). Para definir a cor de um
indicador customizado a função PlotIndexSetInteger() é usada. Para obter valores de cor existem
funções similares ObjectGetInteger() e PlotIndex GetInteger().
Exemplo:
//---- configurando um indicador
#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
Caracteres de W ingdings usados com o objeto OBJ_ARR OW:
Exemplo:
void OnStart()
{
//---
string up_arrow="up_arrow";
datetime time=TimeCurrent();
double lastClose[1];
int close=CopyClose(Symbol(),Period(),0,1,lastClose); // Obtém o preço de Fechamento
//--- Se o preço foi obtido
if(close>0)
{
ObjectCreate(0,up_arrow,OBJ_ARROW,0,0,0,0,0); // Cria uma seta
ObjectSetInteger(0,up_arrow,OBJPROP_ARROWCODE,241); // Define o código da seta
ObjectSetInteger(0,up_arrow,OBJPROP_TIME,time); // Define hora
ObjectSetDouble(0,up_arrow,OBJPROP_PRICE,lastClose[0]);// Define preço
ChartRedraw(0); // Desenha a seta agora
}
else
Print("Não foi possível obter o último Fechamento de preço!");
}
Constantes de Indicador
Existem 37 indicadores técnicos pré-definidos, que podem ser usados em programas escritos na
linguagem MQL5. Além disso, existe uma oportunidade para criar indicadores customizados usando a
função iCustom(). T odas as constantes requeridas para isso estão divididas em 5 grupos :
· Constantes de preço – para seleção do tipo de preço ou volume, sob o qual um indicador é calculado;
Constantes de Preço
Cálculos de indicatores técnicos requerem valores de preço e/ou valores de volumes, sob os quais
cálculos serão realizados. Existem 7 indicadores pré-definidos a partir da enumeração
ENUM _APPL IED_PRICE, usados para especificar o preço base desejado para os cálculos.
ENUM_APPLIED_PRICE
ID Descrição
PRICE_CLOSE Preço de Fechamento
Caso o volume seja usado nos cálculos, é necess ário especificar um dos dois valores a partir da
enumeração ENUM _APPL IED_VOL UME.
ENUM_APPLIED_VOLUME
ID Descrição
VOL UME_TICK Volume de T ick
Para selecionar uma variante necess ária para o cálculo, especifique um dos valores da enumeração
ENUM _S T O_PRICE.
ENUM_STO_PRICE
ID Descrição
S T O_LOWHIGH Cálculo é baseado em preços Mínimo/M áximo
Se um indicador técnico usa nos cálculos dados de preço, seu tipo é definido por
ENUM _APPL IED_PRICE, então o handle de qualquer indicador (incorporado no terminal ou escrito por
um usuário) pode ser usado como a série de preço de entrada. Neste caso, os valores do buffer zero
do indicador serão utilizados para os cálculos. Isso torna fácil construir valores de um indicador usando
valores de um outro indicador. O handle de um indicador customizado é criado por meio de chamada
da função iCustom().
Exemplo:
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots 2
//--- parâmetros de entrada
input int RSIperiod=14; // Período para cálculo do RSI
input int Smooth=8; // Período de suavização do RSI
input ENUM_MA_METHOD meth=MODE_SMMA; // Método de suavização
//---- plotar RSI
#property indicator_label1 "RSI"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//---- plotar 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 do indicador
double RSIBuffer[]; // Aqui nós armazenamos os valores do RSI
double RSI_SmoothedBuffer[]; // Aqui estarão os valores suavizados dos RSI
int RSIhandle; // Handle do indicador RSI
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado |
//+------------------------------------------------------------------+
void OnInit()
{
//--- mapeamento de buffers do indicador
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);
//---
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const int begin,
{
//--- Redefine o valor do último erro
ResetLastError();
//--- Obtém dados do indicador RSI em um array RSIBuffer[]
int copied=CopyBuffer(RSIhandle,0,0,rates_total,RSIBuffer);
if(copied<=0)
{
Print("Não é possível copiar os valores do indicador RSI. Erro = ",
GetLastError(),", copiado =",copied);
return(0);
}
//--- Cria o indicador de valores médios usando valores do RSI
int RSI_MA_handle=iMA(NULL,0,Smooth,0,meth,RSIhandle);
copied=CopyBuffer(RSI_MA_handle,0,0,rates_total,RSI_SmoothedBuffer);
if(copied<=0)
{
Print("Não é possível copiar o indicador suavizado do RSI. Erro = ",
GetLastError(),", copiado =",copied);
return(0);
}
//--- valor retorno de prev_calculated para a próxima chamada
return(rates_total);
}
Métodos de Suavização
Muitos indicadores técnicos são baseados em v ários métodos de suavização de séries de preço. Alguns
indicadores técnicos padrões requerem especificação da tipo de suavização como um parâmetro de
entrada. Para especificar o tipo desejado de suavização, identificadores listados na enumeração
ENUM _MA_METH OD são usados.
ENUM_MA_METHOD
ID Descrição
MODE_SMA Média simples
Exemplo:
double ExtJaws[];
double ExtTeeth[];
double ExtLips[];
//---- handles para médias móveis
int ExtJawsHandle;
int ExtTeethHandle;
int ExtLipsHandle;
//--- obtém handles de MA's
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);
Linhas de Indicadores
Alguns indicadores técnicos têm v ários buffers desenhados no gráfico. A numeração de buffers de um
indicador começa com 0. Ao copiar valores de indicador usando a função CopyBuffer() em um array do
tipo double, para alguns indicadores, pode-se indicar o identificador de um buffer copiado ao invés de
seu número.
Estilos de Desenho
Ao criarum indicador customizado, pode-se especificar um dos 18 tipos de plotagem gráfica (como
exibidos na janela do gráfico principal ou em uma sub-janela do gráfico), cujos valores são
especificados na enumeração ENUM _DR AW_TYPE.
Dependendo do estilo de desenho, pode-se necessitar de um a quatro buffers de valor (marcados como
INDICADOR_DAT A). Se um estilo admite alternação dinâmica de cores (todos os estilos contém COLOR
nos seus nomes), então você precisará de um buffer adicional de cor (tipo indicado
INDICAT OR_COLOR_INDEX). Os buffers de cor são sempre vinculados após os buffers de valores
correspondendo ao estilo.
ENUM_DRAW_TY PE
DR AW_SECTION Seção 1 0
DR AW_COLOR_HIS T O H istograma 1 1
GR AM multicolorida a partir
da linha zero
DR AW_COLOR_HIS T O H istograma 2 1
GR AM 2 multicolorido dos dois
buffers do indicador
ENUM_PLOT_PROPERTY_INTEGER
ENUM_PLOT_PROPERTY_DOUBLE
ENUM_PLOT_PROPERTY_STRING
5 estilos podem ser usados para desenhar linhas em indicadores customizados. Eles são v álidos
somente para a espessura de linha 0 ou 1.
ENUM_LINE_STY LE
ID Descrição
S TYLE_SOL ID Linha sólida
Para definir o estilo de desenho de linha e o tipo de desenho, a função PlotIndexSetInteger()é usada.
Para as extens ões de Fibonacci, a espessura e o estilo de desenho dos níveis podem ser indicados
usando a função ObjectSetInteger().
Exemplo:
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1
//--- buffers do indicador
double MABuffer[];
//+------------------------------------------------------------------+
ENUM_INDEX BUFFER_TY PE
ID Descrição
INDICAT OR_DAT A Dados para desenho
Um indicador customizado tem muitas configurações para fornecer uma exibição conveniente. Estas
configurações são feitas através da atribuição de propriedades de indicador correspondentes usando a
funções IndicatorSetDouble(), IndicatorSetInteger() e IndicatorSetString(). Identificadores de
propriedades de indicador são listados na enumeração ENUM _CUS T OM IND_PR OPERTY.
ENUM_CUSTOMIND_PROPERTY_INTEGER
ENUM_CUSTOMIND_PROPERTY_DOUBLE
ENUM_CUSTOMIND_PROPERTY_STRING
Exemplos:
//--- configurações do indicador
#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
//--- parâmetros de entrada
extern int KPeriod=5;
extern int DPeriod=3;
extern int Slowing=3;
//--- buffers do indicador
double MainBuffer[];
double SignalBuffer[];
double HighesBuffer[];
double LowesBuffer[];
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado |
//+------------------------------------------------------------------+
void OnInit()
{
//--- mapeamento de buffers do indicador
SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);
SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);
SetIndexBuffer(2,HighesBuffer,INDICATOR_CALCULATIONS);
SetIndexBuffer(3,LowesBuffer,INDICATOR_CALCULATIONS);
//--- define acuracidade
IndicatorSetInteger(INDICATOR_DIGITS,2);
//--- define níveis
IndicatorSetInteger(INDICATOR_LEVELS,2);
IndicatorSetDouble(INDICATOR_LEVELVALUE,0,20);
IndicatorSetDouble(INDICATOR_LEVELVALUE,1,80);
//--- define máximo e mínimo para sub-janela
IndicatorSetDouble(INDICATOR_MINIMUM,0);
IndicatorSetDouble(INDICATOR_MAXIMUM,100);
//--- define a primeira barra a partir do qual o índice será desenhado
PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,KPeriod+Slowing-2);
PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,KPeriod+Slowing+DPeriod);
Indicadores Técnicos
Existem duas formas de criar via programação um indicador para posteriormente acessar seus
valores. A primeira forma é especificar diretamente um nome de função da lista de indicadores
técnicos. A segunda forma é, usando a função IndicatorCreate(), criar de forma uniforme um handle
de qualquer indicador através da atribuição de um identificador da enumeração ENUM _INDICAT OR .
Ambos as formas de criar handles são iguais, você pode usar aquela que for mais conveniente em um
caso particular ao escrever um programa em MQL5.
Ao criar um indicador do tipo IND_CUS T OM, o campo type do primeiro elemento de um array de
parâmetros de entrada MqlParam deve ter valor TYPE_S TRING da enumeração ENUM _DAT ATYPE,
enquanto que o campo string_value do primeiro elemento deve conter o nome do indicador
customizado.
ENUM_INDICATOR
Identificador Indicador
IND_AC Accelerator Oscillator
IND_AD Accumulation/Distribution
IND_DEMARKER DeMark er
IND_ENVELOPES Envelopes
IND_MACD MACD
IND_MOMENTUM Momentum
IND_OSMA OsMA
ENUM_DATATY PE
TYPE_CH AR char
TYPE_UCH AR uchar
TYPE_COLOR color
TYPE_INT int
TYPE_UINT uint
TYPE_LONG long
TYPE_ULONG ulong
TYPE_FLOAT float
TYPE_DOUBLE double
Estado de Ambiente
As constantes que descrevem o ambiente de execução corrente de um programa MQL5 estão divididas
em grupos :
ENUM_TERMINAL_INFO_INTEGER
(agente), M B
Usando o recurso gráfico desse modo, ele irá ter o mesmo tamanho, à primeira vista, em monitores
de diferente qualidade de resolução. Além disso, os parâmetros que controlam os elementos (botões,
caixas de diálogo, etc.) irão corresponder às configurações personalizadas.
ENUM_TERMINAL_INFO_DOUBLE
O valor
T ER M INAL _TR ESSM ISS ION é
solicitado no sistema
operacional uma vez por
minuto. O próprio terminal não
calcula estes valores.
Operações de arquivo podem ser realizadas somente em dois diretórios ; os caminhos correspondentes
podem ser obtidos usando solicitação para as propriedades T ER M INAL _DAT A_PATH e
T ER M INAL _COMMONDAT A_PATH .
ENUM_TERMINAL_INFO_STRING
Para um melhor entendimento dos caminhos armazenados nas propriedades dos parâmetros
T ER M INAL _PATH , T ER M INAL _DAT A_PATH e T ER M INAL _COMMONDAT A_PATH , é recomendado executar
o script, que retornará estes valores para a cópia corrente do terminal cliente, instalado em seu
computador.
//+----------´--------------------------------------------------------+
//| Check_TerminalPaths.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"
//+----------´--------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+----------´--------------------------------------------------------+
void OnStart()
{
//---
Print("TERMINAL_PATH = ",TerminalInfoString(TERMINAL_PATH));
Print("TERMINAL_DATA_PATH = ",TerminalInfoString(TERMINAL_DATA_PATH));
Print("TERMINAL_COMMONDATA_PATH = ",TerminalInfoString(TERMINAL_COMMONDATA_PATH));
}
Como resultado da execução do script no Diário de Experts, você verá mensagens, como as seguintes :
ENUM_MQL_INFO_INTEGER
MQL _PR OGR AM _TYPE T ipo do programa MQL5 ENUM _PR OGR AM _TYPE
ENUM_MQL_INFO_STRING
Para obter informações sobre o tipo do programa em execução, são utilizados valores de
ENUM _PR OGR AM _TYPE.
ENUM_PROGRAM_TY PE
Identificador Descrição
PR OGR AM _SCRIPT Script
ENUM_LICENSE_TY PE
Identificador Descrição
L ICENSE_FR EE Um versão gratuita ilimitada
Exemplo:
ENUM_PROGRAM_TYPE mql_program=(ENUM_PROGRAM_TYPE)MQLInfoInteger(MQL_PROGRAM_TYPE);
switch(mql_program)
{
case PROGRAM_SCRIPT:
{
Print(__FILE__+" é um script");
break;
}
case PROGRAM_EXPERT:
{
Print(__FILE__+" é um Expert Advisor");
break;
}
case PROGRAM_INDICATOR:
{
Print(__FILE__+" é um indicador customizado");
break;
}
default:Print("Valor do tipo MQL5 ",mql_program);
}
Propriedades do Ativo
Para obter as informações atuais do mercado, existem v árias funções : S ymbolInfoInteger(),
S ymbolInfoDouble() e S ymbolInfoString(). O primeiro parâmetro é o nome do ativo, os valores do
segundo parâmetro da função podem ser um dos identificadores ENUM _S YM BOL _INFO_INT EGER ,
ENUM _S YM BOL _INFO_DOUBLE e ENUM _S YM BOL _INFO_S TRING.
ENUM_SY MBOL_INFO_INTEGER
S YM BOL _INDUS TRY T ipo de indústria ou ramo da ENUM _S YM BOL _INDUS TRY
economia ao qual pertence o
ativo
S YM BOL _CH ART_MODE T ipo de preço para construção ENUM _S YM BOL _CH ART_MODE
de barras – Bid ou Last
S YM BOL _TR ADE_MODE T ipo de execução de ordem ENUM _S YM BOL _TR ADE_MODE
S YM BOL _TR ADE_EXEMODE Modo de execução de operação ENUM _S YM BOL _TR ADE_EXECUT
(deal) I ON
S YM BOL _S W AP_R OLLOVER3DA Dia da semana para cobrar ENUM _DAY_OF_W EEK
YS rolagem de swap de 3 dias
S YM BOL _ORDER_GT C_MODE Prazo de validade do StopLoss ENUM _S YM BOL _ORDER_GT C_M
e T ak eProfit das ordens, se O DE
S YM BOL _EXPIR ATION_MODE=S Y
M BOL _EXPIR ATION_GT C (Good
till cancelled)
ENUM_SY MBOL_INFO_DOUBLE
A função
S ymbolInfoMarginR ate()
fornece informações sobre o
valor da margem cobrada,
dependendo do tipo e direção
da ordem.
A função
S ymbolInfoMarginR ate()
fornece informações sobre o
valor da margem cobrada,
dependendo do tipo e direção
da ordem.
Cálculo básico:
· Se, para o instrumento, tiver
sido estabelecida uma
margem inicial
(S YM BOL _MARGIN_INITIAL),
então, a margem de
cobertura é indicada como
valor absoluto (em dinheiro).
· Se não se tiver estabelecido
uma margem inicial (igual a
0), então, no campo
S YM BOL _MARGIN_H EDGED
indica-se o tamanho do
contrato que será usado no
cálculo da margem segundo a
fórmula correspondente ao
tipo de instrumento de
negociação
(S YM BOL _TR ADE_CALC_MOD
E).
ENUM_SY MBOL_INFO_STRING
O gráfico de preço segundo o símbolo pode ser construído com base no preço Bid ou Last. A maneira
como são geradas e exibidas as barras - no terminal - depende da escolha do preço para construir
gráficos. Possíveis valores da propriedade S YM BOL _CH ART_MODE são dadas na enumeração
ENUM _S YM BOL _CH ART_MODE
ENUM_SY MBOL_CHART_MODE
Identificador Descrição
S YM BOL _CH ART_MODE_BID Barras são construídas segundo o preço Bid
Para cada ativo v ários modos de expiração de ordens pendentes podem ser especificados. Uma flag é
associado a cada modo. Flags pode ser combinados usando a operação de OR lógico (|), por exemplo,
S YM BOL _EXPIR ATION_GT C|S YM BOL _EXPIR ATION_SPECIFIED. A fim de verificar se um certo modo é
permitido para um ativo, o resultado doAND(&)deve ser comparado ao flag do modo.
Se o flag S YM BOL _EXPIR ATION_SPECIFIED for especificado para um ativo, então ao enviar uma ordem
pendente, você pode especificar até que momento esta ordem pendente é v álida.
Exemplo:
//+------------------------------------------------------------------+
//| Verifica se um modo de expiração especifico é permitido |
//+------------------------------------------------------------------+
bool IsExpirationTypeAllowed(string symbol,int exp_type)
{
//--- Obtém o valor da propriedade que descreve os modos de expiração permitidos
int expiration=(int)SymbolInfoInteger(symbol,SYMBOL_EXPIRATION_MODE);
Se a propriedade S YM BOL _EXPIR ATION_MODE tem o valor S YM BOL _EXPIR ATION_GT C (ordem v álida
até ser cancelada), a validade das ordens pendentes e os níveis colocados StopLoss /T ak eProfit são
definidos adicionalmente usando a enumeração ENUM _S YM BOL _ORDER_GT C_MODE.
ENUM_SY MBOL_ORDER_GTC_MODE
Identificador Descrição
S YM BOL _ORDER S _GT C Ordens pendentes e níveis Stop Loss /T ak e
Profit são validas de maneira ilimitada no tempo
até a cancelação explicita
S YM BOL _ORDER S _DAIL Y_EXCL UDING_S T OPS Ao mudar o dia de negociação são excluídas
apenas as ordens pendentes, enquanto os níveis
StopLoss e T ak eProfit são salvos.
Ao enviar um ordem, você pode especificar a política de preenchimento para o volume definido na
ordem. Modos de preenchimento de ordem permitidos para cada ativo são especificados na tabela.
Você pode definir v ários modos para um ativo através da combinação de flags. Os flags podem ser
combinados através da operação do OR lógico (|), por exemplo, S YM BOL _FILL ING_ALL _OR_NONE|
S YM BOL _CANCEL _R EMAIND. A fim de verificar se um certo modo é permitido para o ativo, o resultado
doANDlógico (&)deve ser comparado com o flag do modo.
disponíveis no
mercado no momento.
No Pedido e modos de execução Instantânea a política Fill or Kill é sempre usado para ordens de
mercado, a política de R eturn é sempre usado para ordens de limite. Neste caso, ao enviar ordens
através de OrderSend ou OrderSendAs ync, não há necessidade de especificar uma política de
preenchimento para elas.
Nos modos de execução de Mercado e de Câmbio a política R eturn é sempre permitida para todos os
tipos de pedidos. Para saber se as outras políticas são permitidas, use as propriedades
S YM BOL _FILL ING_FOK e S YM BOL _FILL ING_IOC.
Exemplo:
//+------------------------------------------------------------------+
Exemplo:
//+------------------------------------------------------------------+
//| A função imprime tipos de ordens permitidas para um símbolo |
//+------------------------------------------------------------------+
A enumeração ENUM _S YM BOL _CALC_MODE é usada para obter informação sobre como os
requerimentos de margem para um ativo são calculados.
ENUM_SY MBOL_CALC_MODE
Profit: (close_price -
open_price) *
Contract_Size*Lots
Profit: (close_price -
open_price) * T ick Price /
T ick Size*Lots
Profit: (close_price -
open_price) * Contract_Size *
Lots
Profit: (close_price -
open_price) * Contract_Size *
Lots
Profit: (close_price-
open_price) * Contract_Size *
Lots
Profit: (close_price -
open_price) * Lots *
T ick Price / T ick Size
Existem v ários modos de negociação de ativos. Informação sobre modos de negociação de um certo
ativo é refletido nos valores da enumeração ENUM _S YM BOL _TR ADE_MODE.
ENUM_SY MBOL_TRADE_MODE
Identificador Descrição
S YM BOL _TR ADE_MODE_DISABLED Negociação está desabilitada para o ativo
Os possíveis modos de execução de uma operação (deal) para um certo ativo são definidos na
enumeração ENUM _S YM BOL _TR ADE_EXECUTION.
Identificador Descrição
S YM BOL _TR ADE_EXECUTION_R EQUES T Execução por solicitação
moeda de depósito do cliente, então os valores destes parâmetros são especificados como uma
quantia de dinheiro na moeda de depósito do cliente.
Identificador Descrição
S YM BOL _S W AP_MODE_DISABLED Desabilita swaps (sem swaps)
S YM BOL _S W AP_MODE_CURR ENCY_S YM BOL Swaps são cobrados em dinheiro na moeda base
do ativo
S YM BOL _S W AP_MODE_INT ER ES T_CURR ENT Swaps são cobrados como juro anual
especificado a partir do preço de instrumento no
cálculo do swap (ano bancário padrão é 360 dias)
Os valores da enumeração ENUM _DAY_OF_W EEK são usados para especificar dias da semana.
ENUM_DAY_OF_W EEK
Identificador Descrição
S UNDAY Domingo
MONDAY Segunda-feira
FRIDAY Sexta-feira
SATURDAY S ábado
An option is a contract, which gives the right, but not the obligation, to buy or sell an underlying asset
(goods, stock s, futures, etc.) at a specified price on or before a specific date. T he following
enumerations describe option properties, including the option type and the right arising from it.
ENUM_SY MBOL_OPTION_RIGHT
Identifier Descrição
S YM BOL _OPTION_RIGHT_CALL A call option gives you the right to buy an asset
at a specified price
S YM BOL _OPTION_RIGHT_PUT A put option gives you the right to sell an asset
at a specified price
ENUM_SY MBOL_OPTION_MODE
Identifier Descrição
S YM BOL _OPTION_MODE_EUR OPEAN A opção europeia só pode ser exercida em uma
data especificada (validade, data de assinatura,
data de entrega)
Os instrumentos financeiros são distribuídos por setores da economia. Um setor de uma economia é
definido por suas características, objetivos econômicos, funções e comportamento gerais, o que o
permite diferenciar de outras parcelas da economia. ENUM _S YM BOL _SECT OR lista os setores da
economia aos quais um instrumento comercial pode pertencer.
Identificador Descrição
SECT OR_UNDEFINED Indefinido
Identificador Descrição
SECT OR_CONS UMER_DEFENS IVE Consumo básico
Cada instrumento financeiro pode pertencer a um tipo específico de indústria ou setor. Um setor da
economia é um conjunto de empresas que produzem produtos homog êneos ou específicos usando o
mesmo tipo de tecnologia. ENUM _S YM BOL _INDUS TRY lista os tipos de indústria aos quais um
instrumento comercial pode pertencer.
Identificador Descrição
INDUS TRY_UNDEFINED Indefinido
Commodities
Identificador Descrição
INDUS TRY_PR ECIOUS _MET ALS Outros metais preciosos e mineração
Serviços de comunicação
INDUS TRY_H OME_IMPR OV_R ET AIL Comércio varejista de artigos para o lar
Identificador Descrição
INDUS TRY_R ECR EATIONAL _VEHICLES Veículos de lazer
Consumo básico
Energia
Finanças
Identificador Descrição
INDUS TRY_EXCH ANGE_TR ADED_FUND Fundo de câmbio
Cuidados de saúde
Identificador Descrição
INDUS TRY_PH AR M _R ET AILER S Varejistas farmacêuticos
Indústria
Imobiliário
Identificador Descrição
INDUS TRY_R EAL _ES T AT E_SERVICES Serviços imobiliários
T ecnologia
Serviços públicos
INDUS TRY_UTIL ITIES _R ENEW ABLE Serviços públicos - Energia renov ável
Identificador Descrição
INDUS TRY_UTIL ITIES _R EGULAT ED_ELECTRIC Serviços públicos - Companhias elétricas
reguladas
Propriedades da Conta
Para obter informações sobre a conta atual existem v árias funções : AccountInfoInteger(),
AccountInfoDouble() e AccountInfoString(). Os valores dos parâmetros destas funções podem aceitar
valores das enumerações de ENUM _ACCOUNT_INFO.
ENUM_ACCOUNT_INFO_INTEGER
(ACCOUNT_MARGIN_MODE!=AC
COUNT_MARGIN_MODE_R ET AIL
_H EDGING), a propriedade
sempre será igual a false
ENUM_ACCOUNT_INFO_DOUBLE
ENUM_ACCOUNT_INFO_STRING
Existem v ários tipos de contas que podem ser abertos em um servidor de negociação. O tipo de conta
sobre o qual um programa MQL5 está sendo executado pode ser encontrado usando a enumeração
ENUM _ACCOUNT_TR ADE_MODE.
ENUM_ACCOUNT_TRADE_MODE
Identificador Descrição
ACCOUNT_TR ADE_MODE_DEMO Conta de Demonstração
No caso do saldo a mercado não ser suficiente para manter posições em aberto ocorre a situação de
Stop Out, ou seja o encerramento forçado. O nível de margem mínimo no qual o Stop Out ocorre pode
ser definido em percentagem ou em termos monetários. Para descobrir a configuração de modo da
conta use a enumeração ENUM _ACCOUNT_S T OPOUT_MODE.
ENUM_ACCOUNT_STOPOUT_MODE
Identificador Descrição
ACCOUNT_S T OPOUT_MODE_PER CENT Modo stop out da conta em percentagem
ENUM_ACCOUNT_MARGIN_MODE
Identificador Descrição
ACCOUNT_MARGIN_MODE_R ET AIL _NETTING Usa-se para o mercado de balcão ao registrar as
posições no modo " compensação" (segundo um
Os dados do tipo float são exibidos com 5 dígitos após o ponto decimal.
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
//--- Nome da empresa
string company=AccountInfoString(ACCOUNT_COMPANY);
//--- Nome do cliente
string name=AccountInfoString(ACCOUNT_NAME);
//--- Número da conta
long login=AccountInfoInteger(ACCOUNT_LOGIN);
//--- Nome do servidor
string server=AccountInfoString(ACCOUNT_SERVER);
//--- Moeda da conta
string currency=AccountInfoString(ACCOUNT_CURRENCY);
//--- Conta demo, de torneio ou real
ENUM_ACCOUNT_TRADE_MODE account_type=(ENUM_ACCOUNT_TRADE_MODE)AccountInfoInteger(ACCOUNT_TRADE_M
//--- Agora transforma o valor da enumeração em uma forma inteligível
string trade_mode;
switch(account_type)
{
case ACCOUNT_TRADE_MODE_DEMO:
trade_mode="demo";
break;
case ACCOUNT_TRADE_MODE_CONTEST:
trade_mode="concurso";
break;
default:
trade_mode="real";
break;
}
//--- Stop Out é definida em percentagem ou dinheiro
ENUM_ACCOUNT_STOPOUT_MODE stop_out_mode=(ENUM_ACCOUNT_STOPOUT_MODE)AccountInfoInteger(ACCOUNT_MA
//--- Obtém os valores dos níveis quando a Chamada de Margem e Stop Out (encerramento forçado) ocor
double margin_call=AccountInfoDouble(ACCOUNT_MARGIN_SO_CALL);
double stop_out=AccountInfoDouble(ACCOUNT_MARGIN_SO_SO);
//--- Exibe informações resumidas sobre a conta
PrintFormat("A conta do do cliente '%s' #%d %s aberta em '%s' no servidor '%s'",
name,login,trade_mode,company,server);
PrintFormat("Moeda da conta - %s, níveis de MarginCall e StopOut são configurados em %s",
currency,(stop_out_mode==ACCOUNT_STOPOUT_MODE_PERCENT)?"porcentagem":" dinheiro");
PrintFormat("MarginCall=%G, StopOut=%G",margin_call,stop_out);
}
Estatísticas de Teste
Depois que o teste é finalizado, diferentes parâmetros das estatísticas dos resultados das negociações
são calculados. Os valores dos parâmetros podem ser obtidos usando a função T esterStatistics(),
através da especificação do parâmetro ID a partir da enumeração ENUM _S T ATIS TICS.
Embora dois tipo de parâmetros (int e double) serem usados nos cálculos das estáticas, a função
retorna todos os valores na forma double. T odos os valores estatísticos do tipo double são expressos
na moeda corrente por default, a mesmo que especificado de outro modo.
ENUM_STATISTICS
percentagem
(S T AT_BALANCE_DDR EL _PER CE
NT ).
ENUM_SERIES_INFO_INTEGER
ENUM_ORDER_PROPERTY_INTEGER
ENUM_ORDER_PROPERTY_DOUBLE
ENUM_ORDER_PROPERTY_STRING
Ao enviar uma solicitação de negociação usando a função OrderSend(), algumas operações requerem a
indicação do tipo da ordem. O tipo de uma ordem é especificado no campo type da estrutura especial
MqlT radeR equest, e pode aceitar valores da enumeração ENUM _ORDER_TYPE.
ENUM_ORDER_TY PE
Identificador Descrição
ORDER_TYPE_BUY Ordem de Comprar a Mercado
Cada ordem tem um status que descreve o seu estado. Para obter informações, use OrderGetInteger()
ou H istoryOrderGetInteger() com o modificador ORDER_S T AT E. Valores permitidos são armazenados
na enumeração ENUM _ORDEM _S T AT E.
ENUM_ORDER_STATE
Identificador Descrição
ORDER_S T AT E_S T ART ED Ordem verificada, mas ainda não aceita pela
corretora (brok er)
ORDER_S T AT E_R EQUES T_ADD Ordem está sendo registrada (aplicação para o
sistema de negociação)
ORDER_S T AT E_R EQUES T_MODIFY Ordem está sendo modificada (alterando seus
parâmetros)
ORDER_S T AT E_R EQUES T_CANCEL Ordem está sendo excluída (excluindo a partir
do sistema de negociação)
ENUM_ORDER_TY PE_FILLING
Identificador Descrição
ORDER_FILL ING_FOK Esta política de preenchimento significa que
uma ordem pode ser preenchida somente na
quantidade especificada. Se a quantidade
desejada do ativo não está disponível no
mercado, a ordem não será executada. O
volume requerido pode ser preenchido usando
v árias ofertas disponíveis no mercado no
momento.
O período de validade de uma ordem pode ser definida no campo type_time da estrutura especial
MqlT radeR equest ao enviar uma solicitação de negociação usando a função OrderSend(). Valores da
enumeração ENUM _ORDER_TYPE_TIME enumeration são permitidos. Para obter o valor desta
propriedade use a função OrderGetInteger() ou H istoryOrderGetInteger() com o modificador
ORDER_TYPE_TIME.
ENUM_ORDER_TY PE_TIME
Identificador Descrição
ORDER_TIME_GT C Ordem v álida até cancelamento
A propriedade ORDER_R EASON contém a razão para a colocação da ordem. A ordem pode ser colocada
usando um programa MQL5, a partir de um aplicativo móvel ou como resultado de um evento StopOut,
etc. Os valores possíveis ORDER_R EASON são descritos na enumeração ENUM _ORDER_R EASON.
ENUM_ORDER_REASON
Identificador Descrição
ORDER_R EASON_CL IENT Ordem colocada a partir de um terminal des k top
ENUM_POSITION_PROPERTY_INTEGER
O identificador de posição é
indicado em cada ordem
(ORDER_POS ITION_ID) e
transação usada para abrir,
alterar ou fechá-la. Utilize esta
propriedade para procurar
ordens e transações associadas
com a posição.
POS ITION_R EASON R azão para a abertura da ENUM _POS ITION_R EASON
posição
ENUM_POSITION_PROPERTY_DOUBLE
ENUM_POSITION_PROPERTY_STRING
A direção de uma posição em aberto (comprada ou vendida) é definida através do valor proveniente
da enumeração ENUM _POS ITION_TYPE. A fim de obter o tipo de uma posição em aberto use a função
PositionGetInteger() com o modificador POS ITION_TYPE.
ENUM_POSITION_TY PE
Identificador Descrição
POS ITION_TYPE_BUY Compra
A propriedade POS ITION_R EASON contém a razão para a colocação da posição. A posição pode ser
aberta como resultado da ativação de uma ordem colocada a partir de um terminal des k top, aplicativo
móvel ou usando um Expert Advisor, etc. Os valores possíveis POS ITION_R EASON são descritos na
enumeração ENUM _POS ITION_R EASON.
ENUM_POSITION_REASON
Identificador Descrição
POS ITION_R EASON_CL IENT Posição aberta como resultado da ativação de
uma ordem colocada a partir de um terminal
des k top
Propriedades da Transação
Uma transação é o reflexo de uma execução de uma negociação baseada em uma ordem que contém
uma solicitação de negociação. Cada negociação é descrita através de propriedades que permitem
obter informações sobre ela. A fim de ler valores destas propriedades, as funções do tipo
H istoryDealGet...() são usadas, que retornam valores provenientes das enumerações correspondentes.
ENUM_DEAL_PROPERTY_INTEGER
ENUM_DEAL_PROPERTY_DOUBLE
ENUM_DEAL_PROPERTY_STRING
Cada transação é caracterizada por um tipo, cujos valores permitidos são enumerados em
ENUM _DEAL _TYPE. A fim de obter informações sobre o tipo de transação, use a função
H istoryDealGetInteger() com o modificador DEAL _TYPE.
ENUM_DEAL_TY PE
Identificador Descrição
DEAL _TYPE_BUY Compra
As operações (deal) diferem entre si não somente no seu conjunto de tipos em ENUM _DEAL _TYPE, mas
também na forma como elas alteram posições. Isto pode ser uma simples abertura de posição, ou
acumulação de uma posição aberta anteriormente (entrada de mercado), encerramento de posição
através de uma operação oposta no volume correspondente (saída de mercado), ou reversão de
posição, se a operação em direção oposta cobrir o volume da posição aberta anteriormente.
T odas estas situações são descritas pelos valores provenientes da enumeração ENUM _DEAL _ENTRY. A
fim de receber esta informação sobre uma transação, use a função H istoryDealGetInteger() com o
modificador DEAL _ENTRY.
ENUM_DEAL_ENTRY
Identificador Descrição
DEAL _ENTRY_IN Entrada
A propriedade DEAL _R EASON contém a razão para a realização da transação. A transação pode ser
realizada como resultado da ativação da ordem colocada a partir do aplicativo móvel ou a partir de um
programa MQL5; ou como resultado de um evento StopOut, ou debitada/creditada a margem de
variação, etc. Os valores possíveis DEAL _R EASON são descritos na enumeração ENUM _DEAL _R EASON.
Para as operações não-comerciais resultantes da alteração do balanço, crédito comiss ões e outras
operações, indica-se como a razão DEAL _R EASON_CL IENT .
ENUM_DEAL_REASON
Identificador Descrição
DEAL _R EASON_CL IENT T ransação realizada como resultado da ativação
de uma ordem colocada a partir de um terminal
des k top
ENUM_TRADE_REQUEST_ACTIONS
Identificador Descrição
TR ADE_ACTION_DEAL Coloca uma ordem de negociação para a
transação ser executada imediatamente usando
os parâmetros especificados (ordem de
mercado)
}
}
//+------------------------------------------------------------------+
request.sl = NormalizeDouble(price-offset*point,digits);
request.price =NormalizeDouble(price,digits); // preço de abertura normalizado
}
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); // preço de abertura normalizado
}
//--- envio do pedido
if(!OrderSend(request,result))
PrintFormat("OrderSend error %d",GetLastError()); // se não foi possível enviar o pedido, exibir o
//--- informações sobre a operação
PrintFormat("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order);
//--- zerado dos valores do pedido e o seu resultado
ZeroMemory(request);
ZeroMemory(result);
}
}
}
//+------------------------------------------------------------------+
· Envio de uma solicitação de negociação a partir de algum aplicativo MQL5 no terminal usando as
funções OrderSend e OrderSendAs ync e sua posterior execução.
· Envio de uma solicitação de negociação por meio da interface gráfica do terminal e sua posterior
execução.
· Ativação de ordens pendentes e ordens de stop no servidor.
· mudança de posições
Por exemplo, ao enviar uma ordem de compra de mercado, ela é tratada, uma ordem de compra
apropriada é criada para a conta, a ordem é então executada e removida da lista de ordens em
aberto, e então ela é adicionada ao histórico de ordens, uma apropriada operação (deal) é adicionada
ao histórico e uma nova posição é criada. T odas estas ações são transações de negociação.
Para deixar um programador rastrear as ações realizadas em relação a uma conta de negociação, a
função OnT radeT ransaction foi fornecida. Este handler permite obter transações de negociação
aplicadas a uma conta em aplicações MQL5 A descrição de uma transação de negociação é submetida
no primeiro parâmetro de OnT radeT ransation usando a estrutura MqlT radeT ransaction.
ENUM_TRADE_TRANSACTION_TY PE
Identificador Descrição
TR ADE_TR ANSACTION_ORDER_ADD Adição de uma nova ordem de abertura.
Também Veja
Estrutura de uma T ransação de Negociação, OnT radeT ransaction
Para obter informações sobre o estado corrente do DOM por meio de MQL5, a função Mark etBookGet()
é usada, que coloca uma " fotografia instantânea" do DOM no array de estruturas MqlBookInfo. Cada
elemento do array no campo type contém informações sobre a direção da ordem - o valor da
enumeração ENUM _BOOK_TYPE.
ENUM_BOOK_TY PE
Identificador Descrição
BOOK_TYPE_SELL Ordem de venda (Offer)
Também Veja
Estruturas e classes, Estruturas do DOM, T ipos de operações de negociação, Informações de
Mercado
Propriedades de Sinal
As seguintes enumerações são usadas ao trabalhar com sinais de negociação e configurações da cópia
de sinal.
ENUM_SIGNAL_BASE_DOUBLE
ID Descrição
S IGNAL _BASE_BALANCE Saldo da conta
ENUM_SIGNAL_BASE_INTEGER
ID Descrição
S IGNAL _BASE_DAT E_PUBL IS H ED Data de publicação (data em que estará
disponível para assinar)
ENUM_SIGNAL_BASE_STRING
ID Descrição
S IGNAL _BASE_AUTH OR_LOGIN Login do autor
ENUM_SIGNAL_INFO_DOUBLE
ID Descrição
S IGNAL _INFO_EQUITY_L IM IT Limite patrimonial
ENUM_SIGNAL_INFO_INTEGER
ID Descrição
S IGNAL _INFO_CONFIR MATIONS _DISABLED O sinalizador permite a sincronização sem caixa
de diálogo de confirmação
ENUM_SIGNAL_INFO_STRING
ID Descrição
S IGNAL _INFO_NAME Nome do sinal, r/o
Veja também
Sinais de Negociação
Constantes Nomeados
T odas as constantes usadas em MQL5 podem ser divididas nos seguintes grupos :
Constante Descrição
__DAT E__ Data de compilação do arquivo sem a hora (horas,
minutos e segundos são iguais a 0)
Exemplo:
#property copyright "Copyright © 2009, MetaQuotes Software Corp."
#property link "https://www.metaquotes.net"
//+------------------------------------------------------------------+
//| Função de inicialização do Expert |
//+------------------------------------------------------------------+
void OnInit()
{
//--- um exemplo de impressão de informação na inicialização de um Expert Advisor
Print(" __FUNCTION__ = ",__FUNCTION__," __LINE__ = ",__LINE__);
//--- define o intervalo entre os eventos timer
EventSetTimer(5);
//---
}
//+------------------------------------------------------------------+
//| Função de Desinicialização do Expert |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- um exemplo de impressão de informação na desinicialização de um Expert Advisor
Print(" __FUNCTION__ = ",__FUNCTION__," __LINE__ = ",__LINE__);
//---
}
//+------------------------------------------------------------------+
//| Função tick (ponto) de um Expert |
//+------------------------------------------------------------------+
void OnTick()
{
//--- impressão de informação no recebimento de um tick
Print(" __MQLBUILD__ = ",__MQLBUILD__," __FILE__ = ",__FILE__);
Print(" __FUNCTION__ = ",__FUNCTION__," __LINE__ = ",__LINE__);
test1(__FUNCTION__);
test2();
//---
}
//+------------------------------------------------------------------+
//| test1 |
//+------------------------------------------------------------------+
void test1(string par)
{
//--- impressão de informação dentro da função
Print(" __FUNCTION__ = ",__FUNCTION__," __LINE__ = ",__LINE__," par=",par);
}
//+------------------------------------------------------------------+
//| test2 |
//+------------------------------------------------------------------+
void test2()
{
//--- impressão de informação dentro da função
Print(" __FUNCTION__ = ",__FUNCTION__," __LINE__ = ",__LINE__);
}
//+------------------------------------------------------------------+
//| OnTimer event handler |
//+------------------------------------------------------------------+
void OnTimer()
{
//---
Print(" __FUNCTION__ = ",__FUNCTION__," __LINE__ = ",__LINE__);
test1(__FUNCTION__);
}
//--- criamos uma macro para impressão rápida da expressão e seu valor no log
#define print(expr) Print(#expr,"=",expr)
//--- definimos uma macro customizada MACRO_COUNTER por meio da macro predefinida __COUNTER__
#define MACRO_COUNTER __COUNTER__
//--- definimos o valor da variável global com a macro __COUNTER__ antes de definir as funções
int ExtVariable = __COUNTER__;
//+------------------------------------------------------------------+
//| a função retorna o valor __COUNTER__ |
//+------------------------------------------------------------------+
int GlobalFunc(void)
{
return(__COUNTER__);
}
//+------------------------------------------------------------------+
//| função de modelo retorna valor __COUNTER__ |
//+------------------------------------------------------------------+
template<typename T>
int GlobalTemplateFunc(void)
{
return(__COUNTER__);
}
//+------------------------------------------------------------------+
//| estrutura com um método que retorna __COUNTER__ |
//+------------------------------------------------------------------+
struct A
{
int dummy; // não é usado
int Method(void)
{
return(__COUNTER__);
}
};
//+------------------------------------------------------------------+
//| estrutura baseada em modelo com um método que retorna __COUNTER__|
//+------------------------------------------------------------------+
template<typename T>
struct B
{
int dummy; // não é usado
int Method(void)
{
return(__COUNTER__);
}
};
//+------------------------------------------------------------------+
//| estrutura com um método baseado em modelo que retorna __COUNTER__|
//+------------------------------------------------------------------+
struct C
{
int dummy; // não é usado
template<typename T>
int Method(void)
{
return(__COUNTER__);
}
};
//+------------------------------------------------------------------+
//| função #2, que retorna o valor __COUNTER__ |
//+------------------------------------------------------------------+
int GlobalFunc2(void)
{
return(__COUNTER__);
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart(void)
{
// __COUNTER__ em macros e variáveis
print(MACRO_COUNTER);
print(InpVariable);
print(ExtVariable);
// __COUNTER__ na estrutura
A a1, a2;
print(a1.Method());
print(a2.Method()); // o valor não muda
//--- mais uma vez, olhamos para __COUNTER__ na macro e na variável global
print(MACRO_COUNTER); // o valor mudou
print(ExtGlobal2);
}
//--- definimos o valor da variável global com a macro __COUNTER__ após as definições da função
int ExtGlobal2 = __COUNTER__;
//+------------------------------------------------------------------+
/* Resultado
__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
*/
Constantes Matemáticas
Constantes especiais contendo valores que são reservados para algumas express ões matemáticas.
Estas constantes podem ser usadas em qualquer lugar no programa ao invés de calcular seus valores
usando funções matemáticas.
M _L N2 ln(2) 0.693147180559945309417
M _PI pi 3.14159265358979323846
Exemplo:
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
//--- imprime os valores das constantes
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));
Exemplo:
void OnStart()
{
//--- imprime os valores de constantes
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);
}
Exemplo:
//+------------------------------------------------------------------+
//| obter descrição do texto |
//+------------------------------------------------------------------+
string getUninitReasonText(int reasonCode)
{
string text="";
//---
switch(reasonCode)
{
case REASON_ACCOUNT:
text="Account was changed";break;
case REASON_CHARTCHANGE:
text="Symbol or timeframe was changed";break;
case REASON_CHARTCLOSE:
text="Chart was closed";break;
case REASON_PARAMETERS:
text="Input-parameter was changed";break;
case REASON_RECOMPILE:
text="Program "+__FILE__+" was recompiled";break;
case REASON_REMOVE:
text="Program "+__FILE__+" was removed from chart";break;
case REASON_TEMPLATE:
text="New template was applied to chart";break;
default:text="Another reason";
}
//---
return text;
}
//+------------------------------------------------------------------+
//| Função de Desinicialização do Expert |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- A primeira maneira de obter o código de razão de desinicialização
Print(__FUNCTION__,"_Uninitalization reason code = ",reason);
//--- A segunda maneira de obter o código de razão de desinicialização
Print(__FUNCTION__,"_UninitReason = ",getUninitReasonText(_UninitReason));
}
Objetos criados por meio do operador new() são do tipo POINT ER_DYNAM IC. O operador delete() pode
e deve ser usado somente para tais ponteiros.
T odos os outros ponteiros são do tipo POINT ER_AUT OMATIC, que significa que este objeto foi criado
automaticamente pelo ambiente do programa mql5. T ais objetos são excluídos automaticamente após
serem usados.
ENUM_POINTER_TY PE
Constante Descrição
POINT ER_INVAL ID Ponteiro incorreto
Também Veja
Erros em T empo de Execução, Exclusão de Objeto Operador delete, Check Pointer
Outras Constantes
A constante CL R_NONE é usada para indicar a aus ência de cor, ela significa que o objeto gráfico ou a
série gráfica de um indicador não serão plotados. Esta constante não foi incluída na lista de
constantes W eb-color, mas ela pode ser aplicada em todo lugar onde os argumentos de cor forem
requeridos.
A constante INVAL ID_H ANDLE pode ser usada para verificar handles de arquivo (veja FileOpen() e
FileFindFirst()).
A constante EMPTY_VAL UE geralmente corresponde aos valores de indicadores que não são exibidos no
gráfico. Por exemplo, para o indicador incorporado Desvio Padrão (Standard Deviation) com um
período de 20, a linha para as primeiras 19 barras no histórico não é exibida no gráfico. Se você criar
um handle deste indicador com a função iStdDev() e copiar os valores do indicador destas barras para
um array através de CopyBuffer(), então estes valores serão iguais a EMPTY_VAL UE.
Você pode escolher especificar em um indicador customizado seus próprios valores vazios, indicando
quando o indicador não deve ser desenhado no gráfico. Use a função PlotIndexSetDouble() com a
modificador PLOT_EMPTY_VAL UE.
A constante NULL pode ser atribuído a uma variável de qualquer tipo simples ou a um objeto,
estrutura ou ponteiro de classe. A atribuição NULL a uma variável string significa a completa
desinicialização desta variável.
A constante WR ONG_VAL UE é destinada para casos em que é necess ário retornar valor de uma
enumeração, e ela deve ser um valor errado. Por exemplo, quando nós precisamos informar que um
valor de retorno é um valor proveniente desta enumeração. Vamos considerar como um exemplo a
função Check LineStyle(), que retorna o estilo de linha para um objeto, especificado seu nome. Se na
verificação de estilo por ObjectGetInteger() o resultado for true, um valor proveniente de
ENUM _L INE_S TYLE é retornado; caso contrário WR ONG_VAL UE é retornado.
void OnStart()
{
if(CheckLineStyle("MyChartObject")==WRONG_VALUE)
printf("Erro ao obter estilo de linha.");
}
//+------------------------------------------------------------------+
//| retorna o estilo de linha para um obj. espec. atráves de seu 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);
}
· ArrayCopy();
· ArrayMinimum();
· ArrayMaximum();
· FileR eadArray();
· FileW riteArray().
Se você quiser especificar que todos os valores do array a partir de uma posição especificada até o
final devem ser processados, você deve especificar apenas o valor WH OLE_ARR AY.
A constante IS _PR OFILE_MODE permite alterar uma operação de programa para correta coleta de
dados no modo de profiling. Profiling permite medir o tempo de execução de fragmentos individuais
do programa (geralmente abrangendo funções), bem como calcular o número de tais chamadas.
Chamadas a função Sleep() podem ser desabilitadas para determinar o tempo de execução no modo de
profiling, como neste exemplo:
O valor da constante IS _PR OFILE_MODE é definida pelo compilador durante a compilação, enquanto
que ela é definida para zero no modo convencional. Ao iniciar um programa no modo de profiling, uma
compilação especial é realizada e IS _PR OFILE_MODE é substituída com um valor não-zero.
A constante IS _DEBUG_MODE pode ser útil quando se precisar alterar levemente a operação de um
programa MQL5 no modo de depuração. Por exemplo, no modo de depuração você pode precisar exibir
informações de depuração adicionais no log do terminal ou criar objetos gráficos adicionais em um
gráfico.
O seguinte exemplo cria um objeto Label e define sua descrição e cor dependendo do modo de
execução do script. A fim de executar um script em modo de depuração a partir do MetaEditor,
pressione F 5. Se você executar um script a partir da janela de navegação do terminal, então a cor e o
texto do objeto Label serão diferentes.
Exemplo:
//+------------------------------------------------------------------+
//| 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"
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
//---
string label_name="invisible_label";
if(ObjectFind(0,label_name)<0)
{
Print("Objeto",label_name,"não encontrado. Código de erro = ",GetLastError());
//--- cria um Rótulo (Label)
ObjectCreate(0,label_name,OBJ_LABEL,0,0,0);
//--- define coordenada X
ObjectSetInteger(0,label_name,OBJPROP_XDISTANCE,200);
//--- define coordenada Y
ObjectSetInteger(0,label_name,OBJPROP_YDISTANCE,300);
ResetLastError();
if(IS_DEBUG_MODE) // modo de depuração
{
//--- exibe mensagem sobre o modo de execução do script
ObjectSetString(0,label_name,OBJPROP_TEXT,"DEBUG MODE");
//--- defini a cor de texto para vermelho
if(!ObjectSetInteger(0,label_name,OBJPROP_COLOR,clrRed))
Print("Não é possível definir a cor. Error",GetLastError());
}
else // modo de operação
{
ObjectSetString(0,label_name,OBJPROP_TEXT,"RELEASE MODE");
//--- defini a cor de texto para vermelho
if(!ObjectSetInteger(0,label_name,OBJPROP_COLOR,CLR_NONE))
Print("Não é possível definir a cor. Error ",GetLastError());
}
ChartRedraw();
DebugBreak(); // aqui finalização ocorrerá, se nós estivermos em modo de depuração
}
}
Crypt Methods
A enumeração ENUM _CRYPT_METH OD é usada para especificar o método de transformação de dados,
usado nas funções CryptEncode() e CryptDecode().
ENUM_CRY PT_METHOD
Constant Descrição
CRYPT_BASE64 BASE64
Também Veja
Debug Break , Propriedades de programas MQL5 executados, CryptEncode(), CryptDecode()
Estruturas de Dados
A linguagem MQL5 oferece 12 estruturas predefinidas :
· MqlParam pode enviar parâmetros de entrada quando criar um indicador usando a função
IndicatorCreate();
· MqlR ates é destinado para manipular dados históricos, ela contém informações sobre o preço, o
volume e o spread;
· MqlBookI nfo é destinado para obter informações sobre a O livro de ofertas ;
· MqlT radeR equest é usado para criar uma solicitação para operações de negociação;
· MqlT radeCheckR esult permite verificar se a solicitação de negociação está prestes antes de ser
enviada;
· MqlT radeR esult contém a resposta do servidor de negociação a uma solicitação de negociação,
enviada via função OrderSend();
· MqlT radeT ransaction contém a descrição de uma operação de negociação;
· MqlT ick é projetado para recuperar rapidamente a maioria das informações requeridas sobre os
preços atuais.
· Estruturas do Calendário Econômico são destinadas para obter informações sobre os eventos do
Calendário econômico que entram na plataforma MetaT rader 5 em tempo real. Funções do
Calendário econômico permitem analisar indicadores macroeconômicos imediatamente após a
publicação de novos relatórios, uma vez que os valores reais são transmitidos diretamente da fonte
sem atraso.
MqlDateTime
A estrutura de tipo data contém oito campos do tipo int:
struct MqlDateTime
{
int year; // Ano
int mon; // Mês
int day; // Dia
int hour; // Hora
int min; // Minutos
int sec; // Segundos
int day_of_week; // Dia da semana (0-domingo, 1-segunda, ... ,6-sábado)
int day_of_year; // Número do dia do ano (1 de Janeiro é atribuído o valor 0)
};
Observação
O número do dia do ano, day_of_year, para ano bissexto, a partir de março, diferirá do número do
dia correspondente a um ano não bissexto.
Exemplo:
void OnStart()
{
//---
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, day of year = %d",str2.day,str2.mon,
str2.year,str2.day_of_year);
}
/* Resultado:
01.03.2008, day of year = 60
01.03.2009, day of year = 59
*/
Também Veja
T imeT oStruct, Estruturas e Classes
struct MqlParam
{
ENUM_DATATYPE type; // tipo de parâmetro de entrada, valor de ENUM_DATATY
long integer_value; // campo para armazenar um tipo inteiro
double double_value; // campo para armazenar um tipo double
string string_value; // campo para armazenar um tipo string
};
Se o valor IND_CUS T OM for passado como tipo do indicador para função IndicatorCreate(), o primeiro
elemento do array de parâmetros de entrada deve ter o campo type com o valor de TYPE_S TRING
proveniente da enumeração ENUM _DAT ATYPE, e o campo string_value deve conter o nome do
indicador customizado.
MqlRates
Esta estrutura armazena informações sobre os preços, volumes e spread.
struct MqlRates
{
datetime time; // Hora inicial do período
double open; // Preço de abertura
double high; // O preço mais alto do período
double low; // O preço mais baixo do período
double close; // Preço de fechamento
long tick_volume; // Volume de Tick
int spread; // Spread
long real_volume; // Volume de negociação
};
Exemplo:
void OnStart()
{
MqlRates rates[];
int copied=CopyRates(NULL,0,0,100,rates);
if(copied<=0)
Print("Erro ao copiar dados de preços ",GetLastError());
else Print("Copied ",ArraySize(rates)," bars");
}
Também Veja
CopyR ates, Acesso a séries de tempo
MqlBookInfo
Fornece informações sobre os dados de profundidade de mercado.
struct MqlBookInfo
{
ENUM_BOOK_TYPE type; // Tipo de ordem proveniente da enumeração ENUM_BOOK_TYPE
double price; // Preço
long volume; // Volume
double volume_real; // Volume com maior precisão
};
Observação
A estrutura MqlBookInfo é predefinida, portanto ela não requer nenhuma declaração ou descrição.
Para usar a estrutura, apenas declare a variável deste tipo.
Exemplo:
MqlBookInfo priceArray[];
bool getBook=MarketBookGet(NULL,priceArray);
if(getBook)
{
int size=ArraySize(priceArray);
Print("MarketBookInfo sobre ",Symbol());
}
else
{
Print("Falha ao receber DOM para o símbolo ",Symbol());
}
Também Veja
Mark etBook Add, Mark etBookR elease, Mark etBookGet, Ordens de Negociação em DOM, T ipos de
Dados
struct MqlTradeRequest
{
ENUM_TRADE_REQUEST_ACTIONS action; // Tipo de operação de negociação
ulong magic; // Expert Advisor -conselheiro- ID (número mágic
ulong order; // Bilhetagem da ordem
string symbol; // Símbolo de negociação
double volume; // Volume solicitado para uma encomenda em lotes
double price; // Preço
double stoplimit; // Nível StopLimit da ordem
double sl; // Nível Stop Loss da ordem
double tp; // Nível Take Profit da ordem
ulong deviation; // Máximo desvio possível a partir do preço requ
ENUM_ORDER_TYPE type; // Tipo de ordem
ENUM_ORDER_TYPE_FILLING type_filling; // Tipo de execução da ordem
ENUM_ORDER_TYPE_TIME type_time; // Tipo de expiração da ordem
datetime expiration; // Hora de expiração da ordem (para ordens do ti
string comment; // Comentário sobre a ordem
ulong position; // Bilhete da posição
ulong position_by; // Bilhete para uma posição oposta
};
Campo Descrição
action T ipo de operação de negociação. Pode ser um
dos valores da enumeração
ENUM _TR ADE_R EQUES T_ACTIONS.
Para modificar ou fechar posições no sistema de cobertura, você deve especificar o seu bilhete
(MqlT radeR equest::position). No sistema de compensação o bilhete também pode ser
especificado, mas a identificação da posição é realizada segundo o nome do símbolo.
Para enviar ordens para realizaroperações de negociação (trade)é necess ário usar a função
OrderSend(). Para cada operação de negociação é necess ário especificar campos obrigatórios ; campos
opcionais também podem ser preenchidos. Existem sete possíveis casos para enviar uma ordem de
negociação:
Execução a Pedido
Esta é uma ordem de negociação para abrir uma posição no modo R equest Execution (negociação
sobre preços solicitados). Ela requer que se especifique os seguintes 9 campos :
· action
· s ymbol
· volume
· price
· sl
· tp
· deviation
· type
· type_filling
T ambém é possível especificar valores dos campos " magic" e " comment" .
Execução Instantânea
Esta é uma ordem de negociação para abrir uma posição no modo Instant Execution (negociação
pelos preços correntes). Ela requer que se especifique os seguintes 9 campos :
· action
· s ymbol
· volume
· price
· sl
· tp
· deviation
· type
· type_filling
T ambém é possível especificar valores dos campos " magic" e " comment" .
Execução de Mercado
Esta é uma ordem de negociação para abrir uma posição no modo Mark et Execution (execução a
mercado). Ela requer que se especifique os seguintes 5 campos :
· action
· s ymbol
· volume
· type
· type_filling
T ambém é possível especificar valores dos campos " magic" e " comment" .
Execução Exchange
Esta é uma ordem de negociação para abrir uma posição no modo Exchange Execution (execução em
um sistema de negociação externo). Ela requer que se especifique os seguintes 5 campos :
· action
· s ymbol
· volume
· type
· type_filling
T ambém é possível especificar valores dos campos " magic" e " comment" .
}
}
//+------------------------------------------------------------------+
SL & TP Modificação
Ordem de negociação para modificar os níveis de preço StopLoss e/ou T ak eProfit Ela requer que se
especifique os seguintes 4 campos :
· action
· s ymbol
· sl
· tp
· position
Ordem Pendente
Ordem de negociação para colocar uma ordem pendente. Ela requer que se especifiquem os
seguintes 11 campos :
· action
· s ymbol
· volume
· price
· stoplimit
· sl
· tp
· type
· type_filling
· type_time
· expiration
T ambém é possível especificar valores dos campos " magic" e " comment" .
Ordem de negociação para modificar os preços de uma ordem pendente. Ela requer que se
especifiquem os seguintes 7 campos :
· action
· order
· price
· sl
· tp
· type_time
· expiration
Exemplo de operação de negociação TR ADE_ACTION_MODIFY para modificação dos níveis de preços
da ordem pendente:
request.sl = NormalizeDouble(price-offset*point,digits);
request.price =NormalizeDouble(price,digits); // preço de abertura normalizado
}
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); // preço de abertura normalizado
}
//--- envio do pedido
if(!OrderSend(request,result))
PrintFormat("OrderSend error %d",GetLastError()); // se não foi possível enviar o pedido, exibir o
//--- informações sobre a operação
PrintFormat("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order);
//--- zerado dos valores do pedido e o seu resultado
ZeroMemory(request);
ZeroMemory(result);
}
}
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Exclusão de ordens pendentes |
//+------------------------------------------------------------------+
void OnStart()
{
//-- Declaração e inicialização do pedido e resultado
MqlTradeRequest request={};
MqlTradeResult result={};
int total=OrdersTotal(); // número de ordens pendentes colocadas
//--- iterar todas as ordens pendentes colocadas
for(int i=total-1; i>=0; i--)
{
ulong order_ticket=OrderGetTicket(i); // bilhete da ordem
ulong magic=OrderGetInteger(ORDER_MAGIC); // MagicNumber da ordem
//--- se o MagicNumber coincidir
if(magic==EXPERT_MAGIC)
{
//--- zerar os valores do pedido e o resultado
ZeroMemory(request);
ZeroMemory(result);
//--- instalação de parâmetros de operação
request.action=TRADE_ACTION_REMOVE; // tipo de operação de negociação
request.order = order_ticket; // bilhete da ordem
//--- envio do pedido
if(!OrderSend(request,result))
PrintFormat("OrderSend error %d",GetLastError()); // Se não for capaz de enviar o pedido, exibir u
//--- informações sobre a operação
PrintFormat("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order);
}
}
}
//+------------------------------------------------------------------+
Também Veja
Estruturas e Classes, Funções de Negociação (T rade), Propriedades de Ordem
struct MqlTradeCheckResult
{
uint retcode; // Código da resposta
double balance; // Saldo após a execução da operação (deal)
double equity; // Saldo a mercado (equity) após a execução da operação
double profit; // Lucro flutuante
double margin; // Requerimentos de Margem
double margin_free; // Margem livre
double margin_level; // Nível de margem
string comment; // Comentário sobre o código da resposta (descrição do erro)
};
Campo Descrição
retcode Código de retorno
Também Veja
Estrutura de Solicitação de Negociação, Estrutura para Preços Correntes, OrderSend, OrderCheck
struct MqlTradeResult
{
uint retcode; // Código de retorno da operação
ulong deal; // Bilhetagem (ticket) da operação (deal),se ela for realizada
ulong order; // Bilhetagem (ticket) da ordem, se ela for colocada
double volume; // Volume da operação (deal), confirmada pela corretora
double price; // Preço da operação (deal), se confirmada pela corretora
double bid; // Preço de Venda corrente
double ask; // Preço de Compra corrente
string comment; // Comentário da corretora para a operação (por default, ele é preenc
uint request_id; // Identificador da solicitação definida pelo terminal durante o desp
uint retcode_external; // Código de resposta do sistema de negociação exterior
};
Campo Descrição
retcode Código de retorno de um servidor de negociação
O resultado da operação de negociação é retornado para variável do tipo MqlT radeR esult, que é
passado como o segundo parâmetro da função OrderSend() para realizar operações de negociação.
O terminal fixa um identificador (ID) de solicitação no campo request_id ao enviar-la para o servidor
de negociação usando as funções OrdersSend() e OrderSendAs ync(). O terminal recebe mensagens
sobre transações realizadas provenientes do servidor de negociação e as submete para processamento
através da função OnT radeT ransaction() contendo os seguintes componentes como parâmetros :
A função OnT radeT ransaction() recebe três parâmetros de entrada mas os últimos dois devem ser
analisados somente para transações do tipo TR ADE_TR ANSACTION_R EQUES T . Em todos os outros
casos, dados sobre a solicitação de negociação e seu resultado de execução não são preenchidos.
Exemplo de análise de parâmetros pode ser encontrado em Estrutura de uma Solicitação de
Negociação.
A definição do request_id pelo terminal na solicitação de negociação quando enviá-la para o servidor é
introduzido principalmente para trabalhar com a função assíncrona OrderSendAs ync(). Este
identificador permite associar a ação realizada (chamada a funções OrderSend ou OrderSendAs ync)
com o resultado desta ação enviada para OnT radeT ransaction().
Exemplo:
//+------------------------------------------------------------------+
//| Enviando uma solicitação de negociação com o proc. de resultado |
//+------------------------------------------------------------------+
bool MyOrderSend(MqlTradeRequest request,MqlTradeResult result)
{
//--- redefine o último código de erro para zero
ResetLastError();
//--- envia solicitação
bool success=OrderSend(request,result);
{
Print("TRADE_RETCODE_NO_MONEY");
Print("request.volume = ",request.volume," result.volume = ",
result.volume," result.comment = ",result.comment);
break;
}
//--- alguma outra razão, saída com o código de resposta do servidor
default:
{
Print("Outra resposta = ",answer);
}
}
//--- notifica sobre o resultado sem sucesso da solicitação de negociação retornando false
return(false);
}
//--- OrderSend() retorna true - repete a resposta
return(true);
}
· Envio de uma solicitação de negociação a partir de algum aplicativo MQL5 no terminal usando as
funções OrderSend e OrderSendAs ync e sua posterior execução.
· Envio de uma solicitação de negociação por meio da interface gráfica do terminal e sua posterior
execução.
· Ativação de ordens pendentes e ordens de stop no servidor.
· mudança de posições
Por exemplo, ao enviar uma ordem de mercado para compra, ele é processado, para a conta cria-se a
respetiva ordem para compra, a ordem é executada, excluída da lista de ordens abertas, adicionada ao
histórico de ordens, a seguir, a transação respetiva é adicionada ao histórico e, finalmente, é criada uma
nova posição. T odas estas ações são transações financeiras.
Para obter transações financeiras, aplicadas à conta, a MQL5 dispõe de um processador especial chamado
de OnT radeT ransaction (). Ao primeiro parâmetro deste processador é transferida a estrutura
MqlT radeT ransaction, que descreve a transação financeira.
struct MqlTradeTransaction
{
ulong deal; // Bilhetagem da operação (deal)
ulong order; // Bilhetagem da ordem
string symbol; // Nome do ativo da negociação
ENUM_TRADE_TRANSACTION_TYPE type; // Tipo de transação da negociação
ENUM_ORDER_TYPE order_type; // Tipo de ordem
ENUM_ORDER_STATE order_state; // Estado da ordem
ENUM_DEAL_TYPE deal_type; // Tipo de operação (deal)
ENUM_ORDER_TYPE_TIME time_type; // Tipo de ordem por período de ação
datetime time_expiration; // Hora de expiração da ordem
double price; // Preço
double price_trigger; // Preço de ativação de ordem tipo Stop limit
double price_sl; // Nível de Stop Loss
double price_tp; // Nível de Take Profit
double volume; // Volume em lotes
ulong position; // Position ticket
ulong position_by; // Ticket of an opposite position
};
Campo Descrição
deal Bilhetagem (tick et) da operação.
O parâmetro essencial para análise de uma transação recebida é o seu tipo, especificado no campo
type. Por exemplo, se uma transação é do tipo TRADE_TRANSACTION_REQUES T (um resultado de
operar uma negociação requisitada pelo servidor foi recebido), a estrutura possui apenas um campo
único que é completamente preenchido - type. Outros campos não são analisados. Neste caso, nós
podemos analisar dois parâmetros adicionais, request e result, submetidos ao handler
OnT radeT ransaction(), como mostrado abaixo.
T endo dados sobre um tipo de operação de negociação, você pode decidir sobre a análise do estado
corrente de ordens, posições e operações (deals) em um conta de negociação. Lembre-se que uma
solicitação de negociação enviada ao servidor a partir do terminal pode gerar v árias novas transações.
A prioridade de chegada delas no terminal não é garantida.
TRADE_TRANSACTION_ORDER_* e TRADE_TRANSACTION_HISTORY_*
Os seguintes campos na estrutura MqlT radeT ransaction são preenchidos para transações de
negociação relacionados a manipulação de abertura de ordens (TR ADE_TR ANSACTION_ORDER_ADD,
TR ADE_TR ANSACTION_ORDER_UPDAT E e TR ADE_TR ANSACTION_ORDER_DELET E) e histórico de
ordens (TR ADE_TR ANSACTION_HIS T ORY_ADD, TR ADE_TR ANSACTION_HIS T ORY_UPDAT E,
TR ADE_TR ANSACTION_HIS T ORY_DELET E):
· order - bilhetagem da ordem;
· s ymbol - nome do ativo da ordem;
· type - tipo de transação de negociação;
· order_type - tipo de ordem;
· orders _state - estado corrente da ordem;
· time_type - tipo de expiração da ordem;
· time_expiration - hora de expiração da ordem (para ordens tendo tipos de expiração
ORDER_TIME_SPECIFIED e ORDER_TIME_SPECIFIED_DAY);
· price - preço da ordem especificado por um cliente;
· price_trigger - preço de stop de ordem stop limit (somente para ORDER_TYPE_BUY_S T OP_L I M IT e
ORDER_TYPE_SELL _S T OP_L IM IT );
· price_sl - Preço de ordem Stop Loss (preenchido, se especificado na ordem);
· price_tp - Preço de ordem T ak e Profit (preenchido, se especificado na ordem);
· volume - volume corrente da ordem (não preenchida). Volume inicial da ordem pode ser encontra
no histórico de ordens usando a função H istoryOrders *.
· position - bilhete da posição, aberta, fechada ou modificada como resultado da execução da ordem.
A preenchido apenas para ordens de mercado. Não é preenchido para
TR ADE_TR ANSACTION_ORDER_ADD.
· position_by - bilhete da posição oposta. Preenche-se apenas para ordens de fechamento da posição
oposta (close by).
TRADE_TRANSACTION_DEAL_*
Os seguintes campos na estrutura MqlT radeT ransaction são preenchidos para transações de
negociação relacionados a manipulação de operações (TR ADE_TR ANSACTION_DEAL _ADD,
TR ADE_TR ANSACTION_DEAL _UPDAT E e TR ADE_TR ANSACTION_DEAL _DELET E):
· deal - bilhetagem da operação (deal);
· order - bilhetagem da ordem, baseado na qual uma operação (deal) foi realizada;
· s ymbol - nome de ativo da operação (deal);
· type - tipo de transação de negociação;
· deal_type - tipo de operação (deal);
· price - preço de operação (deal);
· price_sl - preço de Stop Loss (preenchido, se especificado na ordem, baseado na qual uma
operação foi realizada);
· price_tp - preço de T ak e Profit (preenchido, se especificado na ordem, baseado na qual uma
operação foi realizada);
· volume - volume de operação em lotes.
· position - bilhete da posição, aberta, fechada ou modificada como resultado da execução da
transação.
· position_by - bilhete da posição oposta. Preenche-se apenas para transações de fechamento da
posição oposta (out by).
TRADE_TRANSACTION_POSITION
Os seguintes campos na estrutura MqlT radeT ransaction são preenchidos para transações de
negociação relacionado a mudança de posições não conectados com execução de operações (deals)
(TR ADE_TR ANSACTION_POS ITION):
· s ymbol - nome de ativo da posição;
· type - tipo de transação de negociação;
· deal_type - tipo de posição (DEAL _TYPE_BUY ou DEAL _TYPE_SELL);
· price - preço médio ponderado de abertura de posição;
· price_sl - preço de Stop Loss ;
· price_tp - preço de T ak e Profit;
· volume - volume de posição em lotes, se ele foi alterado.
· position - bilhete de posição.
TRADE_TRANSACTION_REQUEST
Somente um campo na estrutura MqlT radeT ransaction é preenchido para transações de negociação
descrevendo o fato de que uma solicitação de negociação foi processada por um servidor e que o
resultado do processamento foi recebido (TR ADE_TR ANSACTION_R EQUES T ):
· type - tipo de transação de negociação;
Somente o campo type (tipo de transação de negociação) de ser analisado para tais transações.
O segundo e terceiro parâmetros (request e result) da função OnT radeT ransaction deve ser
analisado para dados adicionais.
Exemplo:
input int MagicNumber=1234567;
uint request_id=trade_result.request_id;
Print("Pedido foi enviado para definir uma ordem pendente. Request_ID=",request_id);
//--- armazena a bilhetagem da ordem (será zero se usar o modo assíncrono de envio para CT
order_ticket=trade_result.order;
//--- tudo está feito, saí cedo do handler OnTick()
return;
}
}
//--- exclui a ordem pendente
if(!pending_deleted)
//--- verificação adicional
if(pending_done && (order_ticket!=0))
{
//--- tenda excluir a ordem pendente
bool res=trade.OrderDelete(order_ticket);
Print("OrderDelete=",res);
//--- quando solicitação de exclusão é enviada com sucesso
if(res)
{
pending_deleted=true;
//--- obtém o resultado da execução da solicitação
MqlTradeResult trade_result;
trade.Result(trade_result);
//--- peque o ID da solicitação proveniente do resultado
uint request_id=trade_result.request_id;
//--- exibe no Diário
Print("O pedido foi enviado para eliminar uma ordem pendente #",order_ticket,
". Request_ID=",request_id,
"\r\n");
//--- fixa a bilhetagem da ordem proveniente do resultado da solicitação
order_ticket=trade_result.order;
}
}
//---
}
//+------------------------------------------------------------------+
//| Função TradeTransaction |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
const MqlTradeRequest &request,
const MqlTradeResult &result)
{
//--- obtém o tipo de transação como valor de enumeração
ENUM_TRADE_TRANSACTION_TYPE type=(ENUM_TRADE_TRANSACTION_TYPE)trans.type;
//--- se a transação é a solicitação de manipulação do resultado, somente seu nome é exibido
if(type==TRADE_TRANSACTION_REQUEST)
{
Print(EnumToString(type));
//--- exibe o a string do nome da solicitação manipulada
Print("------------RequestDescription\r\n",RequestDescription(request));
//--- exibe a descrição do resultado da solicitação
Print("------------ResultDescription\r\n",TradeResultDescription(result));
//--- armazena a bilhetagem da ordem para sua exclusão na próxima manipulação em OnTick()
if(result.order!=0)
{
//--- exclui esta ordem através de sua bilhetagem na próxima chamada de OnTick()
order_ticket=result.order;
Print(" Bilhetagem da ordem pendente ",order_ticket,"\r\n");
}
}
else // exibe a descrição completa para transações de um outro tipo
//--- exibe a descriçaõ da transação recebida no Diário
Print("------------TransactionDescription\r\n",TransactionDescription(trans));
//---
}
//+------------------------------------------------------------------+
//| Retorna a descrição textual da transação |
//+------------------------------------------------------------------+
string TransactionDescription(const MqlTradeTransaction &trans)
{
//---
string desc=EnumToString(trans.type)+"\r\n";
desc+="Ativo: "+trans.symbol+"\r\n";
desc+="Bilhetagem (ticket) da operação: "+(string)trans.deal+"\r\n";
desc+="Tipo de operação: "+EnumToString(trans.deal_type)+"\r\n";
desc+="Bilhetagem (ticket) da ordem: "+(string)trans.order+"\r\n";
desc+="Tipo de ordem: "+EnumToString(trans.order_type)+"\r\n";
desc+="Estado da ordem: "+EnumToString(trans.order_state)+"\r\n";
desc+="Ordem do tipo time: "+EnumToString(trans.time_type)+"\r\n";
desc+="Expiração da ordem: "+TimeToString(trans.time_expiration)+"\r\n";
desc+="Preço: "+StringFormat("%G",trans.price)+"\r\n";
desc+="Gatilho do preço: "+StringFormat("%G",trans.price_trigger)+"\r\n";
desc+="Stop Loss: "+StringFormat("%G",trans.price_sl)+"\r\n";
desc+="Take Profit: "+StringFormat("%G",trans.price_tp)+"\r\n";
desc+="Volume: "+StringFormat("%G",trans.volume)+"\r\n";
//--- retorna a string obtida
return desc;
}
//+------------------------------------------------------------------+
//| Retorna a descrição textual da solicitação de negociação |
//+------------------------------------------------------------------+
string RequestDescription(const MqlTradeRequest &request)
{
//---
string desc=EnumToString(request.action)+"\r\n";
desc+="Ativo: "+request.symbol+"\r\n";
desc+="Número mágico: "+StringFormat("%d",request.magic)+"\r\n";
Também Veja
T ipos de T ransação de Negociação, OnT radeT ransaction()
struct MqlTick
{
datetime time; // Hora da última atualização de preços
double bid; // Preço corrente de venda
double ask; // Preço corrente de compra
double last; // Preço da última operação (preço último)
ulong volume; // Volume para o preço último corrente
long time_msc; // Tempo do "Last" preço atualizado em milissegundos
uint flags; // Flags de tick
double volume_real; // Volume para o preço Last atual com maior precisão
};
A variável do tipo MqlT ick permite obter valores de Preço de Compra, Preço de Venda, Preço Último e
Volume com uma única chamada da função S ymbolInfoT ick ().
Você pode analisar as flags dos tick s para descobrir quais dados foram alterados exatamente:
· TI CK_FLAG_BID – tick alterou o preço Bid
· TI CK_FLAG_AS K – tick alterou o preço As k
· TI CK_FLAG_LAS T – tick alterou o último preço da oferta
· TI CK_FLAG_VOL UME – tick alterou o volume
· TI CK_FLAG_BUY – tick é resultado de uma compra
· TI CK_FLAG_SELL – tick é resultado de uma venda
Exemplo:
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() falhou, erro = ",GetLastError());
//---
}
Também Veja
Esta seção descreve as estruturas para trabalhar com o Calendário econômico que está disponível
diretamente na plataforma MetaT rader. O calendário econômico é uma enciclopédia pronta com
descrição, data de lançamento e grau de importância de indicadores macroeconômicos. Os valores
reais dos indicadores macroeconômicos entram na plataforma MetaT rader imediatamente no momento
da publicação e são exibidos no gráfico como tags, permitindo monitorar visualmente os indicadores
necess ários por países, por moedas e por importância.
As descrições do país são especificadas pela estrutura MqlCalendarCountry. São usadas as funções
CalendarCountryById() e CalendarCountries()
struct MqlCalendarCountry
{
ulong id; // identificador de país pelo padrão
string name; // nome do país (na codificação atual
string code; // nome de código do país ISO 3166-1
string currency; // código da moeda do país
string currency_symbol; // símbolo da moeda do país
string url_name; // nome do país usado no URL em mql5.
};
As descrições dos eventos são especificadas pela estrutura MqlCalendarEvent. É usado nas funções
CalendarEventById(), CalendarEventByCountry() e CalendarEventByCurrency()
struct MqlCalendarEvent
{
ulong id; // identificador de evento
ENUM_CALENDAR_EVENT_TYPE type; // tipo de evento da enumeração ENUM_
ENUM_CALENDAR_EVENT_SECTOR sector; // setor ao qual está relacionado o e
ENUM_CALENDAR_EVENT_FREQUENCY frequency; // frequência do evento
ENUM_CALENDAR_EVENT_TIMEMODE time_mode; // modo de hora do evento
ulong country_id; // identificador do país
ENUM_CALENDAR_EVENT_UNIT unit; // unidade de medida da leitura do ca
ENUM_CALENDAR_EVENT_IMPORTANCE importance; // importância do evento
ENUM_CALENDAR_EVENT_MULTIPLIER multiplier; // multiplicador da leitura do calend
uint digits; // número de casas decimais
string source_url; // URL da fonte em que é publicado o
string event_code; // código do evento
string name; // nome do evento na linguagem do ter
};
Os valores do evento são definidos pela estrutura MqlCalendarValue. É usado nas funções
CalendarValueById(), CalendarValueH istoryByEvent(), CalendarValueH istory(),
CalendarValueLastByEvent() e CalendarValueLast()
struct MqlCalendarValue
{
ulong id; // ID do valor
ulong event_id; // ID do evento
datetime time; // hora e data do evento
datetime period; // período do relatório do evento
int revision; // revisão do indicador publicado em
long actual_value; // leitura atual do indicador
long prev_value; // leitura anterior do indicador
long revised_prev_value; // leitura anterior revisada do indic
long forecast_value; // leitura prevista do indicador
ENUM_CALENDAR_EVENT_IMPACT impact_type; // impacto potencial na taxa de câmbi
};
Identificador Descrição
CALENDAR_FR EQUENCY_NONE Frequência de publicação não definida
Identificador Descrição
CALENDAR_TYPE_EVENT Evento (reunião, discurso e assim por diante)
CALENDAR_TYPE_INDICAT OR Indicador
O setor econômico do evento é indicado na estrutura MqlCalendarEvent. Possíveis valores são listados
ENUM_CALENDAR_EVENT_SECTOR
Identificador Descrição
CALENDAR_SECT OR_NONE Setor não definido
Identificador Descrição
CALENDAR_IMPORT ANCE_NONE Nível de importância não definido
O tipo de unidade das leituras do evento é indicado na estrutura MqlCalendarEvent. Possíveis valores
são listados ENUM_CALENDAR_EVENT_UNIT
Identificador Descrição
CALENDAR_UNIT_NONE Unidade não definida
Identificador Descrição
CALENDAR_M UL TIPL IER_NONE Multiplicador não definido
Identificador Descrição
CALENDAR_IMPACT_NA Impacto não especificado
Identificador Descrição
CALENDAR_TIMEMODE_DAT ETIME A fonte publica a hora exata do evento
Veja também
Calendário econômico
· Erros de compilação – códigos de mensagens de erro em uma tentativa sem sucesso de compilar;
· Erros em tempo de execução – códigos de erro na execução de programas -mql5, que podem ser
obtidos usando a função GetLastErtror().
Avisos do Compilador
Os avisos do compilador são exibidos com propósitos informativos somente e não são mensagens de
erro.
Código Descrição
21 R egistro incompleto de uma data na string
datetime.
Erros de Compilação
O MetaEditor 5 exibe mensagens de erro sobre os erros de programa detectados pelo compilador
interno durante a compilação. A lista destes erros estão na tabela dada abaixo. Para compilar um
código-fonte em um código executável, pressione F7. Programas que contêm erros não podem ser
compilados até que os erros identificados pelo compilador sejam eliminados.
Código Descrição
100 Erro de leitura de arquivo
Gráficos
Objetos Gráficos
ERR_OBJECT_ERR OR 4201 Erro trabalhando com um
objeto gráfico
MarketInfo
ERR_MARKET_UNKNOWN_S YM 4301 Ativo desconhecido
BOL
Acesso de Histórico
ERR_HIS T ORY_NOT_FOUND 4401 H istórico solicitado não
encontrado
errado
Variáveis Globais
ERR_GLOBAL VARIABLE_NOT_F 4501 Variável global do terminal
OUND cliente não foi encontrada
Buffers de Indicador
Customizado
ERR_BUFFER S _NO_MEMORY 4601 Sem memória suficiente para
a distribuição de buffers de
indicador
Propriedades de Indicador
Customizado
ERR_CUS T OM _WR ONG_PR OPE 4603 Identificador (ID) de
RTY propriedade do indicador
customizado errado
Conta
ERR_ACCOUNT_WR ONG_PR OP 4701 Identificador (ID) de
ERTY propriedade da conta errado
Indicadores
ERR_INDICAT OR_UNKNOWN_S 4801 Ativo desconhecido
YM BOL
Profundidade de Mercado
ERR_BOOKS _CANNOT_ADD 4901 Profundidade de Mercado não
pode ser adicionado
Operações de Arquivo
ERR_T OO_MANY_FILES 5001 Mais que 64 arquivos não
podem ser abertos ao mesmo
tempo
Conversão de String
ERR_NO_S TRING_DAT E 5030 Sem data na string
Trabalhando com
W ebRequest()
Símbolos personalizados
ERR_NOT_CUS T OM _S YM BOL 5300 Deve ser especificado o
símbolo personalizado
Calendário econômico
ERR_CALENDAR_MOR E_DAT A 5400 T amanho de array insuficiente
para obter descrições de todos
os valores
Veja Também
Códigos de R etorno do Servidor de Negociação
· Propriedades de arquivo
· MessageBox
Um ou v ários flags podem ser especificado ao abrir um arquivo. Esta é uma combinação de flags. A
combinação de flags é escrita usando o sinal de lógica OR (|), que é posicionado entre os flags
enumerados. Por exemplo, para abrir um arquivo em formato CS V para leitura e escrita ao mesmo
tempo, especifique a combinação FILE_R EAD|FILE_WRIT E|FILE_CS V.
Exemplo:
int filehandle=FileOpen(filename,FILE_READ|FILE_WRITE|FILE_CSV);
· Se FI LE_R EAD é especificado, uma tentativa é feita para abrir um arquivo existente. Caso o arquivo
não exista, a abertura do arquivo falha, um novo arquivo não é criado.
· FI LE_R EAD|FI LE_WRIT E – um novo arquivo é criado caso o arquivo com o nome especificado não
exista.
· FI LE_WRIT E – o arquivo é criado novamente com tamanho zero.
Flags que definem o tipo de leitura de um arquivo aberto, possuem prioridade. O flag de mais alta
prioridade é FILE_CS V, daí vem FILE_BIN, e FILE_TXT é o de mais baixa prioridade. Assim, se v ários
flags são especificados ao mesmo tempo (FILE_TXT|FILE_CS V ou FILE_TXT|FILE_BIN ou FILE_BIN|
FILE_CS V), o flag com a mais alta prioridade será usado.
Flags que definem o tipo de codificação também têm prioridade. FILE_UNICODE é de maior prioridade
que FILE_ANS I. Assim, se você especificar a combinação FILE_UNICODE|FILE_ANS I, o flag
FILE_UNICODE será usado.
Se nem FILE_UNICODE ou FILE_ANS I forem indicados, FILE_UNICODE fica implícito. Se nem FILE_CS V,
ou FILE_BIN, ou FILE_TXT forem especificados, FILE_CS V fica implícito.
Se um arquivo é aberto para leitura como um arquivo de texto (FILE_TXT ou FILE_CS V), e no início do
arquivo uma indicação de dois -bytes 0xff,0xfe é encontrada, o flag de codificação será FILE_UNICODE,
mesmo se FILE_ANS I for especificado.
Também Veja
Funções de Arquivo
Propriedades de Arquivo
A função FileGetInteger() é usada para obter propriedades de arquivo. O identificador da propriedade
requerida proveniente da enumeração ENUM _FILE_PR OPERTY_INT EGER é passado para ela durante a
chamada.
ENUM_FILE_PROPERTY_INTEGER
ID Descrição
FILE_EXIS T S Verifica a existência
A função FileGetInteger() tem duas opções diferentes de chamada. Na primeira opção, para obter
propriedades de um arquivo, seu handle é especificado, que é obtido na abertura do arquivo usando a
função FileOpen(). Esta opção permite obter todas as propriedades de um arquivo.
Ao tentar obter propriedades outras daquelas especificadas acima, a segunda opção de chamada de
FileGetInteger() retornará um erro.
ENUM_FILE_POSITION
Identificador Descrição
SEEK_SET Início de arquivo
Também Veja
FileIsEnding, FileIsLineEnding
A tabela lista as constantes internas de alguns dos mais populares códigos de página. Códigos de
página não mencionados podem ser especificados através de um código correspondente à página.
Também Veja
Propriedades do T erminal Cliente
Para exibir um ícone na janela de mensagem é necess ário especificar flags adicionais :
Programas MQL5
Para um programa-mql5 funcionar, ele deve ser compilado (botão Compilar ou tecla F7). A compilação
deve passar sem erros (alguns avisos são possíveis ; eles devem ser analisados). Neste processo, um
arquivo executável com o mesmo nome e com extensão EX5 deve ser criado no diretório
correspondente, terminal_dir\MQL5\Experts, terminal_dir\MQL5\indicators ou
terminal_dir\MQL5\scripts. Este arquivo pode ser executado.
Expert Advisors, indicadores customizados e scripts são anexados a um dos gráficos abertos através
do método " Arrastar e Soltar" a partir da janela Navegador.
Para um Expert Advisor parar de funcionar, ele deve ser removido de um gráfico. Para fazer isso
selecione a " Lista de Experts " no menu de contexto do gráfico, então selecione um Expert Advisor da
lista e clique no botão "R emover" . O funcionamento de Expert Advisors é também afetado pelo estado
do botão " AutoT rading " .
Indicadores customizados e Expert Advisors trabalham até eles serem explicitamente removidos de um
gráfico; informações sobre Expert Advisors e Indicadores são salvos entre sess ões do terminal cliente.
Scripts são executados uma vez e são excluídos automaticamente na conclusão da operação ou
mudança de estado do gráfico corrente, ou no encerramento do terminal cliente. Após o reinício do
terminal cliente, scripts não são iniciados, porque as informações sobre eles não são salvas.
Os serviços não precisam estar vinculados ao gráfico para funcionarem e são projetados para executar
funções auxiliares. Por exemplo, no serviço você pode criar um símbolo personalizado, abrir o gráfico
do símbolo criado e, em um loop infinito, obter dados para ele usando funções de rede e atualizar
continuamente.
Execução de Programa
Cada script, serviço e EA é executado em seu próprio fluxo separado. T odos os indicadores calculados
com base em um símbolo, mesmo se estiverem sendo executados em gráficos diferentes, funcionam
no mesmo fluxo. Assim, todos os indicadores em um símbolo compartilham os recursos de um fluxo.
Ao executar um Expert Advisor, certifique-se de que ele tem um ambiente de negociação real e pode
acessar o histórico do requerido ativo e período, e sincronizar dados entre o terminal e o servidor.
Para todos estes procedimentos, o terminal fornece um atraso de iniciação de não mais que 5
segundos, após o qual o Expert Advisor será iniciado com os dados disponíveis. Portanto, no caso de
não haver conexão com o servidor, isso pode levar a um atraso na iniciação de um Expert Advisor.
Logo após um programa ser anexado a um gráfico, ele é carregado para a memória do terminal
cliente, bem como variáveis globais são inicializadas. Caso alguma variável global do tipo classe tiver
um construtor, este construtor será chamado durante a inicialização das variáveis globais.
Após isso, o programa fica esperando por um evento do terminal cliente. Cada programa-MQL5 deve
ter ao menos um manipulador (handler) de evento, caso contrário o programa carregado não será
executado. H andlers de evento têm nomes pré-definidos, parâmetros e tipos de retorno.
Enquanto o
evento de
recebimento de
um novo tick
está sendo
processado,
nenhum outro
evento deste
tipo é recebido.
Um terminal cliente envia novos eventos para o gráfico aberto correspondente. Os eventos podem ser
gerados por gráficos (Eventos de gráfico) ou programas -MQL5 (eventos customizados). A geração de
eventos de criação ou exclusão de objetos gráficos sobre um gráfico pode ser habilitado ou
desabilitado através da definição das propriedades de gráfico CH ART_EVENT_OBJECT_CR EAT E e
CH ART_EVENT_OBJECT_DELET E. Cada programa MQL5 e cada gráfico têm sua própria fila de eventos,
onde todos os novos eventos que chegam são adicionados.
Um programa recebe somente eventos do gráfico no qual ele está rodando. T odos os eventos são
processados um após o outro na ordem que em eles são recebidos. Se um fila já tiver um evento
NewT ick , ou este evento está correntemente sendo processado, então um novo evento NewT ick não é
colocado na fila do programa MQL5. Similarmente, se ChartEvent já esta enfileirado, ou este evento
está sendo processado, nenhum novo evento deste tipo é enfileirado. Os eventos de timer são
tratados da mesma forma – se o evento T imer está na filha ou sendo tratado, um novo evento timer
não é enfileirado .
Filas de evento têm um tamanho limitado mas suficiente, de modo que a sobrecarga de uma fila em
programas bem escritos é improv ável. No caso de uma sobrecarga de fila, novos eventos são
descartados sem enfileiramento.
Evite usar loops infinitos para manipular eventos. As únicas exceções a essa regra são scripts e
serviços que manipulam um único evento Start.
· OrderCalcMargin();
· OrderCalcProfit();
· OrderCheck ();
· OrderSend();
· SendFT P();
· Sleep();
· ExpertR emove();
· MessageBox().
T odas as funções projetadas para indicadores são proibidas em Expert Advisors e scripts :
· I ndicatorSetDouble();
· I ndicatorSetI nteger();
· I ndicatorSetString();
· PlotI ndexSetDouble();
· PlotI ndexSetString();
ExpertR emove();
EventSetMillisecondT imer();
EventSetT imer();
EventKillT imer();
SetIndex Buffer();
IndicatorSetDouble();
IndicatorSetInteger();
IndicatorSetString();
PlotIndexSetDouble();
PlotIndexSetInteger();
PlotIndexSetString();
PlotIndex GetInteger();
· inicio do terminal (se o indicador estava anexado a um gráfico antes do encerramento do terminal);
· alteração de um perfil (se o indicador estiver anexado a um dos gráficos do perfil alterado);
· após uma bem sucedida recompilação de um indicador, se o indicador estiver anexado a um gráfico;
· início de terminal (se o Expert Advisor estava anexado a um gráfico antes do encerramento do
terminal);
· carga de um template (se o Expert Advisor anexado a um gráfico está especificado no template);
· alteração de um perfil (se o Expert Advisor está anexado a um dos gráficos do perfil);
· conexão a uma conta, mesmo se o número da conta for o mesmo (se o Expert Advisor estava
anexado ao gráfico antes da autorização do terminal no servidor.
· Se um novo Expert Advisor é anexo a um gráfico, e um outro Expert Advisor já estava anexado,
este Expert Advisor é descarregado.
· encerramento do terminal (se o Expert Advisor estiver anexado a um gráfico);
· alteração de um perfil, se o Expert Advisor está anexado a um dos gráficos do perfil alterado;
· alteração da conta na qual o terminal está conectado (se o Expert Advisor estava anexado a um
gráfico antes da autorização do terminal no servidor;
· calling the ExpertR emove() function.
Em caso de alteração de ativo ou período de um gráfico, no qual o Expert Advisor está anexado,
Expert Advisors não são carregados ou descarregados. Neste caso o terminal cliente
subseqüentemente chama os handlers OnDeinit() sobre o ativo/período antigo e OnInit() sobre o novo
ativo/período; valores de variáveis globais e variáveis estáticas não são redefinidos. T odos os
eventos que foram recebidos pelo Expert Advisor antes da inicialização ser concluída (função OnInit())
são pulados.
Os serviços têm um único manipulador OnStart() no qual você pode organizar um loop infinito de
recebimento e de processamento de dados, por exemplo, ao criar e atualizar símbolos personalizados
usando funções de rede.
iniciar, parar, remover uma instância de serviço, use seu menu. Para gerenciar todas as instâncias,
use o menu do próprio serviço.
Exemplo:
//+------------------------------------------------------------------+
//| 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 construtor"); }
~CTestClass() { Print("CTestClass destruidor"); }
};
CTestClass global;
//+------------------------------------------------------------------+
//| Função de inicialização do Expert |
//+------------------------------------------------------------------+
int OnInit()
{
//---
Print("Inicialização");
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de Desinicialização do Expert |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
Print("Desinicialização com motivo",reason);
}
//+------------------------------------------------------------------+
//| Função tick (ponto) de um Expert |
//+------------------------------------------------------------------+
void OnTick()
{
//---
}
//+------------------------------------------------------------------+
Também Veja
Eventos do terminal cliente, H andlers de Evento
Trade Permission
Trade Automation
A linguagem MQL5 fornece um grupo especial de funções de negociação projetado para o
desenvolvimento de sistemas de negociação automatizados. Programas desenvolvidos para negociação
automatizada sem intervenção humana são chamados Expert Advisors ou robôs de negociação. Para
criar um Expert Advisor no MetaEditor, abra o MQL5 W izard e selecione uma das duas opções :
· Expert Advisor (modelo) – permite-lhe criar um modelo com uma função de manipulação de eventos
que devem ser complementados com toda a funcionalidade necess ária por meio de programação.
· Expert Advisor (generate) – permite você desenvolver um robô de negociação
completoSimplesmente selecionando os módulos necess ários : módulo de negociação de sinais,
módulo de gerenciamento de dinheiro e módulo de parada final.
As funções de negociação podem funcionar apenas em Expert Advisors e scripts. A negociação não é
permitida para os indicadores.
Você pode alternar a opção de negociação automatizada diretamente no painel Padrão do terminal:
Verificar amostra:
if (!TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
Alert("Verifique se a negociação automatizada é permitida nas configurações do terminal!");
Verificar amostra:
if(!TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
Alert("Verifique se a negociação automatizada é permitida nas configurações do terminal!");
else
{
if(!MQLInfoInteger(MQL_TRADE_ALLOWED))
Alert("A negociação automatizada é proibida nas configurações do ",__FILE__);
}
if(!AccountInfoInteger(ACCOUNT_TRADE_EXPERT))
Alert("Negociação automatizada é proibida para a conta ",AccountInfoInteger(ACCOUNT_LOGIN),
" no lado do servidor de negociação");
if(!AccountInfoInteger(ACCOUNT_TRADE_ALLOWED))
Comment("A negociação é proibida para a conta ",AccountInfoInteger(ACCOUNT_LOGIN),
".\n Talvez uma senha de investidor tenha sido usada para conectar-se à conta de negoci
"\n Verifique o diário do terminal para a seguinte entrada:",
· Sem conexão com o servidor de negociação. Isso pode ser verificado usando
T erminalInfoInteger(T ER M INAL _CONNECT ED);
· Conta de negociação comutada para modo somente leitura (enviada para o arquivo);
Veja também
Propriedades do terminal do cliente, Propriedades da Conta, Propriedades de um programa MQL5 em
execução
Imediatamente após o terminal cliente carregar um programa (uma Expert Advisor ou um indicador
customizado) e começar o processo de inicialização de variáveis globais, o evento Init será enviado, e
será processado pelo handler de evento OnInit(), caso exista. Este evento também é gerado após um
instrumento financeiro e / ou prazo gráfico ser alterado, depois de um programa ser recompilado no
MetaEditor, depois dos parâmetros de entrada serem alterados a partir da janela de configuração de
um Expert Advisor ou um indicador personalizado. Um Expert Advisor é também inicializado após a
conta ser alterada. O evento Init não é gerado para scripts.
Deinit
O motivo de desinicialização pode ser obtido a partir do parâmetro passado para a função OnDeinit().
A execução da função OnDeinit() está restrita a 2.5 segundos. Se durante este tempo a função não for
concluída, então ela é finalizada de forma forçada. O evento Deinit (Desinicializar) não é gerada para
scripts.
Start
Evento Start – evento especial para executar um script ou serviço depois que ele é carregado. Este
evento é tratado pela função OnStart. Evento Start não é enviado para EAs e indicadores
personalizados.
NewTick
O evento NewT ick é gerado caso existam novas cotações, ele é processado pelo OnT ick () de Expert
Advisors anexados. No caso de uma nova cotação ser recebida enquanto a função OnT ick estiver
processando a cotação anterior, a nova cotação será ignorada pelo Expert Advisor, porque o evento
correspondente não será enfileirado.
T odas as novas cotações que são recebidas enquanto o programa está rodando são ignoradas até que
a execução da função OnT ick () esteja concluída. Após isso, a função rodará somente após uma nova
cotação ser recebida. O evento NewT ick é gerado independentemente da negociação automática ser
permitida ou não (botão " AutoT rading Permite/Proíbe" ). A proibição de negociação automática
significa somente que o envio de solicitações de negociação a partir de um Expert Advisor não é
permitido, enquanto o Expert Advisor continua trabalhando.
A proibição de negociação automática ao apertar o botão apropriado não parará a execução corrente
da função OnT ick ().
Calculate
O evento Calculate é gerado somente para indicadores logo após o evento Init ser enviado e em
qualquer alteração de dados de preços. Ele é processado pela função OnCalculate.
Timer
O evento T imer é periodicamente gerado pelo terminal cliente para o Expert Advisor que ativou o
timer através da função EventSetT imer. Geralmente, esta função é chamada na função OnInit. O
processamento do evento T imer é realizado pela função OnT imer. Após a operação do Expert Advisor
estar concluída, é necess ário destruir o timer usando a função EventKillT imer, que é geralmente
chamada na função OnDeinit.
Trade
O evento T rade é gerado quando uma operação de trade é concluída em um servidor de negociação. O
evento T rade é tratado pela função OnT rade() para as seguintes operações de negociação:
· cancelamento de uma ordem pendente com aus ência de dinheiro suficiente ou expiração;
TradeTransaction
Ao realizar algumas ações específicas em uma conta de negociação, seu estado muda. T ais ações
includem:
· Envio de uma solicitação de negociação a partir de algum aplicativo MQL5 no terminal usando as
funções OrderSend e OrderSendAs ync e sua posterior execução.
· Envio de uma solicitação de negociação por meio da interface gráfica do terminal e sua posterior
execução.
· Ativação de ordens pendentes e ordens de stop no servidor.
· mudança de posições
Por exemplo, ao enviar uma ordem de compra de mercado, ela é tratada, uma ordem de compra
apropriada é criada para a conta, a ordem é então executada e removida da lista de ordens em
aberto, e então ela é adicionada ao histórico de ordens, uma apropriada operação (deal) é adicionada
ao histórico e uma nova posição é criada. T odas estas ações são transações de negociação. A chegada
de tal transação no terminal é um evento T radeT ransaction. Este evento é tratado pela função
OnT radeT ransaction.
Tester
O evento T ester é gerado após um teste de um Expert Advisor sob dados de histórico ter acabado. O
evento é tratado pela função OnT ester().
TesterInit
O evento T esterInit é gerado no início de uma otimização no Provador de Estratégia antes do primeiro
passo de otimização. O evento T esterInit é tratado pela função OnT esterInit().
TesterPass
O evento T esterPass é gerado quando uma nova estrutura de dados é recebido. O evento T esterPass é
tratado pela função OnT esterPass().
TesterDeinit
ChartEvent
O evento ChartEvent é gerado pelo terminal cliente quando um usuário está trabalhando com um
gráfico:
T ambém existe o evento customizado ChartEvent, que pode ser enviado para um Expert Advisor
através de qualquer programa mql5 por meio do uso da função EventChartCustom. O evento é
processado pela função OnChartEvent.
BookEvent
O evento Book Event é gerado pelo terminal cliente após a Profundida de Mercado ser alterada; ele é
processado pela função OnBook Event. Para começar a geração de Book Event para um ativo
especificado, é necess ário subscrever o ativo para este evento através do uso da função
Mark etBook Add.
Para desfazer a subscrição de Book Event para um ativo especificado, é necess ário chamar a função
Mark etBookR elease. O evento Book Event é um evento do tipo-transmissão - isso significa que é
suficiente inscrever apenas um Consultor Especializado (Expert Advisor) para este evento, e todos os
outros Consultores Especializados (Expert Advisors) que têm o manipulador de eventos OnBook Event,
vão recebê-lo. É por isso que é necess ário analisar o nome do ativo, que é passado para um handler
como um parâmetro.
Também Veja
H andlers de Evento, Execução de Programa
Recursos
Usando gráficos e som em programas MQL5
Programas em MQL5 permitem trabalhar com som e arquivos gráficos :
· ObjectCreate() permite criar interfaces de usuário usando os objetos gráficos OBJ_BIT MAP e
OBJ_BIT MAP_LABEL.
PlaySound()
Exemplo de chamada da função PlaySound():
//+------------------------------------------------------------------+
//| A função chama OrderSend() padrão e toca um som |
//+------------------------------------------------------------------+
void OrderSendWithAudio(MqlTradeRequest &request, MqlTradeResult &result)
{
//--- envia uma solicitação para um servidor
OrderSend(request,result);
//--- se a solicitação for aceite, executa o som Ok.wav
if(result.retcode==TRADE_RETCODE_PLACED) PlaySound("Ok.wav");
//--- se falhar, toca um alarme a partir do arquivo timeout.wav
else PlaySound("timeout.wav");
}
O exemplo mostra como tocar sons a partir de arquivos 'Ok .wav ' e 'timeout.wav ', que estão incluídos
no pacote do terminal padrão. Estes arquivos estão localizados na pasta terminal_directory\Sounds.
Aqui, terminal_directory é uma pasta, a partir do qual o terminal de cliente da MetaT rader 5 é
iniciado. A localização do diretório do terminal pode ser encontrado a partir de um programa MQL5 da
seguinte forma:
Você pode usar arquivos de som não somente da pasta terminal_directory\Sounds, mas também de
qualquer sub-pasta localizada em terminal_data_directory\MQL5. Você pode descobrir a localização
do diretório de dados do terminal a partir do menu do terminal " Arquivo" -> " Abrir" dados do terminal
ou usar um método de programa:
Observe que no comentário o caminho do arquivo está escrito usando uma barra invertida "\" , e na
função é usado "\\" .
Ao se especificar o caminho, sempre use barras invertidas duplas como separador, porque uma única
barra invertida é um controle de símbolo para o compilador ao lidar com constantes de cadeias de
caracteres e constantes de caracteres no código fonte do programa.
ObjectCreate()
Exemplo de um Expert Advisor, que cria um rótulo gráfico (OBJ_BIT MAP_LABEL) usando a função
ObjectCreate().
set=ObjectSetString(0,label_name,OBJPROP_BMPFILE,1,dollar);
if(!set)
{
PrintFormat("Falha no download a partir do arquivo de imagem %s. Código de erro %d",dol
}
//--- envia um comando para um gráfico para reatualização, a fim de que o botão apareça im
ChartRedraw(0);
}
else
{
//--- falha ao criar um objeto, notificar
PrintFormat("Falha ao criar objeto OBJ_BITMAP_LABEL. Error code %d",GetLastError());
}
}
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de Desinicialização do Expert |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- exclui um objeto de um gráfico
ObjectDelete(0,label_name);
}
A criação e configuração do objeto gráfico de nome currency_label são executados na função OnInit().
Os caminhos para os arquivos gráficos são definidos nas variáveis globais euro e dollar , uma barra
invertida dupla é usada como separador:
O Objeto OBJ_BIT MAP_LABEL é na realizada um botão, que exibe uma das duas imagens, dependendo
do estado do botão (pressionado ou não pressionado): euro.bmp ou dollar.bmp.
O tamanho do botão com uma interface gráfico é automaticamente ajustada para o tamanho da
figura. A imagem é alterada por um clique do botão esquerdo do mouse sob o objeto
OBJ_BIT MAP_LABEL (" Disable selection" deve estar definida nas propriedades). O objeto
OBJ_BIT MAP é criado da mesma forma - ele é usado para criar o pano de fundo com um imagem
necess ária.
O valor da propriedade OBJPR OP_BMPFILE, que é respons ável pela aparência dos objetos OBJ_BIT MAP
e OBJ_BIT MAP_LABEL, e pode ser alterado dinamicamente. Isso permite criar v árias interfaces
interativas de usuário para programas MQL5.
#resource path_to_resource_file
#resource "<path_to_resource_file>"
· se o separador barra invertida "\" (escrito como "\\" ) é colocado no começo do caminho, ele busca
pelo recurso referente ao diretório terminal_data_directory\MQL5\,
· se não houver barra invertida, ele busca pelo recurso referente à localização do arquivo de recurso,
na qual o recurso foi escrito.
Uso de Recursos
Nome de recurso
Após um recurso ser declarado usando a diretiva #resource, ele pode ser usado em qualquer parte de
um programa. O nome do recurso é seu caminho sem uma barra invertida no começo da linha, que
define o caminho do recurso. Para usar seu próprio recurso no código, o sinal especial "::" deve ser
adicionado antes do nome do recurso.
Exemplos :
Deve se notar que ao definir imagens a partir de um recurso para os objetos OBJ_BIT MAP e
OBJ_BIT MAP_LABEL, o valor da propriedade OBJPR OP_BMPFILE não pode ser modificado manualmente.
Por exemplo, para criar OBJ_BIT MAP_LABEL nós usados euro.bmp e dollar.bmp.
Ao visualizar as propriedades deste objeto, veremos que as propriedades BitMap File (On) e BitMap
File (Off) são esmaecidas e não podem ser alteradas manualmente:
A fim de usar um nome de recurso de um outro arquivo, ele deve ser especificado como
<path_EX5_file_name>::<resource_name>. Por exemplo, suponha que o script
Draw_T riangles _Script.mq5 contém um recurso para uma imagem no arquivo triangle.bmp:
#resource "\\Files\\triangle.bmp"
Então seu nome, para uso no script em si, se assemelhará a "Files \triangle.bmp" , e a fim de us á-lo,
"::" deve ser adicionado ao nome do recurso.
A fim de usar o mesmo recurso a partir de um outro programa, por exemplo, a partir de um Expert
Advisor, precisamos adicionar ao nome do recurso o caminho para o arquivo EX5 correspondente ao
terminal_data_directory\MQL5\ e o nome arquivo EX5 do script - Draw_Triangles_Script.ex5.
Suponha que o script está localizado na pasta padrão terminal_data_directory\MQL5\Scripts \, então
o chamado deve ser escrito da seguinte forma:
Se o caminho para o arquivo executável não for especificado ao chamar o recurso de um outro EX5, o
arquivo executável é procurado na mesma pasta que contém o programa que chama o recurso. Isso
significa que se um Expert Advisor chamar um recurso de Draw_T riangles _Script.ex5 sem especificar o
caminho, como abaixo:
if(handle_ind==INVALID_HANDLE)
{
Print("Expert: iCustom call: Error code=",GetLastError());
return(INIT_FAILED);
}
//---
return(INIT_SUCCEEDED);
}
Os casos em que o indicador personalizado, na função OnInit(), cria uma ou mais cópias de si mesmo
exigem uma análise separada. Lembre-se que para usar um recurso a partir de um programa mql5, é
preciso especificá-lo no formato: <caminho_do_nome_do_arquivo_EX 5>::<nome_do_recurso>.
O caminho para si mesmo pode ser obtido utilizando a função GetR elativeProgramPath(), a seguir, um
exemplo de utilização:
//+------------------------------------------------------------------+
//| SampleIndicator.mq5 |
//| Copyright 2013, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property indicator_separate_window
#property indicator_plots 0
int handle;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- maneira errada para especificar uma referência para si próprio
//--- string path="\\Experts\\SampleEA.ex5::Indicators\\SampleIndicator.ex5";
//--- maneira correta para obter uma referência a si mesmo
string path=GetRelativeProgramPath();
//--- indicator buffers mapping
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;
//--- obtemos o caminho absoluto para o programa
string path=MQLInfoString(MQL_PROGRAM_PATH);
//--- encontramos a posição da sub-cadeia de caracteres "\MQL5\"
int pos =StringFind(path,"\\MQL5\\");
//--- sub-cadeia não encontrada - erro
if(pos<0)
return(NULL);
//--- ignoramos o diretório "\MQL5"
pos+=5;
//--- ignoramos '\' extras
while(StringGetCharacter(path,pos+1)=='\\')
pos++;
//--- se se tratar de um recurso, retornamos o caminho em relação ao diretório MQL5
if(StringFind(path,"::",pos)>=0)
return(StringSubstr(path,pos));
//--- encontramos o delimitador para o primeiro sub-diretório em MQL5 (por exemplo, MQL5\Indicators
//--- se ele não existir, retornamos o caminho em relação ao diretório MQL5
if((pos2=StringFind(path,"\\",pos+1))<0)
return(StringSubstr(path,pos));
//--- retornamos o caminho em relação ao sub-diretório (например, MQL5\Indicators)
return(StringSubstr(path,pos2+1));
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const int begin,
const double& price[])
{
//--- Valor de retorno do prev_calculated para a próxima chamada
return(rates_total);
}
Variáveis de recurso
Os recursos podem ser declarados usando as variáveis de recurso, e tratá-los como se fossem uma
variável do tipo apropriado. Formato do declaração:
Exemplos de declaração:
#resource "data.bin" as int ExtData[] // declaração de matriz de tipo numérico, que con
#resource "data.bin" as MqlRates ExtData[] // declaração de matriz de estruturas simples, qu
//--- cadeias de caracteres
#resource "data.txt" as string ExtCode // declaração de cadeias de caracteres que contêm
//--- recursos gráficos
#resource "image.bmp" as bitmap ExtBitmap[] // declaração de matriz unidimensional, que conté
#resource "image.bmp" as bitmap ExtBitmap2[][] // declaração de matriz bidimensional, que contém
Ao utilizar tal declaração, os dados deste recurso podem ser tratados por intermédio de uma variável,
o endereçamento automático via "::<rsource name>" não funciona.
R esultado de execução do script, estão criados apenas dois objetos OBJ_BIT MAP_LABEL de três. Ao
mesmo tempo, na imagem do primeiro objeto, nós vemos uma linha vermelha no meio.
Uma vantagem importante do uso de recursos é que os arquivos de recurso - antes de serem incluídos
num arquivo EX5 executável e compilados - são comprimidos automaticamente. Assim, o uso de
variáveis de recurso permite não só empacotar diretamente os dados necess ários num arquivo EX5
executável, mas também reduzir o número e o tamanho total dos arquivos em comparação com o
método convencional de escrita de programas MQL5.
Características
· O tipo especial de variável de recurso bitmap informa ao compilador que o recurso é uma
representação gráfica. Essas variáveis recebem o tipo uint.
· A matriz-variável de recurso de tipo bitmap pode ter duas dimens ões, neste caso, o tamanho da
matriz será definido como [altura_de_imagem][largura_de_imagem]. No caso de uma matriz
unidimensional, o número de elementos será definido como o produto de
altura_de_imagem*largura_de_imagem.
· Ao carregar imagens de 24 bits, para todos os pixels da imagem de componente de canal-alfa,
define-se como 255.
· Ao carregar imagens de 32 bits, para todos os pixels da imagem de componente de canal-alfa,
define-se como 255.
· Após carregar uma imagem de 32 bits com canal-alfa não acontece nenhuma manipulação de pixels.
Programas em OpenCL
Neste exemplo, sem a utilização de uma variável de recursocl_program, você teria de descrever esse
código como uma variável de cadeia grande.
Veja Também
R esourceCreate(), R esourceSave(), PlaySound(), ObjectSetInteger(), ChartApplyT emplate(), Funções
de Arquivo
Não é recomendado usar o nome do módulo com especificação completa para ser carregado, como
Drive:\Directory\FileName.Ext. As bibliotecas MQL5 são carregadas a partir da pasta
terminal_dir\MQL5\Libraries . Se a biblioteca não for encontrada, então o terminal tenta carreg á-la a
partir da pasta terminal_dir\experts .
As bibliotecas de sistema (DLL) são carregadas pelas regras do sistema operacional. Se a biblioteca já
estiver carregada (por exemplo, um outro Expert Advisor, e mesmo a partir de um outro terminal
cliente, executando em paralelo, então ele faz solicitações para a biblioteca já carregada. Caso
contrário, ele realiza uma busca na seguinte seqüência:
1. Diretório do qual o módulo que importa a dll foi iniciado. O módulo aqui é um Expert Advisor, um
script, um indicador ou uma biblioteca EX5.
2. Diretório terminal_data_directory\MQL5\Libraries (T ER M INAL _DAT A_PATH\MQL5\Libraries).
3. Diretório do qual o terminal cliente MetaT rader 5 foi iniciado.
4. Diretório de sistema.
5. Diretório do W indows.
6. Diretório corrente.
7. Diretórios listados na variável de sistema PATH .
Se uma biblioteca DLL usa uma outra DLL no seu funcionamento, a primeira DLL não pode ser
carregada no caso de não existir a segunda DLL.
Antes de um Expert Advisor (script, indicador) ser carregado, uma lista comum de todos os módulos
de biblioteca EX5 é formada. Vai ser usado a partir de um Expert Advisor carregado(script, indicador)e
das bibliotecas desta lista. Assim, é necess ário apenas uma única carga de módulos de bibliotecas EX5
usadas muitas vezes. Bibliotecas usam variáveis predefinidas do Expert Advisor (script, indicador) que
as chamam.
1. Diretório, caminho correspondente ao diretório do Expert Advisor (script, indicador) que importa o
EX5).
2. Diretório terminal_directory\MQL5\Libraries.
3. Diretório MQL5\Libraries no diretório comum a todos os terminais clientes MetaT rader 5
(Common\MQL5\Libraries).
· Chamador (no nosso caso, é um programa-mql5) deve " ver" um proto-tipo de uma função chamada
(importado da DLL), a fim de combinar parâmetros em uma pilha de forma apropriada.
· Chamador (em nosso caso, é um programa-mql5) coloca parâmetros na pilha em uma ordem
reversa, da direita para esquerda - nesta ordem uma função lê os parâmetros passados para ela.
· parâmetros são passados por valor, exceto aqueles explicitamente passados por referência (em
nossos casos de strings)
· Uma função importada limpa a pilha de forma independente através da leitura dos parâmetros
passados para ela.
Ao descrever o proto-tipo de uma função importada, parâmetros padrão podem ser usados.
Se a biblioteca correspondente é incapaz de ser carregada, ou existe uma proibição quanto ao uso da
DLL, ou a função importada não é encontrada - o Expert Advisor interrompe sua operação com a
mensagem apropriada " Expert Advisor stopped" no Diário (arquivo de log). Neste caso o Expert
Advisor não rodará até ser reiniciado. Um Expert Advisor pode ser reiniciado como resultado de
recompilação ou após a tabela de suas propriedades ser aberto e OK ser pressionado.
Passando Parâmetros
T odos os parâmetros de tipos simples são passados por valor a menos que sejam explicitamente
indicados que eles devem ser passados por referência. Quando uma string é passada, o endereço do
buffer da string copiada é passado; se uma string é passada por referência, o endereço do buffer
desta string sem copiá-la é passado para a função importada da DLL.
Estruturas que contém arrays dinâmicos, strings, classes, outras estruturas complexas, bem como
arrays estáticos ou dinâmicos dos objetos listados, não podem ser passados como parâmetro para uma
função importada.
Ao passar um array para uma DLL, o endereço do começo do buffer de dados é sempre passado
(independentemente da flag AS _SERIES). Uma função dentro de uma DLL não sabe nada sobre a flag
AS _SERIES, o array passado é um array estático de um comprimento indefinido; um parâmetro
adicional deve ser usado para especificar o tamanho do array.
Antes de iniciar a função OnInit, a variável _LastError é zerada. Em caso de uma situação de erro
ocorrer durante a processamento de cálculos ou no processo de chamada de funções internas, o a
variável _LastError recebe o código do erro correspondente. O valor armazenado nesta variável pode
ser obtida usando a função GetLastError().
Existem diversos erros críticos cuja ocorrência faz com que um programa seja encerrado
imediatamente:
Para obter respostas para estas questões, nos voltamos para o Provador de Estratégia, incluído no
terminal cliente MetaT rader 5.
· Simulação de Spread
· T este Multi-Moeda
· Agentes de T este
· Usando DLLs
Existem restrições no que diz respeito ao trabalho de algumas funções no testador de estratégias de
negociação
O evento NewT ick (mudança de preço) é o evento principal para o EA e, portanto, precisamos gerar
um seqüência de tick s para testar o EA. Existem 3 modos de geração de tick implementada no
Provador de Estratégia do terminal cliente MetaT rader 5:
· Cada T ick
O básico e mais detalhado é o modo " Cada T ick" , os outros dois modos são simplificações do modo
básico, e serão descritos em comparação com o modo " Cada T ick" . Considere todos os três modos em
ordem para entender as diferenças entre eles.
O elemento mínimo do histórico de preços é a barra de minuto, a partir do qual pode-se obter
informações sobre os quatro valores de preços :
· M áximo (H igh) - o máximo que foi alcançado durante esta barra de minuto;
· Mínimo (Low) - o mínimo que foi alcançado durante esta barra de minuto;
A nova barra de minuto não é aberta no momento que o novo minuto começa (número de segundos se
torna igual a 0), mas quando um tick ocorre - uma alteração de preço de no mínimo um ponto. A
figura mostra a primeira barra de minuto da nova semana de negociação, que tem a hora de abertura
de 2011.01.10 00:00. A diferença de preços entre Sexta e Segunda, que nós vemos no gráfico é
comum, já que taxas de moeda flutuam mesmo em fins -de-semana em resposta ao surgimento de
notícias.
Para esta barra, nós sabemos apenas que a barra de minuto foi aberta em 10 de Janeiro de 2011 às 00
horas 00 minutos, mas nós não sabemos nada sobre os segundos. Ela poderia ter sido aberta às
00:00:12 ou 00:00:36 (12 ou 36 segundos após o inicio de um novo dia) ou qualquer outro instante
dentro daquele minuto. Mas nós sabemos que o preço de Abertura do EURUS D foi de 1.28940 no
instante de abertura da nova barra de minuto.
Nós também não sabemos, em termos de segundos, quando o tick , correspondente ao preço de
fechamento da barra de minuto considerada, foi recebido. Nós só sabemos uma coisa - o último preço
de Fechamento da barra de minuto. Para este minuto, o preço foi 1.28958. Os instantes de
aparecimento dos preços de M áximo e Mínimo também são desconhecidos, mas nós sabemos que os
preços máximo e mínimo foram nos níveis de 1.28958 e 1.28940, respectivamente.
Para testar a estratégia de negociação, nós precisamos de uma seqüência de tick s, na qual o trabalho
do Expert Advisor será simulado. Assim, para toda barra de minuto, nós conhecemos os 4 pontos de
controle, onde os preços definitivamente estiveram. Se uma barra tem apenas 4 ticks, então isso é
informação suficiente para realizar um teste, mas geralmente o volume de tick é maior que 4.
Portanto, existe a necessidade de gerar pontos de controle adicionais para tick s, que ocorreram entre
os preços de Abertura, M áximo, Mínimo, e Fechamento. O princípio do modo de geração de tick s
" Cada tick" é descrito dentro do O Algoritmo de Geração de T ick s dentro da T estador de Estratégia do
T erminal MetaT rader 5, um número a partir do qual é apresentado a baixo.
Ao testar no modo " Cada T ick" , a função OnT ick () do EA será chamado a cada ponto de controle. Cada
ponto de controle é um tick de uma seqüência gerada. O EA receberá a hora e preço do tick simulado,
assim como se estivesse trabalhando online.
Importante: o modo de teste " Cada Tick" é o mais preciso, mas ao mesmo tempo, é o que
consome mais tempo. Para um teste inicial da maioria das estratégias de negociação, é
geralmente suficiente usar um dos outros dois modos de teste.
No modo " OH LC por minuto" , a seqüência de tick s é construída somente pelos preços OHLC das
barras de minuto, o número de pontos de controle gerados é significativamente reduzido - assim
como o tempo de teste. O disparo da função OnT ick () é realizada sob todos os pontos de controle, que
são construídos pelos preços OH LC das barras de minuto.
A opção de não gerar tick s intermediários adicionais entre os preços de Abertura, M áximo, Mínimo e
Fechamento, leva ao aparecimento de um rígido determinismo na evolução dos preços, a partir do
momento que o preço de Abertura é determinado. Isso torna possível criar um "T este Graal" , que
mostra um agradável gráfico ascendente do saldo do teste.
A figura mostra um gráfico muito atrativo deste teste de EA. Como ele foi obtido? Nós conhecemos 4
preços para uma barra de minuto, e nós sabemos que o primeiro é preço de Abertura, e o último é o
preço de Fechamento. Nós temos os preços M áximo e Mínimo entre eles, e a seqüência de suas
ocorrências é desconhecida, mas é sabido que o preço M áximo é maior ou igual que o preço de
Abertura (e o preço Mínimo é menor ou igual ao preço de Abertura).
É suficiente determinar o momento da recepção do preço de Abertura, e então analisar o próximo tick
a fim de determinar que preço nós temos no momento - ou o M áximo ou o Mínimo. Se o preço for
abaixo do preço de Abertura, então nós temos um preço Mínimo e comprarmos neste tick , o próximo
tick corresponderá ao preço M áximo, no qual nós encerramos a compra e abrimos para venda. O
próximo tick é o último, este é o preço de Fechamento, e encerramos a venda nele.
Se após o preço, nós recebermos um tick com um preço maior que o preço de Abertura, então a
seqüência de operações (deals) é invertida. Processe uma barra de minuto neste modo " trapaceiro" , e
espere para pela próxima barra.
Ao testar tal EA no histórico, tudo vai bem, mas uma vez que lançamos ele online, a verdade começa a
ser revelada - a linha de saldo permanece regular, porém em direção descendente. Para expor este
truque, nós simplesmente precisamos executar o EA no modo " Cada T ick" .
Os períodos W1 e M N1 são exceções no modo de geração de tick s " Somente Preços de Abertura": para
estas janelas de tempo, tick s são gerados para os preços OH LC de cada dia, e não preços OH LC da
semana ou mês.
Suponha que nós testemos um Expert Advisor sob EURUS D H1 no modo " Somente Preços de Abertura" .
Neste caso o número total de tick s (pontos de controle) não será mais que 4 * número de barras de
uma-hora dentro do intervalo testado. Mas o handler OnTick() é chamado somente na abertura da
barra de uma-hora. As verificações requeridas para um teste correto ocorrem no resto dos ticks (que
são " escondidas " do EA).
Se não existirem nenhum posição aberta ou ordens pendentes, nós não precisamos realizar destas
verificações nos tick s escondidos, e o aumento da velocidade pode ser bastante substancial. Este
modo " Somente Preços de Abertura" é bem adequado para testar estratégias que processam operações
(deals) somente na abertura da barra e não usam ordens pendentes, bem como ordens Stop Loss e
T ak e Profit. Para estratégias deste tipo, a necessidade de precisão do teste é preservada.
Vamos usar o Expert Advisor Moving Average (Média Móvel) do pacote padrão como exemplo de um
EA, que pode ser testado em qualquer modo. A lógica deste EA é construído de tal forma que todas as
decis ões são feitas na abertura da barra, e operações (deals) são executadas imediatamente, sem o
uso de ordens pendentes.
Como se pode ver, os gráficos nos diferentes modos de teste são exatamente o mesmo para o EA
Moving Average do pacote padrão.
· No Expert testado, você não pode acessar os dados do período inferior do período utilizado para o
teste/otimização. Por exemplo, se você rodar um teste em M 20, você não pode acessar dados de
M 30, mas é possível acessar H1. Além disso, os períodos superiores que são acessados devem ser
múltiplos do período do teste. Por exemplo, se você rodar um teste em M 20, você não pode acessar
dados de M 30, mas é possível acessar H1. Estas limitações estão relacionadas com a
impossibilidade de se obter dados de períodos inferiores ou não múltiplos de fora das barras geradas
durante o teste/otimização.
· Limitações no acesso a dados de outros períodos também se aplicam a outros ativos cujos dados
são usados pelo Expert Advisor. Neste caso, a limitação para cada ativo depende do primeiro período
acessado durante o teste/otimização. Suponha que durante teste em EURUS D H1, um Expert Advisor
acesse dados de GBPUS D M 20. Neste caso, o Expert será capaz de continuar a usar os dados de
EURUS D H1, H2, etc, bem como GBPUS D M 20, H1, H2, etc.
Observação: O modo " Somente Preços de Abertura" tem o mais rápido tempo de teste, mas não é
adequado para todas as estratégias de negociação. Selecione o modo de teste desejado baseado
nas características do sistema de negociação.
Para concluir a seção sobre os modos de geração de tick , vamos considerar uma comparação visual
dos diferentes modos de geração de tick para EURUS D, para duas barras de M 15 no intervalo de
2011.01.11 21:00:00 - 2011.01.11 21:30:00.
Os tick s foram salvos em arquivos diferentes usando o EA W riteT ick s FromT ester.mq5 e o fim desses
nomes de arquivos são especificados nos parâmetros de entrada filenameEveryT ick , filenameOH LC e
filenameOpenPrice input-parameters.
Para obter três arquivos com três seqüências de tick (para cada um dos seguintes modos : " Cada T ick" ,
" OH LC por minuto" e " Somente Preços de Abertura" ), o EA foi disparado três vezes nos modos
correspondentes, em execuções individuais. Então, os dados destes três arquivos foram exibidos no
gráfico usando o indicador T ick s FromT ester.mq5. O código do indicador está anexado neste artigo.
Por padrão, todos as operações de arquivo na linguagem MQL5 são feitas dentro da " caixa de areia de
arquivo" e durante um teste o EA tem acesso somente a sua própria " caixa de areia de arquivo" . A fim
de que o indicador e o EA trabalhem com arquivos provenientes de uma pasta comum durante o teste,
nós usados o flag FILE_COMMON. Um exemplo de código do EA:
Para ler dos dados no indicador, nós também usamos o flag FILE_COMMON. Isso nós permite evitar
transferir manualmente os arquivos necess ários de uma pasta para outra.
Simulação de Spread
A diferença de preço entre os preços de Venda (Bid) e Compra (As k ) é chamado de spread. Durante um
teste, o spread não é modelado mas é obtido a partir de dados históricos. If the spread is less than or
equal to zero in the historical data, then the last k nown (at the moment of generation) spread of is
used by testing agent.
Além disso, os dados históricos contém valores de tick e volumes de negociação. Para o
armazenamento e recuperação dos dados nós usamos a estrutura especial MqlR ates :
struct MqlRates
{
datetime time; // Hora de início do período
double open; // Preço de Abertura
double high; // O mais alto preço do período
double low; // O mais baixo preço do período
double close; // Preço de Fechamento
long tick_volume; // Volume de Tick
int spread; // Spread
long real_volume; // Volume de Negociação
};
Para garantir a maior precisão - durante os testes em modo de tick s reais - também são usadas as
barras de minuto. Nelas são verificados e corrigidos os dados de tick s. Isto também evita a
diverg ência de gráficos no testador e no terminal de cliente.
O testador verifica a correspondência entre os dados de tick e os parâmetros da barra de minuto, isto
é: o tick não deve ultrapassar os preços H igh/Low da barra; o tick que a abre e fecha o minuto deve
coincidir com os preços Open/Close da barra. T ambém é comparado o volume. Se identificada uma
diferença, são descartados todos os tick s correspondentes a esta barra de minuto. Em vez deles,
serão utilizados os tick s gerados (como no modo " Cada tick" ).
Se no histórico do símbolo existir uma barra de minuto, mas, se, nesse minuto, não houver dados de
tick s, o testador gerará tick s no modo "T odos os tick s " . Isto permite plotar corretamente o gráfico no
testador, caso a corretora tenha os dados de tick incompletos.
Se, no histórico do símbolo, não existir uma barra de minuto, mas, se, nesse minuto, houver dados de
tick s, então, esses tick s podem ser utilizados. Por exemplo, as barras de símbolos de bolsa são
formados de acordo com os preços Last. Se, a partir do servidor, chegarem apenas tick s com preços
Bid/As k sem preço Last, a barra não será formada. O testador usará estes dados de tick s, uma vez
que eles não contradizem as de minuto.
Os dados de tick s podem ser diferentes das barras de minuto por v árias razões. Por exemplo, devido a
desconex ões ou outras falhas, quando dados são transferidos da fonte para o terminal de cliente. Ao
testar, os dados de minuto são considerados mais confiáveis.
· Ao executar o teste, não só são sincronizados os dados de tick s, mas também os de minuto de
acordo com o instrumento.
· Os tick s são armazenados no cache do símbolo no testador de estratégias. O tamanho do cache é
inferior a 128 000 tick s. Após chegarem novos tick s, seus dados mais antigos serão empurrados
para fora. No entanto, com ajuda da função CopyT ick s podem ser obtidos tick s fora do cache
(somente nos testes em tick s reais). Neste caso, os dados serão solicitados a partir da base de tick s
do testador, ela corresponde completamente à base de dados do terminal de cliente. Nesta base não
é feito nenhum ajuste de barras de minuto. Portanto, os tick s nele podem ser diferentes dos tick s
no cache.
Não importa se existe ou não uma chamada para um indicador em um handler de evento
específico, todos os indicadores, os handles que foram criados pelas funções iCustom() ou
IndicatorCreate(), serão recalculados antes de chamar o handler de evento.
Conseqüentemente, ao testar no modo " Cada T ick" , o cálculo dos indicadores acontecem antes da
chamada da função OnT ick ().
Se o timer está ativo no EA, usando a função EventSetT imer(), então os indicadores serão
recalculados antes de cada chamada ao handler de evento OnT imer(). Por conseqüência, o tempo de
teste pode ser aumentar consideravelmente com o uso de indicadores, escritos de uma forma não
otimizada.
histórico disponível de um ativo de forma a não requerer este histórico mais tarde. Após isso,
somente dados novos são carregados.
Um agente de teste recebe o histórico de um ativo a ser testado a partir do terminal cliente logo após
o começo do teste. Se os dados de outros instrumentos são usados no processo de teste (por exemplo,
é um Expert Advisor multi-moeda), o agente de teste solicita o histórico requerido do terminal cliente
durante a primeira chamada a tais dados. Se os dados históricos estiverem disponíveis no terminal,
eles são imediatamente passados para o agente de teste. Se os dados não estiverem disponíveis, o
terminal solicita e os baixa do servidor, e então os passa para o agente de teste.
Dados de instrumentos adicionais também são requeridos para calcular taxas -cruzadas de operações
de negociação. Por exemplo, ao testar uma estratégia em EUR CHF com a moeda de depósito em US D,
antes de processar a primeira operação de negociação, o agente de teste solicita os dados históricos
de EURUS D e US DCHF do terminal cliente, embora a estratégia não contenha chamadas de uso direta a
estes ativos.
Agentes de teste, por sua vez, recebem o histórico do terminal no formato compactado. Durante o
próximo teste, o Provador de Estratégia não carrega o histórico do terminal, porque os dados
requeridos estão disponíveis desde a execução anterior do Provador de Estratégia.
Teste Multi-Moeda
O Provador de Estratégia nos permite realizar um teste de estratégias, negociando em múltiplos
ativos. T ais EAs são convencionalmente referidos como Expert Advisors multi-moedas, já que
originalmente, um teste era realizado somente para um único ativo. No Provador de Estratégia do
terminal MetaT rader 5, nós podemos modelar negociação para todos os ativos disponíveis.
O Provador de Estratégia carrega o histórico dos ativos usados do terminal cliente (não do servidor
de negociação!) automaticamente durante a primeira chamada aos dados do ativo.
O agente de teste baixa somente o histórico faltante, com uma pequena margem para fornecer os
dados necess ários no histórico para o cálculo dos indicadores no período inicial do teste. Para as
janelas de tempo D1 ou menor, o volume mínimo de histórico baixado é de um ano.
Se não houver barras necess árias, a data de ínicio do teste será automaticamente deslocada do
passado para o presente para fornecer a reserva necess ária de barras antes do teste.
Durante um teste, a janela " Observação de Mercado" é também emulada, a partir do qual se pode
obter informações sobre os ativos.
Por padrão, no começo de um teste, existe somente um ativo na " Observação de Mercado" do
Provador de Estratégia - o ativo em que o teste está rodando. T odos os ativos necess ários são
conectados à janela " Observação de Mercado" do Provador de Estratégia (não ao terminal!)
automaticamente quando referenciados.
Antes de começar um teste de um Expert Advisor multi-moeda, é necess ário selecionar os ativos
requeridos para o teste na janela " Observação de Mercado" do terminal e carregar os dados
requeridos. Durante a primeira chamada de um ativo " estrangeiro" , seu histórico será
automaticamente sincronizado entre o agente de teste e o terminal cliente. Um ativo
" estrangeiro" é o outro ativo, diferente daquele em que o teste é rodado.
R eferência aos dados de um " outro" ativo ocorre nos seguintes casos :
· A solicitação aos dados da janela " Observação de Mercado" por de um outro ativo:
1. Series InfoInteger
2. Bars
3. S ymbolSelect
4. S ymbolIsS ynchronized
5. S ymbolInfoDouble
6. S ymbolInfoInteger
7. S ymbolInfoString
8. S ymbolInfoT ick
9. S ymbolInfoSessionQuote
10.S ymbolInfoSessionT rade
11.Mark etBook Add
12.Mark etBookGet
· Solicitação da série de tempo para um ativo/janela de tempo atráves do uso das seguintes funções :
1. CopyBuffer
2. CopyR ates
3. CopyT ime
4. CopyOpen
5. CopyH igh
6. CopyLow
7. CopyClose
8. CopyT ickVolume
9. CopyR ealVolume
10.CopySpread
No momento da primeira chamada a um " outro" ativo, o processo de teste é interrompido e o histórico
é baixado para o ativo/período, do terminal para o agente de teste. Ao mesmo tempo, a geração da
seqüência de tick para este ativo é feita.
Uma seqüência de tick individual é gerada para cada ativo, de acordo com o modo de geração de tick
selecionado. Você também pode solicitar explicitamente o histórico dos ativos desejados através de
chamada ao S ymbolSelect() no handler OnInit() - a baixa do histórico será feita imediatamente antes
do teste do Expert Advisor.
Assim, não é necess ário nenhum esforço extra para realizar teste de multi-moeda no terminal cliente
MetaT rader 5. Apenas abra os gráficos dos apropriados ativos no terminal cliente. O histórico será
automaticamente carregado do servidor de negociação para todos os ativos requeridos, contanto que
ele contenha estes dados.
A aus ência de diferença entre as horas GM T , local, e do servidor no Provador de Estratégia é feita
deliberadamente para o caso de não haver conexão com o servidor. Os resultados do teste devem
sempre ser os mesmos, independentemente de haver ou não uma conexão. Informações sobre a hora
do servidor não é armazenado localmente, e é obtido do servidor.
Para verificar a dependência do tempo de teste a partir de um dada freqüência do timer, nós temos
que criar um EA simples sem nenhum operação de negociação.
As medições de tempo de tempo são obtidas em valores diferentes do parâmetro timer (periodicidade
do evento T imer). Sob os dados obtidos, nós plotamos o tempo do teste como função do período do
T imer.
Pode-se ver claramente que quanto menor é o parâmetro do timer, durante a a inicialização da função
EventSetT imer, menor é o período entre as chamadas do handler OnT imer(), e maior é o tempo de
teste, sob as mesmas outras condições.
O processo de teste não é atrasado por chamadas à função Sleep(). Quando você chama o Sleep(), os
tick s gerados são " jogados " com um atraso especificado, que pode resultar no disparo de ordens
pendentes, stops, etc. Após uma chamada do Sleep(), o tempo simulado no Provador de Estratégia
aumenta em um intervalo, especificado no parâmetro da função Sleep.
Se como resultado da execução da função Sleep(), o tempo corrente no Provador de Estratégia passar
do período de teste, então você receberá o erro "Infinite Sleep loop detected while testing " . Se você
receber este erro, os resultados do teste não serão rejeitados, todas as computações são realizadas
em seus volumes completos (o número de operações (deals), abrandamento, etc) e os resultados deste
teste são transmitidos para o terminal.
A função Sleep() não funcionará em OnDeinit(), já que após ele ser chamado, será certo que o tempo
de teste ultrapassará a faixa do intervalo de teste.
Neste caso, somente três funções serão chamadas : OnInit(), OnT ester(), OnDeinit(). No modo
" Cálculos matemáticos " o Provador de Estratégia não gera nenhum tick e não baixa o histórico.
O Provador de Estratégia também trabalha em modo " Cálculos matemáticos " se você especificar a
data inicial maior que a data final.
Um problema matemático típico para ser revolvido no Provador de Estratégias do MetaT rader 5 -
busca de um extremo de uma função com muitas variáveis.
· Os parâmetros da função devem estar definidos como variáveis de entrada do Expert Advisor;
Compilar o EA, abrir a janela " Provador de Estratégia" . Na guia " Parâmetros de entrada" , selecionar as
requeridas variáveis de entrada, e definir o conjunto de valores de parâmetros por meio da
especificação dos valores iniciar, parar, e passo de cada uma das variáveis da função.
Selecionar o tipo de otimização - " Algoritmo completo lento" (busca completa do espaço de
parâmetros) ou "Rápido (algoritmo genético)" . Para uma busca simples do extremo da função, é
melhor escolher uma otimização rápida, mas se você quiser calcular os valores para conjunto inteiro
de variáveis, então é melhor usar a otimização lenta.
Selecione o modo " Cálculo matemático" e usando o botão "Iniciar" , executar a procedimento de
otimização. Note que ao otimizar, o Provador de Estratégia buscará pelos valores máximos da função
OnT ester. Para encontrar um mínimo local, retorne o inverso do valor computado da função
proveniente da função OnT ester:
return(1/function_value);
É necess ário verificar que o function_value não é igual a zero, já que de outra forma nós podemos
obter um erro crítico de dividir por zero.
Existe uma outra forma, mais conveniente e que não distorce os resultados da otimização, ela foi
sugerida pelos leitores deste artigo:
return(-function_value);
Esta opção não requer a verificação do function_value ser igual a zero, e a superfície dos resultados
da otimização em uma representação em 3D tem a mesma forma, porém é espelhada da original.
O código do EA para encontrar o extremo desta função é colocada dentro do 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"
//--- parâmetros de entrada
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);
}
//+------------------------------------------------------------------+
Quanto melhor for o valor para um dado par de parâmetros (x,y), mais saturada é a cor. Como era
esperado a partir da observação da forma da formula sink (), seus valores forma círculos concêntricos
com centro em (0,0). Pode-se ver no gráfico 3D, que a função sink () não tem um único extremo
global:
O teste de estratégias, que negociam em ativos múltiplos, impõe alguns requerimentos técnicos
adicionais ao Provador de Estratégia:
O Provador de Estratégia gera e joga uma seqüência de tick s para cada instrumento em concordância
com o modo de negociação selecionado. Ao mesmo tempo e para cada ativo, uma nova barra é aberta,
independentemente de como a barra abriu em outro ativo. Isso significa que ao testar um EA multi-
moeda, uma situação pode ocorrer (e freqüentemente acontece), quando para um instrumento, uma
nova barra já abriu, e para o outro instrumento, ela não abriu. Assim, em um teste, tudo acontece
como na realizada.
Esta simulação autêntica do histórico no Provador de Estratégia não causa nenhum problema contanto
que os modos de teste " Cada T ick" e " OH LC por minuto" sejam usados. Para estes modos, tick s
suficientes são gerados para um candlestick , para ser capaz de esperar até a sincronização das barras
de diferentes ativos aconteça. Mas como nós testamos estratégias multi-moeda no modo " Somente
Preços de Abertura" , se a sincronização das barras nos instrumentos de negociação é obrigatória?
Neste modo, o EA é chamado somente em um tick , que corresponde ao momento de abertura das
barras.
Nós ilustraremos isso com um exemplo: se nós estamos testando um EA no EURUS D, e um novo
candlestick de hora abriu em EURUS D, então podemos reconhecer facilmente este fato - em um teste
no modo " Somente Preços de Abertura" , o evento NewT ick corresponde ao momento da abertura da
barra sobre o período do teste. Mas não exitem garantias que o novo candlestick abriu no ativo
USPJPY, é que usado no EA.
Em condições normais, é suficiente completar o trabalho da função OnT ick () e verificar pelo
surgimento de uma nova barra em US DJPY no próximo tick . Mas ao testar em modo " Somente Preços
de Abertura" , não haverá um outro tick , e assim pode parecer que este modo não é adequado para
testar EAs multi-moedas. Mas isso não é o caso - não se esqueça que o testador no MetraT rader 5 se
comporta como se fosse no mundo real. Você pode esperar até uma nova barra ser aberta em outros
ativos usando a função Sleep()!
//+------------------------------------------------------------------+
//| 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"
//--- parâmetros de entrada
input string other_symbol="USDJPY";
//+------------------------------------------------------------------+
//| Função de inicialização do Expert |
//+------------------------------------------------------------------+
int OnInit()
{
Perceba que a última linha no EA, que exibe a hora corrente quando o sincronização de fato foi
estabelecida:
Para exibir a hora corrente usamos a função T imeT radeServer() ao invés de T imeCurrent(). A função
T imeCurrent() retorna o hora do último tick , que não se altera após usar Sleep(). Executa o EA no
modo " Abertura de preços apenas " ,e você verá uma mensagem sobre a sincronização dos barras.
Use a função T imeT radeServer() ao invés de T imeCurrent(), se você precisar obter hora corrente do
servidor, e não a hora da chegado do último tick .
Existe uma outra forma para sincronizar barras - usando um timer. Um exemplo de tal EA é
S ynchronize_Bars _Use_OnT imer.mq5, que está anexado neste artigo.
Mas em alguns casos, o programador pode querer ocultar a informação sobre quais indicadores
estavam envolvidos nos algoritmos de negociação. Por exemplo, o código do EA é alugado ou vendido
como um arquivo executável, sem o fornecimento do código fonte. Para este propósito, a função
IndicatorR elease() é apropriada.
A função IndicatorR elease() é originalmente destinada para liberar a porção de cálculo do indicador,
caso ele mais mais seja necess ário. Isso permite economizar tanto a memória quando os recursos de
CPU, porque cada tick pede um cálculo do indicador. Seu segundo propósito - é proibir a exibição de
um indicador no gráfico de teste, após uma execução de teste individual.
Para proibir a exibição do indicador no gráfico após um teste, chame o IndicatorR elease() com o
handle do indicator no handler OnDeinit(). A função OnDeinit() é sempre chamada após a conclusão e
antes da exibição do gráfico de teste.
//+------------------------------------------------------------------+
//| Função de Desinicialização do Expert |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
bool hidden=IndicatorRelease(handle_ind);
if(hidden) Print("IndicatorRelease() completado com sucesso");
else Print("IndicatorRelease() retorna false. Erro de código ",GetLastError());
}
A fim de proibir a exibição do indicador no gráfico, após a conclusão de um teste único, use a função
IndicatorR elease() no handler OnDeinit().
Ao testar um EA, nós pode tratar eventos customizados usando a função OnChartEvent(), mas nos
indicadores, esta função não pode ser chamada no testador. Mesmo se o indicador tiver o handler de
evento OnChartEvent() e este indicador for usado em um EA testado, o indicador em si não receberá
nenhum evento customizado.
Além destes eventos, eventos especiais associados com o processo de teste e otimização são gerados
no Provador de Estratégia:
· T ester - este evento é gerado após conclusão do teste do Expert Advisor sobre dados históricos. O
evento T ester é tratado usando a função OnT ester(). Esta função pode ser usada apenas quando
testar Expert Advisor e está destinada sobretudo para o cálculo de um valor que é usado como um
critério máximo personalizado para otimização de parâmetros de entrada genérica.
· T esterI nit - este evento é gerado durante o início da otimização no Provador de Estratégia e antes
do primeiro passo. O evento T esterInit é tratado usando a função OnT esterInit(). Durante o início
da otimização, um Expert Advisor com este handler é carregado automaticamente em um gráfico de
terminal separado com o ativo e período especificados no testador, e recebe o evento T esterInit.
Esta função é usada para inicializar um Expert Advisor antes de iniciar a otimização para posterior
processamento dos resultados da otimização.
· T esterPass - este evento é gerado quanto um novo data frame é recebido. O evento T esterPass é
tratado usando a função OnT esterPass(). Um Expert Advsor com este handler é carregado
automaticamente em um gráfico de terminal separado com o ativo/período especificados para
teste, e recebe um evento T esterPass quando um frame é recebido durante otimização. A função é
usado para tratamento dinâmico de resultados de otimização " in loco" sem esperar pela sua
conclusão. Frames são adicionados usando a função FrameAdd(), que pode ser chamada após o fim
de um passo individual no handler OnT ester().
· T esterDeinit - este evento é gerado após o fim da otimização do Expert Advisor no Provador de
Estratégia. O evento T esterDeinit é tratado usando a função OnT esterDeinit(). Um Expert Advisor
com este handler é carregado automaticamente em um gráfico no começo da otimização, e recebe
T esterDeInit após sua conclusão. A função é usado para o processamento final de todos os
resultados da otimização.
Agentes de Teste
O teste no terminal cliente MetaT rader 5 é realizado usando agentes de teste. Agentes locais são
criados e habilitados automaticamente. O número padrão de agentes locais corresponde ao número de
núcleos em um computador.
Cada agente de teste tem sua própria cópia das variáveis globais, que não são relacionados com o
terminal cliente. O terminal em si é o despachante, que distribui as tarefas para os agentes locais e
remotos. Apos executar uma tarefa no teste de um EA, com os parâmetros dados, o agente retorna o
resultado para o terminal. Para um teste individual, somente um agente é usado.
tester_catalog\Agent-IPaddress-Port\bases\name_source\history\symbol_name
Por exemplo, o histórico para EURUS D proveniente do servidor MetaQuotes -Demo pode ser
armazenada na pasta tester_catalog \Agent-127.0.0.1-3000\bases \MetaQuotes -Demo\EURUS D.
Um agente local, após a conclusão de um teste, entra em modo de espera, aguardando a próxima
tarefa por mais 5 minutos, de modo a não perder tempo com o lançamento para a próxima chamada.
Somente após o período de espera acabar, o agente local desliga e se descarrega da memória do CPU.
No caso de uma conclusão antecipada do testador, por parte do usuário (o botão " Cancelar" ), bem
como com o fechamento do terminal cliente, todos os agentes locais imediatamente param seu
trabalhar e são descarregados da memória.
· Parâmetros de input para o teste (modo de simulação, o intervalo do teste, instrumentos, critério
de otimização, etc.)
· A lista dos ativos selecionados na janela " Observação de Mercado"
Para cada bloco de parâmetros, uma impressão digital na forma de M D5-hash é criada, que é enviado
para o agente. O M D5-hash é único para cada conjunto, seu volume é muito menor que a quantidade
de informação na qual ele é calculado
O agente recebe um hash de blocos e os compara com aqueles que ele já tem. Se a impressão digital
do bloco de parâmetros dado não está presente no agente, ou o hash recebido é diferente daquele
existente, o agente solicita este bloco de parâmetros. Isso reduz o tráfego entre o terminal e o
agente.
Após o teste, o agente retorna ao terminal todos os resultados da execução, que são exibidos nas
guias "R esultados " e "R esultados da Otimização": o lucro recebido, o número de operações (deals), o
coeficiente Sharpe, o resultdo da função OnT ester(), etc.
Durante a otimização, o terminal distribui tarefas de teste para os agentes em pequenos pacotes,
cada pacote contendo v árias tarefas (cada tarefa significando testes individuais com um conjunto de
parâmetros de entrada). Isso reduz o tempo de troca entre o terminal e o agente.
Os agentes nunca gravam no disco rígido o arquivo EX5, obtido do terminal (EA, indicadores,
bibliotecas, etc.) for razões de segurança, de modo que um computador com um agente em execução
não pode usar os dados enviados. T odos os outros arquivos, incluindo DLL, são gravados na caixa de
areia. Em agentes remotos você não pode testar EAs usando DLL.
Os resultados do teste são adicionados pelo terminal em uma cache especial de resultados (o cache de
resultado), para um acesso rápido a estes resultados quando necess ário. Para cada conjunto de
parâmetros, o terminal busca o cache de resultados por resultados já disponíveis a partir de execuções
anteriores, a fim de evitar re-execuções. Se o resultado com tal conjunto de parâmetros não é
encontrado, ao agente é dado a tarefa de conduzir o teste.
T ick s não são enviados pela rede, eles são gerados nos agentes de teste.
//+------------------------------------------------------------------+
//| Função de inicialização do Expert |
//+------------------------------------------------------------------+
int OnInit()
{
//--- a pasta compartilhada para todos os terminais cliente
common_folder=TerminalInfoString(TERMINAL_COMMONDATA_PATH);
//--- imprime o nome desta pasta
PrintFormat("Abrir o arquivo na pasta compartilhada dos terminais de cliente %s", common_folder)
//--- abre um arquivo na pasta compartilhada (indicada pelo flag FILE_COMMON)
handle=FileOpen(filename,FILE_WRITE|FILE_READ|FILE_COMMON);
... novas ações
//---
return(INIT_SUCCEEDED);
Usando DLLs
Para acelerar a otimização nós podemos usar não somente agentes locais, mas também agentes
remotos. Neste caso, existem algumas limitações para agentes remotos. Primeiramente, agentes
remotos não exibem em seus logs os resultados da execução da função Print(), mensagens sobre a
abertura e enceramento de posições. Um mínimo de informação é exibida no log para impedir que EAs
escritos incorretamente de atolem o computador, no qual o agente remoto está trabalhando, com
mensagens.
A segunda limitação - a proibição no uso de DLL ao testar EAs. Chamadas de DLL são absolutamente
proibidas em agentes remotos por razões de segurança. Em agentes locais, chamadas de DLL em EAs
testados são permitidas somente com a apropriada permissão " Allow import DLL " .
Observação: Ao usar os códigos recebidos dos EAs (scripts, indicadores) que requerem a
permissão para fazer chamadas de DLL, você deve estar ciente dos riscos, que você assume ao
permitir este opção nas configurações do terminal. Independentemente de como a EA será usada -
para teste ou para execução em um gráfico.
As variáveis predefinidas
Para cada programa MQL5 executável, um conjunto de variáveis predefinidas é suportado, que reflete
o estado do gráfico de preço corrente no momento em que um programa-mql5 é iniciado.
Os valores das variáveis predefinidas são definidas pelo terminal cliente antes de um programa MQL5
ser iniciado. Variáveis predefinidas são constantes e não podem ser alteradas a partir de um programa
MQL5. Como exceção, existe a variáveis especial _LastError, que pode ser redefinida para 0 pela
função R esetLastError.
Variável Valor
_AppliedT o A variável _AppliedT o permite ver no indicador
o tipo de dados em que é calculado
Variáveis predefinidas não podem ser definidas em uma biblioteca. Uma biblioteca usa tais variáveis
que são definidas em um programa a partir do qual esta biblioteca é chamada.
int _AppliedTo
A variável _AppliedT o permite ver no indicador o tipo de dados em que é calculado:
Exemplo:
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
SetIndexBuffer(0,Label1Buffer,INDICATOR_DATA);
// obtemos o tipo de dados no qual o indicador é calculado
Print("_AppliedTo=",_AppliedTo);
Print(getIndicatorDataDescription(_AppliedTo));
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Descrição dos dados em que o indicador é calculado |
//+------------------------------------------------------------------+
string getIndicatorDataDescription(int data_id)
{
string descr="";
switch(data_id)
{
case(0):descr="It's first type of OnCalculate() - no data buffer";
break;
case(1):descr="Indicator calculates on Close price";
break;
case(2):descr="Indicator calculates on Open price";
break;
case(3):descr="Indicator calculates on High price";
break;
case(4):descr="Indicator calculates on Low price";
break;
case(5):descr="Indicator calculates on Median Price (HL/2)";
break;
case(6):descr="Indicator calculates on Typical Price (HLC/3)";
break;
case(7):descr="Indicator calculates on Weighted Price (HLCC/4)";
break;
case(8):descr="Indicator calculates Previous Indicator's data";
break;
case(9):descr="Indicator calculates on First Indicator's data";
break;
default: descr="Indicator calculates on data of indicator with handle="+string(data_id);
break;
}
//---
return descr;
}
Veja também
ENUM _APPL IED_PRICE
int _Digits
A variável _Digits armazena o número de dígitos após o ponto decimal, que define a precisão do preço
do ativo do gráfico corrente.
double _Point
A variável _Point contém o tamanho do ponto do ativo corrente na moeda de cotação.
int _LastError
A variável _LastError contém o código do último erro, que ocorreu durante a execução de um
programa-mql5. Seu valor pode ser redefinido para zero por R esetLastError().
Para obter o código do último erro, você também pode usar a função GetLastError().
int _Period
A variável _Period contém o valor da janela de tempo do gráfico corrente.
Também Veja
PeriodSeconds, Janelas de tempo de gráficos, Data e H ora, Visibilidade de objetos
_RandomSeed
Variável para armazenamento do estado corrente ao gerar inteiros pseudo-aleatórios. _R andomSeed
altera seu valor ao chamar MathR and(). Use MathSrand() para definir a condição inicial requerida.
x número aleatório recebido pela função MathR and() é calculado da seguinte forma a cada chamada:
x=_RandomSeed*214013+2531011;
_RandomSeed=x;
x=(x>>16)&0x7FFF;
Também Veja
MathR and(), MathSrand(), T ipos inteiros
bool _StopFlag
A variável _StopFlag contém o flag de parada de um programa MQL5. Quando o terminal cliente está
tentando parar o programa, ele define a variável _StopFlag para true.
Para verificar o estado do _StopFlag você também pode usar a função IsStopped().
string _Symbol
A variável _S ymbol contém o nome do ativo do gráfico corrente.
int _UninitReason
A variável _UninitR eason contém o código do motivo de não inicialização do programa.
int _IsX64
A variável _Is X64 permite saber em que terminal está funcionando o programa MQL5: para um
terminal de 32 bits _Is X64=0 e para um terminal de 64 _Is X64!=0.
Exemplo:
// verifique em que terminal está sendo executado o programa
Print("_IsX64=",_IsX64);
if(_IsX64)
Print("O programa ",__FILE__," está sendo executado em um terminal de 64 bits");
else
Print("O programa ",__FILE__," está sendo executado em um terminal de 32 bits");
Print("TerminalInfoInteger(TERMINAL_X64)=",TerminalInfoInteger(TERMINAL_X64));
Veja também
MQL InfoInteger, Importando funções (#import)
Funções Comuns
Funções de propósito geral não inclusas em nenhum grupo especializado estão listadas aqui.
Função Ação
Alert Exibe uma mensagem em uma janela separada
Alert
Exibe uma mensagem em uma janela separada.
void Alert(
argument, // primeiro valor
... // outros valores
);
Parâmetros
argument
[in] Quaisquer valores separados por virgulas. Para dividir a saída da informação em v árias linhas
você pode usar o caractere de quebra de linha "\n" ou "\r\n" . O número de parâmetros não pode
exceder 64.
Valor do Retorno
Sem valor de retorno.
Observação
Arrays não podem ser passados para a função Alert(). Arrays devem ser fornecidos elemento a
elemento. Dados do tipo double são exibidos com 8 dígitos após o ponto decimal, dados do tipo float
são exibidos com 5 dígitos após o ponto decimal. Para exibir os números reais com uma precisão
diferente ou em notação científica, use a função DoubleT oString().
Dados do tipo bool são exibidos como strings " true" ou " false" . Datas são exibidas como
YYYY.MM.DD HH:MM :SS. Para exibir uma data em um outro formato use a função T imeT oString().
Dados do tipo color são exibidos tanto como uma string R ,G,B ou como nome de cor, se a cor estiver
presente no conjunto de cores.
CheckPointer
A função retorna o tipo do ponteiro de objeto.
ENUM_POINTER_TYPE CheckPointer(
object* anyobject // ponteiro de objeto
);
Parâmetros
anyobject
[in] Ponteiro de objeto.
Valor de retorno
R etorna um valor da enumeração ENUM _POINT ER_TYPE.
Observação
Uma tentativa de chamar um ponteiro incorreto resulta na finalização crítica de um programa. É por
isso que é necess ário chamar a função Check Pointer antes de usar um ponteiro. Um ponteiro pode
estar incorreto nos seguintes casos :
Esta função pode ser usada para checar a validade do ponteiro. Um valor não zero garante que o
ponteiro pode ser usado para acesso.
Exemplo:
//+------------------------------------------------------------------+
//| Exclui lista através da exclusão de seus elementos |
//+------------------------------------------------------------------+
void CMyList::Destroy()
{
//--- ponteiro de serviço para trabalhar no loop
CItem* item;
//--- percorre pelo loop e tenta excluir ponteiros dinâmicos
while(CheckPointer(m_items)!=POINTER_INVALID)
{
item=m_items;
m_items=m_items.Next();
if(CheckPointer(item)==POINTER_DYNAMIC)
{
Print("Dynamic object ",item.Identifier()," para ser excluído");
delete (item);
}
else Print("Objeto não-dinâmico ",item.Identifier()," cannot be deleted");
}
//---
}
Também Veja
Ponteiros de Objetos, Verificação do Ponteiro de Objeto, Exclusão de Objeto Operador delete
Comment
Esta função exibe um comentário definido pelo usuário no canto superior esquerdo de um gráfico.
void Comment(
argument, // primeiro valor
... // próximos valores
);
Parâmetros
...
[in] Quaisquer valores, separados por vírgulas. Para delimitar a exibição da informação em
v árias linhas, um símbolo de quebra de linha "\n" ou "\r\n" é usado. O número de parâmetros não
pode exceder 64. O comprimento total do comentário de entrada (incluindo símbolos invisíveis)
não pode exceder 2045 caracteres (símbolos em excesso serão eliminados da exibição)
Valor do Retorno
Sem valor de retorno
Observação
Arrays não podem ser passados para a função Comment(). Arrays devem ser alimentados elemento a
elemento.
Dados de tipo double são impressos com precisão de até 16 dígitos após o ponto decimal, e podem
ser impressos tanto na forma tradicional quanto na forma científica, dependendo de qual notação
será a mais compacta. Dados do tipo float são exibidos com 5 dígitos após o ponto decimal. Para
exibir números reais com uma outra precisão ou em um formato predefinido, use a função
DoubleT oString().
Dados de tipo bool são impressos como strings " true" ou " false" . Datas são mostradas como
YYYY.MM.DD HH:MM :SS. Para mostrar datas em um outro formato, use a função T imeT oString().
Dados de tipo color são impressos tanto como strings R ,G,B quanto como nome de cor, se esta cor
estiver presente no conjunto de cores.
Exemplo:
void OnTick()
{
//---
double Ask,Bid;
int Spread;
Ask=SymbolInfoDouble(Symbol(),SYMBOL_ASK);
Bid=SymbolInfoDouble(Symbol(),SYMBOL_BID);
Spread=SymbolInfoInteger(Symbol(),SYMBOL_SPREAD);
//--- Exibe valores em 3 linhas
Comment(StringFormat("Mostrar preços\nAsk = %G\nBid = %G\nSpread = %d",Ask,Bid,Spread));
}
Também Veja
ChartSetString, ChartGetString
CryptEncode
T ransforma os dados do array com o método especificado.
int CryptEncode(
ENUM_CRYPT_METHOD method, // método
const uchar& data[], // array fonte
const uchar& key[], // key
uchar& result[] // array de destino
);
Parâmetros
método
[in] Método de transformação de dados. Pode ser um dos valores da enumeração
ENUM _CRYPT_METH OD.
data[]
[in] Array fonte.
key[]
[in] Key array.
result[]
[out] Array de destino.
Valor retornado
Quantidade de bytes no array de destino ou 0 em caso de erro. Para obter informações sobre o erro
chame a função GetLastError().
Exemplo:
//+------------------------------------------------------------------+
//| ArrayToHex |
//+------------------------------------------------------------------+
string ArrayToHex(uchar &arr[],int count=-1)
{
string res="";
//--- verificar
if(count<0 || count>ArraySize(arr))
count=ArraySize(arr);
//--- transformar em HEX string
for(int i=0; i<count; i++)
res+=StringFormat("%.2X",arr[i]);
//---
return(res);
}
//+------------------------------------------------------------------+
//| Função de início do programa script |
//+------------------------------------------------------------------+
void OnStart()
{
string text="A rápida raposa marrom salta sobre o cão preguiçoso";
string keystr="ABCDEFG";
uchar src[],dst[],key[];
//--- preparar key
StringToCharArray(keystr,key);
//--- copiar texto do array fonte src[]
StringToCharArray(text,src);
//--- imprimir dados iniciais
PrintFormat("Initial data: size=%d, string='%s'",ArraySize(src),CharArrayToString(src));
//--- encriptar src[] com a key DES 56-bit em key[]
int res=CryptEncode(CRYPT_DES,src,key,dst);
//--- verificar erro
if(res>0)
{
//--- imprimir dados encriptados
PrintFormat("Encoded data: size=%d %s",res,ArrayToHex(dst));
//--- decodificar dst[] para src[]
res=CryptDecode(CRYPT_DES,dst,key,src);
//--- verificar erro
if(res>0)
{
//--- imprimir dados decodificados
PrintFormat("Decoded data: size=%d, string='%s'",ArraySize(src),CharArrayToString(src));
}
else
Print("Erro no CryptDecode. Error code=",GetLastError());
}
else
Print("Erro no CryptEncode. Error code=",GetLastError());
}
Veja também
Funções do array, CryptDecode()
CryptDecode
Executa a transformação inversa dos dados do array, transformada pelo CryptEncode().
int CryptEncode(
ENUM_CRYPT_METHOD method, // método
const uchar& data[], // array fonte
const uchar& key[], // key
uchar& result[] // array de destino
);
Parâmetros
método
[in] Método de transformação de dados. Pode ser um dos valores da enumeração
ENUM _CRYPT_METH OD.
data[]
[in] Array fonte.
key[]
[in] Key array.
result[]
[out] Array de destino.
Valor retornado
Quantidade de bytes no array de destino ou 0 em caso de erro. Para obter informações sobre o erro
chame a função GetLastError().
Veja também
Funções do array, CryptEncode()
DebugBreak
É um ponto de parada de programa em depuração.
void DebugBreak();
Valor do Retorno
Sem valor de retorno.
Observação
A execução de um programa MQL5 é interrompido somente se ele for iniciado em modo de
depuração. A função pode ser usada para ver valores de variáveis e/ou para avançar a execução
passo a passo.
ExpertRemove
A função interrompe um Expert Advisor e o descarrega de um gráfico.
void ExpertRemove();
Valor de retorno
Sem valor de retorno.
Observação
O Expert Advisor não é interrompido imediatamente ao chamar ExpertR emove(); apenas um flag
para interromper a operação o EA é definido. Isso é, nenhum evento seguinte será processo,
OnDeinit() será chamado e o Expert Advisor será descarregado e removido do gráfico.
A chamada da ExpertR emove() no testador de estratégias dentro do manipulador OnInit() faz com
que seja cancelado o teste no conjunto de parâmetros atual. Essa finalização é considerada um erro
durante a inicialização.
Exemplo:
//+------------------------------------------------------------------+
//| 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;// número de ticks antes do EA descarregar
//+------------------------------------------------------------------+
//| Função de Desinicialização do Expert |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
Print(TimeCurrent(),": " ,__FUNCTION__," código de motivo = ",reason);
//--- "limpa" comentário
Comment("");
//---
}
//+------------------------------------------------------------------+
//| Função tick (ponto) de um Expert |
//+------------------------------------------------------------------+
void OnTick()
{
static int tick_counter=0;
//---
tick_counter++;
Comment("\nAntes de descarregar Expert Advisor ",__FILE__," left",
(ticks_to_close-tick_counter)," ticks");
//--- antes
if(tick_counter>=ticks_to_close)
{
ExpertRemove();
Print(TimeCurrent(),": ",__FUNCTION__," Expert Advisor será descarregado");
}
Print("tick_counter =",tick_counter);
//---
}
//+------------------------------------------------------------------+
Também Veja
Execução de programas, Eventos do terminal Cliente
GetPointer
A função retorna o ponteiro de objeto.
void* GetPointer(
any_class anyobject // objeto de qualquer classe
);
Parâmetros
anyobject
[in] Objeto de qualquer classe.
Valor do Retorno
A função retorna o ponteiro de objeto.
Observação
Somente objetos de classe têm ponteiros. Instâncias de estruturas e variáveis de tipo simples não
podem ter ponteiros. O objeto de classe não criado usando o operador new(), mas, por exemplo,
criado automaticamente no array de objetos, tem um ponteiro. Mas este ponteiro será do tipo
automático POINT ER_AUT OMATIC, portanto o operador delete() não pode ser aplicado a ele. Além
de que, o tipo ponteiro não difere dos ponteiros dinâmico do tipo POINT ER_AUT OMATIC.
Como variáveis de tipo estrutura e de tipo simples não têm ponteiros, é proibido aplicar a função
GetPointer() a elas. É também proibido passar o ponteiro como um argumento de função. Nos outros
casos o resultado é indefinido.
Uma tentativa de chamar um ponteiro incorreto causa a finalização crítica de um programa. É por
isso que a função Check Pointer() deve ser chamada antes de usar um ponteiro. Um ponteiro pode
estar incorreto nos seguintes casos :
Esta função pode ser usada para verificar a validade de um ponteiro. Um valor não-zero garante que
o ponteiro pode ser usado para acesso.
Exemplo:
//+------------------------------------------------------------------+
//| 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 implementando o elemento da 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("Destrutor de ",m_id,
(CheckPointer(GetPointer(this))==POINTER_DYNAMIC)?
"dynamic":"não dinâmico"); }
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; }
};
//+------------------------------------------------------------------+
//| Classe mais simples de lista |
//+------------------------------------------------------------------+
class CMyList
{
CItem* m_items;
public:
CMyList() { m_items=NULL; }
~CMyList() { Destroy(); }
bool InsertToBegin(CItem* item);
void Destroy();
};
//+------------------------------------------------------------------+
//| Incluindo elemento de lista no começo |
//+------------------------------------------------------------------+
bool CMyList::InsertToBegin(CItem* item)
{
if(CheckPointer(item)==POINTER_INVALID) return(false);
//---
item.Next(m_items);
m_items=item;
//---
return(true);
}
//+------------------------------------------------------------------+
//| Excluindo a lista através da exclusão dos elementos |
//+------------------------------------------------------------------+
void CMyList::Destroy()
{
//--- ponteiro de serviço para trabalhar em um loop
CItem* item;
//--- varre o loop e tenta excluir ponteiros dinâmicos
while(CheckPointer(m_items)!=POINTER_INVALID)
{
item=m_items;
m_items=m_items.Next();
if(CheckPointer(item)==POINTER_DYNAMIC)
{
Print("Dynamyc object ",item.Identifier()," para ser excluído");
delete (item);
}
else Print("Objeto não-dinâmico ",item.Identifier()," cannot be deleted");
}
//---
}
//+------------------------------------------------------------------+
//| Função start do programa script |
//+------------------------------------------------------------------+
void OnStart()
{
CMyList list;
CItem items[10];
CItem* item;
//--- cria e adiciona na lista um ponteiro de objeto dinâmico
item=new CItem;
if(item!=NULL)
{
item.Initialize(100,"dinâmico");
item.PrintMe();
list.InsertToBegin(item);
}
//--- adiciona ponteiros automáticos na lista
for(int i=0; i<10; i++)
{
items[i].Initialize(i,"automático");
items[i].PrintMe();
item=GetPointer(items[i]);
if(CheckPointer(item)!=POINTER_INVALID)
list.InsertToBegin(item);
}
//--- adiciona mais um ponteiro de objeto dinâmico no começo da lista
item=new CItem;
if(item!=NULL)
{
item.Initialize(200,"dinâmico");
item.PrintMe();
list.InsertToBegin(item);
}
//--- exclui todos os elementos da lista
list.Destroy();
//--- todos os elementos da lista será excluídos após o script terminar
//--- veja a guia Experts no terminal
Também Veja
Ponteiros de Objetos, Verificação do Ponteiro de Objeto, Exclusão de Objeto Operador delete
GetTickCount
A função GetT ick Count() retorna o número de milissegundos decorridos desde o inicialização do
sistema.
uint GetTickCount();
Valor do Retorno
Valor de tipo uint.
Observação
O contador é limitado pelas restrições do timer do sistema. O tempo é armazenado como um inteiro
sem sinal, assim ele é sobre-preenchido a cada 49.7 dias se um computador trabalhar
ininterruptamente.
Exemplo:
#define MAX_SIZE 40
//+------------------------------------------------------------------+
//| Script para medir o tempo de computação de 40 membros Fibonacci |
//+------------------------------------------------------------------+
void OnStart()
{
//--- Lembra o valor inicial
uint start=GetTickCount();
//--- Uma variável para obtenção do próximo número na série Fibonacci
long fib=0;
//--- No loop calcular a quantidade específica de números de série de Fibonacci
for(int i=0;i<MAX_SIZE;i++) fib=TestFibo(i);
//--- Obtém o tempo gasto em milissegundos
uint time=GetTickCount()-start;
//--- Imprime uma mensagem para o diário Experts
PrintFormat("Calculando %d primeiros números Fibonacci tiveram %d ms",MAX_SIZE,time);
//--- Script concluído
return;
}
//+------------------------------------------------------------------+
//| Função para obter número de Fibonacci pelo seu número serial |
//+------------------------------------------------------------------+
long TestFibo(long n)
{
//--- O primeiro membro da série Fibonacci
if(n<2) return(1);
//--- Todos os outros membros são calculados pela seguinte fórmula
return(TestFibo(n-2)+TestFibo(n-1));
}
Também Veja
Data e H ora, EventSetMillisecondT imer, GetT ick Count64, GetMicrosecondCount
GetTickCount64
A função GetT ick Count() 64 retorna o número de milissegundos que passaram desde o início do
sistema.
ulong GetTickCount64();
Valor retornado
Valor do tipo ulong.
Observação
O contador é limitado pela resolução do temporizador do sistema, que geralmente retorna um
resultado com uma precisão de 10 a 16 milissegundos. Ao contrário da função GetT ick Count, que é
do tipo uint e, consequentemente, é abarrotada a cada 49,7 dias durante operação contínua do
computador, GetT ick Count64() pode ser usada com período de operação indefinido do computador e
sem receio de abarrotamento.
Veja também
Data e hora, EventSetMillisecondT imer, GetT ick Count, GetMicrosecondCount
GetMicrosecondCount
A função GetMicrosecondCount() retorna o número de microssegundos que decorreram desde o início
do programa MQL5.
ulong GetMicrosecondCount();
Retornar Valor
Valor do tipo ulong.
Exemplo:
//+------------------------------------------------------------------+
//| Teste da função |
//+------------------------------------------------------------------+
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++;
}
}
//+------------------------------------------------------------------+
//| Função de início do programa script |
//+------------------------------------------------------------------+
void OnStart()
{
uint ui=0,ui_max=0,ui_min=INT_MAX;
ulong ul=0,ul_max=0,ul_min=INT_MAX;
//--- número de medidas
for(int count=0;count<1000;count++)
{
uint ui_res=0;
ulong ul_res=0;
//---
for(int n=0;n<2;n++)
{
//--- selecionar tipo de medida
if(n==0) ui=GetTickCount();
else ul=GetMicrosecondCount();
//--- executar código
Test();
//--- adicionar resultado da medida (dependendo do tipo)
if(n==0) ui_res+=GetTickCount()-ui;
else ul_res+=GetMicrosecondCount()-ul;
}
//--- Calcular o tempo mínimo e máximo para ambas as medições
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));
}
Veja também
Data e hora, GetT ick Count, GetT ick Count64
MessageBox
Cria e exibe uma caixa de mensagem e o gerencia. Um caixa de mensagem contém uma mensagem e
cabeçalho, e qualquer combinação de sinais predefinidos e botões de comando.
int MessageBox(
string text, // texto da mensagem
string caption=NULL, // cabeçalho da caixa
int flags=0 // define o conjunto de botões na caixa
);
Parâmetros
text
[in] T exto, contém a mensagem de saída.
caption=NULL
[in] T exto opcional a ser exibido no cabeçalho da caixa. Se o parâmetro estiver vazio, o nome do
Expert Advisor é exibido no cabeçalho da caixa.
flags=0
[in] Flags opcionais definindo a aparência e comportamento da caixa de mensagem. Flags podem
ser uma combinação de um grupo especial de flags.
Valor do Retorno
Se a função for executada com sucesso, o valor de retorno é um dos valores dos códigos de retorno
do MessageBox().
Observação
A função é proibida em indicadores personalizados, uma vez que a chamada para MessageBox()
interrompe o trabalho do thread de execução durante todo o tempo de espera pela resposta do
usuário. Como todos os indicadores de cada símbolo são executados num único thread, o
funcionamento de todos os gráficos em todos os períodos gráficos do símbolo em questão será
interrompido.
PeriodSeconds
Esta função retorna o número de segundos em um período.
int PeriodSeconds(
ENUM_TIMEFRAMES period=PERIOD_CURRENT // período do gráfico
);
Parâmetros
period=PERIOD_CURRENT
[in] Valor do período de um gráfico proveniente da enumeração ENUM _TIMEFR AMES. Se o
parâmetro não for especificado, ela retorna o número de segundos do período do gráfico corrente,
no qual o programa está rodando.
Valor do Retorno
Número de segundos em um período selecionado.
Também Veja
_Period, Janelas de tempo de Gráficos, Date e H ora, Visibilidade de objetos
PlaySound
T oca um arquivo de som.
bool PlaySound(
string filename // nome do arquivo
);
Parâmetros
filename
[in] Caminho para um arquivo de som. Se filename=NULL, a reprodução é interrompida.
Valor do Retorno
true – se o arquivo for encontrado, caso contrário - false.
Observação
O arquivo deve estar localizado em terminal_directory\Sounds ou em sub-diretórios. Somente
arquivos W AV são executados.
Também Veja
R ecursos
Print
Entra uma mensagem no log do Expert Advisor. Parâmetros podem ser de qualquer tipo.
void Print(
argument, // primeiro valor
... // próximos valores
);
Parâmetros
...
[in] Quaisquer valores separados por virgulas. O número de parâmetros não pode exceder 64.
Observação
Arrays não podem ser passados para a função Print(). Arrays devem ser passados elemento a
elemento.
Dados do tipo double são mostrados com precisão de até 16 dígitos após o ponto decimal, e podem
ser exibidos tanto na formato tradicional como em notação científica, dependendo de qual saída
será mais compacta. Dados do tipo float são exibidos com 5 dígitos após o ponto decimal. Para
imprimir números reais com uma outra precisão ou em um formato predefinido, use a função
PrintFormat() .
Dados do tipo bool são exibidos como strings " true" ou " false" . Datas são mostradas como
YYYY.MM.DD HH:MM :SS. Para mostrar datas em um outro formato, use T imeT oString(). Dados do
tipo cor são retornados como string R ,G,B ou como nome de cor, se esta cor estiver presente no
conjunto de cores
Exemplo:
void OnStart()
{
//--- Imprime o DBL_MAX usando Print(), isso é equivalente a PrintFormat(%%.16G,DBL_MAX)
Print("---- como DBL_MAX aparece -----");
Print("Print(DBL_MAX)=",DBL_MAX);
//--- Agora imprime o número DBL_MAX usando PrintFormat()
PrintFormat("PrintFormat(%%.16G,DBL_MAX)=%.16G",DBL_MAX);
//--- Imprime no diário Experts
// Print(DBL_MAX)=1.797693134862316e+308
// PrintFormat(%.16G,DBL_MAX)=1.797693134862316E+308
//--- Mostra o que pode acontecer com operações aritméticas com tipos reais
double a=7,b=200;
Print("---- Antes de operações aritméticas");
Print("a=",a," b=",b);
Print("Print(DoubleToString(b,16))=",DoubleToString(b,16));
//--- Dividir a por b (7/200)
a=a/b;
//--- Agora emula a restauração de um valor na variável b
b=7.0/a; // É esperado que b=7.0/(7.0/200.0)=>7.0/7.0*200.0=200 - mas ele difere
//--- Imprimi o novo valor calculado de b
Print("----- Após as operações aritméticas");
Print("Print(b)=",b);
Print("Print(DoubleToString(b,16))=",DoubleToString(b,16));
//--- Imprime no diário Experts
// Print(b)=200.0
// Print(DoubleToString(b,16))=199.9999999999999716 (veja que b não é mais igual a 200.0)
Também Veja
DoubleT oString, String Format
PrintFormat
Formata e entra conjuntos de símbolos e valores no log do Expert Advisor em concordância com um
formato predefinido.
void PrintFormat(
string format_string, // string de formato
... // valores de tipo simples
);
Parâmetros
format_string
[in] A string de formato consiste de símbolos simples, e se a string de formato é seguido por
argumentos, ela também contém especificações de formato.
...
[in] Quaisquer valores de tipos simples separados por vírgula. Número total de parâmetros não
pode exceder A 64, incluindo a string de formato.
Valor do Retorno
String.
Observação
A função Printformat() não funciona no durante a otimização no T estador de Estratégias.
O número, ordem e tipo dos parâmetros devem corresponder exatamente com o conjunto de
qualificadores, caso contrário, o resultado do print é indefinido. Ao invés de PrintFormat(), você
pode usar printf().
Se a string de formato for seguida por parâmetros, esta string deve conter especificações de
formato que denotem o formato de saída destes parâmetros. Especificações de formato sempre
começam com o sinal de percentual (%).
Uma string de formato é lida da esquerda para direita. Quando a primeira especificação de formato
é encontrada (se houver alguma), o valor do primeiro parâmetro após a string de formato é
transformado e impresso de acordo com a especificação predefinida. A segunda especificação de
formato chama a transformação e impressão do segundo parâmetro, e assim por diante até a string
de formato acabe.
Cada campo da especificação de formato é tanto um símbolo simples, como um número denotando
uma opção de formato simples. A especificação de formato mais simples contém somente o sinal de
percentagem (%) e um símbolo definindo o tipo do parâmetro de saída (por exemplo, %s). Se você
precisar imprimir o sinal de percentual na string de formato, use o especificação de formato %%.
flags
largura
Um número decimal não negativo que define o número mínimo de símbolos de saída do valor
formatado. Se o número de saída de símbolos é menor do que a largura especificada, o
correspondente número de espaços é adicionado a partir da esquerda ou direita, dependendo do
alinhamento (flag -). Se houver o flag zero (0), o número correspondente de zeros é adicionado
antes do valor de saída. Se o número de saída de símbolos de saída é maior do que a largura
especificada, o valor de saída não é cortado.
Se um asterisco (*) for especificado como width, um valor de tipo int deve ser indicado no lugar
correspondente da lista de parâmetros passados. Ele será usado para especificar a largura do valor
de saída.
precisão
Um número decimal não negativo que define a precisão de saída - número de dígitos após o ponto
decimal. Como diferença da especificação de largura, a especificação de precisão pode truncar a
parte fracionário com ou sem arredondamento.
c, C Não usado
h | l | ll | I32 | I64
Especificação de tamanhos dos dados, passados como parâmetro.
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
tipo
Especificador de tipo é o único campo obrigatório para a saída formatada.
Exemplo:
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
*/
}
Também Veja
String Format, DoubleToString, Tipos reais (double, float)
ResetLastError
Define o valor do variável predefinida _LastError para zero.
void ResetLastError();
Valor do Retorno
Sem valor de retorno.
Observação
Deve ser notado que a função GetLastError() não zera a variável _LastError. Geralmente a função
R esetLastError() é chamada antes de chamar uma função, após o qual um surgimento de erro é
verificado.
ResourceCreate
Criar um recurso de imagem baseado em um conjunto de dados. Existe duas variantes da função:
Criando um recurso baseado em um arquivo
bool ResourceCreate(
const string resource_name, // Nome do recurso
const string path // Uma caminho relativo para o arquivo
);
Parâmetros
resource_name
[in] Nome do recurso.
data[][]
[in] Um array de uma dimensão ou duas dimens ões de cores para criar uma imagem completa.
img_width
[in] A largura da área da imagem retangular em pixels para ser colocada no recurso na forma de
uma imagem. Ela não pode ser maior que o valor data_width.
img_height
[in] A altura da área da imagem retangular em pixels para ser colocada no recurso na forma de
uma imagem.
data_xoffset
[in] O deslocamento horizontal para direita da área retangular da imagem.
data_yoffset
[in] O deslocamento vertical para baixa da área retangular da imagem.
data_width
[in] R equerido somente para arrays de uma dimensão. Denota a largura total da imagem a partir
do conjunto de dados. Se data_width=0, é assumido ser igual a img_width. Para arrays
bidimensionais o parâmetro é ignorado e é assumido como sendo igual à segunda dimensão do
array data[].
color_format
Valor do Retorno
R etorna true se bem sucedido, caso contrário false. Para obter informações sobre o erro chame a
função GetLastError(). Os seguintes erros podem ocorrer:
· 4015 – ERR_R ESOUR CE_NAME_DUPL I CAT ED (nomes idênticos do recurso dinâmico e estático)
· 4016 – ERR_R ESOUR CE_NOT_FOUND (o recurso não foi encontrado)
· 4017 – ERR_R ESOUR CE_UNS UPPORT ED_TYPE (este tipo de recurso não é suportado)
· 4018 – ERR_R ESOUR CE_NAME_I S _T OO_LONG (o nome do recurso é muito longo)
Observação
Se a segunda versão da função é chamada para criar o mesmo recurso com largura, altura e
parâmetros de deslocamento diferentes, ela não cria um novo recurso, mas simplesmente atualiza o
recurso existente.
A primeira versão da função é usada para carregar imagens e sons a partir de arquivos, e a segunda
versão é usada somente para a criação dinâmica de imagens.
Imagens devem estar no formato BMP com um profundidade de cor de 24 ou 32 bits. Sons podem
somente ser no formato W AV. O tamanho do recurso não deve exceder 16 Mb.
ENUM_COLOR_FORMAT
Identifier Descrição
COLOR_FOR MAT_XRGB_NOALPH A O componente do canal alfa é ignorado
COLOR_FOR MAT_ARGB_NOR MAL IZE Componentes de cor são tratados pelo terminal
Também Veja
R ecursos, ObjectCreate(), ObjectSetString(), OBJPR OP_BMPFILE
ResourceFree
A função exclui dinamicamente recursos criados (liberando a memória alocada para ele).
bool ResourceFree(
const string resource_name // nome do recurso
);
Parâmetros
resource_name
[in] Nome do recurso deve começar com "::" .
Valor de retorno
true se bem sucedido, caso contrário false. Para obter informações sobre o erro, chamar a função
GetLastError().
Observação
R esourceFree() permite aos desenvolvedores de aplicativos MQL5 gerenciarem o consumo de
memória quando se trabalha ativamente com recursos. Objetos gráficos vinculados ao recurso que
será apagado da memória serão exibidos corretamente após a sua exclusão. No entanto, os objetos
gráficos recém-criados ((OBJ_BIT MAP e OBJ_BIT MAP_LABEL) não poderão utilizar o recurso
suprimido.
Também Veja
R ecursos, ObjectCreate(), PlaySound(), ObjectSetString(), OBJPR OP_BMPFILE
ResourceReadImage
A função lê os dados do recurso gráfico criado pela função R esourceCreate() ou salvo como arquivo
EX5 durante a compilação.
bool ResourceReadImage(
const string resource_name, // nome do recurso gráfico para leitura
uint& data[], // array recebendo dados a partir do recurso
uint& width, // para receber a largura da imagem no recurso
uint& height, // para receber a altura da imagem no recurso
);
Parâmetros
resource_name
[in] Nome do recurso gráfico contendo uma imagem. Para acessar novamente seus próprios
recursos, o nome é usado em formato abreviado "::resourcename" . Se baixamos um recurso a
partir de uma compilação de arquivo EX5, o nome completo seria usado com o caminho relativo do
diretório MQL5, nomes do arquivo e recurso - " path\\filename.ex5::resourcename" .
data[][]
[in] Array uni- ou bi-dimensional para recebimento de dados do recurso gráfico.
img_width
[out] R ecurso gráfico da largura da imagem em pixels .
img_height
[out] R ecurso gráfico da altura da imagem em pixels .
Valor de retorno
true se bem sucedido, caso contrário false. Para obter informações sobre o erro, chamar a função
GetLastError().
Observação
Se é array data[], então será usado para criar um recurso gráfico, formatos de cor
COLOR_FOR MAT_ARGB_NOR MAL IZE ou COLOR_FOR MAT_XRGB_NOALPH A devem ser utilizados.
Se é array data[] bidimensional e sua segunda dimensão é menor do que X (largura) tamanho do
recurso gráfico,a função R esourceR eadImage() retorna falso e a leitura não é executada. Mas se o
recurso existe, o tamanho da imagem real é retornada pelos parâmetros de largura e altura. Isto
permitirá fazer outra tentativa para receber dados a partir do recurso.
Também Veja
R ecursos, ObjectCreate(), ObjectSetString(), OBJPR OP_BMPFILE
ResourceSave
Salva um recurso no arquivo especificado.
bool ResourceSave(
const string resource_name // Nome do recurso
const string file_name // Nome do arquivo
);
Parâmetros
resource_name
[in] O nome do recurso deve começar com "::" .
file_name
[in] O nome do arquivo relativo a MQL5\Files.
Valor do Retorno
true – no caso de sucesso, caso contrário, false. Para informações do erro chamar GetLastError().
Observação
A função sempre sobre-escreve um arquivo e cria todos os diretórios intermediários requeridos no
nome do arquivo se necess ário.
Também Veja
R ecursos, ObjectCreate(), PlaySound(), ObjectSetString(), OBJPR OP_BMPFILE
SetReturnError
Define o código de retorno que devolverá um processo do terminal ao encerrar o trabalho.
void SetReturnError(
int ret_code // código de encerramento do terminal do cliente
);
Parâmetros
ret_code
[in] O código de retorno que será devolvido pelo processo do terminal do cliente ao encerrar o
trabalho.
Valor retornado
Não há nenhum valor de retorno.
Observação
A instalação desse código de retorno ret_code usando a função SetR eturnError() será útil para
analisar os motivos de encerramento do programa ao iniciar o terminal a partir da linha de
comando.
Ao contrário da função SetR eturnError(), a função T erminalClose() não encerra o terminal, ela
apenas define o código de retorno que devolverá o processo do terminal após seu encerramento.
Se a função SetR eturnError() foi chamada repetidamente e/eu a partir de diferentes programas
MQL5, o terminal retornará o último código de retorno definido.
O código exibido será devolvido no final do processo do terminal, exceto nos seguintes casos :
· se surgir um erro crítico em tempo de execução;
· se for chamada a função T erminalClose(int ret_code) que fornece ao terminal um comando para
encerrar o trabalho com um código especificado.
Veja também
Execução de programas, Erros de execução, Causas de desinicialização, T erminalClose
SetUserError
Define a variável predefinida _LastError para o valor igual a ERR_USER_ERR OR_FIR S T + user_error
void SetUserError(
ushort user_error, // número do erro
);
Parâmetros
user_error
[in] Número do erro definido pelo usuário.
Valor do Retorno
Sem valor de retorno.
Observação
Depois de um erro ser definido usando a função SetUserError(user_error), GetLastError() retorna um
valor igual a ERR_USER_ERR OR_FIR S T + user_error.
Exemplo:
void OnStart()
{
//--- define o número de erro 65537=(ERR_USER_ERROR_FIRST +1)
SetUserError(1);
//--- obtém o último código de erro
Print("GetLastError = ",GetLastError());
/*
Result
GetLastError = 65537
*/
}
Sleep
A função suspende a execução do Expert Advisor corrente ou script por um intervalo especificado.
void Sleep(
int milliseconds // intervalo
);
Parâmetros
milliseconds
[in] Intervalo de atraso em milissegundos.
Valor do Retorno
Sem valor de retorno.
Observação
A função Sleep() não pode ser chamada por indicadores customizados, porque indicadores são
executados na thread de interface e não devem ser atrasados. A função foi incorporada para
verificar flag interrompido a cada 0.1 segundos.
TerminalClose
A função ordena o terminal a finalizar a operação.
bool TerminalClose(
int ret_code // código de fechamento do terminal cliente
);
Parâmetros
ret_code
[in] Código de retorno, retornado pelo processo do terminal cliente na finalização da operação.
Valor do Retorno
A função retorna true para sucesso, caso contrário - false.
Observação
A função T erminalClose() não interrompe o terminal imediatamente, ela apenas ordena o terminal a
finalizar sua operação.
O código de um Expert Advisor que chamou T erminalClose() deve ter todos os arranjos para a
finalização imediata (por exemplo, todos os arquivo previamente abertos devem ser fechados no
modo normal. A chamada desta função deve ser seguida pelo operador return.
O parâmetro ret_code permite indicar o código de retorno necess ário para analise dos motivos da
finalização de programa da operação do terminal ao inicializá-lo a partir da linha de comando.
Exemplo:
//--- parâmetros de entrada
input int tiks_before=500; // número de ticks até finalização
input int pips_to_go=15; // distancia em pips
input int seconds_st=50; // número de segundos dados para o Expert Advisor
//--- globais
datetime launch_time;
int tick_counter=0;
//+------------------------------------------------------------------+
//| Função de Desinicialização do Expert |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
Print(__FUNCTION__," código do motivo = ",reason);
Comment("");
}
//+------------------------------------------------------------------+
//| Função tick (ponto) de um 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;
}
//--- distância do preço em pips
distance=(tick.bid-first_bid)/_Point;
//--- exibe uma notificação para rastrear a operação do EA
string comm="A partir do momento da inicial:\r\n\x25CF segundos decorridos: "+
IntegerToString(tick.time-launch_time)+" ;"+
"\r\n\x25CF ticks recebidos: "+(string)tick_counter+" ;"+
"\r\n\x25CF preço passou em pontos: "+StringFormat("%G",distance);
Comment(comm);
//--- seção para verificar condição para fechar o terminal
if(tick_counter>=tiks_before)
TerminalClose(0); // saída pela contador de tick
if(distance>pips_to_go)
TerminalClose(1); // subida pelo número de pips igual ao pips_to_go
if(distance<-pips_to_go)
TerminalClose(-1); // descida pelo número de pips igual ao pips_to_go
if(tick.time-launch_time>seconds_st)
TerminalClose(100); // finalização por timeout
//---
}
Também Veja
Execução de programa, Erros de execução, Motivos para desinicialização
TesterHideIndicators
Define o modo mostrar/ocultar indicadores usados no Expert Advisor. Esta função é usada para
controlar a visibilidade dos indicadores utilizados somente durante o teste.
void TesterHideIndicators(
bool hide // sinalizador
);
Parâmetros
hide
[in] Sinalizador para ocultar indicadores durante o teste. Especifique true, se você quiser ocultar
os indicadores criados, caso contrário, false.
Valor de retorno
Não.
Observação
Por padrão, no gráfico de teste visual, são apresentados todos os indicadores que são criados no
Expert Advisor testado. Além disso, esses indicadores são mostrados no gráfico que se abre
automaticamente no final do teste. A função T esterH ideIndicators() permite que o desenvolvedor
especifique no código do EA a proibição da exibição dos indicadores utilizados.
Para proibir a exibição do indicador usado durante o teste do EA, é necess ário, antes de criar seu
identificador, chamar a função T esterH ideIndicators() com o parâmetro false, dessa maneira todos
os indicadores criados após isso serão marcados com o sinalizador de ocultar. Indicadores marcados
com o sinalizador de ocultar não são exibidos nem durante o teste visual nem no gráfico que se abre
automaticamente após a conclusão do teste.
Para novamente desativar o modo de ocultar os indicadores criados, basta chamar novamente a
função T esterH ideIndicators(), mas com o parâmetro true. No gráfico de teste, podem ser vistos
apenas os indicadores que são criados diretamente a partir do EA testado. Esta regra se aplica
apenas aos casos em que não há um modelo na pasta
<catálogo_de_dados >MQL5\Profiles \T emplates.
Exemplo:
bool CSampleExpert::InitIndicators(void)
{
TesterHideIndicators(true);
//--- create MACD indicator
if(m_handle_macd==INVALID_HANDLE)
if((m_handle_macd=iMACD(NULL,0,12,26,9,PRICE_CLOSE))==INVALID_HANDLE)
{
printf("Error creating MACD indicator");
return(false);
}
TesterHideIndicators(false);
//--- create EMA indicator and add it to collection
if(m_handle_ema==INVALID_HANDLE)
if((m_handle_ema=iMA(NULL,0,InpMATrendPeriod,0,MODE_EMA,PRICE_CLOSE))==INVALID_HANDLE)
{
printf("Error creating EMA indicator");
return(false);
}
//--- succeed
return(true);
}
Veja também
IndicatorR elease
TesterStatistics
A função retorna o valor do parâmetro estatístico especificado calculado baseado em resultados de
teste.
double TesterStatistics(
ENUM_STATISTICS statistic_id // ID
);
Parâmetros
statistic_id
[in] O ID do parâmetro estatístico a partir da enumeração ENUM _S T ATIS TICS.
Valor do Retorno
O valor do parâmetro estatístico proveniente de resultados de teste.
Observação
A função pode ser chamada de dentro de OnT ester() ou OnDeinit() no Provador de Estratégias. Nos
outros casos o resultado é indefinido.
TesterStop
Dá o comando para encerrar o programa durante os testes.
void TesterStop();
Valor retornado
Não há nenhum valor de retorno.
Observação
A função T esterStop() se destina ao desligamento antecipado geral do EA no agente de teste, por
exemplo, ao atingir um número especificado de transações desfavoráveis ou um nível de
rebaixamento especificado.
Veja também
Execução de programas, T este de estratégias de negociação, ExpertR emove, SetR eturnError
TesterDeposit
Função especial para emular operações de depósito durante o teste. Pode ser usado em alguns
sistemas de gerenciamento de capital.
bool TesterDeposit(
double money // tamanho do montante a ser depositado
);
Parâmetros
money
[in] Quantidade de dinheiro a ser depositado na moeda de depósito.
Valor retornado
R etorna true em caso de sucesso, caso contrário, false.
Veja também
T esterW ithdrawal
TesterW ithdrawal
Função especial para emular a operação de saque de dinheiro no processo de teste. Pode ser usado em
alguns sistemas de gerenciamento de ativos.
bool TesterWithdrawal(
double money // a soma para sacar
);
Parâmetros
money
[in] A soma de dinheiro que nós precisamos sacar (no moeda de depósito).
Valor do Retorno
Com sucesso, retorna verdadeiro (true), do contrário - falso.
Veja também
T esterDeposit
TranslateKey
R etorna o caractere Unicode de acordo com o código de tecla virtual, tendo em conta o idioma de
entrada atual e o status das teclas de controle.
short TranslateKey(
int key_code // código de teclas para obter o caractere Unicode
);
Parâmetros
key_code
[in] Código de tecla.
Valor de retorno
Caractere Unicode no caso de uma conversão bem-sucedida. No caso de erro, a função retorna -1.
Observação
A função utiliza T oUnicodeEx para converter as teclas digitadas - pelo usuário - para caracteres
Unicode. O erro pode surgir se não funcionar T oUnicodeEx, por exemplo, ao tentar obter o caractere
para a tecla S HIFT .
Exemplo:
void OnChartEvent(const int id,const long& lparam,const double& dparam,const string& sparam)
{
if(id==CHARTEVENT_KEYDOWN)
{
short sym=TranslateKey((int)lparam);
//--- se o caractere digitado for convertido com sucesso para Unicode
if(sym>0)
Print(sym,"'",ShortToString(sym),"'");
else
Print("Error in TranslateKey for key=",lparam);
}
}
Veja também
Eventos do terminal de cliente, OnChartEvent
ZeroMemory
A função redefine uma variável passada para ela por referência.
void ZeroMemory(
void & variable // redefine variável
);
Parâmetros
variable
[in] [out] Variável passada por referência, que você quer redefinir (inicializar com zeros).
Valor do Retorno
Sem valor de retorno.
Observação
Se o parâmetro da função é uma string, a chamada será equivalente a indicar NULL como seu valor.
Para tipos simples e seus arrays, bem como para estruturas /classes consistindo de tais tipos, isso é
uma simples redefinição.
Para objetos contendo strings e arrays dinâmicos, ZeroMemory() é chamada para cada elemento.
Para quaisquer arrays não protegidos pelo modificador const, todos os elementos são zerados.
Para arrays de objetos complexos, ZeroMemory() é chamada para cada elemento.
ZeroMemory() não pode ser aplicada a classes com membros protegidos ou herança.
Função Ação
ArrayBsearch R etorna o índice do primeiro elemento
encontrado na primeira dimensão do array
ArrayBsearch
Procura um valor especificado em um array numérico multidimensional ordenado em ordem crescente.
A pesquisa é realizada através dos elementos da primeira dimensão.
Parâmetros
array[]
[in] Array numérico para busca.
value
Valor do Retorno
A função retorna o índice de um elemento encontrado. Se o valor desejado não for encontrado, a
função retorna o índice de um elemento mais próximo em valor.
Observação
A busca binária processa somente arrays ordenados. Para ordenar arrays numéricos use a função
ArraySort().
Exemplo:
#property description "Script baseado no indicador RSI para visualização de dados"
#property description "quantas vezes o mercado ficou em"
#property description "áreas sobre-compradas e sobre-vendidas em intervalo de tempo específico."
//--- mosta a janela dos parâmetros de entrada quando lançado o script
#property script_show_inputs
//--- parâmetros de entrada
input int InpMAPeriod=14; // Período de média móvel
input ENUM_APPLIED_PRICE InpAppliedPrice=PRICE_CLOSE; // Tipo de preço
input double InpOversoldValue=30.0; // Nível sobre-vendido
input double InpOverboughtValue=70.0; // Nível sobre-comprado
input datetime InpDateStart=D'2012.01.01 00:00'; // Data de início para análise
input datetime InpDateFinish=D'2013.01.01 00:00'; // Data final para análise
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
double rsi_buff[]; // array do valores do indicador
int size=0; // tamanho de array
//--- receber a manipulação do indicador RSI
ResetLastError();
int rsi_handle=iRSI(Symbol(),Period(),InpMAPeriod,InpAppliedPrice);
if(rsi_handle==INVALID_HANDLE)
{
//--- falha para receber a manipulação do indicador
PrintFormat("Manipulador de indicator recebido com erro. Código de erro = %d",GetLastError())
return;
}
//--- fica no loop, até que o indicador calcula todos os seus valores
while(BarsCalculated(rsi_handle)==-1)
{
//--- sair se o indicador concluir forçadamente a operação de script
if(IsStopped())
return;
//--- uma pausa para permitir que o indicador calcule todos os seus valores
Sleep(10);
}
ArrayCopy
Copia um array em um outro array.
int ArrayCopy(
void& dst_array[], // array de destino
const void& src_array[], // array de origem
int dst_start=0, // índice de início do array destino a partir do qual se escre
int src_start=0, // primeiro índice de um array de origem
int count=WHOLE_ARRAY // número de elementos
);
Parâmetros
dst_array[]
[out] Array destino
src_array[]
[in] Array fonte
dst_start=0
[in] Índice de início do array destino. Por padrão, o índice de início é 0.
src_start=0
[in] Índice de início para o array fonte. Por padrão, o índice de início é 0.
count=WHOLE_ARRAY
[in] Número de elementos que devem ser copiados. Por padrão, todo conjunto array é copiado
(count=WH OLE_ARR AY).
Valor do Retorno
R etorna o número de elementos copiados.
Observação
Se count<0 ou count>src_size-src_start, toda a parte restante do array é copiada. Arrays são
copiados da esquerda para direita. Para arrays de série, a posição de início é corretamente ajustada
para copiar da esquerda para direita.
Se os arrays são de tipos diferentes, durante a cópia a função tenta transformar cada elemento do
array fonte para o tipo do array destino. Um array de string pode ser copiado somente em um array
de string. Arrays de classes e estruturas contendo objetos que requerem inicialização não são
copiados. Um array de estruturas pode ser copiado somente em um array do mesmo tipo.
For dynamic arrays with indexing as in timeseries, the size of a destination array is automatically
increased to the amount of copied data (if the latter exceeds the array size). T he destination array
size is not decreased automatically.
Exemplo:
#property description "O indicador destaca os candlesticks que são local"
#property description "altos e baixos. Comprimento do intervalo para encontrar"
#property description "valores extremos usando parâmetros de entrada."
PlotIndexSetString(0,PLOT_LABEL,"Open;High;Low;Close");
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
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[])
{
//--- definir a indexação direta em séries de tempo
ArraySetAsSeries(open,false);
ArraySetAsSeries(high,false);
ArraySetAsSeries(low,false);
ArraySetAsSeries(close,false);
//--- variável da barra para iniciar cálculo
int start=prev_calculated;
//--- cálculo não é realizado pela primeira InpNum*2 barras
if(start==0)
{
start+=InpNum*2;
ExtStart=0;
ExtCount=0;
}
//--- se a barra acabou de se formar, verifique o seguinte extremo potencial
if(rates_total-start==1)
start--;
//--- índice da barra a ser verificado para o extremo
int ext;
//--- valor do indicador para cálculo do loop
for(int i=start;i<rates_total-1;i++)
{
//--- inicialmente num bar sem desenhar
ExtOpen[i]=0;
ExtHigh[i]=0;
ExtLow[i]=0;
ExtClose[i]=0;
//--- índice extremo para verificação
ext=i-InpNum;
//--- verificar o máximo local
if(IsMax(high,ext))
{
//--- destacar um candlestick extremo
ExtOpen[ext]=open[ext];
ExtHigh[ext]=high[ext];
ExtLow[ext]=low[ext];
ExtClose[ext]=close[ext];
ExtColor[ext]=1;
//--- destacar outros candles até o extremo com uma cor neutra
FillCandles(open,high,low,close);
//--- alterar as cores variáveis
ExtStart=ext+1;
ExtCount=0;
//--- passar para a próxima iteração
continue;
}
//--- verifique o mínimo local
if(IsMin(low,ext))
{
//--- destacar um candlestick extremo
ExtOpen[ext]=open[ext];
ExtHigh[ext]=high[ext];
ExtLow[ext]=low[ext];
ExtClose[ext]=close[ext];
ExtColor[ext]=2;
//--- destacar outros candles até o extremo com uma cor neutra
FillCandles(open,high,low,close);
//--- alterar os valores das variáveis
ExtStart=ext+1;
ExtCount=0;
//--- passar para a próxima iteração
continue;
}
//--- aumentar o número de não extremos no intervalo
ExtCount++;
}
//--- valor retorno de prev_calculated para a próxima chamada
return(rates_total);
}
//+------------------------------------------------------------------+
//| Verificar se o atual elemento array é um local máximo (high) |
//+------------------------------------------------------------------+
bool IsMax(const double &price[],const int ind)
{
//--- variável do início do intervalo
int i=ind-InpNum;
//--- final do período do intervalo
int finish=ind+InpNum+1;
//--- verificar a primeiro metade do intervalo
for(;i<ind;i++)
{
if(price[ind]<=price[i])
return(false);
}
//--- verificar a segunda metade do intervalo
for(i=ind+1;i<finish;i++)
{
if(price[ind]<=price[i])
return(false);
}
//--- este é um extremo
return(true);
}
//+------------------------------------------------------------------+
//| Verificar se o atual elemento array é um local mínimo (low) |
//+------------------------------------------------------------------+
bool IsMin(const double &price[],const int ind)
{
//--- variável do início do intervalo
int i=ind-InpNum;
//--- variável do final do intervalo
int finish=ind+InpNum+1;
//--- verificar a primeiro metade do intervalo
for(;i<ind;i++)
{
if(price[ind]>=price[i])
return(false);
}
//--- verificar a segunda metade do intervalo
for(i=ind+1;i<finish;i++)
{
if(price[ind]>=price[i])
return(false);
}
//--- este é um extremo
return(true);
}
ArrayCompare
A função retorna o resultado da comparação de dois arrays de mesmo tipo. Pode ser usado para
comparar arrays de tipos simples ou estruturas customizadas sem objetos complexos, isto é,
estruturas customizadas que não contém strings, arrays dinâmicos, classes e outras estruturas com
objetos complexos.
int ArrayCompare(
const void& array1[], // primeiro array
const void& array2[], // segundo array
int start1=0, // deslocamento inicial no primeiro array
int start2=0, // deslocamento inicial no segundo array
int count=WHOLE_ARRAY // número de elementos para comparação
);
Parâmetros
array1[]
[in] Primeiro array.
array2[]
[in] Segundo array.
start1=0
[in] O índice inicial do elemento no primeiro array, a partir do qual a comparação começa. O
índice de começo default - 0.
start2=0
[in] O índice inicial do elemento no segundo array, a partir do qual a comparação começa. O
índice de começo default - 0.
count=WHOLE_ARRAY
[in] Número de elementos a ser comparados. T odos os elementos de ambos os arrays participam
da comparação por default (count=WH OLE_ARR AY).
Valor de retorno
· -1, se array1[] menos que array2[]
· 0, se array1[] igual a array2[]
· 1, se array1[] mais que array2[]
· -2, se um erro ocorrer devido a incompatibilidade dos tipos dos arrays comparados ou se os
valores start1, start2 ou count levarem a cair para fora do array.
Observação
A função não retornará 0 (os arrays não serão considerados iguais) se os arrays diferirem em
tamanho e count=WH OLE_ARR AY para o caso em que um array é um subconjunto fiel do outro.
Neste caso, o resultado da comparação de tamanhos destes arrays irão retornar: -1, se o tamanho
de array1[] for menor que o tamanho de array2[] , caso contrário 1.
ArrayFree
Libera um buffer de qualquer array dinâmico e define o tamanho da dimensão zero para 0.
void ArrayFree(
void& array[] // array
);
Parâmetros
array[]
[in] Array dinâmico.
Valor do Retorno
Sem valor de retorno.
Observação
A necessidade de usar a função ArrayFree() pode não aparecer com muita freqüência, considerando
que toda a memória utilizada é liberada de uma só vez e o principal trabalho com os arrays
compreende o acesso aos buffers dos indicadores. Os tamanhos dos buffers são controlados
automaticamente pelo subsistema executivo do terminal.
Exemplo:
#include <Controls\Dialog.mqh>
#include <Controls\Button.mqh>
#include <Controls\Label.mqh>
#include <Controls\ComboBox.mqh>
//--- constantes predefinidas
#define X_START 0
#define Y_START 0
#define X_SIZE 280
#define Y_SIZE 300
//+------------------------------------------------------------------+
//| Uma classe para trabalhar com uma memória |
//+------------------------------------------------------------------+
class CMemoryControl : public CAppDialog
{
private:
//--- tamanho de 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[];
//--- rótulos
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;
//--- botões
CButton m_button_add;
CButton m_button_free;
//--- caixas de combinação
CComboBox m_combo_box_step;
CComboBox m_combo_box_type;
//--- valor atual do tipo array da caixa de combinação
int m_combo_box_type_value;
public:
CMemoryControl(void);
~CMemoryControl(void);
//--- método de criação de objeto de classe
virtual bool Create(const long chart,const string name,const int subwin,const int x1,const
//--- manipulador de eventos gráfico
virtual bool OnEvent(const int id,const long &lparam,const double &dparam,const string &spa
protected:
//--- cria um rótulos
bool CreateLabel(CLabel &lbl,const string name,const int x,const int y,const string
//--- criar elementos de controle
bool CreateButton(CButton &button,const string name,const int x,const int y,const s
bool CreateComboBoxStep(void);
bool CreateComboBoxType(void);
//--- manipuladores de evento
void OnClickButtonAdd(void);
void OnClickButtonFree(void);
void OnChangeComboBoxType(void);
//--- métodos para trabalhar com o atual array
void CurrentArrayFree(void);
bool CurrentArrayAdd(void);
};
//+------------------------------------------------------------------+
//| Liberar memória do atual array |
//+------------------------------------------------------------------+
void CMemoryControl::CurrentArrayFree(void)
{
//--- restabelecer o tamanho do array
m_arr_size=0;
//--- liberar o 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);
}
//+------------------------------------------------------------------+
//| Tentativa de adicionar memória para o atual array |
//+------------------------------------------------------------------+
bool CMemoryControl::CurrentArrayAdd(void)
{
//--- se o tamanho da memória usada excede o tamanho da memória física, sair
if(TerminalInfoInteger(TERMINAL_MEMORY_PHYSICAL)/TerminalInfoInteger(TERMINAL_MEMORY_USED)<2)
return(false);
//--- tentativa para alocar memória de acordo com o atual tipo
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);
//--- memória alocada
return(true);
}
//+------------------------------------------------------------------+
//| Manipulação de eventos |
//+------------------------------------------------------------------+
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)
//+------------------------------------------------------------------+
//| Construtor |
//+------------------------------------------------------------------+
CMemoryControl::CMemoryControl(void)
{
}
//+------------------------------------------------------------------+
//| Destrutor |
//+------------------------------------------------------------------+
CMemoryControl::~CMemoryControl(void)
{
}
//+------------------------------------------------------------------+
//| Método para criação de objeto de 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)
{
//--- base criada de objetos de classe
if(!CAppDialog::Create(chart,name,subwin,x1,y1,x2,y2))
return(false);
//--- preparar strings para etiquetas
string str_physical="Memória Física = "+(string)TerminalInfoInteger(TERMINAL_MEMORY_PHYSICAL)+"
string str_total="Memória total = "+(string)TerminalInfoInteger(TERMINAL_MEMORY_TOTAL)+" Mb";
string str_available="Memória disponível = "+(string)TerminalInfoInteger(TERMINAL_MEMORY_AVAILAB
string str_used="Memória usada = "+(string)TerminalInfoInteger(TERMINAL_MEMORY_USED)+" Mb";
//--- cria um rótulos
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);
//--- create control elements
if(!CreateButton(m_button_add,"add_button",X_START+15,Y_START+245,"Adicionar",12,clrBlue))
return(false);
if(!CreateButton(m_button_free,"free_button",X_START+75,Y_START+245,"Livre",12,clrBlue))
return(false);
if(!CreateComboBoxType())
return(false);
if(!CreateComboBoxStep())
return(false);
//--- inicializar a variável
m_arr_size=0;
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Criar o botão |
//+------------------------------------------------------------------+
bool CMemoryControl::CreateButton(CButton &button,const string name,const int x,
const int y,const string str,const int font_size,
const int clr)
{
//--- criar o botão
if(!button.Create(m_chart_id,name,m_subwin,x,y,x+50,y+20))
return(false);
//--- texto
if(!button.Text(str))
return(false);
//--- tamanho de fonte
if(!button.FontSize(font_size))
return(false);
//--- cor de rótulo
if(!button.Color(clr))
return(false);
//--- adicionar o botão para os elementos de controle
if(!Add(button))
return(false);
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Criar uma caixa de combinação para o tamanho do array |
//+------------------------------------------------------------------+
bool CMemoryControl::CreateComboBoxStep(void)
{
//--- criar a caixa de combinação
if(!m_combo_box_step.Create(m_chart_id,"step_combobox",m_subwin,X_START+100,Y_START+185,X_START+
return(false);
//--- adicionar elementos para a caixa de combinação
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);
//--- definir o elemento atual da caixa de combinação
if(!m_combo_box_step.SelectByValue(1000000))
return(false);
//+------------------------------------------------------------------+
//| Manipulador da caixa de combinação para alterar evento |
//+------------------------------------------------------------------+
void CMemoryControl::OnChangeComboBoxType(void)
{
//--- verificar se o tipo de array foi alterado
if(m_combo_box_type.Value()!=m_combo_box_type_value)
{
//--- liberar memória do atual array
OnClickButtonFree();
//--- trabalhar com outro tipo de array
m_combo_box_type_value=(int)m_combo_box_type.Value();
//--- exibir um novo tipo de array na tela
if(m_combo_box_type_value==0)
m_lbl_array_type.Text("Tipo de array = char");
if(m_combo_box_type_value==1)
m_lbl_array_type.Text("Tipo de array = int");
if(m_combo_box_type_value==2)
m_lbl_array_type.Text("Tipo de array = float");
if(m_combo_box_type_value==3)
m_lbl_array_type.Text("Tipo de array = double");
if(m_combo_box_type_value==4)
m_lbl_array_type.Text("Tipo de array = long");
}
}
//--- objeto de classe CMemoryControl
CMemoryControl ExtDialog;
//+------------------------------------------------------------------+
//| Função de inicialização do Expert |
//+------------------------------------------------------------------+
int OnInit()
{
//--- criar o diálogo
if(!ExtDialog.Create(0,"MemoryControl",0,X_START,Y_START,X_SIZE,Y_SIZE))
return(INIT_FAILED);
//--- lançamento
ExtDialog.Run();
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de Desinicialização do Expert |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
ExtDialog.Destroy(reason);
}
//+------------------------------------------------------------------+
ArrayGetAsSeries
Verifica a direção do índice de um array.
bool ArrayGetAsSeries(
const void& array[] // array para verificação
);
Parâmetros
array
[in] Array verificado.
Valor do Retorno
R etorna true, se o array especificado tem o flag AS _SERIES definido, isto é, o acesso ao array é
realizado de trás para frente como em séries de tempo. A indexação em timeséries de tempo difere
da indexação de um array comum, na medida que os elementos de séries de tempo são indexados
do fim para o começo (dos dados mais novos para os mais antigos).
Observação
Para verificar se um array se comporta como uma série de tempo, use a função ArrayIsSeries().
Array de dados de preços passados como parâmetros de entrada na função OnCalculate() não
obrigatoriamente têm a mesma direção de uma série de tempo. A direção de indexação necess ária
pode ser definida usando a função ArraySetAsSeries().
Exemplo:
#property description "Indicador calcula os valores absolutos das diferenças entre"
#property description "Preços de Open (Abertura) e Close (Fechamento) ou High (Alto) e Low (Baixo)
#property description "como um histograma."
//--- configurações do indicador
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1
//---- plotar
#property indicator_type1 DRAW_HISTOGRAM
#property indicator_style1 STYLE_SOLID
#property indicator_width1 3
//--- parâmetros de entrada
input bool InpAsSeries=true; // Direção de indexação no buffer de indicador
input bool InpPrices=true; // Cálculo de preços (true - Abertura, Fechamento; false - Máximo, Mín
//--- buffer do indicador
double ExtBuffer[];
//+------------------------------------------------------------------+
//| Calcule os valores do indicador |
//+------------------------------------------------------------------+
void CandleSizeOnBuffer(const int rates_total,const int prev_calculated,
const double &first[],const double &second[],double &buffer[])
{
//--- iniciar variável para o cálculo das barras
int start=prev_calculated;
//--- trabalho na última barra se os valores do indicador já foram calculados no tick anterior
if(prev_calculated>0)
start--;
//--- definir a direção de indexação nos arrays
bool as_series_first=ArrayGetAsSeries(first);
bool as_series_second=ArrayGetAsSeries(second);
bool as_series_buffer=ArrayGetAsSeries(buffer);
//--- substituir a direção de indexação com um direto, se necessário
if(as_series_first)
ArraySetAsSeries(first,false);
if(as_series_second)
ArraySetAsSeries(second,false);
if(as_series_buffer)
ArraySetAsSeries(buffer,false);
//--- calcule valores do indicador
for(int i=start;i<rates_total;i++)
buffer[i]=MathAbs(first[i]-second[i]);
}
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado |
//+------------------------------------------------------------------+
int OnInit()
{
//--- vincular buffers de indicador
SetIndexBuffer(0,ExtBuffer);
//--- conjunto de elementos de indexação no buffer de indicador
ArraySetAsSeries(ExtBuffer,InpAsSeries);
//--- verificar quais os preços do indicador são calculados
if(InpPrices)
{
//--- Preços Open (abrir) e Close (fechar)
PlotIndexSetString(0,PLOT_LABEL,"BodySize");
//--- definir a cor do indicador
PlotIndexSetInteger(0,PLOT_LINE_COLOR,clrOrange);
}
else
{
//--- Preços High (máximo) e Low (mínimo)
PlotIndexSetString(0,PLOT_LABEL,"ShadowSize");
//--- definir a cor do indicador
PlotIndexSetInteger(0,PLOT_LINE_COLOR,clrDodgerBlue);
}
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
Também Veja
Aceso a séries de tempo, ArraySetAsSeries
ArrayInitialize
A função inicializa um array numérico com um valor predefinido.
int ArrayInitialize(
char array[], // array inicializado
char value // valor que será definido
);
int ArrayInitialize(
short array[], // array inicializado
short value // valor que será definido
);
int ArrayInitialize(
int array[], // array inicializado
int value // valor que será definido
);
int ArrayInitialize(
long array[], // array inicializado
long value // valor que será definido
);
int ArrayInitialize(
float array[], // array inicializado
float value // valor que será definido
);
int ArrayInitialize(
double array[], // array inicializado
double value // valor que será definido
);
int ArrayInitialize(
bool array[], // array inicializado
bool value // valor que será definido
);
int ArrayInitialize(
uint array[], // array inicializado
uint value // valor que será definido
);
Parâmetros
array[]
[out] Array numérico que deve ser inicializado.
value
[in] Novo valor que deve ser definido para todos os elementos do array.
Valor do Retorno
Número de elementos.
Observação
A função ArrayR esize() permite definir o tamanho de um array com uma reserva para expansão
posterior sem a realocação de memória. É implementada para uma melhor performance, porque as
operações de realocação de memória são razoavelmente lentas.
Exemplo:
void OnStart()
{
//--- array dinâmico
double array[];
//--- vamos definir o tamanho do array para 100 elementos e reservar um buffer para outros 10 eleme
ArrayResize(array,100,10);
//--- inicializa os elementos do array com valor EMPTY_VALUE=DBL_MAX
ArrayInitialize(array,EMPTY_VALUE);
Print("Valores dos 10 últimos elementos antes da inicialização");
for(int i=90;i<100;i++) printf("array[%d] = %G",i,array[i]);
//--- expande o array em 5 elementos
ArrayResize(array,105);
Print("Valores dos 10 últimos elementos antes do ArrayResize(array,105)");
//--- valores dos 5 últimos elementos são obtidos do buffer de reserva
for(int i=95;i<105;i++) printf("array[%d] = %G",i,array[i]);
}
ArrayFill
A função preenche um array com o valor especificado.
void ArrayFill(
void& array[], // array
int start, // índice de início
int count, // número de elementos para preencher
void value // valor
);
Parâmetros
array[]
[out] Array de tipo simples (char, uchar, short, ushort, int, uint, long, ulong, bool, color,
datetime, float, double).
start
[in] Índice de início. Neste caso, flag AS _SERIES específico é ignorado.
count
[in] Número de elementos para preencher.
value
[in] Valor usado no preenchimento do array.
Valor de retorno
Sem valor de retorno.
Observação
Quando a função ArrayFill() é chamada, a direção de indexação normal( da esquerda para direita) é
sempre implícita. Isso significa que a alteração da ordem de acesso dos elementos do array usando
a função ArraySetAsSeries() é ignorada.
Exemplo:
void OnStart()
{
//--- declara um array dinâmico
int a[];
//--- define tamanho
ArrayResize(a,10);
//--- preenche os primeiros 5 elementos com 123
ArrayFill(a,0,5,123);
//--- preenche os primeiros 5 elementos com 456
ArrayFill(a,5,5,456);
//--- mostrar valores
for(int i=0;i<ArraySize(a);i++) printf("a[%d] = %d",i,a[i]);
}
ArrayIsDynamic
A função verifica se um array é dinâmico.
bool ArrayIsDynamic(
const void& array[] // array verificado
);
Parâmetros
array[]
[in] Array verificado.
Valor do Retorno
R etorna true se o array selecionado é dinâmico, caso contrário retorna false.
Exemplo:
#property description "Este indicador não calcula valores. Faz uma única tentativa para"
#property description "aplicar a chamada da função ArrayFree() para três arrays: dinâmico, estático
#property description "um buffer de indicador. Os resultados são mostrados no jornal dos Experts."
//--- configurações do indicador
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1
//--- variáveis globais
double ExtDynamic[]; // array dinâmico
double ExtStatic[100]; // array estático
bool ExtFlag=true; // bandeira
double ExtBuff[]; // buffer do indicador
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado |
//+------------------------------------------------------------------+
int OnInit()
{
//--- alocar memória para o array
ArrayResize(ExtDynamic,100);
//--- mapeamento de buffers do indicador
SetIndexBuffer(0,ExtBuff);
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const int begin,
const double &price[])
{
//--- executar uma análise única
if(ExtFlag)
{
//--- tentativa para liberar memória para os arrays
//--- 1. Array dinâmico
Print("+============================+");
Print("1. Verificar o array dinâmico:");
Print("Antes do tamanho da memória ser liberada = ",ArraySize(ExtDynamic));
Print("Isto é um array dinâmico = ",ArrayIsDynamic(ExtDynamic) ? "Sim" : "Não");
//--- tentativa de liberar memória do array
ArrayFree(ExtDynamic);
Print("Após o tamanho da memória ser liberada = ",ArraySize(ExtDynamic));
//--- 2. Array estático
Print("2. Verificar array estático:");
Print("Antes do tamanho da memória ser liberada = ",ArraySize(ExtStatic));
Print("Isto é um array dinâmico = ",ArrayIsDynamic(ExtStatic) ? "Sim" : "Não");
//--- tentativa de liberar memória do array
ArrayFree(ExtStatic);
Print("Após do tamanho da memória ser liberada = ",ArraySize(ExtStatic));
//--- 3. Buffer do indicador
Print("3. Verificar buffer do indicador:");
Print("Antes do tamanho da memória ser liberada = ",ArraySize(ExtBuff));
Print("Isto é um array dinâmico = ",ArrayIsDynamic(ExtBuff) ? "Sim" : "Não");
//--- tentativa de liberar memória do array
ArrayFree(ExtBuff);
Print("Após do tamanho da memória ser liberada = ",ArraySize(ExtBuff));
//--- alterar o valor do sinalizador
ExtFlag=false;
}
//--- valor retorno de prev_calculated para a próxima chamada
return(rates_total);
}
Também Veja
Acesso a séries de tempo e indicadores
ArrayIsSeries
A função verifica se um array é uma série de tempo.
bool ArrayIsSeries(
const void& array[] // array verificado
);
Parâmetros
array[]
[in] Array verificado.
Valor do Retorno
R etorna true, se o array verificado é um array de série de tempo, caso contrário, retorna false.
Arrays passados como parâmetro para a função OnCalculate() devem ser verificados quanto a ordem
de acesso dos elementos do array através de ArrayGetAsSeries().
Exemplo:
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1
//---- Plotar Etiqueta1
#property indicator_label1 "Etiqueta1"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- buffers do indicador
double Label1Buffer[];
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado |
//+------------------------------------------------------------------+
void OnInit()
{
//--- mapeamento de buffers do indicador
SetIndexBuffer(0,Label1Buffer,INDICATOR_DATA);
//---
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
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[],
Também Veja
Acesso a séries de tempo e indicadores
ArrayMaximum
Procura o maior elemento na primeira dimensão de um array numérico multidimensional.
int ArrayMaximum(
const void& array[], // array para busca
int start=0, // índice a partir do qual começa a verificação
int count=WHOLE_ARRAY // número de elementos verificados
);
Parâmetros
array[]
[in] Um array númerico, na qual a busca é feita.
start=0
[in] Índice a partir do qual começa a verificação.
count=WHOLE_ARRAY
[in] Número de elementos para busca. Por padrão, busca no array inteiro
(count=WH OLE_ARR AY)..
Valor do Retorno
A função retorna um índice de um elemento encontrado levando em consideração a série do array.
Em caso de falha, retorna -1.
Observação
O valor da bandeira AS _SERIES É levado em consideração durante a procura de um máximo.
Exemplo:
#property description "O indicador mostra sobre as barras (candlesticks) um prazo de tempo maior do
//--- configurações do indicador
#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
//--- constante pré-definida
#define INDICATOR_EMPTY_VALUE 0.0
//--- parâmetros de entrada
input ENUM_TIMEFRAMES InpPeriod=PERIOD_H4; // Prazo de tempo para calcular o indicador
input datetime InpDateStart=D'2013.01.01 00:00'; // Analisar a partir desta data
//--- buffers do indicador para candlesticks de baixa
double ExtBearBodyFirst[];
double ExtBearBodySecond[];
double ExtBearBodyEndFirst[];
double ExtBearBodyEndSecond[];
double ExtBearShadowFirst[];
double ExtBearShadowSecond[];
double ExtBearShadowEndFirst[];
double ExtBearShadowEndSecond[];
//--- buffers do indicador para candlesticks de alta
double ExtBullBodyFirst[];
double ExtBullBodySecond[];
double ExtBullBodyEndFirst[];
double ExtBullBodyEndSecond[];
double ExtBullShadowFirst[];
double ExtBullShadowSecond[];
double ExtBullShadowEndFirst[];
double ExtBullShadowEndSecond[];
//--- variáveis globais
datetime ExtTimeBuff[]; // buffer de tempo para maior periodicidade
int ExtSize=0; // tamanho do buffer de tempo
int ExtCount=0; // índice dentro do buffer de tempo
int ExtStartPos=0; // posição inicial para cálculo do indicador
bool ExtStartFlag=true; // sinalizador auxiliar para receber a posição inicial
datetime ExtCurrentTime[1]; // último tempo na geração da barra de maior periodicidade
datetime ExtLastTime; // último tempo a partir da barra de maior periodicidade, para a execu
bool ExtBearFlag=true; // flag para definir a ordem de escrita do dados para os buffers de in
bool ExtBullFlag=true; // flag para definir a ordem de escrita do dados para os buffers de in
int ExtIndexMax=0; // índice do elemento máximo do array
int ExtIndexMin=0; // índice do elemento mínimo do array
int ExtDirectionFlag=0; // direção de movimento de preços para o atual candlestick
//--- alternar entre o preço de abertura e fechamento do candlestick para desenhar corretamente
//--- se os preços de fechamento e de abertura são iguais, use o deslocamento para a exibição corre
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);
}
//+------------------------------------------------------------------+
//| Preencher o final do candlestick |
//+------------------------------------------------------------------+
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)
{
//--- não desenhar em caso de uma única barra
if(last-start==0)
return;
//--- se o preço de fechamento no primeiro bar é excede ao do último bar, o candlesticks é de baixa
if(open[start]>close[last])
{
//--- gerar o final do candelstick
FormCandleEnd(ExtBearBodyEndFirst,ExtBearBodyEndSecond,ExtBearShadowEndFirst,ExtBearShadowEnd
open[start],close[last],high[index_max],low[index_min],fill_index,ExtBearFlag);
//--- sair da função
return;
}
//--- se o preço de fechamento no primeiro bar é menor do que último bar, o candlesticks é de alta
if(open[start]<close[last])
{
//--- gerar o final do candelstick
FormCandleEnd(ExtBullBodyEndFirst,ExtBullBodyEndSecond,ExtBullShadowEndFirst,ExtBullShadowEnd
close[last],open[start],high[index_max],low[index_min],fill_index,ExtBullFlag);
//--- sair da função
return;
}
//--- se você está nesta parte da função, o preço de abertura no primeiro bar é igual ao
//--- preço de fechamento no último bar; então o candlestick é considerado de baixa
//--- gerar o final do candelstick
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
}
//+------------------------------------------------------------------+
{
//--- neste caso ainda não existe cálculos de barras
if(prev_calculated==0)
{
//--- receber a maior periodicidade das barra no tempo de chegada
if(!GetTimeData())
return(0);
}
//--- definir a indexação direta
ArraySetAsSeries(time,false);
ArraySetAsSeries(high,false);
ArraySetAsSeries(low,false);
ArraySetAsSeries(open,false);
ArraySetAsSeries(close,false);
//--- iniciar variável para o cálculo das barras
int start=prev_calculated;
//--- se uma barra é gerada, recalcular o valor do indicador sobre ela
if(start!=0 && start==rates_total)
start--;
//--- o loop para cálculos dos valores do indicador
for(int i=start;i<rates_total;i++)
{
//--- preencher i elementos dos buffers do indicador por valores vazios
FillIndicatorBuffers(i);
//--- executar cálculos para as barras iniciando a partir dos dados InpDateStart
if(time[i]>=InpDateStart)
{
//--- definir posição, a partir do qual os valores são exibidos pela primeira vez
if(ExtStartFlag)
{
//--- armazenar o número do bar inicial
ExtStartPos=i;
//--- definir a primeira data a partir da maior periodicidade excedendo time[i]
while(time[i]>=ExtTimeBuff[ExtCount])
if(ExtCount<ExtSize-1)
ExtCount++;
//--- alterar o valor da sinalização em ordem não executada neste bloco novamente
ExtStartFlag=false;
}
//--- verificar se ainda existem quaisquer elementos no array
if(ExtCount<ExtSize)
{
//--- esperar o valor da periodicidade atual para chegar a um maior período de tempo
if(time[i]>=ExtTimeBuff[ExtCount])
{
//--- desenhar a parte principal do candlestick (sem preencher o espaço entre a últi
FillCandleMain(open,close,high,low,ExtStartPos,i-1,i-2,ExtIndexMax,ExtIndexMin);
//--- preencher o final do candlestick(a área entre a última e a penúltima barra)
FillCandleEnd(open,close,high,low,ExtStartPos,i-1,i-1,ExtIndexMax,ExtIndexMin);
if(current_period>=high_period)
{
Print("Erro! O valor do período do indicador deve exceder o valor do intervalo do tempo atual
return(false);
}
//--- se o período do indicador é de uma semana ou um mês, o período está correto
if(high_period>32768)
return(true);
//--- converter valores do período para minutos
if(high_period>30)
high_period=(high_period-16384)*60;
if(current_period>30)
current_period=(current_period-16384)*60;
//--- o período do indicador deve ser múltiplo do período de tempo, é exibido sobre
if(high_period%current_period!=0)
{
Print("Erro! O valor do período do indicador deve ser múltiplo ao valor do atual período de t
return(false);
}
//--- o período do indicador deve exceder o prazo de tempo quando apresentado de 3 ou mais vezes
if(high_period/current_period<3)
{
Print("Erro! O período do indicador deve exceder o prazo atual de 3 ou mais vezes!");
return(false);
}
//--- O período do indicador é o correto para a atual periodicidade
return(true);
}
//+------------------------------------------------------------------+
//| Receber dados de tempo a partir da maior prazo de tempo |
//+------------------------------------------------------------------+
bool GetTimeData(void)
{
//--- redefine o valor de erro
ResetLastError();
//--- copiar todos os dados para o tempo atual
if(CopyTime(Symbol(),InpPeriod,InpDateStart,TimeCurrent(),ExtTimeBuff)==-1)
{
//--- receber o código de erro
int code=GetLastError();
//--- imprimir a mensagem de erro
PrintFormat("Erro de cópia de dados! %s",code==4401
? "Histórico ainda está sendo carregado!"
: "Código = "+IntegerToString(code));
//--- retornar falso para fazer uma tentativa de repetir o download de dados
return(false);
}
//--- recebe o tamanho do array
ExtSize=ArraySize(ExtTimeBuff);
if(flag)
{
//--- gerar o final do corpo do candlestick
FormEnd(body_fst,body_snd,fst_value,snd_value,end);
//--- gerar o final da sombra do candlestick
FormEnd(shadow_fst,shadow_snd,fst_extremum,snd_extremum,end);
//--- alterar o valor do sinalizador para o oposto
flag=false;
}
else
{
//--- gerar o final do corpo do candlestick
FormEnd(body_fst,body_snd,snd_value,fst_value,end);
//--- gerar o final da sombra do candlestick
FormEnd(shadow_fst,shadow_snd,snd_extremum,fst_extremum,end);
//--- alterar o valor do sinalizador para o oposto
flag=true;
}
}
//+---------------------------------------------------------------------------------+
//| Limpar o fim do candlestick (a área entre a última e a penúltima |
//| barra) |
//+---------------------------------------------------------------------------------+
void ClearEndOfBodyMain(const int ind)
{
ClearCandle(ExtBearBodyFirst,ExtBearBodySecond,ExtBearShadowFirst,ExtBearShadowSecond,ind,1);
ClearCandle(ExtBullBodyFirst,ExtBullBodySecond,ExtBullShadowFirst,ExtBullShadowSecond,ind,1);
}
//+--------------------------------------------------------------------------+
//| Limpar o candlestick |
//+--------------------------------------------------------------------------+
void ClearCandle(double &body_fst[],double &body_snd[],double &shadow_fst[],
double &shadow_snd[],const int start,const int count)
{
//--- verificar
if(count!=0)
{
//--- preencher buffers do indicador com valores vazios
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);
}
}
//+--------------------------------------------------------------------------+
//| Gerar a parte principal do candlestick |
//+--------------------------------------------------------------------------+
void FormMain(double &fst[],double &snd[],const double fst_value,
const double snd_value,const int start,const int count)
{
//--- verificar
if(count!=0)
{
//--- preencher o buffer do indicador com valores
ArrayFill(fst,start,count,fst_value);
ArrayFill(snd,start,count,snd_value);
}
}
//+-----------------------------------------------------------------------------+
//| Gerar o final do candlestick |
//+-----------------------------------------------------------------------------+
void FormEnd(double &fst[],double &snd[],const double fst_value,
const double snd_value,const int last)
{
//--- preencher o buffer do indicador com valores
ArrayFill(fst,last-1,2,fst_value);
ArrayFill(snd,last-1,2,snd_value);
}
//+------------------------------------------------------------------+
//| Preencher i elemento dos buffers do indicador por valores vazios |
//+------------------------------------------------------------------+
void FillIndicatorBuffers(const int i)
{
//--- definir um valor vazio na célula dos buffers do indicador
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
Procura o elemento mais baixo na primeira dimensão de um array numérico multidimensional.
int ArrayMinimum(
const void& array[], // array para busca
int start=0, // índice a partir do qual começa a verificação
int count=WHOLE_ARRAY // número de elementos verificados
);
Parâmetros
array[]
[in] Um array númerico, na qual a busca é feita.
start=0
[in] Índice a partir do qual começa a verificação.
count=WHOLE_ARRAY
[in] Número de elementos para busca. Por padrão, busca no array inteiro
(count=WH OLE_ARR AY)..
Valor do Retorno
A função retorna um índice de um elemento encontrado levando em consideração a série do array.
Em caso de falha, retorna -1.
Observação
O valor da flag AS _SERIES é levado em conta durante a busca de um mínimo.
Exemplo:
#property description "O indicador mostra sobre as barras (candlesticks) um prazo de tempo maior do
//--- configurações do indicador
#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
//--- constante pré-definida
#define INDICATOR_EMPTY_VALUE 0.0
//--- parâmetros de entrada
input ENUM_TIMEFRAMES InpPeriod=PERIOD_H4; // Prazo de tempo para calcular o indicador
input datetime InpDateStart=D'2013.01.01 00:00'; // Analisar a partir desta data
//--- buffers do indicador para candlesticks de baixa
double ExtBearBodyFirst[];
double ExtBearBodySecond[];
double ExtBearBodyEndFirst[];
double ExtBearBodyEndSecond[];
double ExtBearShadowFirst[];
double ExtBearShadowSecond[];
double ExtBearShadowEndFirst[];
double ExtBearShadowEndSecond[];
//--- buffers do indicador para candlesticks de alta
double ExtBullBodyFirst[];
double ExtBullBodySecond[];
double ExtBullBodyEndFirst[];
double ExtBullBodyEndSecond[];
double ExtBullShadowFirst[];
double ExtBullShadowSecond[];
double ExtBullShadowEndFirst[];
double ExtBullShadowEndSecond[];
//--- variáveis globais
datetime ExtTimeBuff[]; // buffer de tempo para maior periodicidade
int ExtSize=0; // tamanho do buffer de tempo
int ExtCount=0; // índice dentro do buffer de tempo
int ExtStartPos=0; // posição inicial para cálculo do indicador
bool ExtStartFlag=true; // sinalizador auxiliar para receber a posição inicial
datetime ExtCurrentTime[1]; // último tempo na geração da barra de maior periodicidade
datetime ExtLastTime; // último tempo a partir da barra de maior periodicidade, para a execu
bool ExtBearFlag=true; // flag para definir a ordem de escrita do dados para os buffers de in
bool ExtBullFlag=true; // flag para definir a ordem de escrita do dados para os buffers de in
int ExtIndexMax=0; // índice do elemento máximo do array
int ExtIndexMin=0; // índice do elemento mínimo do array
int ExtDirectionFlag=0; // direção de movimento de preços para o atual candlestick
//--- alternar entre o preço de abertura e fechamento do candlestick para desenhar corretamente
//--- se os preços de fechamento e de abertura são iguais, use o deslocamento para a exibição corre
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);
}
//+------------------------------------------------------------------+
//| Preencher o final do candlestick |
//+------------------------------------------------------------------+
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)
{
//--- não desenhar em caso de uma única barra
if(last-start==0)
return;
//--- se o preço de fechamento no primeiro bar é excede ao do último bar, o candlesticks é de baixa
if(open[start]>close[last])
{
//--- gerar o final do candelstick
FormCandleEnd(ExtBearBodyEndFirst,ExtBearBodyEndSecond,ExtBearShadowEndFirst,ExtBearShadowEnd
open[start],close[last],high[index_max],low[index_min],fill_index,ExtBearFlag);
//--- sair da função
return;
}
//--- se o preço de fechamento no primeiro bar é menor do que último bar, o candlesticks é de alta
if(open[start]<close[last])
{
//--- gerar o final do candelstick
FormCandleEnd(ExtBullBodyEndFirst,ExtBullBodyEndSecond,ExtBullShadowEndFirst,ExtBullShadowEnd
close[last],open[start],high[index_max],low[index_min],fill_index,ExtBullFlag);
//--- sair da função
return;
}
//--- se você está nesta parte da função, o preço de abertura no primeiro bar é igual ao
//--- preço de fechamento no último bar; então o candlestick é considerado de baixa
//--- gerar o final do candelstick
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
}
//+------------------------------------------------------------------+
{
//--- neste caso ainda não existe cálculos de barras
if(prev_calculated==0)
{
//--- receber a maior periodicidade das barra no tempo de chegada
if(!GetTimeData())
return(0);
}
//--- definir a indexação direta
ArraySetAsSeries(time,false);
ArraySetAsSeries(high,false);
ArraySetAsSeries(low,false);
ArraySetAsSeries(open,false);
ArraySetAsSeries(close,false);
//--- iniciar variável para o cálculo das barras
int start=prev_calculated;
//--- se uma barra é gerada, recalcular o valor do indicador sobre ela
if(start!=0 && start==rates_total)
start--;
//--- o loop para cálculos dos valores do indicador
for(int i=start;i<rates_total;i++)
{
//--- preencher i elementos dos buffers do indicador por valores vazios
FillIndicatorBuffers(i);
//--- executar cálculos para as barras iniciando a partir dos dados InpDateStart
if(time[i]>=InpDateStart)
{
//--- definir posição, a partir do qual os valores são exibidos pela primeira vez
if(ExtStartFlag)
{
//--- armazenar o número do bar inicial
ExtStartPos=i;
//--- definir a primeira data a partir da maior periodicidade excedendo time[i]
while(time[i]>=ExtTimeBuff[ExtCount])
if(ExtCount<ExtSize-1)
ExtCount++;
//--- alterar o valor da sinalização em ordem não executada neste bloco novamente
ExtStartFlag=false;
}
//--- verificar se ainda existem quaisquer elementos no array
if(ExtCount<ExtSize)
{
//--- esperar o valor da periodicidade atual para chegar a um maior período de tempo
if(time[i]>=ExtTimeBuff[ExtCount])
{
//--- desenhar a parte principal do candlestick (sem preencher o espaço entre a últi
FillCandleMain(open,close,high,low,ExtStartPos,i-1,i-2,ExtIndexMax,ExtIndexMin);
//--- preencher o final do candlestick(a área entre a última e a penúltima barra)
FillCandleEnd(open,close,high,low,ExtStartPos,i-1,i-1,ExtIndexMax,ExtIndexMin);
if(current_period>=high_period)
{
Print("Erro! O valor do período do indicador deve exceder o valor do intervalo do tempo atual
return(false);
}
//--- se o período do indicador é de uma semana ou um mês, o período está correto
if(high_period>32768)
return(true);
//--- converter valores do período para minutos
if(high_period>30)
high_period=(high_period-16384)*60;
if(current_period>30)
current_period=(current_period-16384)*60;
//--- o período do indicador deve ser múltiplo do período de tempo, é exibido sobre
if(high_period%current_period!=0)
{
Print("Erro! O valor do período do indicador deve ser múltiplo ao valor do atual período de t
return(false);
}
//--- o período do indicador deve exceder o prazo de tempo quando apresentado de 3 ou mais vezes
if(high_period/current_period<3)
{
Print("Erro! O período do indicador deve exceder o prazo atual de 3 ou mais vezes!");
return(false);
}
//--- O período do indicador é o correto para a atual periodicidade
return(true);
}
//+------------------------------------------------------------------+
//| Receber dados de tempo a partir da maior prazo de tempo |
//+------------------------------------------------------------------+
bool GetTimeData(void)
{
//--- redefine o valor de erro
ResetLastError();
//--- copiar todos os dados para o tempo atual
if(CopyTime(Symbol(),InpPeriod,InpDateStart,TimeCurrent(),ExtTimeBuff)==-1)
{
//--- receber o código de erro
int code=GetLastError();
//--- imprimir a mensagem de erro
PrintFormat("Erro de cópia de dados! %s",code==4401
? "Histórico ainda está sendo carregado!"
: "Código = "+IntegerToString(code));
//--- retornar falso para fazer uma tentativa de repetir o download de dados
return(false);
}
//--- recebe o tamanho do array
ExtSize=ArraySize(ExtTimeBuff);
if(flag)
{
//--- gerar o final do corpo do candlestick
FormEnd(body_fst,body_snd,fst_value,snd_value,end);
//--- gerar o final da sombra do candlestick
FormEnd(shadow_fst,shadow_snd,fst_extremum,snd_extremum,end);
//--- alterar o valor do sinalizador para o oposto
flag=false;
}
else
{
//--- gerar o final do corpo do candlestick
FormEnd(body_fst,body_snd,snd_value,fst_value,end);
//--- gerar o final da sombra do candlestick
FormEnd(shadow_fst,shadow_snd,snd_extremum,fst_extremum,end);
//--- alterar o valor do sinalizador para o oposto
flag=true;
}
}
//+-------------------------------------------------------------------------------------+
//| Limpar o final do candlestick (a área entre a última e a penúltima |
//| barra) |
//+-------------------------------------------------------------------------------------+
void ClearEndOfBodyMain(const int ind)
{
ClearCandle(ExtBearBodyFirst,ExtBearBodySecond,ExtBearShadowFirst,ExtBearShadowSecond,ind,1);
ClearCandle(ExtBullBodyFirst,ExtBullBodySecond,ExtBullShadowFirst,ExtBullShadowSecond,ind,1);
}
//+------------------------------------------------------------------+
//| Limpar o candlestick |
//+------------------------------------------------------------------+
void ClearCandle(double &body_fst[],double &body_snd[],double &shadow_fst[],
double &shadow_snd[],const int start,const int count)
{
//--- verificar
if(count!=0)
{
//--- preencher buffers do indicador com valores vazios
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);
}
}
//+------------------------------------------------------------------+
//| Gerar a parte principal do candlestick |
//+------------------------------------------------------------------+
void FormMain(double &fst[],double &snd[],const double fst_value,
const double snd_value,const int start,const int count)
{
//--- verificar
if(count!=0)
{
//--- preencher o buffer do indicador com valores
ArrayFill(fst,start,count,fst_value);
ArrayFill(snd,start,count,snd_value);
}
}
//+------------------------------------------------------------------+
//| Gerar o fim do candlestick |
//+------------------------------------------------------------------+
void FormEnd(double &fst[],double &snd[],const double fst_value,
const double snd_value,const int last)
{
//--- preencher o buffer do indicador com valores
ArrayFill(fst,last-1,2,fst_value);
ArrayFill(snd,last-1,2,snd_value);
}
//+------------------------------------------------------------------+
//| Preencher i elemento dos buffers do indicador por valores vazios |
//+------------------------------------------------------------------+
void FillIndicatorBuffers(const int i)
{
//--- definir um valor vazio na célula dos buffers do indicador
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
No log, exibe uma matriz de tipo ou estrutura simples.
void ArrayPrint(
const void& array[], // matriz de saída
uint digits=_Digits, // número de casas decimais
const string separator=NULL, // separador entre os valores dos campos de estrutura
ulong start=0, // índice do primeiro elemento de saída
ulong count=WHOLE_ARRAY, // número de elementos exibidos
ulong flags=ARRAYPRINT_HEADER|ARRAYPRINT_INDEX|ARRAYPRINT_LIMIT|ARRAYPRINT_ALIGN
);
Parâmetros
array[]
[in] Matriz de tipo ou estrutura simples..
digits=_Digits
[in] Número de casas decimais para tipos reais. Por padrão igual a _Digits.
separator=NULL
[in] Separador entre os valores dos campos do elemento de estrutura. O valor padrão NULL indica
que existe uma cadeia de caracteres vazia, neste caso, o separador é um espaço.
start=0
[in] Índice da primeira saída do elemento da matriz. Por padrão, exibe-se a partir do índice zero.
count=WHOLE_ARRAY
[in] Número de elementos de matriz que você deseja exibir. Por padrão, ele exibe toda a matriz
(count=WH OLE_ARR AY).
flags=ARRAYPRINT_HEADER|ARRAYPRINT_INDEX|ARRAYPRINT_LIMIT|ARRAYPRINT_ALIGN
[in] A combinação de sinalizadores especificada pelo modo de saída. Por padrão, todas os
sinalizadores :
· ARR AYPRINT_H EADER – exibição dos cabeçalhos para a matriz das estruturas
· ARR AYPRINT_INDEX – exibição à esquerda do número de índice
· ARR AYPRINT_L I M IT – exibição somente dos 100 primeiros e os últimos 100 elementos da matriz. É
usado quando você deseja exibir apenas parte de uma matriz maior.
· ARR AYPRINT_AL IGN – permitir o alinhamento dos valores de saída, quer dizer, os números serão
alinhados à direita, enquanto as cadeias de caracteres à esquerda.
· ARR AYPRINT_DAT E – ao exibir datetime, mostra a data no formato dd.mm.yyyy
· ARR AYPRINT_M INUT ES – ao exibir datetime, mostra a data no formato HH:MM
· ARR AYPRINT_SECONDS – ao exibir datetime, mostra a data no formato HH:MM :SS
Valor de retorno
Não
Observação
ArrayPrint() não exibe, no log, todos os campos da matriz de estruturas, uma vez que os campos
tanto de matriz como de indicadores de objetos são omitidos. Estas colunas simplesmente não serão
exibidas para impressão, com o propósito de obter uma apresentação simples e conveniente. Se
você precisar da exibição de todos os campos dessa estrutura, necessitará escrever sua própria
função de saída em massa com a formatação desejada.
Exemplo:
//--- exibir os valores das últimas 10 barras
MqlRates rates[];
if(CopyRates(_Symbol,_Period,1,10,rates))
{
ArrayPrint(rates);
Print("Verificação\n[time]\t[open]\t[high]\t[low]\t[close]\t[tick_volume]\t[spread]\t[real_vo
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());
//--- exemplo de saída
/*
[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
Verificação
[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
*/
Veja também
FileSave, FileLoad
ArrayRange
A função retorna o número de elementos na dimensão selecionada do array.
int ArrayRange(
const void& array[], // array para verificação
int rank_index // índice da dimensão
);
Parâmetros
array[]
[in] Array verificado.
rank_index
[in] Índice da dimensão.
Valor do Retorno
Número de elementos na dimensão selecionada do array.
Observação
Uma vez que os índices começam em zero, o número de dimens ões de um array é uma unidade
maior que o índice da última dimensão.
Exemplo:
void OnStart()
{
//--- cria um array de quatro dimensões
double array[][5][2][4];
//--- definir o tamanho da dimensão de zero
ArrayResize(array,10,10);
//--- imprimir as dimensões
int temp;
for(int i=0;i<4;i++)
{
//--- receber o tamanho de i dimensão
temp=ArrayRange(array,i);
//--- imprimir
PrintFormat("dim = %d, range = %d",i,temp);
}
//--- Resultado
// dim = 0, range = 10
// dim = 1, range = 5
// dim = 2, range = 2
// dim = 3, range = 4
}
ArrayResize
A função define um tamanho novo para a primeira dimensão
int ArrayResize(
void& array[], // array passado por referência
int new_size, // novo tamanho de array
int reserve_size=0 // valor do tamanho de reserva (excesso)
);
Parâmetros
array[]
[out] Array para alteração de tamanho.
new_size
[in] Novo tamanho para a primeira dimensão.
reserve_size=0
[in] T amanho alocado para obter reserva.
Valor do Retorno
Se executado com sucesso, a função retorna a quantidade de todos os elementos contidos no array
após a alteração do tamanho, caso contrário, retorna -1, e o tamanho do array não é alterado.
Observação
A função pode ser aplicada somente para arrays dinâmicos. Deve ser notado que não se pode alterar
o tamanho de arrays dinâmicos atribuídos como buffers de indicadores através da função
SetIndex Buffer(). Para buffers de indicadores, todas a operações de redimensionamento de tamanho
são realizadas pelo subsistema de tempo de execução do terminal.
Com uma alocação de memória freqüente, é recomendado usar o terceiro parâmetro que defini um
reserva para reduzir o número de alocações físicas de memória. T odas as subseqüentes chamadas
de ArrayR esize não levam uma realocação física de memória, mas somente alteração do tamanho da
primeira dimensão do array dentro da memória reservada. Deve ser lembrado que o terceiro
parâmetro será usado somente durante a alocação física de memória. Por exemplo:
ArrayResize(arr,1000,1000);
for(int i=1;i<3000;i++)
ArrayResize(arr,i,1000);
Neste caso a memória será realocada duas vezes, a primeira vez antes de entrar no loop de
elemento 3000 (o tamanho do array será definido para 1000), e a segunda vez com i igual a 2000.
Se omitisse o terceiro parâmetro, haveria 2000 realocações físicas de memória, que desaceleraria o
programa.
Exemplo:
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
//--- Contadores
ulong start=GetTickCount();
ulong now;
int count=0;
//--- Um array para demonstração de uma versão rápida
double arr[];
ArrayResize(arr,100000,100000);
//--- Verifique quão rápida a variante com a reserva de memória trabalha
Print("--- Test Fast: ArrayResize(arr,100000,100000)");
for(int i=1;i<=300000;i++)
{
//--- Define um novo tamanho de array especificando a reserva de 100 000 elementos!
ArrayResize(arr,i,100000);
//--- Quando alcançar um número redondo, exibe o tamanho do array e tempo gasto
if(ArraySize(arr)%100000==0)
{
now=GetTickCount();
count++;
PrintFormat("%d. ArraySize(arr)=%d Time=%d ms",count,ArraySize(arr),(now-start));
start=now;
}
}
//--- Agora mostra quão lento a versão sem reserva de memória é
double slow[];
ArrayResize(slow,100000,100000);
//---
count=0;
start=GetTickCount();
Print("---- Teste lenta: ArrayResize(slow,100000)");
//---
for(int i=1;i<=300000;i++)
{
//--- Define um novo tamanho de array, mas sem a reserva adicional
ArrayResize(slow,i);
//--- Quando alcançar um número redondo, exibe o tamanho do array e tempo gasto
if(ArraySize(slow)%100000==0)
{
now=GetTickCount();
count++;
PrintFormat("%d. ArraySize(slow)=%d Time=%d ms",count,ArraySize(slow),(now-start));
start=now;
}
}
}
//--- O resultado do 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
*/
Também Veja
ArrayInitialize
ArrayInsert
Insere na matriz de destino o número especificado de elementos da matriz de origem, iniciando no
índice especificado.
bool ArrayInsert(
void& dst_array[], // matriz de destino
const void& src_array[], // matriz de origem
uint dst_start, // índice na matriz de destino para inserir
uint src_start=0, // índice na matriz de origem para copiar
uint count=WHOLE_ARRAY // número de elementos a serem inseridos
);
Parâmetros
dst_array[]
[in][out] Matriz receptor à qual você deseja adicionar elementos.
src_array[]
[in] Matriz de origem a partir da qual você deseja adicionar elementos
dst_start
[in] Índice na matriz de destino para inserir elementos da matriz de origem.
src_start=0
[in] Índice na matriz de destino a partir do qual são tomados os elementos da matriz de origem
para serem inseridos.
count=WHOLE_ARRAY
[in] Número de elementos adicionados a partir da matriz de origem. O valor WH OLE_ARR AY
significa que serão inseridos todos os elementos do índice especificado até o final da matriz.
Valor retornado
R etorna true em caso de sucesso, caso contrário, false. Para obter informações de erro, chame a
função GetLastError(). Possíveis erros :
· 5052 – ERR_SMALL _ARR AY (parâmetros start e/ou count inv álidos ou matriz de origem src_array[]
está vazia),
· 5056 – ERR_SERIES _ARR AY (a matriz não pode ser alterada, buffer de indicador),
· 4006 – ERR_INVAL ID_ARR AY (a cópia para si próprio é inv álida, ou as matrizes têm um tipo
diferente ou possuem uma matriz de tamanho fixo, que contém objetos de uma classe ou de uma
estrutura com um destruidor),
· 4005 - ERR_S TRUCT_WITH OBJECT S _OR CLASS (a matriz não contém estruturas POD, isto é, é
impossível copiar),
· erros de redimensionamento da matriz de destino dst_array[] – eles são dados na descrição da
função ArrayR emove().
Observação
Se a função é usada para uma matriz de tamanho fixo, o tamanho da própria matriz de destino
dst_array[] não muda, a partir da posição dst_start os elementos da matriz de destino são
deslocados para a direita (o último count dos elementos cai), e os elementos são copiados da matriz
de origem para o local liberado.
Você não pode inserir elementos em matrizes dinâmicas, que são designadas como buffers de
indicador, através da função SetIndex Buffer(). Para buffers de indicador, todas as operações de
redimensionamento são executadas pelo subsistema em execução do terminal.
Na matriz de origem, os elementos são copiados a partir do índice src_start. O tamanho da matriz
de origem não é alterado. Os elementos adicionados à matriz de destino não são referências aos
elementos da matriz de origem, o que significa que alterações subsequentes nos elementos em
qualquer uma das matrizes não são refletidas na seguinte.
Exemplo:
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- declara uma matriz de tamanho fixo e preenche com valores
int array_dest[10];
for(int i=0;i<10;i++)
{
array_dest[i]=i;
}
//--- matriz de origem
int array_source[10];
for(int i=0;i<10;i++)
{
array_source[i]=10+i;
}
//--- mostra matrizes antes de inserir elementos
Print("Antes de chamar a ArrayInsert()");
ArrayPrint(array_dest);
ArrayPrint(array_source);
//--- insere 3 elementos da matriz de origem e mostra a nova composição da matriz de destino
ArrayInsert(array_dest,array_source,4,0,3);
Print("Depois de chamar a ArrayInsert()");
ArrayPrint(array_dest);
/*
Resultado de execução
Antes de chamar a ArrayInsert()
0 1 2 3 4 5 6 7 8 9
Depois de chamar aArrayInsert()
0 1 2 3 10 11 12 7 8 9
*/
Veja também
ArrayR emove, ArrayCopy, ArrayR esize, ArrayFree
ArrayRemove
R emove o número especificado de elementos da matriz, iniciando no índice especificado.
bool ArrayRemove(
void& array[], // matriz de qualquer tipo
uint start, // índice a partir do qual é iniciada a remoção
uint count=WHOLE_ARRAY // número de elementos
);
Parâmetros
array[]
[in][out] Matriz.
start
[in] Índice a partir do qual são excluídos os elementos da matriz.
count=WHOLE_ARRAY
[in] Número de elementos para excluir. O valor WH OLE_ARR AY indica a remoção de todos os
elemento, do índice especificado até o final da matriz.
Valor retornado
R etorna true em caso de sucesso, caso contrário, false. Para obter informações de erro, chame a
função GetLastError(). Possíveis erros :
· 5052 – ERR_SMALL _ARR AY (o valor start é muito grande),
· 5056 – ERR_SERI ES _ARR AY (a matriz não pode ser alterada, buffer de indicador),
· 4003 – ERR_INVAL ID_PAR AMET ER (o valor count é muito grande),
· 4005 - ERR_S TRUCT_WITH OBJECT S _OR CLASS (matriz de tamanho fixo que contém objetos
complexos com um destruidor),
· 4006 - ERR_INVAL ID_ARR AY (matriz de tamanho fixo que contém objetos de estruturas ou de
classes com destruidores).
Observação
Se a função é usada para uma matriz de tamanho fixo, o tamanho da matriz em si não muda: neste
caso, a “cauda” remanescente é fisicamente copiada para a posição start. Para um entendimento
preciso de como funciona a função, veja o exemplo abaixo. Cópia “física” significa que os objetos
copiados não são criados chamando o construtor ou o operador de cópia, mas, sim, simplesmente
copiando a representação binária do objeto. É por esse motivo que é proibido aplicar a função
ArrayR emove() à uma matriz de tamanho fixo contendo objetos com um destruidor (é ativado
ERR_INVAL ID_ARR AY ou ERR_S TRUCT_WITH OBJECT S _OR CLASS) Como ao remover tal objeto, o
destruidor deve ser chamado duas vezes - para o objeto inicial e para sua cópia.
Exemplo:
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- declara uma matriz de tamanho fixo e preenche com valores
int array[10];
for(int i=0;i<10;i++)
{
array[i]=i;
}
//--- mostra uma matriz antes de remover elementos
Print("Antes de chamar a ArrayRemove()");
ArrayPrint(array);
//--- remove 2 elementos da matriz e mostra a nova composição
ArrayRemove(array,4,2);
Print("Depois de chamar a ArrayRemove()");
ArrayPrint(array);
/*
Resultado da execução:
Antes de chamar a ArrayRemove()
0 1 2 3 4 5 6 7 8 9
Depois de chamar a ArrayRemove()
0 1 2 3 6 7 8 9 8 9
*/
Veja também
ArrayInsert, ArrayCopy, ArrayR esize, ArrayFree
ArrayReverse
Expande o número de elementos especificado na matriz, iniciando no índice especificado.
bool ArrayReverse(
void& array[], // matriz de qualquer tipo
uint start=0, // índice a partir do qual é expandida a matriz
uint count=WHOLE_ARRAY // número de elementos
);
Parâmetros
array[]
[in][out] Matriz.
start=0
[in] O índice a partir do qual a matriz é invertida.
count=WHOLE_ARRAY
[in] Número de elementos para expandir. Se for especificado WH OLE_ARR AY, todos os elementos
da matriz serão colocados de maneira invertida entre eles, começando com o índice especificado
start até o final da matriz.
Valor retornado
R etorna true em caso de sucesso, caso contrário, false.
Observação
A função ArraySetAsSeries() apenas altera a direção de indexação de trás para frente, a fim de
organizar o acesso aos elementos como em timeseries. A função ArrayR everse() move fisicamente
os elementos de uma matriz de tal forma que a matriz é " invertida" .
Exemplo:
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- declara uma matriz de tamanho fixo e preenche com valores
int array[10];
for(int i=0;i<10;i++)
{
array[i]=i;
}
//--- mostra uma matriz antes de inversão de elementos
Print("Antes de chamar a ArrayReverse()");
ArrayPrint(array);
//--- inverte 3 elementos na matriz e exibe a nova composição
ArrayReverse(array,4,3);
Print("Depois de chamar a ArrayReverse()");
ArrayPrint(array);
/*
Resultado da execução:
Antes de chamar a ArrayReverse()
0 1 2 3 4 5 6 7 8 9
Depois de chamar a ArrayReverse()
0 1 2 3 6 5 4 7 8 9
*/
Veja também
ArrayInsert, ArrayR emove, ArrayCopy, ArrayR esize, ArrayFree, ArrayGetAsSeries, ArraySetAsSeries
ArraySetAsSeries
A função define o flag AS _SERIES para um objeto de um array dinâmico, e os elementos serão
indexados como em timeseries.
bool ArraySetAsSeries(
const void& array[], // array passado por referência
bool flag // true significa ordem reversa de indexação
);
Parâmetros
array[]
[in][out] Array numérico para definir.
flag
[in] Direção de indexação do array.
Valor do Retorno
A função retorna true para sucesso, caso contrário - false.
Observação
O flag AS _SERIES não pode ser definido para arrays multi-dimensionais ou arrays estáticos (arrays
cujo tamanho nos colchetes já é predefinido na etapa de compilação). A indexação em séries de
tempo difere da indexação de um array comum, na medida que os elementos de séries de tempo são
indexados do fim para o começo (dos dados mais novos para os mais antigos).
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1
//---- plota Numeration
Também Veja
Acesso à séries de tempo, ArrayGetAsSeries
ArraySize
A função retorna o número de elementos de um array selecionado.
int ArraySize(
const void& array[] // array verificado
);
Parâmetros
array[]
[in] Array de qualquer tipo.
Valor do Retorno
Valor do tipo int.
Observação
Para um array de uma dimensão, o valor a ser retornado pela função ArraySize é igual ao de
ArrayR ange(array,0).
Exemplo:
void OnStart()
{
//--- criar arrays
double one_dim[];
double four_dim[][10][5][2];
//--- tamanhos
int one_dim_size=25;
int reserve=20;
int four_dim_size=5;
//--- variáveis auxiliares
int size;
//--- alocar memória sem fazer backup
ArrayResize(one_dim,one_dim_size);
ArrayResize(four_dim,four_dim_size);
//--- 1. array unidimensional
Print("+==========================================================+");
Print("Tamanhos de arrays:");
Print("1. Array unidimensional");
size=ArraySize(one_dim);
PrintFormat("Tamanho dimensão zero = %d, Tamanho array = %d",one_dim_size,size);
//--- 2. array multidimensional
Print("2. Array multidimensional");
size=ArraySize(four_dim);
PrintFormat("Tamanho dimensão zero = %d, Tamanho array = %d",four_dim_size,size);
//--- tamanhos de dimensões
int d_1=ArrayRange(four_dim,1);
int d_2=ArrayRange(four_dim,2);
int d_3=ArrayRange(four_dim,3);
Print("Verificar:");
Print("Dimensão zero = Tamanho de array / (Primeira dimensão * Segunda dimensão * Terceira dimen
PrintFormat("%d = %d / (%d * %d * %d)",size/(d_1*d_2*d_3),size,d_1,d_2,d_3);
//--- 3. array unidimensional com backup de memória
Print("3. Array unidimensional com backup de memória");
//--- dobro do valor
one_dim_size*=2;
//--- alocar memória com o backup
ArrayResize(one_dim,one_dim_size,reserve);
//--- imprimir o tamanho
size=ArraySize(one_dim);
PrintFormat("Tamanho com o backup = %d, Atual tamanho do array = %d",one_dim_size+reserve,size);
}
ArraySort
Classifica os valores na primeira dimensão de um array numérico multidimensional na ordem
crescente.
bool ArraySort(
void& array[] // array para ordenação
);
Parâmetros
array[]
[in][out] Array numérico para ordenação.
Valor do Retorno
A função retorna true para sucesso, caso contrário - false.
Observação
Um array é sempre classificado em ordem crescente, independentemente do valor da
flag AS _SERIES.
Exemplo:
#property description "O indicador analisa os dados para o último mês e pinta todos os candlesticks
#property description "e grandes volumes de tick. A volume de tick do array é ordenado"
#property description "para definir estes candlesticks. Os candlesticks que tem os volumes compreen
#property description "por cento do array, são consideradas pequenos. Os candlesticks que tem os vo
#property description "por cento do array, são consideradas grandes."
//--- configurações do indicador
#property indicator_chart_window
#property indicator_buffers 5
#property indicator_plots 1
//--- plotar
#property indicator_label1 "VolumeFactor"
#property indicator_type1 DRAW_COLOR_CANDLES
#property indicator_color1 clrDodgerBlue,clrOrange
#property indicator_style1 STYLE_SOLID
#property indicator_width1 2
//--- constante pré-definida
#define INDICATOR_EMPTY_VALUE 0.0
//--- parâmetros de entrada
input int InpSmallVolume=15; // Valor percentual de pequenos volumes (<50)
input int InpBigVolume=20; // Valor percentual de grandes volumes (<50)
//--- início do tempo para análise (será deslocado)
datetime ExtStartTime;
//--- buffers do indicador
double ExtOpenBuff[];
double ExtHighBuff[];
double ExtLowBuff[];
double ExtCloseBuff[];
double ExtColorBuff[];
//--- valores de limite do volume para exibir os candlesticks
long ExtLeftBorder=0;
long ExtRightBorder=0;
//+------------------------------------------------------------------+
//| Receber valores das bordas para volumes de tick |
//+------------------------------------------------------------------+
bool GetVolumeBorders(void)
{
//--- variáveis
datetime stop_time; // copiar tempo final
long buff[]; // buffer para copiar
//--- tempo final é o atual
stop_time=TimeCurrent();
//--- tempo de início é de um mês antes do atual
ExtStartTime=GetStartTime(stop_time);
//--- receber os valores de volume do tick
ResetLastError();
if(CopyTickVolume(Symbol(),Period(),ExtStartTime,stop_time,buff)==-1)
{
//--- falhou para receber os dados, retornar falso para lançar o comando de recálculo
PrintFormat("Falha ao receber os valores de volume do tick. Código de erro = %d",GetLastError
return(false);
}
//--- calcule tamanho de array
int size=ArraySize(buff);
//--- classificar o array
ArraySort(buff);
//--- definir os valores das bordas esquerda e direita para volumes do tick
ExtLeftBorder=buff[size*InpSmallVolume/100];
ExtRightBorder=buff[(size-1)*(100-InpBigVolume)/100];
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Receber os dados do mês menor do que o mês anterior |
//+------------------------------------------------------------------+
datetime GetStartTime(const datetime stop_time)
{
//--- converter o tempo final da variável de estrutura do tipo MqlDateTime
MqlDateTime temp;
TimeToStruct(stop_time,temp);
//--- receber os dados que é do mês menor
if(temp.mon>1)
temp.mon-=1; // o mês corrente não é o primeiro no ano, por conseguinte, o número do anterio
else
{
temp.mon=12; // o mês corrente é o primeiro no ano, por conseguinte, o número do anterior é
temp.year-=1; // enquanto o número do ano é um a menos
}
//--- número do dia não será superior a 28
if(temp.day>28)
temp.day=28;
//--- retornar a data obtida
return(StructToTime(temp));
}
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado |
//+------------------------------------------------------------------+
int OnInit()
{
//--- verificar se os parâmetros de entrada satisfazem as condições
if(InpSmallVolume<0 || InpSmallVolume>=50 || InpBigVolume<0 || InpBigVolume>=50)
{
Print("Parâmetros de entrada incorreto");
return(INIT_PARAMETERS_INCORRECT);
}
//--- mapeamento de buffers do indicador
SetIndexBuffer(0,ExtOpenBuff);
SetIndexBuffer(1,ExtHighBuff);
SetIndexBuffer(2,ExtLowBuff);
SetIndexBuffer(3,ExtCloseBuff);
SetIndexBuffer(4,ExtColorBuff,INDICATOR_COLOR_INDEX);
//--- definir o valor que não será exibido
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,INDICATOR_EMPTY_VALUE);
//--- definir etiquetas para buffers do indicador
PlotIndexSetString(0,PLOT_LABEL,"Open;High;Low;Close");
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
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[])
{
//--- verificar se barras não manipuladas ainda estão presentes
if(prev_calculated<rates_total)
{
//--- receber novos valores das bordas direita e esquerda para volumes
if(!GetVolumeBorders())
return(0);
}
//--- iniciar variável para cálculo da barra
int start=prev_calculated;
//--- trabalho na última barra se os valores do indicador já foram calculados no tick anterior
if(start>0)
start--;
//--- definir indexação direta em séries temporais
ArraySetAsSeries(time,false);
ArraySetAsSeries(open,false);
ArraySetAsSeries(high,false);
ArraySetAsSeries(low,false);
ArraySetAsSeries(close,false);
ArraySetAsSeries(tick_volume,false);
//--- o loop de cálculo dos valores do indicador
for(int i=start;i<rates_total;i++)
{
//--- preencher os candlesticks a partir da data inicial
if(ExtStartTime<=time[i])
{
//--- se o valor não é inferior a borda direita, preencher clandlestick
if(tick_volume[i]>=ExtRightBorder)
{
//--- receber dados para desenhar o candlestick
ExtOpenBuff[i]=open[i];
ExtHighBuff[i]=high[i];
ExtLowBuff[i]=low[i];
ExtCloseBuff[i]=close[i];
//--- cor de DodgerBlue
ExtColorBuff[i]=0;
//--- continuar o loop
continue;
}
//--- preencher o candlestick, se o valor não exceder o limite esquerdo
if(tick_volume[i]<=ExtLeftBorder)
{
//--- receber dados para desenhar o candlestick
ExtOpenBuff[i]=open[i];
ExtHighBuff[i]=high[i];
ExtLowBuff[i]=low[i];
ExtCloseBuff[i]=close[i];
//--- Cor laranja
ExtColorBuff[i]=1;
//--- continuar o loop
continue;
}
}
//--- definir valores vazios para as barras que não foram incluídas no cálculo
ExtOpenBuff[i]=INDICATOR_EMPTY_VALUE;
ExtHighBuff[i]=INDICATOR_EMPTY_VALUE;
ExtLowBuff[i]=INDICATOR_EMPTY_VALUE;
ExtCloseBuff[i]=INDICATOR_EMPTY_VALUE;
}
//--- valor retorno de prev_calculated para a próxima chamada
return(rates_total);
}
Também Veja
ArrayBsearch
ArraySwap
T roca entre si o conteúdo de duas matrizes do tipo dinâmico. Para matrizes multidimensionais, o
número de elementos em todas as dimens ões, excepto o primeiro, tem de ser o mesmo.
bool ArraySwap(
void& array1[], // primeira matriz
void& array2[] // segunda matriz
);
Parâmetros
array1[]
[in][out] Matriz numérica.
array2[]
[in][out] Matriz numérica.
Valor de retorno
R etorna true em caso de sucesso, caso contrário, false. Neste caso, GetLastError() retorna o código
de erro ERR_INVAL ID_ARR AY.
Observação
A função implementa matrizes dinâmicas do mesmo tipo e as mesmas dimens ões, exceto a
primeira. Para tipos inteiros, o sinal é ignorado, ou seja, char==uchar)
Exemplo:
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- matrizes para armazenar cotações
double source_array[][8];
double dest_array[][8];
MqlRates rates[];
//--- obtemos dados dos últimos 20 candles no timeframe atual
int copied=CopyRates(NULL,0,0,20,rates);
if(copied<=0)
{
PrintFormat("CopyRates(%s,0,0,20,rates) failed, error=%d",
Symbol(),GetLastError());
return;
}
//--- definimos o tamanho da matriz pelo número de dados copiados
ArrayResize(source_array,copied);
//--- preenchemos a matriz rate_array_1[] com dados a partir de 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;
}
//--- realizamos o intercâmbio de dados entre source_array[] e dest_array[]
if(!ArraySwap(source_array,dest_array))
{
PrintFormat("ArraySwap(source_array,rate_array_2) failed, error code=%d",GetLastError());
return;
}
//--- verificamos que, depois do intercâmbio, o tamanho da fonte-matriz se tornou zero
PrintFormat("ArraySwap() done: ArraySize(source_array)=%d",ArraySize(source_array));
//--- exibimos os dados do receptor de matriz dest_array[]
ArrayPrint(dest_array);
}
Veja também
ArrayCopy, ArrayFill, ArrayR ange, ArrayIs Dynamic
Funções de Conversão
Este é um grupo de funções que fornece conversão de dados de um formato para outro.
T he NormalizeDouble() function must be specially noted as it provides the necessary accuracy of the
price presentation. Em operações de negociação, nenhum preço não normalizado deve ser usado caso
sua precisão exceder, mesmo que por um dígito, daquilo que é requerida pelo servidor de negociação.
Função Ação
CharT oString Converte um código de símbolo em um string
de um caractere.
ColorT oARGB Converte tipo color para tipo uint para receber
representação ARGB da cor.
String T oColor Converte uma string "R ,G,B" ou uma string com
nome de cor em valor de tipo color
Também Veja
Uso de um Código de Página (Codepage)
CharToString
Converte um código de símbolo em uma string de um caractere.
string CharToString(
uchar char_code // código numérico de um símbolo
);
Parâmetros
char_code
[in] Código de um símbolo ANS I.
Valor do Retorno
String com um símbolo ANS I.
Também Veja
String T oCharArray, ShortT oString, String GetCharacter
CharArrayToString
Copia e converte parte de um array de tipo uchar em uma string retornada
string CharArrayToString(
uchar array[], // array
int start=0, // posição de início no array
int count=-1 // número de símbolos
uint codepage=CP_ACP // código de página
);
Parâmetros
array[]
[in] Array de tipo uchar.
start=0
[in] Posição a partir da qual a cópia começa. por default 0 é usado.
count=-1
[in] Número de elementos do array para cópia. Define o comprimento de uma string resultante.
Valor padrão é -1, que significa copiar até o fim do array, ou até o terminador 0.
codepage=CP_ACP
[in] O valor do código de página. Para os mais usados códigos de página forneça as constantes
apropriadas.
Valor do Retorno
String.
Também Veja
String T oCharArray, ShortArrayT oString, Uso de um Código de Página (Codepage)
CharArrayToStruct
Copia uma matriz do tipo uchar para a estrutura POD.
bool CharArrayToStruct(
void& struct_object, // estrutura
const uchar& char_array[], // matriz
uint start_pos=0 // posição inicial na matriz
);
Parâmetros
struct_object
[in] R eferência para qualquer tipo de estrutura POD (estruturas contendo apenas tipos de dados
simples).
char_array[]
[in] Matriz do tipo uchar.
start_pos=0
[in] Posição na matriz a partir da qual serão copiados os dados.
Valor retornado
R etorna true em caso de sucesso, caso contrário, false.
Veja também
String T oCharArray, ShortArrayT oString, StructT oCharArray, Использование кодовой страницы,
FileR eadStruct, União (union), MathSwap
StructToCharArray
Copia a estrutura POD para a matriz do tipo uchar.
bool StructToCharArray(
const void& struct_object, // estrutura
uchar& char_array[], // matriz
uint start_pos=0 // posição inicial na matriz
);
Parâmetros
struct_object
[in] R eferência para qualquer tipo de estrutura POD (estruturas contendo apenas tipos de dados
simples).
char_array[]
[in] Matriz do tipo uchar.
start_pos=0
[in] Posição na matriz a partir da qual serão copiados os dados.
Valor retornado
R etorna true em caso de sucesso, caso contrário, false.
Observação
Ao copiar, a matriz dinâmica é expandida automaticamente (ArrayR esize) se não houver espaço
suficiente. Se não for possível expandir a matriz para o valor requerido, a função retornará um erro.
Veja também
String T oCharArray, ShortArrayT oString,CharArrayT oStruct, Использование кодовой страницы,
FileW riteStruct, União (union), MathSwap
ColorToARGB
A função converte o tipo color em tipo uint para obter a representação ARGB da cor. O formato de cor
ARGB é usado para gerar recurso gráfico, exibição de texto, assim como a classe da biblioteca padrão
CCanvas.
uint ColorToARGB(
color clr, // converte color em formato de cor
uchar alpha=255 // canal alfa para gerenciamente da transparência de cor
);
Parâmetros
clr
[in] Valor da cor em variável de tipo color.
alpha
[in] O valor do canal alfa usado para receber a cor em formato ARGB. O valor pode ser definido de
0 (uma cor de um pixel de primeiro plano não altera a exibição de um pixel subjacente) até 255
(uma cor de um pixel subjacente é completamente substituída pela cor do pixel do primeiro plano).
T ransparência de cor em termos de percentagem é calculada como (1-alpha/255)*100%. Em outras
palavras, quanto menor o valor de canal alfa, mais transparente é a cor.
Valor de retorno
Apresenta a cor em formato ARGB onde os valores Alfa, R ed, Green, Blue (canal alfa, vermelho,
verde, azul) são definidos em séries de quatro bytes de tipo uint.
Observação
RGB é um formato básico e comumente usado para descrever cor de pixel em uma tela em gráficos
de computador. Nomes de cores básicas são usadas para atribuir componentes de cor vermelho,
verde e azul. Cada componente é descrito por um byte especificando a saturação de cor em uma
faixa de 0 a 255 (0x 00 a 0XFF formato hexadecimal). Já que a cor branca contém todas as cores, ela
é descrita como 0x FFFFFF, ou seja, cada um dos três componentes está presente pelo valor máximo
de 0x FF.
Entretanto, algumas tarefas requerem especificar a transparência da cor para descrever a aparência
de uma imagem no caso dela ficar coberta, através de uma cor com algum grau de transparência. O
conceito de canal alfa é introduzido para tais casos. Ele é implementado como componente adicional
do formato RGB. A estrutura do ARGB é mostrado abaixo.
Valores ARGB são tipicamente expressos usando formato hexadecimal com cada par de dígitos
representando os valores dos canais Alpha, Green, e Blue, respectivamente. Por exemplo, a cor
80FFFF00 representa 50.2% amarelo opaco. Inicialmente, 0x 80 define valor alfa de 50.2%, uma vez
que é 50.2% de valor 0x FF. Então, o primeiro par FF define o valor mais alto do componente
vermelho; o próximo par FF é como o anterior mas para o componente verde; e par final 00
representa o valor mais baixo do componente azul que pode haver (aus ência de azul). Combinação
de cores verde e vermelha resultam na cor amarela. Se o canal alfa não for usado, a entrada pode
ser reduzida para 6 RRGGBB dígitos, é por isso que os valores de canal alfa são armazenados nos
bits de topo do tipo inteiro uint.
Dependendo do contexto, dígitos hexadecimais podem ser escritos com o prefixo '0x ' ou '#', por
exemplo, 80FFFF00, 0x 80FFFF00 ou #80FFFF00.
Exemplo:
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
//--- define transparência
uchar alpha=0x55; // 0x55 significa 55/255=21.6 % de transparência
//--- fazer conversão de ARGB para cor clrBlue
PrintFormat("0x%.8X - clrBlue",clrBlue);
PrintFormat("0x%.8X - clrBlue ARGB com alpha=0x55 (transparency 21.6%%)",ColorToARGB(clrBlue,alp
//--- fazer conversão de ARGB para cor clrGreen
PrintFormat("0x%.8X - clrGreen",clrGreen);
PrintFormat("0x%.8X - clrGreen ARGB com alpha=0x55 (transparency 21.6%%)",ColorToARGB(clrGreen,a
//--- fazer conversão de ARGB para cor clrRed
PrintFormat("0x%.8X - clrRed",clrRed);
PrintFormat("0x%.8X - clrRed ARGB com alpha=0x55 (transparency 21.6%%)",ColorToARGB(clrRed,alpha
}
Também Veja
R ecursos, R esourceCreate(), T extOut(), T ipo color, T ipos char, short, int e long
ColorToString
Converte valor de cor em string na forma de "R ,G,B" .
string ColorToString(
color color_value, // valor da cor
bool color_name // mostrar ou não nome da cor
);
Parâmetros
color_value
[in] Valor da cor em variável de tipo color.
color_name
[in] Sinaliza a necessidade de retornar o nome da cor, se o nome da cor for idêntica a uma das
constantes de cor predefinidas.
Valor do Retorno
R epresentação de string da cor como "R ,G,B" , onde R , G e B são constantes decimais de 0 a 255
convertidos em uma string. Se o parâmetro color_name=true for definido, a função tentará
converter o valor da cor no nome da cor.
Exemplo:
string clr=ColorToString(C'0,255,0'); // cor verde
Print(clr);
Também Veja
String T oColor, ColorT oARGB
DoubleToString
Converte um valor numérico em string de texto.
string DoubleToString(
double value, // número
int digits=8 // numero de dígitos depois do ponto decimal
);
Parâmetros
value
[in] Valor com um ponto flutuante.
digits
[in] Formato de precisão. Se o valor de digits estiver na faixa entre 0 e 16, um representação de
string de um número com a quantidade especificada de dígitos depois do ponto será obtida. Se o
valor de digits estiver na faixa entre -1 e -16, uma representação de string de um número em
notação científica com a quantidade especificada de dígitos depois do ponto decimal será obtida.
Em todos os outros casos, o valor da string conterá 8 dígitos depois do ponto decimal.
Valor do Retorno
String contendo uma representação de um número com a precisão especificada.
Exemplo:
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));
Também Veja
NormalizeDouble, String T oDouble
EnumToString
Converte um valor de enumeração de qualquer tipo para forma de texto.
string EnumToString(
any_enum value // qualquer tipo de valor de enumeração
);
Parâmetros
value
[in] Qualquer tipo de valor de enumeração.
Valor do Retorno
Uma string com uma representação de texto da enumeração. Para obter a mensagem de erro chame
a função GetLastError().
Observação
A função pode definir os seguintes valores de erro na variável _LastError:
· ERR_INT ERNAL _ERR OR – erro do ambiente de execução
· ERR_NOT_ENOUGH_MEMORY – sem memória suficiente para concluir a operação
· ERR_INVAL ID_PAR AMET ER – não pode permitir o nome do valor da enumeração
Exemplo:
enum interval // Enumeração de constantes nomeadas
{
month=1, // intervalo de um mês
two_months, // dois meses
quarter, // três meses - um quadrimestre
halfyear=6, // meio ano
year=12, // um ano - 12 months
};
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
//--- define o intervalo de tempo igual a um mês
interval period=month;
Print(EnumToString(period)+"="+IntegerToString(period));
ENUM_ORDER_TYPE type=ORDER_TYPE_BUY;
Print(EnumToString(type)+"="+IntegerToString(type));
// Resultado:
// month=1
// quarter=3
// year=12
// ORDER_TYPE_BUY=0
// ENUM_ORDER_TYPE::-1=-1
}
Também Veja
Enumerações, Variáveis de entrada
IntegerToString
Esta função converte um valor de tipo inteiro em uma string de comprimento especificado e retorna a
string obtida.
string IntegerToString(
long number, // número
int str_len=0, // comprimento da string resultado
ushort fill_symbol=' ' // símbolo de preenchimento
);
Parâmetros
number
[in] Número para conversão.
str_len=0
[in] Comprimento da string. Se o comprimento da string resultante for maior que aquele
especificado, a string não é truncada. Se ela for menor, os símbolos de preenchimento (filler)
serão adicionados a esquerda.
fill_symbol=' '
[in] Símbolo de preenchimento. Por padrão, ele é um espaço.
Valor do Retorno
String.
Também Veja
String T oInteger
ShortToString
Converte um código de símbolo (unicode) em uma string de um símbolo e retorna a string resultante.
string ShortToString(
ushort symbol_code // símbolo
);
Parâmetros
symbol_code
[in] Código do símbolo. Ao invés de um código de símbolo, você pode usar uma string literal
contendo um símbolo ou uma string literal com código hexadecimal de 2-bytes correspondente ao
símbolo da tabela Unicode.
Valor do Retorno
String.
Também Veja
String T oCharArray, CharT oString, String GetCharacter
ShortArrayToString
Copia parte de um array em uma string retornada.
string ShortArrayToString(
ushort array[], // array
int start=0, // posição de começo do array
int count=-1 // número de símbolos
);
Parâmetros
array[]
[in] Array de tipo ushort (análogo ao tipo wchar_t).
start=0
[in] Posição, a partir da qual a cópia começa, Default - 0.
count=-1
[in] Número de elemento do array para copiar. Define o comprimento de uma string resultante.
Valor padrão é -1, que significa copiar até o fim do array, ou até o terminador 0.
Valor do Retorno
String.
Também Veja
String T oShortArray, CharArrayT oString, Uso de um Código de Página (Codepage)
TimeToString
Converte um valor contendo hora em segundos decorridos deste 01.01.1970 em uma string de formato
"yyyy.mm.dd hh:mi" .
string TimeToString(
datetime value, // número
int mode=TIME_DATE|TIME_MINUTES // formato de saída
);
Parâmetros
value
[in] H ora em segundos a partir de 00:00 1970/01/01.
mode=TIME_DATE|TIME_MINUTES
[in] Modo de entrada de dados adicionais. Pode ser um ou sinalizador combinado:
TIME_DAT E obtém como resultado "yyyy.mm.dd" ,
TIME_M INUT ES obtém como resultado " hh:mi" ,
TIME_SECONDS obêm resultados como " hh:mi:ss " .
Valor do Retorno
String.
Também Veja
String T oT ime, T imeT oStruct
NormalizeDouble
Arredonda um número de ponto flutuante para uma precisão especificada.
double NormalizeDouble(
double value, // número normalizado
int digits // número de dígitos depois do ponto decimal
);
Parâmetros
value
[in] Valor com um ponto flutuante.
digits
[in] Formato de precisão, número de dígitos depois do ponto (0-8).
Valor do Retorno
Valor de tipo double com precisão predefinida.
Observação
Valores calculados de StopLoss, T ak eProfit, e valores de preços de abertura para ordens pendentes
devem ser normalizados com a precisão obtida através de Digits().
Favor notar que ao imprimir no Diário usando a função Print(), um número normalizado pode conter
um número maior de posições decimais do que o esperado. Por exemplo, para:
double a=76.671; // Um número normalizado com três posições decimais
Print("Print(76.671)=",a); // Imprime como é
Print("DoubleToString(a,8)=",DoubleToString(a,8)); // Imprime com um precisão predefinida
DoubleT oString(a,8)=76.67100000
Print(76.671)=76.67100000000001
Exemplo:
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));
/*
Resultado:
pi= 3.1415926535897931
NormalizeDouble(pi,3)= 3.1419999999999999
NormalizeDouble(pi,8)= 3.1415926499999998
NormalizeDouble(pi,0)= 3.0000000000000000
*/
Também Veja
DoubleT oString, T ipos reais (double, float), Conversão de T ipo (Typecasting)
StringToCharArray
Copia símbolo a símbolo uma string convertida de Unicode para ANS I, para um lugar selecionado de um
array de tipo uchar. R etorna o número de elementos copiados.
int StringToCharArray(
string text_string, // string fonte
uchar& array[], // array
int start=0, // posição de começo no array
int count=-1 // número de símbolos
uint codepage=CP_ACP // código de página
);
Parâmetros
text_string
[in] String para copiar.
array[]
[out] Array de tipo uchar.
start=0
[in] Posição a partir da qual a cópia começa. Default - 0.
count=-1
[in] Número de elemento do array para copiar. Define o comprimento de uma string resultante.
Valor padrão é -1, que significa copiar até o fim do array, ou até o terminador 0. T erminador 0
será também copiado para o array destino, neste caso o tamanho de um array dinâmico pode ser
aumentado se necess ário para o tamanho da string. Se o tamanho do array inicializado não é
especificado, ele é determinado pelo compilador, baseado no tamanho da seqüência de
inicialização.
codepage=CP_ACP
[in] O valor do código de página. Para os mais usados códigos de página forneça as constantes
apropriadas.
Valor do Retorno
Número de elementos copiados.
Também Veja
CharArrayT oString, String T oShortArray, Uso de um Código de Página (Codepage)
StringToColor
Converte uma string "R ,G,B" ou uma string com o nome da cor em valor de tipo color.
color StringToColor(
string color_string // representação de string de cor
);
Parâmetros
color_string
[in] R epresentação de string de uma cor de tipo "R ,G,B" ou nome de uma das W eb-cores
predefinidas.
Valor do Retorno
Valor da cor.
Exemplo:
color str_color=StringToColor("0,127,0");
Print(str_color);
Print((string)str_color);
//--- altera a cor um pouco
str_color=StringToColor("0,128,0");
Print(str_color);
Print((string)str_color);
Também Veja
ColorT oString, ColorT oARGB
StringToDouble
A função converte uma string contendo uma representação de um número em um número de tipo
double.
double StringToDouble(
string value // string
);
Parâmetros
value
[in] String contém uma representação do símbolo de um número.
Valor do Retorno
Valor de tipo double.
Também Veja
NormalizeDouble, Вещественные типы (double, float), Conversão de T ipo (Typecasting)
StringToInteger
A função converte uma string contendo uma representação de símbolo de um número em um número
de tipo long (inteiro).
long StringToInteger(
string value // string
);
Parâmetros
value
[in] String contendo um número.
Valor do Retorno
Valor de tipo long.
Também Veja
IntegerT oString, Вещественные типы (double, float), Conversão de T ipo (Typecasting)
StringToShortArray
A função copia símbolo a símbolo uma string em um lugar especificado de um array de tipo ushort.
R etorna o número de elementos copiados.
int StringToShortArray(
string text_string, // string fonte
ushort& array[], // array
int start=0, // posição de começo no array
int count=-1 // número de símbolos
);
Parâmetros
text_string
[in] String para copiar
array[]
[out] Array de tipo ushort (análogo ao tipo wchar_t).
start=0
[in] Posição, a partir da qual a cópia começa. Default - 0.
count=-1
[in] Número de elemento do array para copiar. Define o comprimento de uma string resultante.
Valor padrão é -1, que significa copiar até o final do array, ou até o terminador 0. O terminador 0
será copiado para o array destino, neste caso o tamanho de um array dinâmico pode ser
aumentado se necess ário para o tamanho da string. Se o tamanho do array inicializado não é
especificado, ele é determinado pelo compilador, baseado no tamanho da seqüência de
inicialização.
Valor do Retorno
Número de elementos copiados.
Também Veja
ShortArrayT oString, String T oCharArray, Uso de um Código de Página (Codepage)
StringToTime
Converte uma string contendo a hora e/ou data no formato " aaaa.mm.dd [hh:mi]" para o tipo
datetime.
datetime StringToTime(
const string time_string // string data
);
Parâmetros
time_string
[in] String em um dos formatos especificados :
· "yyyy.mm.dd [hh:mi]"
Valor retornado
O valor do tipo datetime contendo o número de segundos desde 1º de janeiro de 1970.
Observação
Qualquer sequência de tabulação e de espaços entre data e hora é contada como um espaço, de
modo que não é necess ário nenhum processamento adicional da linha time_string antes de chamar a
String T oT ime().
Veja também
T imeT oString, T imeT oStruct
StringFormat
A função formata parâmetros obtidos e retorna uma string.
string StringFormat(
string format, // string com descrição de formato
... ... // parâmetros
);
Parâmetros
format
[in] String contendo método de formatação. As regras de formação são as mesmas da função
PrintFormat.
...
[in] Parâmetros, separados por vírgula.
Valor do Retorno
String.
Exemplo:
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)
*/
}
Também Veja
PrintFormat, DoubleT oString,ColorT oString, T imeT oString
Funções Matemáticas
Um conjunto de funções matemáticas e trigonométricas.
Função Ação
MathAbs R etorna o valor absoluto (modulo) do valor
numérico especificado
MathAbs
A função retorna o valor absoluto (módulo) de um valor numérico especificado.
double MathAbs(
double value // valor numérico
);
Parâmetros
value
[in] Valor numérico.
Valor do Retorno
Valor de tipo double maior ou igual a zero.
Observação
A invés da função MathAbs(), você pode usar fabs().
MathArccos
A função retorna o arco-cosseno de x no intervalo de 0 a p radianos.
double MathArccos(
double val // -1<val<1
);
Parâmetros
val
[in] Valor de val entre -1 e 1, valor sobre o qual será calculado o arco-cosseno.
Valor do Retorno
Arco-cosseno de um número em radianos. Se val for menor que -1 ou maior que 1, a função retorna
NaN (valor indeterminado).
Observação
Ao invés da função MathArccos(), você pode usar acos().
Também Veja
T ipos reais (double, float)
MathArcsin
A função retorna o arco-seno de x no intervalo de -p /2 a p /2 radianos.
double MathArcsin(
double val // -1<value<1
);
Parâmetros
val
[in] Valor de val entre -1 e 1, valor sobre o qual será calculado o arco-seno.
Valor do Retorno
Arco-seno do número val em radianos no intervalo de -p /2 e p /2 radianos. Se val for menor que -1
ou maior que 1, a função retorna NaN (valor indeterminado).
Observação
Ao invés da função MathArcsin(), você pode usar asin().
Também Veja
T ipos reais (double, float)
MathArctan
A função retorna o arco-tangente de x. Se x for igual a 0, a função retorna 0.
double MathArctan(
double value // tangente
);
Parâmetros
value
[in] Um número representando uma tangente.
Valor do Retorno
MathArctan retorna um valor no intervalo de -p /2 a p /2 radianos.
Observação
Ao invés da função MathArctan(), você pode usar atan().
MathArctan2
R etorna em radianos o valor de um ângulo cuja tangente é igual ao quociente de dois números
especificados.
double MathArctan2(
double y // coordenada y do ponto
double x // coordenada x do ponto
);
Parâmetros
y
[in] Número representando a coordenada Y.
x
[in] Número representando a coordenada X.
Valor retornado
MathArctan2 retorna o valor do ângulo θ no intervalo de -p ap radianos, tal que MathTan(θ)=y/x.
Observe o seguinte:
· Para (x, y) no quadrante 1, 0 < θ < p /2
· Para (x, y) no quadrante 2, p /2 < θ≤p
· Para (x, y) no quadrante 3, -p < θ < -p /2
· Para (x, y) no quadrante 4, -p /2 < θ < 0
Para os pontos fora dos quadrantes indicados, o valor retornado é especificado abaixo:
· Se y é igual a 0 e x não é negativo, θ = 0.
· Se y é igual a 0 e x é negativo, θ = p .
· Se y é um número positivo, e x é igual a 0, θ = p /2.
· Se y é um número negativo, e x é igual a 0, θ = -p /2.
· Se y é igual a 0 e x é igual a 0, θ = 0.
Observação
Em vez da função MathArctan2(), pode ser usada a função atan2().
MathClassify
Determina o tipo de um número real e retorna o resultado como um valor da enumeração
ENUM _FP_CLASS
ENUM_FP_CLASS MathClassify(
double value // número real
);
Parâmetros
value
[in] Número real verificado
Valor retornado
Valor a partir da enumeração ENUM _FP_CLASS
ENUM_FP_CLASS
Identificador Descrição
FP_S UBNOR MAL Número subnormal que está mais próximo de
zero do que do menor número normalizado
representável DBL _M IN (2.2250738585072014e-
308)
Exemplo:
//+------------------------------------------------------------------+
//| 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");
Veja também
T ipos reais (double, float), MathIs ValidNumber
MathCeil
A função retorna o valor do número inteiro mais próximo do acima.
double MathCeil(
double val // número
);
Parâmetros
val
[in] Valor numérico.
Valor do Retorno
Valor numérico representando o menor inteiro que excede ou é igual a val.
Observação
Ao invés da função MathCeil(), você pode usar ceil().
MathCos
A função retorna o cosseno de um ângulo.
double MathCos(
double value // número
);
Parâmetros
value
[in] Ângulo em radianos.
Valor do Retorno
Valor de tipo double no intervalo de -1 a 1.
Observação
A invés de MathCos(), você pode usar cos().
MathExp
A função retorna o valor e elevado a potência d.
double MathExp(
double value // potência para o número e
);
Parâmetros
value
[in] Um número especificando a potência.
Valor do Retorno
Um número de tipo double. Em " overflow" , a função retorna INF (infinito), em caso de perda de
ordem MathExp retorna 0.
Observação
Ao invés de MathExp(), você pode usar exp().
Também Veja
T ipos reais (double, float)
MathFloor
A função retorna o valor numérico inteiro mais próximo do abaixo.
double MathFloor(
double val // número
);
Parâmetros
val
[in] Valor numérico.
Valor do Retorno
Um valor numérico representando o maior inteiro que é menor ou igual a val.
Observação
Ao invés de MathFloor(), você pode usar floor().
MathLog
A função retorna o logaritmo natural.
double MathLog(
double val // valor aplicado ao logaritmo
);
Parâmetros
val
[in] Valor cujo logaritmo deve ser encontrado.
Valor do Retorno
O logaritmo natural de val em caso de sucesso. Se val for negativo, a função retorna NaN (valor
indeterminado). Se val for igual a 0, a função retorna INF (infinito).
Observação
Ao invés de MathLog(), você pode usar log().
Também Veja
T ipos reais (double, float)
MathLog
R etorna o logaritmo de um número na base 10.
double MathLog10(
double val // número aplicado ao logaritmo
);
Parâmetros
val
[in] Valor numérico cujo logaritmo comum deve ser encontrado.
Valor do Retorno
O logaritmo comum em caso de sucesso. Se val for negativo, a função retorna NaN (valor
indeterminado). Se val for igual a 0, a função retorna INF (infinito).
Observação
Ao invés de MathLog 10(), você pode usar log 10().
Também Veja
T ipos reais (double, float)
MathMax
A função retorna o valor máximo entre dois valores.
double MathMax(
double value1, // primeiro valor
double value2 // segundo valor
);
Parâmetros
value1
[in] Primeiro valor numérico.
value2
[in] Segundo valor numérico.
Valor do Retorno
O maior dos dois valores.
Observação
Ao invés de MathMax(), você pode usar fmax(). As funções fmax(), fmin(), MathMax(), MathMin()
podem trabalhar com tipos inteiros sem convertê-los para o tipo double.
Se parâmetros de diferentes tipos são passados para um função, o parâmetro do menor tipo é
automaticamente convertido para o maior tipo. O tipo do valor de retorno corresponde ao do maior
tipo.
MathMin
A função retorna o valor mínimo entre dois valores.
double MathMin(
double value1, // primeiro valor
double value2 // segundo valor
);
Parâmetros
value1
[in] Primeiro valor numérico.
value2
[in] Segundo valor numérico.
Valor do Retorno
O menor valor dos dois valores.
Observação
Ao invés de MathMin(), você pode usar fmin(). As funções fmax(), fmin(), MathMax(), MathMin()
podem trabalhar com tipos inteiros sem convertê-los para o tipo double.
Se parâmetros de diferentes tipos são passados para um função, o parâmetro do menor tipo é
automaticamente convertido para o maior tipo. O tipo do valor de retorno corresponde ao do maior
tipo.
MathMod
A função retorna o resto real da divisão de dois números.
double MathMod(
double value, // valor do dividendo
double value2 // valor do divisor
);
Parâmetros
value
[in] Valor do dividendo.
value2
[in] Valor do divisor.
Valor do Retorno
A função MathMod calcula o valor real de f de val / y tal que val = i * y + f , onde i é um inteiro, f
tem o mesmo sinal de val, e o valor absoluto de f é menor que o valor absoluto de y.
Observação
Ao invés de MathMod(), você pode usar fmod().
MathPow
A função eleva uma base a uma potência especificada.
double MathPow(
double base, // base
double exponent // valor do expoente
);
Parâmetros
base
[in] Base.
exponent
[in] Valor do expoente.
Valor do Retorno
Valor da base elevada a uma potência especificada.
Observação
Ao invés de MathPow(), você pode usar pow().
MathRand
R etorna um inteiro pseudo-aleatório no intervalo de 0 a 32767.
int MathRand();
Valor do Retorno
Valor de um inteiro no intervalo de 0 a 32767.
Observação
Antes da primeira chamada da função, é necess ário chamar MathSrand para definir o gerador de
números pseudo-aleatório para o estado inicial.
Observação
Ao invés de MathR and(), você pode usar rand().
MathRound
A função retorna o valor arredondado para o inteiro mais próximo de um valor numérico especificado.
double MathRound(
double value // valor a ser arredondado
);
Parâmetros
value
[in] Valor numérico antes do arredondamento.
Valor do Retorno
Valor arredondado até o inteiro mais próximo.
Observação
Ao invés de MathR ound(), você pode usar round().
MathSin
R etorna o seno de um ângulo especificado.
double MathSin(
double value // argumento em radianos
);
Parâmetros
value
[in] Ângulo em radianos.
Valor do Retorno
Seno de um ângulo medido em radianos. R etorna um valor no intervalo de -1 a 1.
Observação
Ao invés de MathSin(), você pode usar sin().
MathSqrt
R etorna a raiz quadrada de um número.
double MathSqrt(
double value // número positivo
);
Parâmetros
value
[in] Valor numérico positivo.
Valor do Retorno
R aiz quadrada de um valor. Se val for negativo, a função retorna NaN (valor indeterminado).
Observação
Ao invés de MathSqrt(), você pode usar sqrt().
Também Veja
T ipos reais (double, float)
MathSrand
Define o ponto inicial para geração de uma série de inteiros pseudo-aleatórios.
void MathSrand(
int seed // número de inicialização
);
Parâmetros
seed
[in] Número inicial para a seqüência de números aleatórios.
Valor do Retorno
Sem valor de retorno.
Observação
A função MathR and() é usada para gerar uma seqüência de números pseudo-aleatórios. Chamar
MathSrand() com um certo número de inicialização permite produzir sempre a mesma seqüência de
números pseudo-aleatórios.
Exemplo:
#property description "O indicador mostra o teorema do limite central, que:"
#property description "A soma de um número suficientemente grande de variáveis aleatórias fracament
#property description "A soma de um número suficientemente grande de variáveis aleatórias fracament
#property description "ou faz uma contribuição determinante para a soma), tem uma distribuição próx
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1
//--- Propriedades da construção gráfica
#property indicator_label1 "Label"
#property indicator_type1 DRAW_HISTOGRAM
#property indicator_color1 clrRoyalBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1 5
//--- Uma variável de entrada
input int sample_number=10;
{
//--- Um restante na divisão por 7 retornará um valor de 0 a 6
rand_index+=MathRand()%7;
}
//--- Aumentar o valor no número da célula rand_index por 1
LabelBuffer[rand_index]++;
}
//--- Sair do manipulador OnCalculate()
return(rates_total);
}
MathTan
A função retorna a tangente de um número.
double MathTan(
double rad // argumento em radianos
);
Parâmetros
rad
[in] Ângulo em radianos.
Valor do Retorno
T angente do rad. Se rad for maior ou igual a 263, ou menor ou igual a -263, uma perda de
significância no resultado ocorre, neste caso a função retorna um número indefinido.
Observação
Ao invés de MathT an(), você pode usar tan().
Também Veja
T ipos reais (double, float)
MathIsValidNumber
Verifica a validade de um número real.
bool MathIsValidNumber(
double number // número para verificar
);
Parâmetros
number
[in] Valor numérico verificado.
Valor do Retorno
R etorna true, se o valor verificado for um número real aceitável. Se o valor verificado for infinito
positivo ou infinito negativo, ou " not a number" (NaN), a função retorna false.
Exemplo:
double abnormal=MathArcsin(2.0);
if(!MathIsValidNumber(abnormal)) Print("Atenção! MathArcsin(2.0) = ",abnormal);
Também Veja
T ipos R eais (double, float)
MathExpm1
R etorna o valor da expressão MathExp(x)-1.
double MathExpm1(
double value // nível par a o número e
);
Parâmetros
value
[in] Número que define o nível.
Valor de retorno
Número do tipo double. Após ser excedido, a função retorna INF (infinito), em caso de perda de
precisão de MathExpm1, retorna 0.
Observação
Com valores x próximo de 0, a função MathExpm1(x) dá um valor muito mais preciso do que
MathExp(x)-1.
Veja também
T ipos reais (double, float)
MathLog1p
R etorna o valor da expressão MathLog(1+x).
double MathLog1p(
double value // número para tomar o logaritmo
);
Parâmetros
value
[in] Valor, cujo logaritmo deve ser calculado.
Valor de retorno
Logaritmo natural do valor (value+1), em caso de sucesso. Se value < -1, a função retorna NaN
(valor não definido). Se value é igual a -1, a função retorna INF (infinito) .
Observação
Com valores x próximo de 0, a função MathLog 1p(x) dá um valor muito mais preciso do que
MathLog(1+x).
Veja também
T ipos reais (double, float)
MathArccosh
R etorna o valor do arco cosseno hiperbólico.
double MathArccosh(
double value // 1 <= value < ∞
);
Parâmetros
value
[in] Valor value, cujo arco-cosseno hiperbólico inverso deve ser calculado.
Valor de retorno
Arco-cosseno hiperbólico do número. Se value for inferior a +1, a função retornará NaN (valor não
definido).
Observação
Em vez da função MathArccosh(), é possível utilizar a função acosh().
Veja também
T ipos reais (double, float)
MathArcsinh
R etorna o valor do arco seno hiperbólico.
double MathArcsinh(
double value // -∞ < value < +∞
);
Parâmetros
val
[in] Valor value, cujo arco-cosseno deve ser calculado.
Valor de retorno
Arco-seno hiperbólico de um número.
Observação
Em vez da função MathArcsinh(), é possível utilizar a função asinh().
Veja também
T ipos reais (double, float)
MathArctanh
R etorna o valor do arco tangente hiperbólico.
double MathArctanh(
double value // valor no intervalo -1 < value < 1
);
Parâmetros
value
[in] Valor no intervalo -1 < value < 1, que representa a tangente.
Valor de retorno
Arco-tangente hiperbólica de um número.
Observação
Em vez da função MathArctanh(), é possível utilizar a função atanh().
MathCosh
R etorna o valor do cosseno hiperbólico do número.
double MathCosh(
double value // número
);
Parâmetros
value
[in] Valor.
Valor de retorno
Cosseno hiperbólico de um número, valor no intervalo de +1 a mais infinito.
Observação
Em vez da função MathCosh(), é possível utilizar a função cosh().
MathSinh
R etorna o valor do seno hiperbólico do número.
double MathSinh(
double value // número
);
Parâmetros
value
[in] Valor.
Valor de retorno
Seno hiperbólico de um número.
Observação
Em vez da função MathSinh(), é possível utilizar a função sinh().
MathTanh
Retorna o v alor da tang ente hiperbólica числа.
double MathTanh(
double value // número
);
Parâmetros
value
[in] Valor.
Valor de retorno
T angente hiperbólica de um número, valor no intervalo de -1 a +1.
Observação
Em vez da função MathT anh(), é possível utilizar a função tanh().
Veja também
T ipos reais (double, float)
MathSwap
Altera a ordem de bytes em valores do tipo ushort.
ushort MathSwap(
ushort value // valor
);
Parâmetros
value
[in] Valor para alterar a ordem de bytes.
Valor retornado
Valor ushort com ordem de bytes inversa.
MathSwap
Altera a ordem de bytes em valores do tipo uint.
uint MathSwap(
uint value // valor
);
Parâmetros
value
[in] Valor para alterar a ordem de bytes.
Valor retornado
Valor uint com ordem de bytes inversa.
MathSwap
Altera a ordem de bytes em valores do tipo ulong.
ulong MathSwap(
ulong value // valor
);
Parâmetros
value
[in] Valor para alterar a ordem de bytes.
Valor retornado
Valor ulong com ordem de bytes inversa.
Veja também
Funções de rede, Sock etR ead, Sock etSend, Sock etT ls R ead, Sock etT ls R eadAvailable, Sock etT lsSend
Funções de String
Este é um grupo de funções destinado a trabalhar com dados do tipo string.
Função Ação
StringAdd Adiciona uma string no final de uma outra
string
de tamanho especificado
StringAdd
A função adiciona uma substring no final de uma string.
bool StringAdd(
string& string_var, // string, na qual nós adicionados
string add_substring // string, que é adicionada
);
Parâmetros
string_var
[in][out] String, na qual uma outra string é adicionada.
add_substring
[in] String que é adicionada ao final de uma string fonte.
Valor do Retorno
Em caso de sucesso retorna verdadeiro, caso contrário falso. A fim de obter o código de erro, a
função GetLastError() deve ser chamada.
Exemplo:
void OnStart()
{
long length=1000000;
string a="a",b="b",c;
//--- primeiro método
uint start=GetTickCount(),stop;
long i;
for(i=0;i<length;i++)
{
c=a+b;
}
stop=GetTickCount();
Print("tempo para 'c = a + b' = ",(stop-start)," milissegundos, i = ",i);
{
StringConcatenate(c,a,b);
}
stop=GetTickCount();
Print("tempo para 'StringConcatenate(c,a,b)' = ",(stop-start)," milissegundos, i = ",i);
}
Também Veja
StringConcatenate, StringSplit, StringSubstr
StringBufferLen
A função retorna o tamanho de buffer alocado para a string.
int StringBufferLen(
string string_var // string
)
Parâmetros
string_var
[in] Seqüência.
Valor do Retorno
O valor 0 significa que a string é constante e o tamanho do buffer não pode ser alterado. -1
significa que a string pertence ao terminal cliente, e modificações no conteúdo do buffer pode ter
resultados indeterminados.
Exemplo:
void OnStart()
{
long length=1000;
string a="a",b="b";
//---
long i;
Print("antes: StringBufferLen(a) = ",StringBufferLen(a),
" StringLen(a) = ",StringLen(a));
for(i=0;i<length;i++)
{
StringAdd(a,b);
}
Print("após: StringBufferLen(a) = ",StringBufferLen(a),
" StringLen(a) = ",StringLen(a));
}
Também Veja
StringAdd, String Init, StringLen, String Fill
StringCompare
A função compara duas strings e retorna o resultada da comparação na forma de um inteiro.
int StringCompare(
const string& string1, // a primeira string na comparação
const string& string2, // a segunda string na comparação
bool case_sensitive=true // seleção do modo sensibilidade à maiúscula/minúscula p
);
Parâmetros
string1
[in] A primeira string.
string2
[in] A segunda string.
case_sensitive=true
[in] Seleção do modo de sensibilidade à maiúscula/minúscula. Se for true, então " A">" a" . Se for
false, então " A"=" a" . Por default, o valor é igual a true.
Valor do Retorno
· -1 (menos um), se string 1<string 2
· 0 (zero), se string 1=string 2
· 1 (um), se string 1>string 2
Observação
As strings são comparadas símbolo a símbolo, os símbolos são comparados na ordem alfabética em
concordância como o código de página corrente.
Exemplo:
void OnStart()
{
//--- qual é maior - apple ou home?
string s1="Apple";
string s2="home";
{
if(result2<0)PrintFormat("Comparação insensível caso: %s < %s",s1,s2);
else PrintFormat("Comparação insensível caso: %s = %s",s1,s2);
}
/* Resultado:
Comparação sensível caso: Apple < home
Comparação insensível caso: Apple < home
*/
}
Também Veja
T ipo de String, CharT oString(), ShortT oString(), String T oCharArray(), String T oShortArray(),
String GetCharacter(), Uso de um Código de Página
StringConcatenate
A função forma uma string de parâmetros passados e retorna o tamanho da string formada.
Parâmetros podem ser de qualquer tipo. O número de parâmetros não pode ser menor que 2 ou maior
que 64.
int StringConcatenate(
string& string_var, // string para formar
void argument1 // primeiro parâmetro de qualquer tipo simples
void argument2 // segundo parâmetro de qualquer tipo simples
... // próximo parâmetro de qualquer tipo simples
);
Parâmetros
string_var
[out] String que será formada como resultado da concatenação.
argumentN
[in] Quaisquer valores separados por vírgula. De 2 a 63 parâmetros de qualquer tipo simples.
Valor do Retorno
R etorna o comprimento da string, formada pela concatenação dos parâmetros transformados em
tipo string. Os parâmetros são transformados em strings em concordância com as mesmas regras
aplicadas em Print() e Comment().
Também Veja
StringAdd, StringSplit, StringSubstr
StringFill
Preenche uma string selecionada com um símbolo especificado.
bool StringFill(
string& string_var, // string a preencher
ushort character // símbolos que preencherão a string
);
Parâmetros
string_var
[in][out] String, que será preenchida pelo símbolo selecionado.
character
[in] Símbolo a partir do qual a string será preenchida.
Valor do Retorno
Em caso de sucesso retorna true, caso contrário - false. Para obter o código de erro chame
GetLastError().
Observação
Preencher uma string no lugar significa que os símbolos são inseridos diretamente na string sem
operações transitórias de criar ou copiar uma nova string. Isso permite economizar o tempo da
operação.
Exemplo:
void OnStart()
{
string str;
StringInit(str,20,'_');
Print("str = ",str);
StringFill(str,0);
Print("str = ",str,": StringBufferLen(str) = ", StringBufferLen(str));
}
// Resultado
// str = ____________________
// str = : StringBufferLen(str) = 20
//
Também Veja
String BufferLen, StringLen, String Init
StringFind
Busca por uma substring em uma string.
int StringFind(
string string_value, // string na qual a busca é feita
string match_substring, // o que é procurado
int start_pos=0 // a partir de qual posição a busca inicia
);
Parâmetros
string_value
[in] String, na qual a a busca é feita.
match_substring
[in] Substring procurada.
start_pos=0
[in] Posição na string a partir da qual a busca é iniciada.
Valor do Retorno
R etorna o número da posição na string, a partir da qual a substring procurada começa, ou -1, se a
substring não foi encontrada.
Também Veja
StringSubstr, String GetCharacter, StringLen, StringLen
StringGetCharacter
R etorna o valor de um símbolo, localizado na posição especificada de uma string.
ushort StringGetCharacter(
string string_value, // string
int pos // posição do símbolo na string
);
Parâmetros
string_value
[in] Seqüência.
pos
[in] Posição de um símbolo na string. Pode ser de 0 a StringLen(text) -1.
Valor do Retorno
Código do símbolo ou 0 em caso de um erro. Para obter o código de erro chame GetLastError().
Também Veja
StringSetCharacter, String BufferLen, StringLen, String Fill, String Init, String T oCharArray,
String T oShortArray
StringInit
Inicializa uma string com um símbolo especificado e fornece o tamanho da string especificada.
bool StringInit(
string& string_var, // string para inicialização
int new_len=0, // comprimento da string requerida após inicialização
ushort character=0 // símbolo, com o qual a string será preenchida
);
Parâmetros
string_var
[in][out] String que deve ser inicializada e desinicializada.
new_len=0
[in] Comprimento da string após inicialização. Se length=0, ela desinicializa a string, isto é, o
buffer da string é limpo e o endereço do buffer é zerado.
character=0
[in] Símbolo para preencher a string.
Valor do Retorno
Em caso de sucesso retorna true, caso contrário - false. Para obter o código de erro chame
GetLastError().
Observação
Se character=0 e o comprimento new_len>0, o buffer da string de comprimento indicado será
alocado e preenchido com zeros. O comprimento da string será igual a zero, porque o buffer inteiro
será preenchido com terminadores de string.
Exemplo:
void OnStart()
{
//---
string str;
StringInit(str,200,0);
Print("str = ",str,": StringBufferLen(str) = ",
StringBufferLen(str)," StringLen(str) = ",StringLen(str));
}
/* Resultado:
str = : StringBufferLen(str) = 200 StringLen(str) = 0
*/
Também Veja
String BufferLen, StringLen
StringLen
R etorna o número de símbolos em uma string.
int StringLen(
string string_value // string
);
Parâmetros
string_value
[in] String para calcular o comprimento.
Valor do Retorno
O número de símbolos em uma string sem o zero final.
Também Veja
String BufferLen, String T rimLeft, String T rimR ight, String T oCharArray, String T oShortArray
StringSetLength
Define para a string um comprimento especificado em caracteres.
bool StringSetLength(
string& string_var, // string
uint new_length // novo comprimento de string
);
Parâmetros
string_var
[in][out] String para a qual qual você deseja especificar um novo comprimento em caracteres.
new_capacity
[in] Comprimento necess ário de string em caracteres. Se o novo tamanho new_length for menor
do que o tamanho atual, os caracteres não selecionados serão descartados.
Valor retornado
Se for bem-sucedido, retorna true, caso contrário, false. Para obter o código do erro é preciso
chamar a função GetLastError().
Observação
A função StringSetLength() não altera o tamanho do buffer alocado para a string.
Veja também
StringLen, String BufferLen, String R eserve String Init, StringSetCharacter
StringReplace
Substitui todas as substrings encontradas de uma string por uma seqüência de símbolos.
int StringReplace(
string& str, // a string na qual substrings serão substituídas
const string find, // a substring procurada
const string replacement // a substring que será inserida nas posições encontradas
);
Parâmetros
str
[in][out] A string na qual você irá substituir substrings.
find
[in] A substring que deseja substituir.
replacement
[in] A string que será inserida na lugar da encontrada.
Valor do Retorno
A função retorna o número de substituições no caso de sucesso, caso contrário -1. Para obter o
código do erro chame a função GetLastError().
Observação
Se a função rodou com sucesso, mas nenhuma substituição foi feita (a substring a ser substituída
não foi encontrada), ela retorna 0.
O erro pode resultar de parâmetros str ou find incorretos (vazio ou string não inicializada, veja
String Init() ). Além disso, o erro ocorre se não houver memória suficiente para concluir a
substituição.
Exemplo:
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("Replaced: ", replaced,". Result=",text);
// Resultado
// Substituído: 3. Resultado=The slow black bear jumped over the lazy dog.
//
Também Veja
StringSetCharacter(), StringSubstr()
StringReserve
R eserva na memória para uma string um buffer de tamanho especificado.
bool StringReserve(
string& string_var, // strings
uint new_capacity // tamanho do buffer para armazenar a string.
);
Parâmetros
string_var
[in][out] String para a qual você deseja alterar o tamanho do buffer.
new_capacity
[in] T amanho do buffer necess ário de acordo com a string. Se o novo tamanho new_capacity for
menor que o comprimento da string, o tamanho do buffer atual não será alterado.
Valor retornado
Se for bem-sucedido, retorna true, caso contrário, false. Para obter o código do erro é preciso
chamar a função GetLastError().
Observação
O tamanho da string não é igual ao tamanho do buffer para armazenar a string. Como regra, ao
criar uma string, o buffer para ela é alocado com reserva. A função String R eserve() permite
controlar o tamanho do buffer e especificar o tamanho ideal para operações futuras.
Ao contrário da String Init(), a função String R eserve() ) não altera o conteúdo da string e não a
preenche com caracteres.
Exemplo:
void OnStart()
{
string s;
//--- verifica a velocidade sem usar StringReserve
ulong t0=GetMicrosecondCount();
for(int i=0; i< 1024; i++)
s+=" "+(string)i;
ulong msc_no_reserve=GetMicrosecondCount()-t0;
s=NULL;
//--- agora mede usando a StringReserve
StringReserve(s,1024 * 3);
t0=GetMicrosecondCount();
for(int i=0; i< 1024; i++)
s+=" "+(string)i;
ulong msc_reserve=GetMicrosecondCount()-t0;
//--- verifica o tempo
Print("Test with StringReserve passed for "+(string)msc_reserve+" msc");
Print("Test without StringReserve passed for "+(string)msc_no_reserve+" msc");
/* Resultado:
Veja também
String BufferLen, StringSetLength, String Init, StringSetCharacter
StringSetCharacter
R etorna uma cópia de uma string com um caractere alterado na posição especificada.
bool StringSetCharacter(
string& string_var, // string
int pos, // posição
ushort character // caractere
);
Parâmetros
string_var
[in][out] String.
pos
[in] Posição de um caractere em uma string. Pode ser de 0 a StringLen(text).
character
[in] Código Unicode de um símbolo.
Valor do Retorno
Em caso de sucesso retorna verdadeiro, caso contrário falso. A fim de obter o código de erro, a
função GetLastError() deve ser chamada.
Observação
Se pos for menor que o comprimento da string e o valor de código do símbolo = 0, a string é
truncada (mas o tamanho de buffer, alocado para a string permanece inalterado). O comprimento da
string se torna igual a pos.
Se pos for igual ao comprimento da string, o símbolo especificado é adicionado ao final da string, e
o comprimento é aumentado em um.
Exemplo:
void OnStart()
{
string str="0123456789";
Print("antes: str = ",str,",StringBufferLen(str) = ",
StringBufferLen(str)," StringLen(str) = ",StringLen(str));
//--- adicionado valor zero no meio
StringSetCharacter(str,6,0);
Print("após: str = ",str,",StringBufferLen(str) = ",
StringBufferLen(str)," StringLen(str) = ",StringLen(str));
//--- adiciona símbolo no final
int size=StringLen(str);
StringSetCharacter(str,size,'+');
Print("adição: str = ",str,",StringBufferLen(str) = ",
StringBufferLen(str)," StringLen(str) = ",StringLen(str));
}
/* Resultado
Também Veja
String BufferLen, StringLen, String Fill, String Init, CharT oString, ShortT oString, CharArrayT oString,
ShortArrayT oString
StringSplit
Obtém substrings por meio um separador especificado a partir de uma string especificada, retorna o
número de substrings obtidas.
int StringSplit(
const string string_value, // A string que será pesquisada
const ushort separator, // Um separador usado para buscar substrings
string & result[] // Um array passado por referencia para obter as substrings e
);
Parâmetros
string_value
[in] Uma string da qual você necessita obter substrings. A string não será alterada.
pos
[in] O código do caractere separador. Para obter o código, você pode usar a função
String GetCharacter().
result[]
[out] Um array de strings onde as substrings obtidas estão localizadas.
Valor do Retorno
O número de substrings no array result[]. Se o separador não for encontrado na string passada,
somente uma string fonte será colocada no array.
Se string _value for vazia ou NULL, a função retornará zero. No caso de um erro, a função retorna -
1. Para obter o código do erro, chame a função GetLastError().
Exemplo:
string to_split="_life_is_good_"; // Um string para dividir em substrings
string sep="_"; // Um separador como um caractere
ushort u_sep; // O código do caractere separador
string result[]; // Um array para obter strings
//--- Obtém o código do separador
u_sep=StringGetCharacter(sep,0);
//--- Divide a string em substrings
int k=StringSplit(to_split,u_sep,result);
//--- Exibe um comentário
PrintFormat("Strings obtidos: %d. Usado separador '%s' com o código %d",k,sep,u_sep);
//--- Agora imprime todos os resultados obtidos
if(k>0)
{
for(int i=0;i<k;i++)
{
PrintFormat("result[%d]=\"%s\"",i,result[i]);
}
}
Também Veja
String R eplace(), StringSubstr(), StringConcatenate()
StringSubstr
Extrai uma substring de uma string de texto iniciando de uma posição especificada.
string StringSubstr(
string string_value, // string
int start_pos, // posição de início
int length=-1 // comprimento da string extraída
);
Parâmetros
string_value
[in] String de onde será extraída uma substring.
start_pos
[in] Posição inicial de uma substring. Pode ser de 0 a StringLen(text) -1.
length=-1
[in] Comprimento de uma substring extraída. Se o valor do parâmetro for igual a -1 ou o
parâmetro não for definido, a substring será extraída da posição indicada até a final da string.
Valor do Retorno
Cópia de uma substring extraída, se possível. Caso contrário, retorna uma string vazia.
Também Veja
StringSplit, String Find, String GetCharacter
StringToLower
T ransforma todos os símbolos de uma string selecionada em minúscula por localização.
bool StringToLower(
string& string_var // string para processar
);
Parâmetros
string_var
[in][out] String.
Valor do Retorno
Em caso de sucesso retorna true, caso contrário - false. Para obter o código de erro chame
GetLastError().
Também Veja
String T oUpper, String T rimLeft, String T rimR ight
StringToUpper
T ransforma todos os símbolos de uma string selecionada em maiúscula por localização.
bool StringToUpper(
string& string_var // string para processar
);
Parâmetros
string_var
[in][out] String.
Valor do Retorno
Em caso de sucesso retorna true, caso contrário - false. Para obter o código de erro chame
GetLastError().
Também Veja
String T oLower, String T rimLeft, String T rimR ight
StringTrimLeft
A função remove caracteres de quebra de linha, espaços e tabs na parte esquerda da string até o
primeiro símbolo significativo. A string é modificada no lugar.
int StringTrimLeft(
string& string_var // string para cortar
);
Parâmetros
string_var
[in][out] String que será cortada a partir da esquerda.
Valor do Retorno
R etorna o número de símbolos removidos.
Também Veja
String T rimR ight, String T oLower, String T oUpper
StringTrimRight
A função remove caracteres de quebra de linha, espaços e tabs na parte direita da string após o último
símbolo significativo. A string é modificada no lugar.
int StringTrimRight(
string& string_var // string para cortar
);
Parâmetros
string_var
[in][out] String que será cortada a partir da direita.
Valor do Retorno
R etorna o número de símbolos removidos.
Também Veja
String T rimLeft, String T oLower, String T oUpper
Data e Hora
Este é o grupo de funções para trabalhar com dados do tipo datetime (um inteiro que representa
número de segundos decorridos a partir da 0 hora de 1° Janeiro de 1970).
Para obter contadores e timers de alta-resolução, use a função GetT ick Count(), que produz valores em
milissegundos.
Função Ação
T imeCurrent R etorna a última hora conhecida do servidor
(hora da última cotação recebida) no formato
de datetime(
TimeCurrent
R etorna a última hora conhecida do servidor, hora da última cotação recebida para um dos ativos
selecionados na janela " Observação de Mercado" . No handler OnT ick (), esta função retorna a hora do
tick recebido, que está sendo tratado. Em outros casos (por exemplos, chamar nos handlers OnInit(),
OnDeinit(), OnT imer() e assim por diante), esta função retorna a hora da última cotação recebida para
qualquer ativo disponível na janela " Observação de Mercado" , a hora exibida no cabeçalho desta
janela. O valor da hora é formado em servidor de negociação e não depende das configurações de hora
em seu computador. Existem 2 variantes da função.
Parâmetros
dt_struct
[out] MqlDateT ime variável de tipo estrutura.
Valor do Retorno
Valor de tipo datetime
Observação
Se uma variável de tipo estrutura MqlDateT ime for passada como parâmetro, ela é preenchida de
acordo.
Para obter contadores e timer de alta-resolução, use a função GetT ick Count(), que produz valores
em milissegundos.
During testing in the strateg y tester, T imeCurrent() is simulated according to historical data.
TimeTradeServer
R eturna a hora corrente calculada do servidor de negociação. Diferentemente de T imeCurrent(), o
cálculo do valor da hora é realizado no terminal cliente e depende das configurações de hora em seu
computador. Existem 2 variantes da função.
Parâmetros
dt_struct
[out] Variável de tipo estrutura MqlDateT ime.
Valor do Retorno
Valor de tipo datetime
Observação
Se uma variável de tipo estrutura MqlDateT ime for passada como parâmetro, ela é preenchida de
acordo.
Para obter contadores e timer de alta-resolução, use a função GetT ick Count(), que produz valores
em milissegundos.
Durante o teste no testador de estratégia, o tempo do servidor simuladoT imeGM T () é sempre igual
ao T imeCurrent().
TimeLocal
R etorna a hora local de um computador, de onde o terminal cliente está executando. Existem 2
variantes da função.
Parâmetros
dt_struct
[out] Variável de tipo estrutura MqlDateT ime.
Valor do Retorno
Valor de tipo datetime
Observação
Se uma variável de tipo estrutura MqlDateT ime for passada como parâmetro, ela é preenchida de
acordo.
Para obter contadores e timer de alta-resolução, use a função GetT ick Count(), que produz valores
em milissegundos.
Durante o teste no testador de estratégia, o tempo do servidor simuladoT imeGM T () é sempre igual
ao T imeCurrent().
TimeGMT
R etorna a hora GM T , que é calculada levando em consideração o ajuste ao horário de verão pela hora
local no computador de onde o terminal cliente está executando. Existem 2 variantes da função.
Parâmetros
dt_struct
[out] Variável de tipo estrutura MqlDateT ime.
Valor do Retorno
Valor de tipo datetime
Observação
Se uma variável de tipo estrutura MqlDateT ime for passada como parâmetro, ela é preenchida de
acordo.
Para obter contadores e timer de alta-resolução, use a função GetT ick Count(), que produz valores
em milissegundos.
Durante o teste no testador de estratégia, o tempo do servidor simuladoT imeGM T () é sempre igual
ao T imeT radeServer().
TimeDaylightSavings
R etorna correção para o horário de verão em segundos, ajuste ao horário de verão foi feito. Depende
das configurações de hora de seu computador.
int TimeDaylightSavings();
Valor do Retorno
Se o ajuste ao horário de inverno (padrão) foi feito, retorna 0.
TimeGMTOffset
R etorna a diferença corrente entre a hora GM T e a hora do computador local em segundos. Depende
das configurações de hora de seu computador.
int TimeGMTOffset();
Valor do Retorno
Valor de tipo int, representando a diferença corrente entre a hora GM T e a hora local do
computador T imeLocal() em segundos.
TimeToStruct
Converte um valor de tipo datetime (número de segundos desde 01.01.1970) em uma variável
estrutura MqlDateT ime.
bool TimeToStruct(
datetime dt, // data e hora
MqlDateTime& dt_struct // estrutura para a captura de valores
);
Parâmetros
dt
[in] Valor de data e hora para conversão.
dt_struct
[out] Variável de tipo estrutura MqlDateT ime.
Valor do Retorno
true se bem sucedido, caso contrário false. Para obter informações sobre o erro, chamar a função
GetLastError().
StructToTime
Converte uma variável estrutura MqlDateT ime em um valor de tipo datetime e retorna o valor
resultante.
datetime StructToTime(
MqlDateTime& dt_struct // estrutura da data e hora
);
Parâmetros
dt_struct
[in] Variável de tipo estrutura MqlDateT ime.
Valor do Retorno
Valor de tipo datetime contendo o número de segundos deste 01.01.1970.
Informações de Conta
Funções que retornam parâmetros da conta corrente.
Função Ação
AccountInfoDouble R etorna um valor de tipo double da
correspondente propriedade da conta
AccountInfoDouble
R etorna o valor da correspondente propriedade da conta.
double AccountInfoDouble(
ENUM_ACCOUNT_INFO_DOUBLE property_id // identificador da propriedade
);
Parâmetros
property_id
[in] Identificador da propriedade. O valor pode ser um dos valores de
ENUM _ACCOUNT_INFO_DOUBLE.
Valor do Retorno
Value of double type.
Exemplo:
void OnStart()
{
//--- exibe todas as informações disponíveis a partir da função 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));
}
Também Veja
S ymbolInfoDouble, S ymbolInfoString, S ymbolInfoInteger, PrintFormat
AccountInfoInteger
R etorna o valor das propriedades da conta.
long AccountInfoInteger(
ENUM_ACCOUNT_INFO_INTEGER property_id // Identificador da propriedade
);
Parâmetros
property_id
[in] Identificador da propriedade. O valor pode ser um dos valores de
ENUM _ACCOUNT_INFO_INT EGER .
Valor do Retorno
Value of long type.
Observação
A propriedade deve ser um dos tipos bool, int ou long.
Exemplo:
void OnStart()
{
//--- exibe todas as informações disponíveis a partir da função 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("Esta é uma conta de competição");
break;
default:Print("Esta é uma conta real!");
}
Também Veja
Informações de Conta
AccountInfoString
R etorna o valor da correspondente propriedade da conta.
string AccountInfoString(
ENUM_ACCOUNT_INFO_STRING property_id // Identificador da propriedade
);
Parâmetros
property_id
[in] Identificador da propriedade. O valor pode ser um dos valores de
ENUM _ACCOUNT_INFO_S TRING.
Valor do Retorno
Valor de tipo string.
Exemplo:
void OnStart()
{
//--- Exibe todas as informações disponíveis a partir da função AccountInfoString()
Print("O nome do corretor = ",AccountInfoString(ACCOUNT_COMPANY));
Print("Moeda do depósito = ",AccountInfoString(ACCOUNT_CURRENCY));
Print("Nome do cliente = ",AccountInfoString(ACCOUNT_NAME));
Print("O nome do servidor comercial = ",AccountInfoString(ACCOUNT_SERVER));
}
Também Veja
Informações de Conta
Verificação de Estado
Funções que retornam parâmetros do estado corrente do terminal cliente
Função Ação
GetLastError R etorna o último erro
GetLastError
R etorna o conteúdo da variável de sistema _LastError.
int GetLastError();
Valor de Retorno
R etorna o valor do último erro que ocorreu durante a execução de um programa mql5.
Observação
Após a chamada da função, o conteúdo de _LastError não é zerado. Para zerar esta variável, você
precisa chamar R esetLastError().
Também Veja
Códigos de R etorno do Servidor de Negociação
IsStopped
Verifique um desligamento forçado de um programa mql5.
bool IsStopped();
Valor de Retorno
R etorna true, se a variável de sistema _StopFlag contém um valor diferente de 0. Um valor não-zero
é escrito em _StopFlag, se um programa mql5 foi ordenado a concluir sua operação. Neste caso,
você deve imediatamente finalizar o programa, caso contrário o programa será concluído
forçadamente do lado de fora após 3 segundos.
UninitializeReason
R etorna o código do motivo para desinicialização.
int UninitializeReason();
Valor de Retorno
R etorna o valor de _UninitR eason que é formado antes de OnDeinit() ser chamado. O valor depende
dos motivos que levaram à desinicialização.
TerminalInfoInteger
R etorna o valor de uma propriedade correspondente do ambiente de um programa mql5.
int TerminalInfoInteger(
int property_id // identificador de uma propriedade
);
Parâmetros
property_id
[in] Identificador de uma propriedade. Can be one of the values of the enumeration
ENUM _T ER M INAL _INFO_INT EGER .
Valor de Retorno
Valor de tipo int.
TerminalInfoDouble
R etorna o valor de uma propriedade correspondente do ambiente do programa mql5.
double TerminalInfoDouble(
int property_id // identificador de uma propriedade
);
Parâmetros
property_id
[in] Identificador de uma propriedade. Pode ser um dos valores da enumeração
ENUM _T ER M INAL _INFO_DOUBLE.
Retornar Valor
Valor do tipo double.
TerminalInfoString
A função retorna o valor de uma propriedade correspondente do ambiente de um programa mql5. A
propriedade deve ser do tipo string.
string TerminalInfoString(
int property_id // identificador de uma propriedade
);
Parâmetros
property_id
[in] Identificador de uma propriedade. Pode ser um dos valores da enumeração
ENUM _T ER M INAL _INFO_S TRING.
Valor de Retorno
Valor de tipo string.
MQLInfoInteger
R etorna o valor de uma propriedade correspondente de um programa mql5 em execução.
int MQLInfoInteger(
int property_id // identificador de uma propriedade
);
Parâmetros
property_id
[in] Identificador de uma propriedade. Can be one of values of the ENUM _MQL _INFO_INT EGER
enumeration.
Valor de Retorno
Valor de tipo int.
MQLInfoString
R etorna o valor de uma propriedade correspondente de um programa mql5 em execução.
string MQLInfoString(
int property_id // Identificador de uma propriedade
);
Parâmetros
property_id
[in] Identificador de uma propriedade. Pode ser um dos valores da enumeração
ENUM _MQL _INFO_S TRING.
Valor de Retorno
Valor de tipo string.
Symbol
R etorna o nome do ativo do gráfico corrente.
string Symbol();
Valor de Retorno
Valor da variável de sistema _S ymbol, que armazena o nome do ativo do gráfico corrente.
Observação
Ao contrário de EAs, indicadores e scripts, os serviços não estão vinculados a um gráfico específico.
Portanto, para o serviço, S ymbol() retorna a linha em branco ("" ).
Period
R etorna a janela de tempo do gráfico corrente.
ENUM_TIMEFRAMES Period();
Valor de Retorno
O conteúdo da variável _Period que representa o valor da janela de tempo do gráfico corrente. O
valor pode ser um dos valores da enumeração ENUM _TIMEFR AMES.
Observação
Ao contrário de EAs, indicadores e scripts, os serviços não estão vinculados a um gráfico específico.
Portanto, para o serviço, Period() retorna 0.
Veja também
PeriodSeconds, Janelas de tempo de gráficos, Data e H ora, Visibilidade de objetos
Digits
R etorna o número de dígitos decimais determinando a precisão do preço do ativo do gráfico corrente.
int Digits();
Valor de Retorno
O valor da variável _Digits que armazena o número de dígitos decimais determina a precisão do
preço do ativo do gráfico corrente.
Point
R etorna o tamanho do ponto do ativo corrente na moeda de cotação.
double Point();
Valor de Retorno
O valor da variável _Point que armazena o tamanho do ponto do ativo corrente na moeda de
cotação.
Manipulação de eventos
A linguagem MQL5 providencia o processamento de eventos predefinidos. As funções para processar
esses eventos devem ser definidas no programa MQL5: o nome da função, o tipo de retorno, a
composição dos parâmetros (se houver) e seus tipos devem corresponder estritamente à descrição da
função do manipulador de eventos.
É pelo tipo do valor de retorno e pelos tipos de parâmetros que o manipulador de eventos do terminal
do cliente identifica as funções que manipulam eventos. Se, para a respectiva função, forem definidos
outros parâmetros que não correspondem às seguintes descrições, ou se for especificado um tipo de
retorno diferente, essa função não será usada para processar o evento.
Função Descrição
OnStart É chamada no script quando ocorre um evento
Start para executar ações definidas no script
final do teste
O terminal do cliente envia os novos eventos para os respectivos gráficos abertos. Além disso, os
eventos podem ser gerados por gráficos (evento de gráfico) ou por programas MQL5 (eventos
personalizados). A geração de eventos para criar e excluir objetos gráficos no gráfico pode ser ativada
e desativada definindo as propriedades do gráfico CH ART_EVENT_OBJECT_CR EAT E e
CH ART_EVENT_OBJECT_DELET E. Cada programa MQL5 e cada gráfico tem sua própria fila de eventos,
à qual são adicionados todos os eventos recém-chegados.
O programa recebe eventos apenas do gráfico em que está sendo executado. T odos os eventos são
processados um após o outro na ordem em que são recebidos. Se na fila já houver um evento NewT ick
ou este evento estiver no estado de processamento, o novo evento NewT ick não será colocado na fila
do programa MQL5. Da mesma forma, se na fila do programa MQL5 já estiver o evento ChartEvent ou
tal evento estiver sendo processado, não será enfileirado um novo evento desse tipo. Os eventos do
temporizador são processados da mesma maneira, isto é, se um evento estiver na fila ou o evento
T imer já estiver sendo processado, não será enfileirado um novo evento do temporizador.
Filas de eventos são de tamanho limitado, mas suficiente, portanto, para um programa escrito
corretamente, o estouro da fila é improv ável. Quando a fila estourar, novos eventos são descartados
sem serem enfileirados.
Evite usar loops infinitos para manipular eventos. Uma exceção a essa regra podem ser apenas os
scripts que lidam com o evento único Start.
OnStart
É chamado em scripts e serviços quando ocorre um evento Start. A função se destina à execução única
de ações estabelecidas pelo programa. Existem duas vers ões da função.
Valor retornado
Valor de tipo int que é exibido na guia "Diário" .
Após o script ser concluído, no log do terminal será criada uma entrada de tipo " script
nome_do_script removed (result code N)" , onde N é o valor retornado pela função OnStart().
Após o serviço ser concluído, no log do terminal será criada uma entrada de tipo " service
имя_сервиса s topped (result code N)" , onde N é o v alor retornado pela função OnStart().
O uso da chamada da OnStart() com o retorno de resultado é prioridade, pois este método permite não
apenas iniciar o script, mas também retornar um código de erro ou outras informações úteis para
analisar o resultado da execução do script.
Versão sem retorno do resultado é deixada apenas para compatibilidade com códigos antigos. Não é
recomendada
void OnStart(void);
Observação
OnStart() é a única função para manipular eventos em scripts e serviços, outros eventos não são
enviados para esses programas. Por sua vez, o evento Start não é enviado para EAs e indicadores
personalizados.
Exemplo de script:
//--- macros para trabalhar com cores
#define XRGB(r,g,b) (0xFF000000|(uchar(r)<<16)|(uchar(g)<<8)|uchar(b))
#define GETRGB(clr) ((clr)&0xFFFFFF)
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- definimos a cor a vela de baixa
Comment("Definimos a cor da vela de baixa");
ChartSetInteger(0,CHART_COLOR_CANDLE_BEAR,GetRandomColor());
ChartRedraw(); // atualizamos imediatamente o gráfico sem esperar por um novo tick
Sleep(1000); // fazemos uma pausa de 1 segundo, para poder ver as alterações
//--- definimos a cor da vela de alta
Comment("Definimos a cor da vela de alta");
ChartSetInteger(0,CHART_COLOR_CANDLE_BULL,GetRandomColor());
ChartRedraw();
Sleep(1000);
Sleep(1000);
//--- definimos a cor dos volumes e dos níveis de abertura das posições
Comment("Definimos a cor dos volumes e dos níveis de abertura das posições");
ChartSetInteger(0,CHART_COLOR_VOLUME,GetRandomColor());
ChartRedraw();
}
//+------------------------------------------------------------------+
//| Retorna uma cor gerada aleatoriamente |
//+------------------------------------------------------------------+
color GetRandomColor()
{
color clr=(color)GETRGB(XRGB(rand()%255,rand()%255,rand()%255));
return clr;
}
Veja também
Funções de processamento de eventos, Execução de programas, Eventos do terminal do cliente
OnInit
É chamada em indicadores e EAs quando ocorre o evento Init. A função é projetada para inicialização
de um programa MQL5 em execução. Existem duas vers ões da função.
Valor retornado
Valor de tipo int, zero significa inicialização bem-sucedida.
O uso da chamada da OnInit() com o retorno de resultado é prioridade, pois este método permite não
apenas inicializar o programa, mas também retornar o código de erro em caso de término antecipado
do programa.
Versão sem retorno do resultado é deixada apenas para compatibilidade com códigos antigos. Não é
recomendada
void OnInit(void);
Observação
O evento Init é gerado imediatamente após o especialista ou indicador ser carregado, este evento
não é gerado para scripts. A função OnInit() é usada para inicialização do programa MQL5. Se a
OnInit() tiver um valor retornado do tipo int, um código de retorno diferente de zero significa uma
inicialização mal-sucedida e gera o evento Deinit com código de motivo de desinicialização
R EASON_INITFAILED.
A função OnInit() do tipo void sempre significa uma inicialização bem-sucedida e não é
recomendada.
Ao otimizar os parâmetros de entrada do EA, recomenda-se usar como código de retorno os valores
da enumeração ENUM _INIT_R ET CODE. Estes valores se destinam a organizar o gerenciamento do
progresso da otimização e, inclusive, a selecionar os mais adequados agentes de teste. Na
inicialização do EA, mesmo antes de executar o teste, você pode solicitar informações sobre a
configuração e sobre os recursos do agente (o número de núcleos, a quantidade de memória livre,
etc.) usando a função T erminalInfoInteger(). Com base nas informações recebidas, você pode
permitir que esse agente de teste seja usado ou não ao ser otimizado.
Identificador Descrição
INIT_S UCCEEDED Inicialização bem-sucedida, o teste do EA pode
continuar.
Esse código significa o mesmo que o valor zero –
inicialização do EA no testador bem-sucedida.
O uso da OnInit() com retorno de INIT_FAILED/INIT_PAR AMET ER S _INCORR ECT no testador tem
v árias características que devem ser consideradas ao otimizar EAs :
· o conjunto de parâmetros para o qual a OnI nit() retornou INIT_PAR AMET ER S _INCORR ECT é
considerado inadequado para testes e não será usado para obter a próxima população
duranteotimizações genéticas. O fato de haver muitos conjuntos de parâmetros rejeitados pode
levar a resultados de pesquisa incorretos de parâmetros ideais de EAs. O algoritmo de busca
pressupõe que a função de critério de otimização é suave e não tem descontinuidades em todo o
conjunto de parâmetros de entrada.
· se a OnI nit() retornar INIT_FAI LED, o teste não poderá ser iniciado e o EA será descarregado da
memória do agente. Para executar a próxima passagem, o novo EA será carregado com o novo
conjunto de parâmetros. Isso faz com que inciar o teste da próxima passagem de otimização leve
mais tempo do que se fosse chamada a T esterStop().
Exemplo da função OnInit() para um EA
//--- input parameters
input int ma_period=20; // período de média móvel
{
PrintFormat("Valor inválido do parâmetro de entrada ma_period: %d",ma_period);
return (INIT_PARAMETERS_INCORRECT);
}
//--- ao otimizar
if(MQLInfoInteger(MQL_OPTIMIZATION))
{
//--- verificamos a quantidade de RAM disponível para o agente
int available_memory_mb=TerminalInfoInteger(TERMINAL_MEMORY_TOTAL);
if(available_memory_mb<2000)
{
PrintFormat("Memória insuficiente para o agente de teste: %d MB",
available_memory_mb);
return (INIT_AGENT_NOT_SUITABLE);
}
}
//--- verificamos se existe indicador
indicator_handle=iCustom(_Symbol,_Period,"My_Indicator",ma_period);
if(indicator_handle==INVALID_HANDLE)
{
PrintFormat("Não foi possível criar o indicador My_Indicator. Código de erro %d",
GetLastError());
return (INIT_FAILED);
}
//--- inicialização do EA bem-sucedida
return(INIT_SUCCEEDED);
}
Veja também
OnDeinit, T esterH ideIndicators, Funções de processamento de eventos, Execução de programas,
Evento do terminal do cliente, Inicialização de variáveis, Criando e destruindo objetos
OnDeinit
É chamada em indicadores e EAs quando ocorre o evento Deinit. A função é projetada para
desinicialização de um programa MQL5 em execução.
void OnDeinit(
const int reason // código de motivo da desinicialização
);
Parâmetros
reason
[in] Código de motivo da desinicialização.
Valor retornado
Sem valor retornado
Observação
O evento Deinit é gerado para EAs e para indicadores nos seguintes casos :
· antes de uma reinicialização devida à mudança do símbolo ou do período do gráfico ao qual o
programa MQL5 está associado;
· antes de uma reinicialização devida à mudança dos parâmetros de entrada;
· antes de descarregar o programa MQL %.
zero
Códigos de motivo de desinicialização do EA podem ser obtidos pela função UninitializeR eason() ou a
partir da variável predefinida _UninitR eason.
Veja também
OnInit, Funções de processamento de eventos, Execução de programas, Eventos do terminal do
cliente, Motivos de desinicialização, Escopo de visibilidade e tempo de vida das variáveis, Criando e
destruindo objetos
OnTick
É chamada em EAs quando ocorre o evento NewT ick para processar uma nova cotação.
void OnTick(void);
Valor retornado
Sem valor retornado
Observação
O evento NewT ick é gerado apenas para EAs após a chegada de um novo tick do símbolo cujo EA é
anexado ao gráfico. É inútil definir a função OnT ick () no indicador personalizado ou no script, pois o
evento NewT ick não é gerado para eles.
O evento T ick é gerado apenas para EAs, mas isso não significa que os EAs precisam ter a função
OnT ick (), porque não apenas os eventos NewT ick são gerados para EAs, mas também os eventos
T imer, Book Event e ChartEvent.
T odos os eventos são processados um após o outro na ordem em que são recebidos. Se na fila já
houver um evento NewT ick ou este evento estiver no estado de processamento, o novo evento
NewT ick não será colocado na fila do programa MQL5.
}
//--- se aberta uma posição de 'netting', ignoramos o sinal e esperamos até que ele feche
if(signal!=0 && PositionsTotal()>0 && (ENUM_ACCOUNT_MARGIN_MODE)AccountInfoInteger(ACCOUNT_MARGI
{
signal=0;
return; // saímos do manipulador de eventos NewTick e não entramos no mercado até que apareça
}
//--- para contas de cobertura ('hedge'), casa posição tem vida e fecha separadamente
if(signal!=0)
{
//--- sinal de compra
if(signal>0)
{
PrintFormat("%s: Existe um sinal de compra! Revers=%s",__FUNCTION__,string(revers));
if(Buy(trade_lot,slippage,EXPERT_MAGIC))
signal=0;
}
//--- sinal de venda
if(signal<0)
{
PrintFormat("%s: Existe um sinal de venda! Revers=%s",__FUNCTION__,string(revers));
if(Sell(trade_lot,slippage,EXPERT_MAGIC))
signal=0;
}
}
//--- fim da função OnTick
}
//+------------------------------------------------------------------+
//| Verificando se á sinal de negociação |
//+------------------------------------------------------------------+
int CheckSignal()
{
//--- 0 significa que não há sinal
int res=0;
//--- obtemos o valor do ATR na penúltima barra concluída (o índice da barra igual a 2)
double atr_value[1];
if(CopyBuffer(atr_handle,0,2,1,atr_value)!=-1)
{
last_atr=atr_value[0];
//--- recebemos os dados da última barra fechada numa matriz do tipo MqlRates
MqlRates bar[1];
if(CopyRates(_Symbol,_Period,1,1,bar)!=-1)
{
//--- calculamos o tamanho do corpo da barra na última barra fechada
last_body=bar[0].close-bar[0].open;
//--- se o corpo da última barra (com índice 1) exceder o valor anterior do ATR (na barra
if(MathAbs(last_body)>kATR*last_atr)
res=last_body>0?1:-1; // para a leva altista um valor positivo
}
else
PrintFormat("%s: Não foi possível obter a última barra! Erro",__FUNCTION__,GetLastError())
}
else
PrintFormat("%s: Não foi possível obter o valor do indicador ATR! Erro",__FUNCTION__,GetLastE
//--- se estiver ativado o modo de negociação de reversão
res=revers?-res:res; // se necessário, revertemos o sinal (em vez de 1, retornamos -1, e, em ve
//--- retornamos o valor do sinal de negociação
return (res);
}
//+------------------------------------------------------------------+
//| Retornando true quando aparece uma nova barra |
//+------------------------------------------------------------------+
bool isNewBar(const bool print_log=true)
{
static datetime bartime=0; // armazenamos o tempo de abertura da barra atual
//--- obtemos o tempo de abertura da barra zero
datetime currbar_time=iTime(_Symbol,_Period,0);
//--- se o tempo de abertura mudar, é porque apareceu uma nova barra
if(bartime!=currbar_time)
{
bartime=currbar_time;
lastbar_timeopen=bartime;
//--- exibir no log informações sobre o tempo de abertura da nova barra
if(print_log && !(MQLInfoInteger(MQL_OPTIMIZATION)||MQLInfoInteger(MQL_TESTER)))
{
//--- exibimos uma mensagem sobre o tempo de abertura da nova barra
PrintFormat("%s: new bar on %s %s opened at %s",__FUNCTION__,_Symbol,
StringSubstr(EnumToString(_Period),7),
TimeToString(TimeCurrent(),TIME_SECONDS));
//--- obtemos os dados do último tick
MqlTick last_tick;
if(!SymbolInfoTick(Symbol(),last_tick))
Print("SymbolInfoTick() failed, error = ",GetLastError());
//--- exibimos o tempo do último tick em segundos
PrintFormat("Last tick was at %s.%03d",
TimeToString(last_tick.time,TIME_SECONDS),last_tick.time_msc%1000);
}
//--- temos uma nova barra
return (true);
}
//--- não há nenhuma barra nova
return (false);
}
//+------------------------------------------------------------------+
//| Comprando a mercado com o volume especificado |
//+------------------------------------------------------------------+
bool Buy(double volume,ulong deviation=10,ulong magicnumber=0)
{
//--- se a posição tem vivido por um longo tempo, e também o MagicNumber e o símbolo são os m
if(bars>holdtimebars && magic==magicnumber && position_symbol==_Symbol)
{
int digits=(int)SymbolInfoInteger(position_symbol,SYMBOL_DIGITS); // número d
double volume=PositionGetDouble(POSITION_VOLUME); // volume d
ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); // tipo de
string str_type=StringSubstr(EnumToString(type),14);
StringToLower(str_type); // reduzimos o registro do texto para uma correta formatação da m
PrintFormat("Fechamos a posição #%d %s %s %.2f",
position_ticket,position_symbol,str_type,volume);
//--- definindo o tipo de ordem e de envio do pedido de negociação
if(type==POSITION_TYPE_BUY)
MarketOrder(ORDER_TYPE_SELL,volume,deviation,magicnumber,position_ticket);
else
MarketOrder(ORDER_TYPE_BUY,volume,deviation,magicnumber,position_ticket);
}
}
}
//+------------------------------------------------------------------+
//| Preparando e enviando uma solicitação de negociação |
//+------------------------------------------------------------------+
bool MarketOrder(ENUM_ORDER_TYPE type,double volume,ulong slip,ulong magicnumber,ulong pos_ticket=0
{
//--- declaração e inicialização de estruturas
MqlTradeRequest request={};
MqlTradeResult result={};
double price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
if(type==ORDER_TYPE_BUY)
price=SymbolInfoDouble(Symbol(),SYMBOL_ASK);
//--- parâmetros da solicitação
request.action =TRADE_ACTION_DEAL; // tipo de operação de negociação
request.position =pos_ticket; // boleta da posição, se fechada
request.symbol =Symbol(); // símbolo
request.volume =volume; // volume
request.type =type; // tipo de ordem
request.price =price; // preço de transação
request.deviation=slip; // desvio permitido em relação ao preço
request.magic =magicnumber; // MagicNumber da ordem
//--- envio do pedido
if(!OrderSend(request,result))
{
//--- exibimos as informações sobre a falha
PrintFormat("OrderSend %s %s %.2f at %.5f error %d",
request.symbol,EnumToString(type),volume,request.price,GetLastError());
return (false);
}
//--- relatamos sobre a operação bem-sucedida
PrintFormat("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order);
return (true);
}
Veja também
Funções de processamento de eventos, Execução de programas, Eventos do terminal do cliente,
OnT imer, OnBook Event, OnChartEvent
OnCalculate
É chamada em indicadores quando ocorre o evento Calculate para processar alterações nos dados de
preço. Existem duas vers ões da função, você não pode usar as duas dentro do mesmo indicador.
Parâmetros
rates_total
[in] T amanho da matriz price[] ou das séries temporais de entrada disponíveis para o indicador
para cálculo. Na segunda versão da função, o valor do parâmetro corresponde ao número de barras
no gráfico em que está sendo executado.
prev_calculated
[in] Contém o valor retornado pela função OnCalculate() na chamada anterior. Ele é usado para
ignorar nos cálculos as barras que não mudaram desde a última inicialização desta função.
begin
[in] valor do índice na matriz price[] a partir do qual começam os dados significativos. Permite
ignorar nos cálculos os dados ausentes ou iniciais, para os quais não há valores corretos.
price[]
[in] Matriz de valores para executar cálculos. Como matriz price[] pode ser transferida uma das
séries temporais de preços ou o buffer calculado de qualquer indicador. O tipo de dados que foi
transferido para o cálculo pode ser determinado usando a variável predefinida _AppliedT o.
time{}
[in] Matriz com os valores de tempo da abertura das barras.
open[]
[in] Matriz com os valores dos preços de abertura.
high[]
[in] Matriz com os valores dos preços máximos.
low[]
[in] Matriz com os valores dos preços mínimos.
close[]
[in] Matriz com os valores dos preços de fechamento.
tick_volume[]
[in] Matriz com valores dos volumes de tick s.
volume[]
[in] Matriz com valores dos volumes de negociação.
spread[]
[in] Matriz com os valores de spread para barras.
Valor retornado
Valor de tipo int que será transferido como parâmetro prev_calculated, da próxima vez que a função
for chamada.
Observação
Se a função OnCalculate() retornar um valor zero, a janela DataW indow do terminal do cliente não
exibirá os valores do indicador.
Se os dados de preço foram alterados desde a última chamada da função OnCalculate() (um histórico
mais profundo foi carregado ou o histórico estava ausente), o valor do parâmetro de entrada
prev_calculated será definido como zero pelo próprio terminal.
Para determinar a direção da indexação nas matrizes time[], open[], high[], low[], close[],
tick_volume[], volume[] e spread[], é necess ário chamar a função ArrayGetAsSeries(). Para não
depender dos padrões, é absolutamente necess ário chamar a função ArraySetAsSeries() para aquelas
matrizes com as quais se deve trabalhar.
Ao usar a primeira versão da função, a séries temporais ou o indicador necess ário como uma matriz
price[] é selecionado pelo usuário na guia Parameters quando o indicador é iniciado. Para fazer isso,
você deve especificar o elemento desejado na lista suspensa do campo " Apply to" .
Para obter os valores do indicador personalizado a partir de outros programas MQL5, é usada a
função iCustom() que retorna o identificador do indicador para as operações subsequentes. Neste
caso, você pode especificar a matriz necess ária price[] ou o identificador da outro indicador. Este
parâmetro deve ser o último a ser passado na lista de variáveis de entrada do indicador
personalizado.
É necess ário usar o relacionamento entre o valor retornado pela função OnCalculate() e o segundo
parâmetro de entrada prev_calculated. O parâmetro prev_calculated, ao chamar a função, contém o
valor retornado pela função OnCalculate() na chamada anterior. Isso possibilita a implementação de
algoritmos econômicos para o cálculo do indicador personalizado, a fim de evitar cálculos repetitivos
para as barras que não foram alteradas desde a última inicialização desta função.
Exemplo de indicador
//+------------------------------------------------------------------+
//| 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 "Exemplo de cálculo do indicador Momentum"
}
//+------------------------------------------------------------------+
//| Cálculo do indicador Momentum |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total, // tamanho da matriz price[]
const int prev_calculated, // número de barras processadas anteriormente
const int begin, // começo dos valores significativos
const double &price[]) // matriz para o valor a ser processado
{
//--- posição inicial para cálculos
int StartCalcPosition=(IntPeriod-1)+begin;
//---- se não houver suficientes dados para cálculo
if(rates_total<StartCalcPosition)
return(0); // saímos com valor nulo - indicador não é calculado
//--- correct draw begin
if(begin>0)
PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,StartCalcPosition+(IntPeriod-1));
//--- começamos os cálculos, calculamos a posição do início
int pos=prev_calculated-1;
if(pos<StartCalcPosition)
pos=begin+IntPeriod;
//--- ciclo principal de cálculos
for(int i=pos;i<rates_total && !IsStopped();i++)
MomentumBuffer[i]=price[i]*100/price[i-IntPeriod];
//--- execução da OnCalculate concluída. Retornamos o novo valor de prev_calculated para a chamada
return(rates_total);
}
Veja também
ArrayGetAsSeries, ArraySetAsSeries, iCustom, Funções de processamento de eventos, Execução de
programas, Eventos do terminal do cliente, Acesso a séries temporais e indicadores
OnTimer
É chamada em EAs quando o ocorre o evento T imer gerado pelo terminal com um intervalo
predeterminado.
void OnTimer(void);
Valor retornado
Sem valor retornado
Observação
O evento T imer é gerado periodicamente pelo terminal do cliente para o EA que ativa o
temporizador usando a função EventSetT imer(). Geralmente, esta função é chamada na função
OnInit(). Ao concluir o trabalho do EA, é necess ário destruir o temporizador criado com a ajuda da
EventKillT imer() que, normalmente é chamada na função OnDeinit().
Cada EA e cada indicador trabalha com seu temporizador e recebe eventos apenas dele. No final do
trabalho do programa MQL5, o temporizador é forçosamente destruído, se foi criado, mas não foi
desabilitado pela função EventKillT imer().
Se precisar receber eventos do temporizador mais de uma vez por segundo, use a
EventSetMillisecondT imer() para criar um temporizador de alta resolução.
O testador de estratégia usa um intervalo mínimo de 1 000 milissegundos. Em geral, à medida que o
período do temporizador diminui, o tempo de teste aumenta, uma vez que o número de chamadas
do manipulador de eventos do tempo total aumenta. Ao trabalhar em tempo real, os eventos do
temporizador são gerados no máximo 1 vez a cada 10-16 milissegundos, o que é devido a limitações
de hardware.
Para cada programa, não pode ser iniciado mais do que um temporizador. Cada programa MQL5 e
cada gráfico têm sua própria fila de eventos, à qual são adicionados todos os eventos recém-
chegados. Se na fila já houver um evento T imer ou este evento estiver no estado de
processamento, o novo evento T imer não será colocado na fila do programa MQL5.
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- destruímos o temporizador no final do trabalho
EventKillTimer();
}
//+----------´--------------------------------------------------------+
//| Expert tck function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
}
//+------------------------------------------------------------------+
//| Timer function |
//+------------------------------------------------------------------+
void OnTimer()
{
//--- hora da primeira chamada da OnTimer()
static datetime start_time=TimeCurrent();
//--- hora do servidor de negociação na primeira chamada da OnTimer();
static datetime start_tradeserver_time=0;
//--- hora do servidor de negociação calculada
static datetime calculated_server_time=0;
//--- hora local no computador
datetime local_time=TimeLocal();
//--- hora estimada atual do servidor de negociação
datetime trade_server_time=TimeTradeServer();
//--- se por algum motivo a hora do servidor for desconhecida, sairemos antecipadamente
if(trade_server_time==0)
return;
//--- se o valor inicial do servidor de negociação ainda não estiver definido
if(start_tradeserver_time==0)
{
start_tradeserver_time=trade_server_time;
//--- definimos a hora calculada do servidor de negociação
Print(trade_server_time);
calculated_server_time=trade_server_time;
}
else
{
//--- aumentamos o tempo da primeira chamada da 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
//--- exibimos no gráfico os valores de todos os contadores
Comment(com);
}
Veja também
EventSetT imer, EventSetMillisecondT imer, EventKillT imer, GetT ick Count, GetMicrosecondCount,
Eventos do terminal do cliente
OnTrade
É chamada em EAs quando ocorre o evento T rade. A função se destina ao processamento de alterações
em listas de ordens, de posições e de transações.
void OnTrade(void);
Valor retornado
Sem valor retornado
Observação
A OnT rade() é chamada apenas para EAs, é ignorada em indicadores e em scripts, mesmo se você
adicionar uma função com esse nome e tipo a eles.
Para qualquer ação de negociação (colocação de uma ordem pendente, abertura/fechamento de uma
posição, definição de stops, desencadeamento de ordens pendentes, etc.), são devidamente
modificados o histórico de ordens e de transações e/ou a lista de posições e de ordens atuais.
Cada evento T rade pode ser o resultado de uma ou mais solicitações de negociação. As solicitações
de negociação são enviadas para o servidor usando OrderSend() ou OrderSendAs ync(). Cada
solicitação pode gerar v ários eventos de negociação. Você não pode confiar na regra «Uma
solicitação - Um evento 'T rade'», já que o processamento de solicitações pode ocorrer em v ários
estágios e cada operação pode alterar o status de ordens, de posições e do histórico de negociação.
O manipulador OnT rade() é chamado após a chamadas correspondentes da OnT radeT ransaction().
Em geral, não há correlação exata no número de chamadas da OnT rade() e da
OnT radeT ransaction(). Uma chamada da OnT rade() corresponde a uma ou mais chamadas da
OnT radeT ransaction.
Exemplo de EA com manipulador 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"
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
end=TimeCurrent();
start=end-days*PeriodSeconds(PERIOD_D1);
PrintFormat("Limites do histórico de negociação carregado: início - %s, fim - %s",
TimeToString(start),TimeToString(end));
InitCounters();
//---
return(0);
}
//+------------------------------------------------------------------+
//| Inicializando contadores de posições, de ordens e de transações |
//+------------------------------------------------------------------+
void InitCounters()
{
ResetLastError();
//--- carregamos o histórico
bool selected=HistorySelect(start,end);
if(!selected)
{
PrintFormat("%s. Não foi possível carregar no cache o histórico de %s a %s. Código de erro: %
__FUNCTION__,TimeToString(start),TimeToString(end),GetLastError());
return;
}
//--- obtemos os valores atuais
orders=OrdersTotal();
positions=PositionsTotal();
deals=HistoryDealsTotal();
history_orders=HistoryOrdersTotal();
started=true;
Print("Inicialização de contadores de ordens, de posições e de transações bem-sucedida");
}
//+------------------------------------------------------------------+
positions,curr_positions);
//--- atualizamo o valor
positions=curr_positions;
}
//--- alterações no número de transações no cache do histórico de negociação
if(curr_deals!=deals)
{
//--- número de transações no cache do histórico de negociação foi alterado
PrintFormat("O número de transações foi alterado de %d para %d",
deals,curr_deals);
//--- atualizamo o valor
deals=curr_deals;
}
//--- alterações no número de ordens históricas no cache do histórico de negociação
if(curr_history_orders!=history_orders)
{
//--- número de ordens históricas no cache do histórico de negociação foi alterado
PrintFormat("O número de ordens no histórico foi alterado de %d para %d",
history_orders,curr_history_orders);
//--- atualizamos o valor
history_orders=curr_history_orders;
}
//--- verificamos se é necessário alterar os limites do histórico de negociação para solicitação no
CheckStartDateInTradeHistory();
}
//+------------------------------------------------------------------+
//| alterações da data de início para a solicitação do histórico de negociação
//+------------------------------------------------------------------+
void CheckStartDateInTradeHistory()
{
//--- intervalo de início, se começarmos a trabalhar agora
datetime curr_start=TimeCurrent()-days*PeriodSeconds(PERIOD_D1);
//--- verificamos que o limite do início do histórico de transações seja inferior
//--- a 1 dia a partir da data planejada
if(curr_start-start>PeriodSeconds(PERIOD_D1))
{
//--- deve-se corrigir a data de início do histórico carregado no cache
start=curr_start;
PrintFormat("Novo limite de início do histórico de negociação carregado: início => %s",
TimeToString(start));
//--- agora recarregamos o histórico de transações para o intervalo atualizado
HistorySelect(start,end);
//--- corrigimos os contadores de transações e de ordens no histórico para a próxima comparaç
history_orders=HistoryOrdersTotal();
deals=HistoryDealsTotal();
}
}
//+------------------------------------------------------------------+
/* Exemplo de exibição:
Limites do histórico de negociação carregado: início - 2018.07.16 18:11, fim - 2018.07.23 18:11
Contadores de ordens, deposições e de transações inicializados com sucesso
O número de ordens foi alterado. Havia 0, há 1
O número de ordens foi alterado. Havia 1, há 0
O número de posições foi alterado. Havia 0, há 1
O número de transações foi alterado. Havia 0, há 1
O número de ordens no histórico foi alterado. Havia 0, há 1
*/
Veja também
OrderSend, OrderSendAs ync, OnT radeT ransaction, Eventos do terminal do cliente
OnTradeTransaction
É chamada em EAs quando ocorre o evento T radeT ransaction. A função é projetada para processar os
resultados de execução da solicitação de negociação.
void OnTradeTransaction()
const MqlTradeTransaction& trans, // estrutura da transação comercial
const MqlTradeRequest& request, // estrutura da solicitação
const MqlTradeResult& result // estrutura da resposta
);
Parâmetros
trans
[in] Variável do tipo MqlT radeT ransaction com descrição da transação feita na conta de
negociação.
request
[in] Variável do tipo MqlT radeR equest com descrição da solicitação que gerou a transação.
Contém os valores apenas para a transação de tipo TR ADE_TR ANSACTION_R EQUES T .
result
[in] Variável do tipo MqlT radeR esult com resultado da execução da solicitação que gerou a
transação. Contém os valores apenas para a transação de tipo TR ADE_TR ANSACTION_R EQUES T .
Valor retornado
Sem valor retornado
Observação
OnT radeT ransaction() é chamada para manipular o evento T radeT ransaction que o servidor de
negociação envia para o terminal nos seguintes casos :
· envio da solicitação de negociação a partir do programa MQL5 usando as funções
OrderSend()/OrderSendAs ync() e sua posterior execução;
· envio manual da solicitação de negociação através da interface gráfica e sua posterior execução;
· desencadeamento de ordens pendentes e ordens stop no servidor;
· execução de operações no lado do servidor de negociação.
Informações sobre o tipo de transação são contidas no campo type da variável trans . Os tipos de
trasações comerciais são descritas na enumeração ENUM _TR ADE_TR ANSACTION_TYPE:
· TR ADE_TR ANSACTI ON_ORDER_ADD – adição de uma nova ordem ativa
· TR ADE_TR ANSACTI ON_ORDER_UPDAT E – alteração da ordem ativa
· TR ADE_TR ANSACTI ON_ORDER_DELET E – remoção da ordem da lista de ordens ativas
· TR ADE_TR ANSACTI ON_DEAL _ADD – adição da transação ao histórico
· TR ADE_TR ANSACTI ON_DEAL _UPDAT E – alteração da transação no histórico
· TR ADE_TR ANSACTI ON_DEAL _DELET E – remoção da transação do histórico
· TR ADE_TR ANSACTI ON_HI S T ORY_ADD – adição da ordem ao histórico como resultado da execução
ou do cancelamento
· TR ADE_TR ANSACTI ON_HI S T ORY_UPDAT E – alteração da ordem que se encontra no histórico de
ordens
O envio de uma solicitação de compra leva a uma cadeia de transações comerciais feitas na conta
de negociação: 1) a solicitação é aceita para ser processada, 2) para a conta é criada a respectiva
solicitação de compra, 3) é executada a ordem, 4) a ordem executada é removida da lista de ordens
ativas, 5) adicionada ao histórico de ordens, 6) a transação correspondente é adicionada ao
histórico e 7) é criada uma nova posição. T odas essas ações são transações comerciais. A chegada
de cada transação desse tipo no terminal é um evento T radeT ransaction. FFNeste caso, não é
garantida a ordem de recepção destas transações ao terminal, portanto, não se pode construir seu
próprio algoritmo de negociação na expectativa de receber certas transações comerciais após a
chegada de outras.
Quando EA processa transações comerciais usando o manipulador OnT radeT ransaction(), o terminal
continua processando as transações recém-chegadas. Assim, o estado da conta de negociação pode
mudar já durante o funcionamento da OnT radeT ransaction(). Por exemplo, enquanto o programa
MQL5 manipula o evento de adição de nova ordem, ela pode ser executada, excluída da lista de
pedidos ordens abertas e movida para o histórico. No futuro, o programa será notificado de todos
esses eventos.
O manipulador OnT rade() é chamado após as respectivas chamadas da OnT radeT ransaction(). Em
geral, não há correlação exata no número de chamadas da OnT rade() e da OnT radeT ransaction().
Uma chamada da OnT rade() corresponde a uma ou mais chamadas da OnT radeT ransaction.
Cada evento T rade pode ser o resultado de uma ou mais solicitações de negociação. As solicitações
de negociação são enviadas para o servidor usando OrderSend() ou OrderSendAs ync(). Cada
solicitação pode gerar v ários eventos de negociação. Você não pode confiar na regra «Uma
solicitação - Um evento 'T rade'», já que o processamento de solicitações pode ocorrer em v ários
estágios e cada operação pode alterar o status de ordens, de posições e do histórico de negociação.
//+------------------------------------------------------------------+
int OnInit()
{
//---
PrintFormat("LAST PING=%.f ms",
TerminalInfoInteger(TERMINAL_PING_LAST)/1000.);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
}
//+------------------------------------------------------------------+
//| TradeTransaction function |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
const MqlTradeRequest &request,
const MqlTradeResult &result)
{
//---
static int counter=0; // contador de chamadas da OnTradeTransaction()
static uint lasttime=0; // hora da última chamada da OnTradeTransaction()
//---
uint time=GetTickCount();
//--- se a última operação tiver sido realizada há mais de 1 segundo,
if(time-lasttime>1000)
{
counter=0; // significa que se trata de uma nova operação de negociação e, portanto, podemos
if(IS_DEBUG_MODE)
Print(" Nova operação de negociação");
}
lasttime=time;
counter++;
Print(counter,". ",__FUNCTION__);
//--- resultado da execução do pedido de negociação
ulong lastOrderID =trans.order;
ENUM_ORDER_TYPE lastOrderType =trans.order_type;
ENUM_ORDER_STATE lastOrderState=trans.order_state;
//--- nome do símbolo segundo o qual foi realizada a transação
string trans_symbol=trans.symbol;
//--- tipo de transação
ENUM_TRADE_TRANSACTION_TYPE trans_type=trans.type;
switch(trans.type)
{
if(Exchange_ticket!="")
Exchange_ticket=StringFormat("Exchange ticket=%s",Exchange_ticket);
}
PrintFormat("MqlTradeTransaction: %s order #%d %s %s %s",EnumToString(trans_type),
lastOrderID,EnumToString(lastOrderType),EnumToString(lastOrderState),Exchange_
}
break;
}
//--- bilhete da ordem
ulong orderID_result=result.order;
string retcode_result=GetRetcodeID(result.retcode);
if(orderID_result!=0)
PrintFormat("MqlTradeResult: order #%d retcode=%s ",orderID_result,retcode_result);
//---
}
//+------------------------------------------------------------------+
//| converte códigos numéricos de respostas em códigos Mnemonic de string
//+------------------------------------------------------------------+
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;
Veja também
OrderSend, OrderSendAs ync, OnT radeT ransaction, Estrutura do pedido de negociação, Estrutura da
transação comercial, T ipos de transações comerciais, T ipos de operações de negociação, Eventos do
terminal do cliente
OnBookEvent
É chamada em indicadores e EAs quando ocorre o evento Book Event. A função é projetada para
processar alterações no livro de ofertas (Depth of Mark et).
void OnBookEvent(
const string& symbol // símbolo
);
Parâmetros
symbol
[in] Nome do instrumento financeiro em que ocorre o evento Book Event
Valor retornado
Sem valor retornado
Observação
Para receber eventos Book Event em qualquer símbolo, basta fazer uma pré-assinatura a fim de
receber esses eventos para este símbolo usando a função Mark etBook Add(). Para cancelar a
assinatura de recebimento do evento Book Event num símbolo específico, você deve chamar a função
Mark etBookR elease().
O evento Book Event é difundido no gráfico. Isso significa que basta que um aplicativo no gráfico
assine a recepção do evento Book Event usando a função Mark etBook Add, para todos os outros
indicadores e EAs - que estão sendo executados neste gráfico e que têm o manipulador
OnBook Event() - receberem esse evento. Por isso, você precisa analisar o nome do símbolo que é
transferido para o manipulador OnBook Event() como um parâmetro symbol.
Para todos os aplicativos em andamento no mesmo gráfico, são executados contadores separados
para receber eventos Book Event na seção de símbolos. Isso significa que em cada gráfico pode
haver assinaturas de diferentes símbolos, e para cada símbolo existe seu próprio contador.
Assinatura e remoção de assinatura de eventos Book Event alteram o contador de assinaturas só dos
símbolos especificados, apenas dentro do mesmo gráfico. Isso significa que, em dois gráficos
adjacentes, pode haver assinaturas de eventos Book Event para o mesmo símbolo, mas com valores
diferentes para o contador de assinaturas.
O valor inicial do contador de assinaturas é zero. Após cada chamada da Mark etBook Add(), o
contador de assinaturas para o símbolo especificado neste gráfico é aumentado em 1 (não é
necess ário o símbolo do gráfico e o símbolo na Mark etBook Add() coincidirem). Após a chamada da
Mark etBookR elease(), o contador de assinaturas para o símbolo especificado dentro do gráfico é
reduzido em 1. A transmissão de eventos Book Event em qualquer símbolo dentro do gráfico continua
até que o contador de assinaturas para este símbolo se torne zero. Portanto, é importante que cada
programa MQL5 contendo chamadas da Mark etBook Add(), ao concluir seu trabalho, corretamente
cancele a recepção de eventos para cada símbolo com a ajuda da Mark etBookR elease(). Para isso,
basta que - para cada chamada - o número de chamadas da Mark etBook Add() e da
Mark etBookR elease() seja par durante toda a vida útil do programa MQL5. Usar sinalizadores ou
próprios contadores de assinaturas dentro do programa permite trabalhar com segurança com
eventos Book Event e impede a remoção de assinaturas de recepção desse evento em programas de
terceiros dentro do mesmo gráfico.
Os eventos Book Event nunca são ignorados e sempre são enfileirados, mesmo que o processamento
do evento Book Event anterior ainda não tenha sido concluído. Deve-se ter em mente que os eventos
Book Event são entregues por eles mesmos e não levam consigo o status do livro de ofertas. Isso
significa que a chamada da Mark etBookGet() a partir do manipulador OnBook Event() permite - em
vez do status do livro de ofertas que causou o envio do evento Book Event - obter o status atual do
livro de ofertas no momento da chamada. Para garantir que todos os status exclusivos sejam
obtidos, a função OnBook Event() deve ser o mais rápida possível.
Exemplo
//+------------------------------------------------------------------+
//| 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/pt/articles/2635"
#property version "1.00"
#property description "Exemplo de medição da velocidade de atualização do livro de ofertas usando O
#property description "Código é retirado do artigo https://www.mql5.com/pt/articles/2635"
//--- parâmetros de entrada
input ulong ExtCollectTime =30; // tempo de teste em segundos
input ulong ExtSkipFirstTicks=10; // número de ticks ignorados no início
//--- sinalizador da presença de assinatura de recepção de eventos BookEvent
bool book_subscribed=false;
//--- matriz para receber solicitações a partir do livro de ofertas
MqlBookInfo book[];
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- definimos o início
Comment(StringFormat("Aguardamos a recepção dos primeiros %I64u ticks",ExtSkipFirstTicks));
PrintFormat("Aguardamos a recepção dos primeiros %I64u ticks",ExtSkipFirstTicks);
//--- ativamos a transmissão do livro de ofertas
if(MarketBookAdd(_Symbol))
{
book_subscribed=true;
PrintFormat("%s: Função MarketBookAdd(%s) retornou true",__FUNCTION__,_Symbol);
}
else
PrintFormat("%s: Função MarketBookAdd(%s) retornou false! GetLastError()=%d",__FUNCTION__,_Sy
//--- inicialização bem-sucedida
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Deinitialize expert |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- exibimos o código de motivo da desinicialização
Print(__FUNCTION__,": Código de motivo da desinicialização = ",reason);
//--- cancelamos nossa assinatura de recepção de eventos a partir do livro de ofertas
if(book_subscribed)
{
if(!MarketBookRelease(_Symbol))
PrintFormat("%s: MarketBookRelease(%s) retornou false! GetLastError()=%d",_Symbol,GetLastE
else
book_subscribed=false;
}
//---
}
//+------------------------------------------------------------------+
//| BookEvent function |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
{
static ulong starttime=0; // tempo de início do teste
static ulong tickcounter=0; // contador de atualização do livro de ofertas
//--- trabalhamos com eventos do livro de ofertas somente se ele tiver sido assinado por nós mesmos
if(!book_subscribed)
return;
//--- consideramos atualizações apenas do próprio símbolo
if(symbol!=_Symbol)
return;
//--- pulamos os primeiros ticks para a limpeza primária da fila e para aquecimento
tickcounter++;
if(tickcounter<ExtSkipFirstTicks)
return;
//--- lembramo-nos do tempo de início
if(tickcounter==ExtSkipFirstTicks)
starttime=GetMicrosecondCount();
//--- consultamos os dados do livro de ofertas
MarketBookGet(symbol,book);
//--- quando se deve parar?
ulong endtime=GetMicrosecondCount()-starttime;
ulong ticks =1+tickcounter-ExtSkipFirstTicks;
// quanto tempo passou em microssegundos desde o início do teste?
if(endtime>ExtCollectTime*1000*1000)
{
PrintFormat("%I64u ticks for %.1f seconds: %.1f ticks/sec ",ticks,endtime/1000.0/1000.0,ticks
ExpertRemove();
return;
}
//--- exibição dos contadores no campo de comentários
if(endtime>0)
Comment(StringFormat("%I64u ticks for %.1f seconds: %.1f ticks/sec ",ticks,endtime/1000.0/100
}
Veja também
Mark etBook Add, Mark etBookR elease, Mark etBookGet, OnT rade, OnT radeT ransaction, OnT ick ,
Função de manipulação de eventos, Execução do programa, Eventos do terminal do cliente
OnChartEvent
É chamada em EAs e indicadores quando ocorre o evento ChartEvent. A função é projetada para
processar mudanças no gráfico causadas por ações do usuário ou pelo funcionamento de programas
MQL5
void OnChartEvent()
const int id, // identificador de evento
const long& lparam, // parâmetro do evento de tipo long
const double& dparam, // parâmetro do evento de tipo double
const string& sparam // parâmetro do evento de tipo string
);
Parâmetros
id
[in] Identificador do evento a partir da enumeração ENUM _CH ART_EVENT .
lparam
[in] Parâmetro do evento de tipo long
dparam
[in] Parâmetro do evento de tipo double
sparam
[in] Parâmetro do evento de tipo string
Valor retornado
Sem valor retornado
Observação
Existem 11 tipos de eventos que podem ser processados usando a função predefinida
OnChartEvent() . Para eventos personalizados, são fornecidos 65 535 identificadores no intervalo de
CH ART EVENT_CUS T OM a CH ART EVENT_CUS T OM _LAS T . Para gerar um evento personalizado, você
deve usar a função EventChartCustom().
propriedades do
gráfico através
do diálogo de
propriedades
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//--- contador de ticks para gerar o evento personalizado
static int tick_counter=0;
//--- vamos dividir os ticks acumulados por este número
int simple_number=113;
//---
tick_counter++;
//--- enviamos o m evento personalizado se o contador de ticks for um múltiplo de simple_number
if(tick_counter%simple_number==0)
{
//--- formaremos o identificador do evento personalizado no intervalo de 0 a 65535
ushort custom_event_id=ushort(tick_counter%65535);
//--- enviamos um evento personalizado com preenchimento dos parâmetros
EventChartCustom(ChartID(),custom_event_id,tick_counter,SymbolInfoDouble(Symbol(),SYMBOL_BID)
//--- fazemos a exibição do log para estudar e analisar os resultados do exemplo
Print(__FUNCTION__,": Evento personalizado enviado com ID=",custom_event_id);
}
//---
}
//+------------------------------------------------------------------+
//| ChartEvent function |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
const long &lparam,
const double &dparam,
const string &sparam)
{
//--- pressionamento de tecla
if(id==CHARTEVENT_KEYDOWN)
{
switch((int)lparam)
{
case KEY_NUMLOCK_LEFT: Print("KEY_NUMLOCK_LEFT pressionado"); break;
case KEY_LEFT: Print("KEY_LEFT pressionado"); break;
case KEY_NUMLOCK_UP: Print("KEY_NUMLOCK_UP pressionado"); break;
case KEY_UP: Print("KEY_UP pressionado"); break;
case KEY_NUMLOCK_RIGHT: Print("KEY_NUMLOCK_RIGHT pressionado"); break;
case KEY_RIGHT: Print("KEY_RIGHT pressionado"); break;
case KEY_NUMLOCK_DOWN: Print("KEY_NUMLOCK_DOWN pressionado"); break;
case KEY_DOWN: Print("KEY_DOWN pressionado"); break;
case KEY_NUMPAD_5: Print("KEY_NUMPAD_5 pressionado"); break;
case KEY_NUMLOCK_5: Print("KEY_NUMLOCK_5 pressionado"); break;
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
}
//--- redimensionando o gráfico ou alterando as propriedades do gráfico através do diálogo de propr
if(id==CHARTEVENT_CHART_CHANGE)
Print("Redimensionamento ou alteração das propriedades do gráfico");
//--- evento personalizado
if(id>CHARTEVENT_CUSTOM)
PrintFormat("Evento personalizado ID=%d, lparam=%d, dparam=%G, sparam=%s",id,lparam,dparam,sp
}
//+------------------------------------------------------------------+
//| MouseState |
//+------------------------------------------------------------------+
string MouseState(uint state)
{
string res;
res+="\nML: " +(((state& 1)== 1)?"DN":"UP"); // mouse left
res+="\nMR: " +(((state& 2)== 2)?"DN":"UP"); // mouse right
res+="\nMM: " +(((state&16)==16)?"DN":"UP"); // mouse middle
res+="\nMX: " +(((state&32)==32)?"DN":"UP"); // mouse first X key
res+="\nMY: " +(((state&64)==64)?"DN":"UP"); // mouse second X key
res+="\nSHIFT: "+(((state& 4)== 4)?"DN":"UP"); // shift key
res+="\nCTRL: " +(((state& 8)== 8)?"DN":"UP"); // control key
return(res);
}
Veja também
EventChartCustom, T ipos de eventos do gráfico, Funções de processamento de eventos, Execução
do programa, Evento do terminal do cliente
OnTester
É chamada em EAs quando ocorre o evento T ester para executar as ações necess árias no final do
teste.
double OnTester(void);
Valor retornado
Valor de um critério de otimização personalizado para avaliar os resultados do teste.
Observação
A função OnT ester() só pode ser usada em EAs durante o teste e é projetada principalmente para
calcular um determinado valor a ser usado como critério " Custom max " ao otimizar parâmetros de
entrada.
Assim, usando a função OnT ester(), você pode não apenas criar e salvar seus próprios relatórios de
resultados de testes, mas também controlar o processo de otimização para encontrar os melhores
parâmetros da estratégia de negociação.
//+------------------------------------------------------------------+
//| 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 "Exemplo de EA com manipulador OnTester()"
#property description "Como critério de otimização personalizado "
#property description "é retornado o coeficiente de regressão linear do gráfico de saldo,"
#property description "dividido pelo erro quadrático médio do desvio"
//--- conectamos a classe de operações de negociação
#include <Trade\Trade.mqh>
//--- parâmetros de entrada do EA
input double Lots = 0.1; // Volume
input int Slippage = 10; // Derrapagem admissível
input int MovingPeriod = 80; // Período de média móvel
input int MovingShift = 6; // Deslocamento de média móvel
//--- variáveis globais
int IndicatorHandle=0; // identificador do indicador
bool IsHedging=false; //sinal da conta
void CheckForClose(void)
{
MqlRates rt[2];
//--- negociamos apenas no início da barra nova
if(CopyRates(_Symbol,_Period,0,2,rt)!=2)
{
Print("CopyRates of ",_Symbol," failed, no history");
return;
}
if(rt[1].tick_volume>1)
return;
//--- obtemos os valores da média móvel
double ma[1];
if(CopyBuffer(IndicatorHandle,0,1,1,ma)!=1)
{
Print("CopyBuffer from iMA failed, no data");
return;
}
//--- posição já foi selecionada usando PositionSelect()
bool signal=false;
long type=PositionGetInteger(POSITION_TYPE);
//--- a vela se abriu mais acima, mas fechou abaixo da média móvel - fechamos a posição curta
if(type==(long)POSITION_TYPE_SELL && rt[0].open>ma[0] && rt[0].close<ma[0])
signal=true;
//--- a vela se abriu mais abaixo, mas fechou acima da média móvel - fechamos a posição longa
if(type==(long)POSITION_TYPE_BUY && rt[0].open<ma[0] && rt[0].close>ma[0])
signal=true;
//--- verificações adicionais
if(signal)
{
if(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) && Bars(_Symbol,_Period)>100)
trade.PositionClose(_Symbol,Slippage);
}
//---
}
//+------------------------------------------------------------------+
//| Selecionamos a posição com base no tipo de conta: Netting ou Hedging
//+------------------------------------------------------------------+
bool SelectPosition()
{
bool res=false;
//--- seleção da posição para a conta Hedging
if(IsHedging)
{
uint total=PositionsTotal();
for(uint i=0; i<total; i++)
{
string position_symbol=PositionGetSymbol(i);
if(_Symbol==position_symbol && EA_MAGIC==PositionGetInteger(POSITION_MAGIC))
{
res=true;
break;
}
}
}
//--- seleção da posição para a conta Netting
else
{
if(!PositionSelect(_Symbol))
return(false);
else
return(PositionGetInteger(POSITION_MAGIC)==EA_MAGIC); //---verificação do Magic number
}
//--- resultado da execução
return(res);
}
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit(void)
{
//--- definimos o tipo de negociação: Netting ou Hedging
IsHedging=((ENUM_ACCOUNT_MARGIN_MODE)AccountInfoInteger(ACCOUNT_MARGIN_MODE)==ACCOUNT_MARGIN_MOD
//--- inicializamos o objeto para o controle correto das posições
trade.SetExpertMagicNumber(EA_MAGIC);
trade.SetMarginMode();
trade.SetTypeFillingBySymbol(Symbol());
trade.SetDeviationInPoints(Slippage);
//--- criamos o indicador Moving Average
IndicatorHandle=iMA(_Symbol,_Period,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE);
if(IndicatorHandle==INVALID_HANDLE)
{
printf("Erro ao criar o indicador iMA");
return(INIT_FAILED);
}
//--- ok
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick(void)
{
//--- se a posição já estiver aberta, verificamos condição de fechamento
if(SelectPosition())
CheckForClose();
// verificamos a condição para abertura da posição
CheckForOpen();
//---
}
//+------------------------------------------------------------------+
//| Tester function |
//+------------------------------------------------------------------+
double OnTester()
{
//--- valor do critério de otimização personalizado (quanto mais, melhor)
double ret=0.0;
//--- obtemos os resultados dos trades na matriz
double array[];
double trades_volume;
GetTradeResultsToArray(array,trades_volume);
int trades=ArraySize(array);
//--- se há menos de 10 trades, o teste não gerou resultados positivos
if(trades<10)
return (0);
//--- resultado médio no trade
double average_pl=0;
for(int i=0;i<ArraySize(array);i++)
average_pl+=array[i];
average_pl/=trades;
//--- exibimos uma mensagem para o modo de teste único
if(MQLInfoInteger(MQL_TESTER) && !MQLInfoInteger(MQL_OPTIMIZATION))
PrintFormat("%s: Trades=%d, Lucro médio=%.2f",__FUNCTION__,trades,average_pl);
//--- calculamos os coeficientes de regressão linear para o gráfico de lucro
double a,b,std_error;
double chart[];
if(!CalculateLinearRegression(array,chart,a,b))
return (0);
//--- calculamos o erro de desvio do gráfico em relação à linha de regressão
if(!CalculateStdError(chart,a,b,std_error))
return (0);
//--- calculamos o rácio do lucro de tendência em relação ao desvio padrão
ret=(std_error == 0.0) ? a*trades : a*trades/std_error;
//--- retornamos o valor do critério de otimização personalizado
return(ret);
}
//+------------------------------------------------------------------+
//| Obtendo a matriz de lucros/perdas de transações |
//+------------------------------------------------------------------+
bool GetTradeResultsToArray(double &pl_results[],double &volume)
{
//--- consultamos o histórico de negociação completo
if(!HistorySelect(0,TimeCurrent()))
return (false);
uint total_deals=HistoryDealsTotal();
volume=0;
//--- definimos o tamanho inicial da matriz pelo número de transações no histórico
ArrayResize(pl_results,total_deals);
//--- contador de trades que fixam o resultado da negociação - lucro ou perda
int counter=0;
ulong ticket_history_deal=0;
//--- passar por todos os trades
for(uint i=0;i<total_deals;i++)
{
//--- selecionamos o trade
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);
//--- estamos interessados apenas em operações de negociação
if((deal_type!=DEAL_TYPE_BUY) && (deal_type!=DEAL_TYPE_SELL))
continue;
//--- somente trades com fixação de lucro/perda
if(deal_entry!=DEAL_ENTRY_IN)
{
//--- escrevemos o resultado da negociação na matriz e aumentamos o contador de trades
pl_results[counter]=deal_profit;
volume+=deal_volume;
counter++;
}
}
}
//--- definimos o tamanho final da matriz
ArrayResize(pl_results,counter);
return (true);
}
//+------------------------------------------------------------------+
//| Calculando a regressão linear de tipo y=a*x+b |
//+------------------------------------------------------------------+
bool CalculateLinearRegression(double &change[],double &chartline[],
double &a_coef,double &b_coef)
{
//--- verificamos se há suficientes dados
if(ArraySize(change)<3)
return (false);
//--- criamos a matriz do gráfico com acumulação
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];
//--- agora calculamos os coeficientes de regressão
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);
}
//+------------------------------------------------------------------+
//| Calcula o erro quadrático médio do desvio para os a e b definidos
//+------------------------------------------------------------------+
bool CalculateStdError(double &data[],double a_coef,double b_coef,double &std_err)
{
//--- soma dos quadrados dos erros
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);
}
Veja também
T este de estratégias de negociação, T esterH ideIndicators, T rabalhando com os resultados da
otimização, T esterStatistics, OnT esterInit, OnT esterDeinit, OnT esterPass, MQL _T ES T ER ,
MQL _OPTIM IZATION, FileOpen, FileW rite, FileLoad, FileSave
OnTesterInit
É chamada em EAs quando ocorre o evento T esterInit para executar as ações necess árias antes do
início da otimização no testador de estratégia. Existem duas vers ões da função.
Valor retornado
Valor do tipo int, zero significa inicialização bem-sucedida do EA em execução no gráfico antes do
início da otimização.
O uso da chamada da OnT esterInit() com o retorno de resultado é prioridade, pois este método
permite não apenas inicializar o programa, mas também retornar o código de erro em caso de término
antecipado da otimização. R etorno de qualquer valor diferente de INIT_S UCCEEDED (0) significa um
erro e não será inicializada a otimização.
Versão sem retorno do resultado é deixada apenas para compatibilidade com códigos antigos. Não é
recomendada
void OnTesterInit(void);
Observação
O evento T esterInit é gerado automaticamente antes do início da otimização do EA no testador de
estratégias.Para esse evento, o EA com manipulador OnT esterDeinit() e/ou OnT esterPass() é
carregado automaticamente num gráfico de terminal separado com o símbolo e o período
especificados no testador.
Esse EA recebe os eventos T esterInit, T esterDeinit e T esterPass, mas, não, os eventos Init, Deinit e
NewT ick . Assim, toda lógica necess ária para processar os resultados de cada passagem durante a
otimização deve ser implementada nos manipuladores OnT esterInit(), OnT esterDeinit() e
OnT esterPass().
O resultado de cada passagem única ao otimizar uma estratégia pode ser passado por um quadro a
partir do manipulador OnT ester() com a ajuda da função FrameAdd().
A função OnT esterInit() se destina a inicializar o EA antes de iniciar a otimização para o seguinte
processamento de resultados de otimização. É sempre usada em conjunto com o manipulador
OnT esterDeinit().
//+------------------------------------------------------------------+
//| 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"
#property description "Exemplo de EA com manipulador OnTesterInit()"
#property description "em que são definidos valores e limites "
#property description "de parâmetros de entrada ao otimizar"
//+------------------------------------------------------------------+
//| TesterDeinit function |
//+------------------------------------------------------------------+
void OnTesterDeinit()
{
//--- duração da otimização
string log_message=StringFormat("%s: a otimização demorou %d segundos",
__FUNCTION__,TimeLocal()-optimization_start);
PrintFormat(log_message);
report=report+"\r\n"+log_message;
Comment(report);
}
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- inicializamos as variáveis globais
last_atr=0;
last_body=0;
//--- definimos o volume correto
double min_lot=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
trade_lot=lots>min_lot? lots:min_lot;
//--- criamos o identificador do indicador ATR
atr_handle=iATR(_Symbol,_Period,ATRperiod);
if(atr_handle==INVALID_HANDLE)
{
PrintFormat("%s: não foi possível criar o iATR, código de erro %d",__FUNCTION__,GetLastError(
return(INIT_FAILED);
}
//--- inicialização bem-sucedida do EA
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//--- sinal de negociação
static int signal=0; // +1 significa um sinal de compra, -1 significa um sinal de venda
//--- verificamos e fechamos as posições abertas antigas, abertas há mais de holdbars barras atrás
ClosePositionsByBars(holdbars,slippage,EXPERT_MAGIC);
//--- verificamos o surgimento de uma nova barra
if(isNewBar())
{
//--- verificamos a presença de sinal
signal=CheckSignal();
}
//--- se aberta uma posição de 'netting', ignoramos o sinal e esperamos até que ele feche
}
else
PrintFormat("%s: Não foi possível obter o valor do indicador ATR! Erro",__FUNCTION__,GetLastE
//--- se estiver ativado o modo de negociação de reversão
res=revers?-res:res; // se necessário, revertemos o sinal (em vez de 1, retornamos -1, e, em ve
//--- retornamos o valor do sinal de negociação
return (res);
}
//+------------------------------------------------------------------+
//| Retornando true quando aparece uma nova barra |
//+------------------------------------------------------------------+
bool isNewBar(const bool print_log=true)
{
static datetime bartime=0; // armazenamos o tempo de abertura da barra atual
//--- obtemos o tempo de abertura da barra zero
datetime currbar_time=iTime(_Symbol,_Period,0);
//--- se o tempo de abertura mudar, é porque apareceu uma nova barra
if(bartime!=currbar_time)
{
bartime=currbar_time;
lastbar_timeopen=bartime;
//--- exibir no log informações sobre o tempo de abertura da nova barra
if(print_log && !(MQLInfoInteger(MQL_OPTIMIZATION)||MQLInfoInteger(MQL_TESTER)))
{
//--- exibimos uma mensagem sobre o tempo de abertura da nova barra
PrintFormat("%s: new bar on %s %s opened at %s",__FUNCTION__,_Symbol,
StringSubstr(EnumToString(_Period),7),
TimeToString(TimeCurrent(),TIME_SECONDS));
//--- obtemos os dados do último tick
MqlTick last_tick;
if(!SymbolInfoTick(Symbol(),last_tick))
Print("SymbolInfoTick() failed, error = ",GetLastError());
//--- exibimos o tempo do último tick em segundos
PrintFormat("Last tick was at %s.%03d",
TimeToString(last_tick.time,TIME_SECONDS),last_tick.time_msc%1000);
}
//--- temos uma nova barra
return (true);
}
//--- não há nenhuma barra nova
return (false);
}
//+------------------------------------------------------------------+
//| Comprando a mercado com o volume especificado |
//+------------------------------------------------------------------+
bool Buy(double volume,ulong deviation=10,ulong magicnumber=0)
{
//--- compramos a mercado
return (MarketOrder(ORDER_TYPE_BUY,volume,deviation,magicnumber));
}
//+------------------------------------------------------------------+
//| Vendendo a mercado com o volume definido |
//+------------------------------------------------------------------+
bool Sell(double volume,ulong deviation=10,ulong magicnumber=0)
{
//--- vendemos a mercado
return (MarketOrder(ORDER_TYPE_SELL,volume,deviation,magicnumber));
}
//+------------------------------------------------------------------+
//| Fechando posições segundo o tempo de retenção nas barras |
//+------------------------------------------------------------------+
void ClosePositionsByBars(int holdtimebars,ulong deviation=10,ulong magicnumber=0)
{
int total=PositionsTotal(); // número de posições abertas
//--- pesquisa detalhada de todas as posições abertas
for(int i=total-1; i>=0; i--)
{
//--- parâmetros da posição
ulong position_ticket=PositionGetTicket(i); // boleta d
string position_symbol=PositionGetString(POSITION_SYMBOL); // símbolo
ulong magic=PositionGetInteger(POSITION_MAGIC); // MagicNum
datetime position_open=(datetime)PositionGetInteger(POSITION_TIME); // tempo de
int bars=iBarShift(_Symbol,PERIOD_CURRENT,position_open)+1; // há quant
//--- se a posição tem vivido por um longo tempo, e também o MagicNumber e o símbolo são os m
if(bars>holdtimebars && magic==magicnumber && position_symbol==_Symbol)
{
int digits=(int)SymbolInfoInteger(position_symbol,SYMBOL_DIGITS); // número d
double volume=PositionGetDouble(POSITION_VOLUME); // volume d
ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); // tipo de
string str_type=StringSubstr(EnumToString(type),14);
StringToLower(str_type); // reduzimos o registro do texto para uma correta formatação da m
PrintFormat("Fechamos a posição #%d %s %s %.2f",
position_ticket,position_symbol,str_type,volume);
//--- definindo o tipo de ordem e de envio do pedido de negociação
if(type==POSITION_TYPE_BUY)
MarketOrder(ORDER_TYPE_SELL,volume,deviation,magicnumber,position_ticket);
else
MarketOrder(ORDER_TYPE_BUY,volume,deviation,magicnumber,position_ticket);
}
}
}
//+------------------------------------------------------------------+
//| Preparando e enviando uma solicitação de negociação |
//+------------------------------------------------------------------+
bool MarketOrder(ENUM_ORDER_TYPE type,double volume,ulong slip,ulong magicnumber,ulong pos_ticket=0
{
//--- declaração e inicialização de estruturas
MqlTradeRequest request={};
MqlTradeResult result={};
double price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
if(type==ORDER_TYPE_BUY)
price=SymbolInfoDouble(Symbol(),SYMBOL_ASK);
//--- parâmetros da solicitação
request.action =TRADE_ACTION_DEAL; // tipo de operação de negociação
request.position =pos_ticket; // boleta da posição, se fechada
request.symbol =Symbol(); // símbolo
request.volume =volume; // volume
request.type =type; // tipo de ordem
request.price =price; // preço de transação
request.deviation=slip; // desvio permitido em relação ao preço
request.magic =magicnumber; // MagicNumber da ordem
//--- envio do pedido
if(!OrderSend(request,result))
{
//--- exibimos as informações sobre a falha
PrintFormat("OrderSend %s %s %.2f at %.5f error %d",
request.symbol,EnumToString(type),volume,request.price,GetLastError());
return (false);
}
//--- relatamos sobre a operação bem-sucedida
PrintFormat("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order);
return (true);
}
Veja também
T este de estratégias de negociação, T rabalhando com resultados de otimização, OnT esterDeinit,
OnT esterPass, ParameterGetR ange, ParameterSetR ange
OnTesterDeinit
É chamada em EAs quando ocorre o evento T esterDeinit para realizar as ações necess árias após a
otimização do EA.
void OnTesterDeinit(void);
Valor retornado
Sem valor retornado
Observação
O evento T esterDeinit é gerado automaticamente no final da otimização do EA no testador de
estratégia.
EA com manipulador OnT esterDeinit() ou OnT esterPass() que é carregado automaticamente num
gráfico de terminal separado com o símbolo e o período especificados no testador quando é iniciada
a otimização. A função se destina ao processamento final de todos os resultados de otimização.
Deve ser lembrado que os quadros de otimização enviados pelos agentes de teste usando a função
FrameAdd() podem vir em pacotes e levar tempo para serem entregues. Portanto, nem todos os
quadros e, consequentemente, os eventos T esterPass, podem ser recebidos e processados antes do
final da otimização na OnT esterPass(). Portanto, para garantir o recebimento de todos os quadros
atrasados na OnT esterDeinit(), você precisa colocar um bloco de código usando a função
FrameNext().
Veja também
T este de estratégias de negociação, T rabalhando com os resultados da otimização, T esterStatistics,
OnT esterInit, OnT esterPass, ParameterGetR ange, ParameterSetR ange
OnTesterPass
É chamada em EAs quando ocorre o evento T esterPass para processar o novo quadro de dados durante
a otimização do EA.
void OnTesterPass(void);
Valor retornado
Sem valor retornado
Observação
O evento T esterPass é gerado automaticamente quando chega um quadro durante a otimização do
EA no testador de estratégia.
EA com manipulador OnT esterDeinit() ou OnT esterPass() que é carregado automaticamente num
gráfico de terminal separado com o símbolo e o período especificados no testador quando é iniciada
a otimização. A função é projetada para processar quadros recebidos de agentes de teste durante a
otimização. O envio do quadro com resultados de teste deve ser feito a partir do manipulador
OnT ester() usando a função FrameAdd().
Deve ser lembrado que os quadros de otimização enviados pelos agentes de teste usando a função
FrameAdd() podem vir em pacotes e levar tempo para serem entregues. Portanto, nem todos os
quadros e, consequentemente, os eventos T esterPass, podem ser recebidos e processados antes do
final da otimização na OnT esterPass(). Portanto, para garantir o recebimento de todos os quadros
atrasados na OnT esterDeinit(), você precisa colocar um bloco de código usando a função
FrameNext().
Após concluída a otimização de OnT esterDeinit(), você pode classificar novamente todos os quadros
com a ajuda das funções FrameFirst()/FrameFilter e FrameNext().
Veja também
T este de estratégias de negociação, T rabalhando com resultados de otimização, OnT esterInit,
OnT esterDeinit, FrameFirst, FrameFilter, FrameNext, FrameInputs
Função Ação
S ymbols T otal R etorna o número de ativos disponíveis
(selecionados na janela Observação de Mercado
ou todos)
SymbolsTotal
R etorna o número de ativos disponíveis (selecionados na janela Observação do Mercado ou todos os
ativos).
int SymbolsTotal(
bool selected // True - somente ativos em Observador de Mercado
);
Parâmetros
selected
[in] Mode de solicitação. Pode ser true ou false.
Valor do Retorno
Se o parâmetro 'selected' for true, a função retorna o número de ativos selecionados na janela
Observador de Mercado. Se o valor for false, ela retorna o número total de todos os ativos.
SymbolExist
Verifica se há um símbolo com o nome especificado.
bool SymbolExist(
const string name, // nome do símbolo
bool& is_custom // tipo de símbolo personalizado
);
Parâmetros
nome
[in] Nome do símbolo.
is_custom
[out] T ipo de símbolo personalizado que é definido após a execução bem-sucedida. Se for true, o
símbolo encontrado é personalizado.
Valor retornado
R etorna false se o símbolo não for encontrado entre os padrão ou entre os símbolos personalizados.
Veja também
S ymbols T otal, S ymbolSelect, Símbolos personalizados
SymbolName
R etorna o nome de um ativo.
string SymbolName(
int pos, // número na lista
bool selected // true - somente ativos em Observador de Mercado
);
Parâmetros
pos
[in] Número de ordem de um ativo.
selected
[in] Mode de solicitação. Se o valor for true, o ativo é tomado da lista de ativos selecionados na
janela Observador de Mercado. Se o valor for false, o ativo é tomado da lista geral.
Valor do Retorno
Valor de tipo string com o nome do ativo.
SymbolSelect
Seleciona um ativo da janela Observador de Mercado ou remove um ativo desta janela.
bool SymbolSelect(
string name, // nome do ativo
bool select // adicionar ou remover
);
Parâmetros
name
[in] Nome do ativo.
select
[in] Alterna. Se o valor for false, o ativo deve ser removido do Observador de Mercado, caso
contrário o ativo deve ser selecionado nesta janela. Um ativo não pode ser removido se o gráfico
do ativo estiver aberto, ou houver posições em aberto deste ativo.
Valor do Retorno
Em caso de falha retorna false.
SymbolIsSynchronized
A função verifica se os dados de um ativo selecionado no terminal estão sincronizados com os dados
no servidor de negociação.
bool SymbolIsSynchronized(
string name, // nome do ativo
);
Parâmetros
name
[in] Nome do ativo.
Valor de retorno
Se os dados estiverem sincronizados, retorna 'true'; caso contrário, retorna 'false'.
Também Veja
S ymbolInfoInteger, Organizando Acesso a Dados
SymbolInfoDouble
R etorna a propriedade correspondente de um ativo especificado. Existem 2 variantes da função.
2. R etorna true ou false dependendo se a função for executada com sucesso. Em caso de sucesso, o
valor da propriedade é colocado em uma variável recipiente, passada por referênce atráves do último
parâmetro.
bool SymbolInfoDouble(
string name, // ativo
ENUM_SYMBOL_INFO_DOUBLE prop_id, // identificador da propriedade
double& double_var // aqui nós assumimos o valor da propriedade
);
Parâmetros
name
[in] Nome do ativo.
prop_id
[in] Identificador de um propriedade de ativo. O valor pode ser um dos valores da enumeração
ENUM _S YM BOL _INFO_DOUBLE.
double_var
[out] Variável de tipo double recebendo o valor da propriedade solicitada.
Valor do Retorno
Valor de tipo double. Em caso de falha de execução, a informação sobre o erro pode ser obtida
usando a função GetLastError():
· 5040 – parâmetro de string inv álido para especificar um nome de ativo,
· 4301 – ativo desconhecido (instrumento financeiro),
· 4302 – ativo não está selecionado no " Observador de Mercado" (não encontrado na lista de ativos
disponíveis),
· 4303 – identificador inv álido de uma propriedade de ativo.
Observação
É recomendável usar S ymbolInfoT ick () se a função for usada para obter informações sobre o último
tick . É bom possível que nenhuma cotação tenha aparecido ainda desde que o terminal se conectou
a uma conta de negociação. Em tal situação, o valor solicitado será indefinido
Na maioria dos casos, é suficiente usar a função S ymbolInfoT ick () permitindo a um usuário receber
os valores dos preços Compra, Venda, Último, Volume e a hora da chegada do último tick através de
uma única chamada.
Exemplo:
void OnTick()
{
//--- obtém spread a partir das propriedade do ativo
bool spreadfloat=SymbolInfoInteger(Symbol(),SYMBOL_SPREAD_FLOAT);
string comm=StringFormat("Spread %s = %I64d pontos\r\n",
spreadfloat?"flutuante":"fixo",
SymbolInfoInteger(Symbol(),SYMBOL_SPREAD));
//--- agora vamos calcular nós mesmos o 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+"Spread calculada = "+(string)spread_points+" pontos";
Comment(comm);
}
SymbolInfoInteger
R etorna a propriedade correspondente de um ativo especificado. Existem 2 variantes da função.
);
2. R etorna true ou false dependendo se a função for executada com sucesso. Em caso de sucesso, o
valor da propriedade é colocado em uma variável recipiente, passada por referênce atráves do último
parâmetro.
bool SymbolInfoInteger(
string name, // ativo
ENUM_SYMBOL_INFO_INTEGER prop_id, // identificador da propriedade
long& long_var // aqui nós assumimos o valor da propriedade
);
Parâmetros
name
[in] Nome do ativo.
prop_id
[in] Identificador de um propriedade de ativo. O valor pode ser um dos valores da enumeração
ENUM _S YM BOL _INFO_INT EGER .
long_var
[out] Variável de tipo long rececendo o valor da propriedade solicitada.
Valor do Retorno
Valor de tipo long. Em caso de falha de execução, a informação sobre o erro pode ser obtida usando
a função GetLastError():
· 5040 – parâmetro de string inv álido para especificar um nome de ativo,
· 4301 – ativo desconhecido (instrumento financeiro),
· 4302 – ativo não está selecionado no " Observador de Mercado" (não encontrado na lista de ativos
disponíveis),
· 4303 – identificador inv álido de uma propriedade de ativo.
Observação
É recomendável usar S ymbolInfoT ick () se a função for usada para obter informações sobre o último
tick . É bom possível que nenhuma cotação tenha aparecido ainda desde que o terminal se conectou
a uma conta de negociação. Em tal situação, o valor solicitado será indefinido
Na maioria dos casos, é suficiente usar a função S ymbolInfoT ick () permitindo a um usuário receber
os valores dos preços Compra, Venda, Último, Volume e a hora da chegada do último tick através de
uma única chamada.
Exemplo:
void OnTick()
{
//--- obtém spread a partir das propriedade do ativo
bool spreadfloat=SymbolInfoInteger(Symbol(),SYMBOL_SPREAD_FLOAT);
string comm=StringFormat("Spread %s = %I64d pontos\r\n",
spreadfloat?"flutuante":"fixo",
SymbolInfoInteger(Symbol(),SYMBOL_SPREAD));
//--- agora vamos calcular nós mesmos o 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+"Spread calculada = "+(string)spread_points+" pontos";
Comment(comm);
}
SymbolInfoString
R etorna a propriedade correspondente de um ativo especificado. Existem 2 variantes da função.
2. R etorna true ou false, dependendo do sucesso na execução da função. Se for bem sucedido, o valor
da propriedade é colocada em uma variável de recbimento passada por referência no último
parâmetro.
bool SymbolInfoString(
string name, // Ativo
ENUM_SYMBOL_INFO_STRING prop_id, // Identificador de propriedade
string& string_var // Aqui nós assumimos o valor da propriedade
);
Parâmetros
name
[in] Nome do ativo.
prop_id
[in] Identificador de um propriedade de ativo. O valor pode ser um dos valores da enumeração
ENUM _S YM BOL _INFO_S TRING.
string_var
[out] Variável de tipo string recebendo o valor da propriedade solicitada.
Valor do Retorno
Valor de tipo string. Em caso de falha de execução, a informação sobre o erro pode ser obtida
usando a função GetLastError():
· 5040 – parâmetro de string inv álido para especificar um nome de ativo,
· 4301 – ativo desconhecido (instrumento financeiro),
· 4302 – ativo não está selecionado no " Observador de Mercado" (não encontrado na lista de ativos
disponíveis),
· 4303 – identificador inv álido de uma propriedade de ativo.
Observação
É recomendável usar S ymbolInfoT ick () se a função for usada para obter informações sobre o último
tick . É bom possível que nenhuma cotação tenha aparecido ainda desde que o terminal se conectou
a uma conta de negociação. Em tal situação, o valor solicitado será indefinido
Na maioria dos casos, é suficiente usar a função S ymbolInfoT ick () permitindo a um usuário receber
os valores dos preços Compra, Venda, Último, Volume e a hora da chegada do último tick através de
uma única chamada.
SymbolInfoMarginRate
R etorna uma coleção de índices de margem, dependendo do tipo e direção mandado.
bool SymbolInfoMarginRate(
string name, // símbolo
ENUM_ORDER_TYPE order_type, // tipo de ordem
double& initial_margin_rate, // taxa de carregamento da margem inicial
double& maintenance_margin_rate // taxa de carregamento da margem de manutenção
);
parâmetros
name
[in] Nome do símbolo.
order_type
[in] T ipo de ordem.
initial_margin_rate
[in] Variável do tipo double para carregar o coeficiente de margem inicial. Margem inicial - é o
tamanho da quantidade de garantia sob o volume de transação de um lote de direção
correspondente. A multiplicação do coeficiente para a margem inicial, pode-se obter o montante
de fundos a ser reservados na conta quando se coloca o tipo de ordem especificada.
maintenance_margin_rate
[out] A variável do tipo double para o carregamento de manutenção margem de proporção.
Margem de Manutenção - Quantidade mínima para manter um volume de uma posição aberta de
uma direção correspondente. A multiplicação do coeficiente da margem de apoio, pode ser obter o
montante de fundos a ser reservados na cont, após a atuação do referido tipo de ordem.
valor de retorno
R etorna true se as propriedades da consulta foram bem sucedidas, caso contrário false.
SymbolInfoTick
A funçção retorna preços correntes de um ativo especificado em uma variável de tipo MqlT ick .
bool SymbolInfoTick(
string symbol, // nome do ativo
MqlTick& tick // referencia a uma estrutura
);
Parâmetros
symbol
[in] Nome do ativo.
tick
[out] Estrutura do tipo MqlT ick , na qual os preços correntes e a hora da atualização do último
preço será colocada.
Valor do Retorno
A função retorna true se bem sucedida, caso contrário retorna false.
SymbolInfoSessionQuote
Permite obter a hora de início e fim das sess ões de cotação especificadas para um ativo especificado
e dia da semana.
bool SymbolInfoSessionQuote(
string name, // nome do ativo
ENUM_DAY_OF_WEEK day_of_week, // dia da semana
uint session_index, // índice da sessão
datetime& from, // hora de início da sessão
datetime& to // hora de término da sessão
);
Parâmetros
name
[in] Nome do ativo.
ENUM_DAY_OF_WEEK
[in] Dia da semana, um valor da enumeração ENUM _DAY_OF_W EEK.
uint
[in] Número ordinal de uma sessão, cujo hora de começo e término nós queremos receber. A
indexação de sess ões começa com 0.
from
[out] H ora de início da sessão em segundos a partir de 00 horas 00 minutos, no valor de retorna a
data deve ser ignorada.
to
[out] H ora de término da sessão em segundos a partir de 00 horas e 00 minutos, no valor
retornado a data deve ser ignorada.
Valor do Retorno
Se os dados para a sessão, ativo e dia da semana especificados forem recebidos, retorna true, caso
contrário retorna false.
Também Veja
Propriedade de Ativo, T imeT oStruct, Estrutura de Dados
SymbolInfoSessionTrade
Permite obter a hora de início e fim das sess ões de negociação especificadas para um ativo
especificado e dia da semana.
bool SymbolInfoSessionTrade(
string name, // nome do ativo
ENUM_DAY_OF_WEEK day_of_week, // dia da semana
uint session_index, // índice da sessão
datetime& from, // hora de início da sessão
datetime& to // hora de término da sessão
);
Parâmetros
name
[in] Nome do ativo.
ENUM_DAY_OF_WEEK
[in] Dia da semana, um valor da enumeração ENUM _DAY_OF_W EEK.
uint
[in] Número ordinal de uma sessão, cujo hora de começo e término nós queremos receber. A
indexação de sess ões começa com 0.
from
[out] H ora de início da sessão em segundos a partir de 00 horas 00 minutos, no valor de retorna a
data deve ser ignorada.
to
[out] H ora de término da sessão em segundos a partir de 00 horas e 00 minutos, no valor
retornado a data deve ser ignorada.
Valor de retorno
Se os dados para a sessão, ativo e dia da semana especificados forem recebidos, retorna true, caso
contrário retorna false.
Também Veja
Propriedade de Ativo, T imeT oStruct, Estrutura de Dados
MarketBookAdd
Fornece a abertura da Profundidade de Mercado (DOM) para um ativo selecionado, e subscreve para
receber notificados de alterações na DOM (Depth of Mark et).
bool MarketBookAdd(
string symbol // ativo
);
Parâmetros
symbol
[in] O nome de um ativo, cuja Profundidade de Mercado é para ser usada no Expert Advisor ou
script.
Valor do Retorno
O valor true se aberto com sucesso, caso contrário false.
Observação
Normalmente, esta função deve ser chamada a partir da função OnInit() ou no construtor da classe.
Para manipular a chegada de alertas, o programa Expert Advisor deve conter a função void
OnBook Event(string & s ymbol).
Também Veja
Estrutura da Profunção de Mercado, Estruturas e Classes
MarketBookRelease
Fornece o fechamento da Profundidade de Mercado (DOM) para um ativo selecionado, e cancela a
subscrição para receber notificações de alteração na DOM (Depth of Mark et).
bool MarketBookRelease(
string symbol // ativo
);
Parâmetros
symbol
[in] Nome do ativo.
Valor do Retorno
O valor true se a fechamento foi bem sucedido, caso contrário false.
Observação
Normalmente, esta função deve ser chamada da função OnDeinit(), se a correspondente função
Mark etBook Add() foi chamada na função OnInit(). Ou ela deve ser chamada a partir do destrutor da
classe, se a correspondente função Mark etBook Add() foi chamada a partir do construtor da classe.
Também Veja
Estrutura da Profundidade de Mercado, Estruturas e Classes
MarketBookGet
R etorna um array de estruturas MqlBookInfo contendo registros da Profundidade de Mercado de um
ativo especificado.
bool MarketBookGet(
string symbol, // ativo
MqlBookInfo& book[] // referência para um array
);
Parâmetros
symbol
[in] Nome do ativo.
book[]
[in] R eferência para um array de registros de Profundidade de Mercado. O array pode ser pré-
alocado para um número suficiente de registros. Se um array dinâmico não tiver sido pré-alocado
na memória operacional, o terminal cliente alocará ele mesmo o array.
Valor do Retorno
R etorna true em caso de sucesso, caso contrário false.
Observação
A Profundidade de Mercado deve ser pre-aberta pela função Mark etBook Add().
Exemplo:
MqlBookInfo priceArray[];
bool getBook=MarketBookGet(NULL,priceArray);
if(getBook)
{
int size=ArraySize(priceArray);
Print("MarketBookInfo para ",Symbol());
for(int i=0;i<size;i++)
{
Print(i+":",priceArray[i].price
+" Volume = "+priceArray[i].volume,
" tipo = ",priceArray[i].type);
}
}
else
{
Print("Could not get contents of the symbol DOM ",Symbol());
}
Também Veja
Estrutura da Profundidade de Mercado, Estruturas e Classes
T odas as funções para trabalhar com o Calendário Econômico usam o horário do servidor de
negociação (T imeT radeServer). Isso significa que o tempo na estrutura MqlCalendarValue e os
parâmetros de tempo de entrada nas funções CalendarValueH istoryByEvent/CalendarValueH istory são
definidos no fuso horário do servidor de negociação e não no horário local do usuário.
Função Ação
CalendarCountryById Obtém uma descrição do país por seu ID
CalendarCountryById
Obtém a descrição do país por seu ID.
bool CalendarCountryById(
const long country_id, // identificador do país
MqlCalendarCountry& country // variável para obter a descrição do país
);
Parâmetros
country_id
[in] ID do país segundo o padrão ISO 3166-1.
country
[out] Variável do tipo MqlCalendarCountry para obter uma descrição do país.
Valor retornado
R etorna true em caso de sucesso, caso contrário, false. Para obter informações de erro, chame a
função GetLastError(). Possíveis erros :
· 4001 – ERR_INT ERNAL _ERR OR (erro geral de tempo de execução),
· 5402 – ERR_CALENDAR_NO_DAT A (país não encontrado),
· 5401 – ERR_CALENDAR_TI MEOUT (tempo limite de solicitação excedido),
Exemplo:
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- obtenha a lista de países do Calendário Econômico
MqlCalendarCountry countries[];
int count=CalendarCountries(countries);
//--- verifique o resultado
if(count==0)
PrintFormat("CalendarCountries() returned 0! Error %d",GetLastError());
//--- se você tiver dois ou mais países
if(count>=2)
{
MqlCalendarCountry country;
//--- agora obtenha a descrição do país pelo seu identificador
if(CalendarCountryById(countries[1].id, country))
{
//--- prepare a descrição do país
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");
Veja também
CalendarCountries, CalendarEventByCountry
CalendarEventById
Obtém uma descrição do evento por seu ID.
bool CalendarEventById(
ulong event_id, // ID do evento
MqlCalendarEvent& event // variable para obter a descrição do evento
);
Parâmetros
event_id
[in] ID do evento.
event
[out] Variável de tipo MqlCalendarEvent para obter uma descrição do evento.
Valor retornado
R etorna true em caso de sucesso, caso contrário, false. Para obter informações de erro, chame a
função GetLastError(). Possíveis erros :
· 4001 – ERR_INT ERNAL _ERR OR (erro geral de tempo de execução),
· 5402 – ERR_CALENDAR_NO_DAT A (país não encontrado),
· 5401 – ERR_CALENDAR_TI MEOUT (tempo limite de solicitação excedido),
Exemplo:
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- código do país para a Alemanha de acordo com a ISO 3166-1 Alpha-2
string germany_code="DE";
//--- obtenha os eventos para a Alemanha
MqlCalendarEvent events[];
int events_count=CalendarEventByCountry(germany_code,events);
//--- imprima os eventos para a Alemanha no Diário
if(events_count>0)
{
PrintFormat("Eventos para a Alemanha: %d",events_count);
ArrayPrint(events);
}
else
{
PrintFormat("Falha ao obter eventos para o código do país %s, erro %d",
germany_code,GetLastError());
//--- conclusão antecipada do script
return;
}
//--- obtenha a descrição do último evento do 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("Obtida a descrição do evento com event_id=%d",event_id);
PrintFormat("País: %s (código do país= %d)",country.name,event.country_id);
PrintFormat("Nome do evento: %s",event.name);
PrintFormat("Código do evento: %s",event.event_code);
PrintFormat("Importância do evento: %s",EnumToString((ENUM_CALENDAR_EVENT_IMPORTANCE)event.im
PrintFormat("Tipo de evento: %s",EnumToString((ENUM_CALENDAR_EVENT_TYPE)event.type));
PrintFormat("Setor do evento: %s",EnumToString((ENUM_CALENDAR_EVENT_SECTOR)event.sector));
PrintFormat("Frequência do evento: %s",EnumToString((ENUM_CALENDAR_EVENT_FREQUENCY)event.freq
PrintFormat("Modo de saída do evento: %s",EnumToString((ENUM_CALENDAR_EVENT_TIMEMODE)event.ti
PrintFormat("Unidade de medida do evento: %s",EnumToString((ENUM_CALENDAR_EVENT_UNIT)event.un
PrintFormat("Número de casas decimais: %d",event.digits);
PrintFormat("Multiplicador de valor: %s",EnumToString((ENUM_CALENDAR_EVENT_MULTIPLIER)event.m
PrintFormat("URL da fonte: %s",event.source_url);
}
else
PrintFormat("Falha ao obter a descrição do evento para event_d=%s, erro %d",
event_id,GetLastError());
}
/*
Resultado:
Eventos para a Alemanha: 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
Descrições de evento recebidas com event_id=276500003
País: Germany (código do país = 276)
Nome do evento: Markit Composite PMI
Código do evento: markit-composite-pmi
Importância do evento: CALENDAR_IMPORTANCE_MODERATE
Tipo de evento: CALENDAR_TYPE_INDICATOR
Setor do evento: CALENDAR_SECTOR_BUSINESS
Frequência do evento: CALENDAR_FREQUENCY_MONTH
Modo de saída do evento: CALENDAR_TIMEMODE_DATETIME
Unidade de medida do evento: CALENDAR_UNIT_NONE
Número de casas decimais: 1
Multiplicador de valor: CALENDAR_MULTIPLIER_NONE
URL da fonte: https://www.markiteconomics.com
*/
Veja também
CalendarEventByCountry, CalendarEventByCurrency, CalendarValueById
CalendarValueById
Obtém uma descrição do valor do evento por seu ID.
bool CalendarValueById(
ulong value_id, // ID do valor do evento
MqlCalendarValue& value // variável para obter o valor do evento
);
Parâmetros
value_id
[in] Identificador do valor do evento.
value
[out] Variável de tipo MqlCalendarValue para obter o valor do evento.
Valor retornado
R etorna true em caso de sucesso, caso contrário, false. Para obter informações de erro, chame a
função GetLastError(). Possíveis erros :
· 4001 – ERR_INT ERNAL _ERR OR (erro geral de tempo de execução),
· 5402 – ERR_CALENDAR_NO_DAT A (país não encontrado),
· 5401 – ERR_CALENDAR_TI MEOUT (tempo limite de solicitação excedido)
Observação
T odas as funções para trabalhar com o Calendário Econômico usam o horário do servidor de
negociação (T imeT radeServer). Isso significa que o tempo na estrutura MqlCalendarValue e os
parâmetros de tempo de entrada nas funções CalendarValueH istoryByEvent/CalendarValueH istory
são definidos no fuso horário do servidor de negociação e não no horário local do usuário.
Exemplo:
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- código do país para o Japão de acordo com a ISO 3166-1 Alpha-2
string japan_code="JP";
//--- defina os limites do intervalo de onde são tomados os eventos
datetime date_from=D'01.01.2018'; // defina todos os eventos de 2018
datetime date_to=0; // 0 indica que todos os eventos são conhecidos mesmo aqueles
//--- obtenha uma matriz de valores de eventos para o Japão
MqlCalendarValue values[];
int values_count=CalendarValueHistory(values,date_from,date_to,japan_code);
//--- passe pelos valores do evento encontrado
if(values_count>0)
{
PrintFormat("Número de valores para eventos do Japão: %d",values_count);
//--- remova todos os valores "vazios" (actual_value==-9223372036854775808)
for(int i=values_count-1;i>=0;i--)
{
if(values[i].actual_value==-9223372036854775808)
ArrayRemove(values,i,1);
}
PrintFormat("Número de valores após a exclusão de vazios: %d",ArraySize(values));
}
else
{
PrintFormat("Falha ao obter eventos para o código do país %s, erro %d",
japan_code,GetLastError());
//--- conclusão antecipada do script
return;
}
//--- não deixe mais de 10 valores no array values[]
if(ArraySize(values)>10)
{
PrintFormat("Reduza a lista de valores para 10 e exiba-a");
ArrayRemove(values,0,ArraySize(values)-10);
}
ArrayPrint(values);
//--- agora exiba como, com base no value_id conhecido, obtém-se uma descrição do valor do evento
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
}
//---
}
/*
Resultado:
Número de valores para eventos do Japão: 1734
Número de valores após a exclusão de vazios: 1017
Reduza a lista de valores para 10 e exiba-a
[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
Exiba informações resumidas sobre valores de eventos com base em value_id
Veja também
CalendarValueH istoryByEvent, CalendarValueH istory, CalendarValueLastByEvent, CalendarValueLast
CalendarCountries
Obtém um array de descrições dos países disponíveis no calendário.
int CalendarCountries(
MqlCalendarCountry& countries[] // array para obter uma lista de descrições dos países
);
Parâmetros
countries[]
[out] Array de tipo MqlCalendarCountry para obter descrições de todos os países do Calendário.
Valor retornado
Número de descrições recebidas. Para obter informações de erro, chame a função GetLastError().
Possíveis erros :
· 4001 – ERR_INT ERNAL _ERR OR (erro geral de tempo de execução),
· 5401 – ERR_CALENDAR_TI MEOUT (excedido tempo limite de solicitação),
· 5400 – ERR_CALENDAR_MOR E_DAT A (tamanho de array insuficiente para obter descrições de
todos os países, portanto, eles recebem apenas o que foi incluído).
Exemplo:
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- obtenha a lista de países do Calendário Econômico
MqlCalendarCountry countries[];
int count=CalendarCountries(countries);
//--- Imprima o array no Diário
if(count>0)
ArrayPrint(countries);
else
PrintFormat("CalendarCountries() returned 0! Error %d",GetLastError());
/*
Resultado:
[id] [name] [code] [currency] [currency_symbol] [url_name] [reserved]
[ 0] 0 "Worldwide" "WW" "ALL" "" "worldwide" 0
[ 1] 999 "European Union" "EU" "EUR" "€" "european-union" 0
[ 2] 840 "United States" "US" "USD" "$" "united-states" 0
[ 3] 124 "Canada" "CA" "CAD" "$" "canada" 0
[ 4] 36 "Australia" "AU" "AUD" "$" "australia" 0
[ 5] 554 "New Zealand" "NZ" "NZD" "$" "new-zealand" 0
[ 6] 392 "Japan" "JP" "JPY" "Ґ" "japan" 0
[ 7] 156 "China" "CN" "CNY" "Ґ" "china" 0
[ 8] 826 "United Kingdom" "GB" "GBP" "Ј" "united-kingdom" 0
[ 9] 756 "Switzerland" "CH" "CHF" "₣" "switzerland" 0
Veja também
CalendarEventByCountry, CalendarCountryById
CalendarEventByCountry
Obtém um array de descrições de todos os eventos disponíveis no Calendário, de acordo com o código
do país especificado.
int CalendarEventByCountry(
string country_code, // código do país segundo ISO 3166-1 alpha-2
MqlCalendarEvent& events[] // variável para obter o array de descrições
);
Parâmetros
country_code
[in] Código do país segundo ISO 3166-1 alpha-2
events[]
[out] Array do tipo MqlCalendarEvent para obter descrições de todos os eventos para o país
especificado.
Valor retornado
Número de descrições recebidas. Para obter informações de erro, chame a função GetLastError().
Possíveis erros :
· 4001 – ERR_INT ERNAL _ERR OR (erro geral de tempo de execução),
· 4004 – ERR_NOT_ENOUGH_MEMORY (memória insuficiente para execução da solicitação),
· 5401 – ERR_CALENDAR_TI MEOUT (excedido tempo limite de solicitação),
· falha ao executar ArrayR esize()
Exemplo:
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- código do país para a União Europeia de acordo com a ISO 3166-1 Alpha-2
string EU_code="EU";
//--- obtenha os eventos para a União Europeia
MqlCalendarEvent events[];
int events_count=CalendarEventByCountry(EU_code,events);
//--- imprima eventos para a União Europeia no Diário
if(events_count>0)
{
PrintFormat("Eventos para a União Europeia: %d",events_count);
ArrayPrint(events);
}
//---
}
/*
Resultado:
Eventos para a União Europeia: 56
*/
Veja também
CalendarCountries, CalendarCountryById
CalendarEventByCurrency
Obtém um array de descrições de todos os eventos disponíveis no Calendário para a moeda
especificada.
int CalendarEventByCurrency(
const string currency, // código da moeda do país
MqlCalendarEvent& events[] // variável para obter o array de descrições
);
Parâmetros
currency
[in] Código da moeda do país
events[]
[out] Array do tipo MqlCalendarEvent para obter descrições de todos os eventos da moeda
especificada.
Valor retornado
Número de descrições recebidas. Para obter informações de erro, chame a função GetLastError().
Possíveis erros :
· 4001 – ERR_INT ERNAL _ERR OR (erro geral de tempo de execução),
· 4004 – ERR_NOT_ENOUGH_MEMORY (memória insuficiente para execução da solicitação),
· 5401 – ERR_CALENDAR_TI MEOUT (excedido tempo limite de solicitação),
· falha ao executar ArrayR esize()
Exemplo:
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- declare um array para receber eventos do Calendário Econômico
MqlCalendarEvent events[];
//--- obtenha eventos para a moeda da União Europeia
int count = CalendarEventByCurrency("EUR",events);
Print("count = ", count);
//--- por exemplo, 10 eventos são suficientes para nós
if(count>10)
ArrayResize(events,10);
//--- imprima eventos no Diário
ArrayPrint(events);
}
/*
Resultado:
[id] [type] [country_id] [unit] [importance] [s
[0] 999010001 0 999 0 2 "https://www.ecb.europa.eu/home/html/index
Veja também
CalendarEventById, CalendarEventByCountry
CalendarValueHistoryByEvent
Obtém um array de valores de todos os eventos no intervalo de tempo especificado, segundo o ID do
evento.
bool CalendarValueHistoryByEvent(
ulong event_id, // identificador do evento
MqlCalendarValue& values[], // array para obter a descrição dos valores
datetime datetime_from, // borda esquerda do intervalo de tempo
datetime datetime_to=0 // borda direita do intervalo de tempo
);
Parâmetros
event_id
[in] ID do evento.
values[]
[out] Matriz de tipo MqlCalendarValue para obter valores de eventos.
datetime_from
[in] Data de início do intervalo de tempo a partir do qual os eventos são selecionados pelo ID
definido, enquanto datetime_from < datetime_to.
datetime_to=0
[in] Data final do intervalo de tempo a partir do qual os eventos são selecionados pelo ID
definido. Se não for especificado o parâmetro datetime_to (ou é igual a 0), serão retornados todos
os valores de evento da data especificada datetime_from, disponível no banco de dados do
Calendário, incluindo os valores dos eventos planejados para o futuro.
Valor retornado
R etorna true em caso de sucesso, caso contrário, false. Para obter informações de erro, chame a
função GetLastError(). Possíveis erros :
· 4001 – ERR_INT ERNAL _ERR OR (erro geral de tempo de execução),
· 4004 – ERR_NOT_ENOUGH_MEMORY (memória insuficiente para execução da solicitação),
· 5401 – ERR_CALENDAR_TI MEOUT (excedido tempo limite de solicitação),
· 5400 – ERR_CALENDAR_MOR E_DAT A (tamanho de array insuficiente para obter descrições de
todos os valores, portanto, eles recebem apenas o que contêm).
· falha ao executar ArrayR esize()
Se, para o valor de evento, não houver algum dos campos abaixo
struct MqlCalendarValue
{
...
long actual_value; // valor atual do indicador
long prev_value; // valor anterior do indicador
long revised_prev_value; // valor do evento anterior revisado
long forecast_value; // valor previsto do evento
...
};
o valor do campo ausente será retornado como INT64_M IN (-9223372036854775808). Veja o exemplo
abaixo para valores de campo revised_prev_value.
Observação
T odas as funções para trabalhar com o Calendário Econômico usam o horário do servidor de
negociação (T imeT radeServer). Isso significa que o tempo na estrutura MqlCalendarValue e os
parâmetros de tempo de entrada nas funções CalendarValueH istoryByEvent/CalendarValueH istory
são definidos no fuso horário do servidor de negociação e não no horário local do usuário.
Exemplo:
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- código do país para a União Europeia de acordo com a ISO 3166-1 Alpha-2
string EU_code="EU";
//--- obtenha os eventos para a União Europeia
MqlCalendarEvent events[];
int events_count=CalendarEventByCountry(EU_code,events);
//--- imprima eventos para a União Europeia no Diário
if(events_count>0)
{
PrintFormat("Eventos para a União Europeia: %d",events_count);
//--- reduza a lista de eventos, para estudar basta deixar 10
ArrayResize(events,10);
ArrayPrint(events);
}
//--- veja que o evento "ECB Interest Rate Decision" tem event_id=999010007
ulong event_id=events[6].id; // o ID deste evento pode mudar no Calendário, por isso, ver
string event_name=events[6].name; // nome do evento no Calendário
PrintFormat("Obtenha o valor para o evento event_name=%s event_id=%d",event_name,event_id);
//--- obtenha todos os valores do evento "ECB Interest Rate Decision"
MqlCalendarValue values[];
//--- defina os limites do intervalo de onde são tomados os eventos
datetime date_from=0; // pegue todos os eventos desde o começo do histórico
datetime date_to=D'01.01.2016'; // pege eventos não mais antigos que 2016
if(CalendarValueHistoryByEvent(event_id,values,date_from,date_to))
{
PrintFormat("Obtidos valores de eventos %s: %d",
event_name,ArraySize(values));
//--- reduza a lista de eventos para 10, isso chega 10
ArrayResize(values,10);
ArrayPrint(values);
}
else
{
PrintFormat("Erro! Falha ao obter valores para o evento event_id=%d",event_id);
Veja também
CalendarCountries, CalendarEventByCountry, CalendarValueH istory, CalendarEventById,
CalendarValueById
CalendarValueHistory
Obtém uma matriz de valores de todos os eventos num determinado intervalo de tempo com um filtro
por país e/ou moeda.
bool CalendarValueHistory(
MqlCalendarValue& values[], // array para obter descrições de valores
datetime datetime_from, // borda esquerda do intervalo de tempo
datetime datetime_to=0 // borda direita do intervalo de tempo
const string country_code=NULL, // código do país ISO 3166-1 alpha-2
const string currency=NULL // código da moeda do país
);
Parâmetros
values[]
[out] Matriz de tipo MqlCalendarValue para obter valores de eventos.
datetime_from
[in] Data de início do intervalo de tempo a partir do qual os eventos são selecionados pelo ID
definido, enquanto datetime_from < datetime_to.
datetime_to=0
[in] Data final do intervalo de tempo a partir do qual os eventos são selecionados pelo ID
definido. Se não for especificado o parâmetro datetime_to (ou é igual a 0), serão retornados todos
os valores de evento da data especificada datetime_from, disponível no banco de dados do
Calendário, incluindo os valores dos eventos planejados para o futuro.
country_code=NULL
[in] Código do país segundo ISO 3166-1 alpha-2
currency=NULL
[in] Código da moeda do país
Valor retornado
R etorna true em caso de sucesso, caso contrário, false. Para obter informações de erro, chame a
função GetLastError(). Possíveis erros :
· 4001 – ERR_INT ERNAL _ERR OR (erro geral de tempo de execução),
· 4004 – ERR_NOT_ENOUGH_MEMORY (memória insuficiente para execução da solicitação),
· 5401 – ERR_CALENDAR_TI MEOUT (excedido tempo limite de solicitação),
· 5400 – ERR_CALENDAR_MOR E_DAT A (tamanho de array insuficiente para obter descrições de
todos os valores, portanto, eles recebem apenas o que contêm).
· falha ao executar ArrayR esize()
Observação
T odas as funções para trabalhar com o Calendário Econômico usam o horário do servidor de
negociação (T imeT radeServer). Isso significa que o tempo na estrutura MqlCalendarValue e os
parâmetros de tempo de entrada nas funções CalendarValueH istoryByEvent/CalendarValueH istory
são definidos no fuso horário do servidor de negociação e não no horário local do usuário.
Se um array foi passado para a função events[] de comprimento fixo e, como resultado da
solicitação, não havia espaço suficiente para salvar o resultado inteiro, é mostrado o erro
ERR_CALENDAR_MOR E_DAT A (5400).
Se não for especificado o parâmetro datetime_to (=0), serão retornados todos os valores de eventos
a partir da data datetime_from disponível no banco de dados do Calendário, incluindo os valores
planejados para o futuro.
Para os filtros country_code e currency valores NULL e "" são equivalentes, eles indicam que não há
filtro.
Para country_code deve ser usado o campo code da estrutura MqlCalendarCountry, por exemplo,
"US " , "RU" ou " EU" .
Para currency deve ser usado o campo currency da estrutura MqlCalendarCountry, por exemplo,
"US D" , "RUB" ou " EUR" .
Os filtros são aplicados por conjunção, ou seja, através do booliano 'E' são selecionados apenas os
eventos para os quais ambas as condições são atendidas simultaneamente – país e moeda.
Se, para o valor de evento, não houver algum dos campos abaixo
struct MqlCalendarValue
{
...
long actual_value; // valor atual do indicador
long prev_value; // valor anterior do indicador
long revised_prev_value; // valor do evento anterior revisado
long forecast_value; // valor previsto do evento
...
};
o valor do campo ausente será retornado como INT64_M IN (-9223372036854775808). Veja o exemplo
abaixo para valores de campo revised_prev_value.
Exemplo:
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- código do país para a União Europeia de acordo com a ISO 3166-1 Alpha-2
string EU_code="EU";
//--- obtenha todos os valores de evento da União Europeia
MqlCalendarValue values[];
//--- defina os limites do intervalo de onde são tomados os eventos
datetime date_from=D'01.01.2018'; // defina todos os eventos de 2018
datetime date_to=0; // 0 indica que todos os eventos são conhecidos mesmo aqueles
/ --- solicite o histórico do evento para a União Europeia desde 2018
if(CalendarValueHistory(values,date_from,date_to,EU_code))
{
PrintFormat("Obtidos valores do evento para country_code=%s: %d",
EU_code,ArraySize(values));
//--- reduza o tamanho do array para imprimir no Diário
ArrayResize(values,10);
//--- imprima o valor dos eventos no Diário
ArrayPrint(values);
}
else
{
PrintFormat("Erro! Falha ao obter eventos do país country_code=%s",EU_code);
PrintFormat("Código de erro: %d",GetLastError());
}
//---
}
/*
Resultado:
Obtidos os valores de eventos para 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
*/
Veja também
CalendarCountries, CalendarEventByCountry, CalendarValueH istoryByEvent, CalendarEventById,
CalendarValueById
CalendarValueLastByEvent
Obtém um array de valores do eventos por seu ID desde o momento em que criado do banco de dados
do Calendário com o change_id definido.
int CalendarValueLastByEvent(
ulong event_id, // identificador de evento
ulong& change_id, // identificador do valor do evento
MqlCalendarValue& values[] // array para obter descrições de valores
);
Parâmetros
event_id
[in] ID do evento.
change_id
[in][out] Identificador de alteração.
values[]
[out] Array de tipo MqlCalendarValue para obter valores de eventos.
Valor retornado
Número de valores de eventos recebidos. Para obter informações de erro, chame a função
GetLastError(). Possíveis erros :
· 4001 – ERR_INT ERNAL _ERR OR (erro geral de tempo de execução),
· 4004 – ERR_NOT_ENOUGH_MEMORY (memória insuficiente para execução da solicitação),
· 5401 – ERR_CALENDAR_TI MEOUT (excedido tempo limite de solicitação),
· 5400 – ERR_CALENDAR_MOR E_DAT A (tamanho de array insuficiente para obter descrições de
todos os valores, portanto, eles recebem apenas o que contêm).
· falha ao executar ArrayR esize()
Observação
T odas as funções para trabalhar com o Calendário Econômico usam o horário do servidor de
negociação (T imeT radeServer). Isso significa que o tempo na estrutura MqlCalendarValue e os
parâmetros de tempo de entrada nas funções CalendarValueH istoryByEvent/CalendarValueH istory
são definidos no fuso horário do servidor de negociação e não no horário local do usuário.
Se um array foi passado para a função events[] de comprimento fixo e, como resultado da
solicitação, não havia espaço suficiente para salvar o resultado inteiro, é mostrado o erro
ERR_CALENDAR_MOR E_DAT A (5400).
Se na função for passado change_id = 0, a função sempre retornará zero, mas ao mesmo tempo
change_id retorna o estado atual do banco de dados do Calendário.
A função retorna uma matriz de valores para as notícias especificadas e change_id novo que pode
ser usado para chamadas subsequentes desta função para obter novos valores de notícias. Assim,
chamando esta função com o último conhecido change_id, pode-se receber atualizações de valores
para uma determinada notícia.
Se, para o valor de evento, não houver algum dos campos abaixo
struct MqlCalendarValue
{
...
long actual_value; // valor atual do indicador
long prev_value; // valor anterior do indicador
long revised_prev_value; // valor do evento anterior revisado
long forecast_value; // valor previsto do evento
...
};
}
//+------------------------------------------------------------------+
//| Timer function |
//+------------------------------------------------------------------+
void OnTimer()
{
ulong old_change_id=calendar_change_id;
//--- verifique se surgiu um novo valor para o evento "Nonfarm Payrolls"
if(CalendarValueLastByEvent(event_id,calendar_change_id,values)>0)
{
PrintFormat("%s: Obtidos novos eventos para \"%s\": %d",
__FUNCTION__,event_name,ArraySize(values));
//--- exiba no Diário informações do array values
ArrayPrint(values);
//--- exiba no Diário os valores do ID do Calendário - o anterior e o novo
PrintFormat("%s: Anterior change_id=%d, novo change_id=%d",
__FUNCTION__,old_change_id,calendar_change_id);
/*
escreva aqui o código que processará a publicação de dados sobre o "Nonfarm Payrolls"
*/
}
//---
}
/*
Resultado:
OnTimer: Eventos para EUA: 202
Evento "Nonfarm Payrolls" encontrado: event_id=840030016 event_name=Nonfarm Payrolls
[id] [type] [sector] [frequency] [time_mode] [country_id] [unit] [importance] [multipli
[0] 840030007 1 4 2 0 840 1 1
[1] 840030008 1 4 2 0 840 1 1
[2] 840030009 1 4 2 0 840 0 1
[3] 840030010 1 4 2 0 840 0 1
[4] 840030011 1 4 2 0 840 1 1
[5] 840030012 1 4 2 0 840 1 1
[6] 840030013 1 4 2 0 840 1 1
[7] 840030014 1 4 2 0 840 1 1
[8] 840030015 1 3 2 0 840 1 2
[9] 840030016 1 3 2 0 840 4 3
OnTimer: Recebido o ID atual da base do Calendário: change_id=33986560
*/
Veja também
CalendarValueLast, CalendarValueH istory, CalendarValueH istoryByEvent, CalendarValueById
CalendarValueLast
Obtém um array de valores de todos os eventos com filtro por país e/ou moeda desde o momento em
que criado do banco de dados do Calendário com o change_id definido.
int CalendarValueLast(
ulong& change_id, // identificador de alteração
MqlCalendarValue& values[], // array para obter descrições de valores
const string country_code=NULL, // código do país segundo ISO 3166-1 alpha-2
const string currency=NULL // código da moeda do país
);
Parâmetros
change_id
[in][out] Identificador de alteração.
values[]
[out] Array de tipo MqlCalendarValue para obter valores de eventos.
country_code=NULL
[in] Código do país segundo ISO 3166-1 alpha-2
currency=NULL
[in] Código da moeda do país
Valor retornado
Número de valores de eventos recebidos. Para obter informações de erro, chame a função
GetLastError(). Possíveis erros :
· 4001 – ERR_INT ERNAL _ERR OR (erro geral de tempo de execução),
· 4004 – ERR_NOT_ENOUGH_MEMORY (memória insuficiente para execução da solicitação),
· 5401 – ERR_CALENDAR_TI MEOUT (excedido tempo limite de solicitação),
· 5400 – ERR_CALENDAR_MOR E_DAT A (tamanho de array insuficiente para obter descrições de
todos os valores, portanto, eles recebem apenas o que contêm).
· falha ao executar ArrayR esize()
Observação
T odas as funções para trabalhar com o Calendário Econômico usam o horário do servidor de
negociação (T imeT radeServer). Isso significa que o tempo na estrutura MqlCalendarValue e os
parâmetros de tempo de entrada nas funções CalendarValueH istoryByEvent/CalendarValueH istory
são definidos no fuso horário do servidor de negociação e não no horário local do usuário.
Se um array foi passado para a função events[] de comprimento fixo e, como resultado da
solicitação, não havia espaço suficiente para salvar o resultado inteiro, é mostrado o erro
ERR_CALENDAR_MOR E_DAT A (5400).
Se na função for passado change_id = 0, a função sempre retornará zero, mas ao mesmo tempo
change_id retorna o estado atual do banco de dados do Calendário.
Para os filtros country_code e currency valores NULL e "" são equivalentes, eles indicam que não há
filtro.
Para country_code deve ser usado o campo code da estrutura MqlCalendarCountry, por exemplo,
"US " , "RU" ou " EU" .
Para currency deve ser usado o campo currency da estrutura MqlCalendarCountry, por exemplo,
"US D" , "RUB" ou " EUR" .
Os filtros são aplicados por conjunção, ou seja, através do booliano 'E' são selecionados apenas os
eventos para os quais ambas as condições são atendidas simultaneamente – país e moeda
A função retorna uma matriz de valores para as notícias especificadas e change_id novo que pode
ser usado para chamadas subsequentes desta função para obter novos valores de notícias. Assim,
chamando esta função com o último conhecido change_id, pode-se receber atualizações de valores
para uma determinada notícia.
Se, para o valor de evento, não houver algum dos campos abaixo
struct MqlCalendarValue
{
...
long actual_value; // valor atual do indicador
long prev_value; // valor anterior do indicador
long revised_prev_value; // valor do evento anterior revisado
long forecast_value; // valor previsto do evento
...
};
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
}
//+------------------------------------------------------------------+
//| Timer function |
//+------------------------------------------------------------------+
void OnTimer()
{
//--- ID da alteração da base do Calendário
static ulong calendar_change_id=0;
//--- sinal da primeira inicialização
static bool first=true;
//--- array de valores do evento
MqlCalendarValue values[];
//--- inicialize - obtenha o calendar_change_id atual
if(first)
{
//--- obtenha o ID da alteração da base do Calendário
if(CalendarValueLast(calendar_change_id,values)>0)
{
//--- este bloco de código não pode ser executado na primeira inicialização, mas ainda ass
PrintFormat("%s: Obtido ID atual da base do calendário: change_id=%d",
__FUNCTION__,calendar_change_id);
//--- defina o sinalizador e saia antes do próximo evento do temporizador
first=false;
return;
}
else
{
//--- dados não recebidos (para a primeira execução, isso é normal), verifique se há um er
int error_code=GetLastError();
if(error_code==0)
{
PrintFormat("%s: Obtido ID atual da base do calendário: change_id=%d",
__FUNCTION__,calendar_change_id);
//--- defina o sinalizador e saia antes do próximo evento do temporizador
first=false;
//--- agora você tem o valor calendar_change_id
return;
}
else
{
//--- isso é realmente um erro
*/
Veja também
Existe uma importante exceção a esta regra: se valores de séries de tempo e indicadores precisam
ser copiados com freqüência, por exemplo, a cada chamada de OnT ick () em Expert Advisors ou a cada
chamada de OnCalculate() em indicadores, neste caso seria melhor usar arrays alocados
estaticamente, porque operações de alocação de memória para arrays dinâmicos requerem um
tempo adicional, e isso terá efeitos durante os processos de teste e otimização.
Ao usar funções de acesso a valores de séries de tempo e indicadores, a direção de indexação deve
ser leva em consideração. Isso é descrito na seção Direção de indexação em arrays e séries de tempo.
É historicamente aceito que um acesso a dados de preço em um array é realizado a partir do final dos
dados. Fisicamente, os novos dados são sempre escritos no final do array, mas o índice do array é
sempre igual a zero. O índice 0 no array de série de tempo denota dados da barra corrente, isto é, a
barra que correspondente ao intervalo de tempo não terminado nesta janela de tempo.
Uma janela de tempo é o período de tempo, durante o qual uma única barra de preço é formada.
Existem 21 janelas de tempo padrão predefinidas.
Função Ação
Series InfoInteger R etorna informação sobre o estado dos dados
históricos
especificados em um array
Apesar do fato de que pelo uso da função ArraySetAsSeries() é possível definir em arrays acesso aos
elementos como em séries de tempo, deve ser lembrado que os elementos de arrays são fisicamente
armazenados na mesma e única ordem - somente a direção de indexação muda. Para demonstrar este
fato, vamos apresentar um exemplo:
datetime TimeAsSeries[];
//--- define acesso ao array como uma série de tempo
ArraySetAsSeries(TimeAsSeries,true);
ResetLastError();
int copied=CopyTime(NULL,0,0,10,TimeAsSeries);
if(copied<=0)
{
Print("A operação de cópia dos valores do tempo de abertura para as últimas 10 barras falhou"
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("A operação de cópia dos valores do tempo de abertura para as últimas 10 barras falhou"
return;
}
size=ArraySize(ArrayNotSeries);
for(int i=size-1;i>=0;i--)
{
Print("ArrayNotSeries["+i+"] =",ArrayNotSeries[i]);
}
Como vemos a partir da saída, a medida que o índice do array T imeAsSeries aumenta, o valor da hora
do índice diminui, isto é, nós nos movemos do presente para o passado. Para o array comum
ArrayNotSeries o resultado é diferente - a medida que o índice cresce, nós nos movemos do passado
para o presente.
Veja também
ArrayIs Dynamic, ArrayGetAsSeries, ArraySetAsSeries, ArrayIsSeries
Um buffer de indicador é um array dinâmico de tipo double, cujo tamanho é gerenciado pelos
terminais clientes, de modo que ele sempre corresponde ao número de barras do indicador sobre o
qual está calculando. Um array dinâmico usual de tipo double é atribuído como um buffer de indicador
usando a função SetIndex Buffer(). Buffers de indicador não requerem que seus tamanhos sejam
definidos usando a função ArrayR esize() - isso será feito pelo sistema de execução do terminal.
Séries de tempo são array com indexação reversa, isto é, o primeiro elemento de uma série de tempo
está na posição mais a direita, e o último elemento está na posição mais a esquerda. Em uma série de
tempo sendo usada para armazenar dados de preços históricos e que contém informações de hora, os
dados mais recentes são colocados na posição mais a direita da série de tempo, enquanto que os
dados mais antigos na posição mais a esquerda.
Assim o elemento da série de tempo com índice 0 contém a informação sobre a última cotação de um
ativo. Se uma série de tempo contém dados sobre uma janela de tempo diária, os dados correntes do
dia ainda não terminado ficam localizados na posição zero, e na posição com índice 1 contém os dados
de ontem.
A direção de indexação não pode ser alterada para arrays alocados estaticamente. Mesmo se um array
for passado como um parâmetro para uma função, tentar alterar a direção de indexação dentro desta
função não produzirá nenhum efeito.
Para buffers de indicador, assim como para arrays comuns, a direção de indexação pode ser definida
no sentido contrário (como em séries de tempo), isto é, uma referência à posição zero no buffer de
indicador retornará o último valor no correspondente buffer de indicador e isso não corresponderá ao
valor do indicador na barra mais recente. Contudo, a localização física das barras do indicador não
será alterada.
Arrays passados para a função refletem dados de preço, isto é, estes arrays têm o sinal de uma série
de preço e a função ArrayIsSeries() retornará true ao verificar estes arrays. Contudo, de qualquer
forma a direção de indexação deve ser verificada somente pela função ArrayGetAsSeries().
A fim de não ficar dependente de valores default, a função ArraySetAsSeries() deve ser
incondicionalmente chamada para os arrays com os quais você vai trabalhar, e definir a direção
requerida.
· CopyR ates – copiar histórico de preços para um array de estruturas MqlR ates ;
· CopyR ealVolume – copiar volumes de capital (equity) para um array de tipo long ;
T odas estas funções trabalham de forma similar. Vamos considerar o mecanismo de obtenção de
dados no exemplo de CopyBuffer(). É implícito que a direção de indexação dos dados requeridos é de
série de tempo, e a posição com índice 0 (zero) armazena dados da barra corrente ainda incompleta. A
fim de obter acesso a estes dados nós precisamos copiar o volume necess ário de dados em um array
recipiente, por exemplo, em um array de buffer.
Para copiar nós precisamos especificar a posição de início no array fonte, início a partir do qual dados
serão copiados para o array recipiente. Em caso de sucesso, o número especificado de elementos
serão copiados para o array recipiente do array fonte (do buffer de indicador neste caso).
Independentemente do valor de indexação definido no array recipiente, a cópia é sempre realizada
como exibida na figura abaixo.
Se é esperado que um grande número de iterações seja tratado por um loop, é recomendável que se
verifique a ocorrência de uma finalização de programa forçada usando a função IsStopped().
Exemplo:
input int per=10; // período do expoente
int ma_handle; // manipulador do indicador
//+------------------------------------------------------------------+
//| Função de inicialização do Expert |
//+------------------------------------------------------------------+
int OnInit()
{
//---
ma_handle=iMA(_Symbol,0,per,0,MODE_EMA,PRICE_CLOSE);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função tick (ponto) de um Expert |
//+------------------------------------------------------------------+
void OnTick()
{
//---
double ema[10];
int copied=CopyBuffer(ma_handle,// manipulador do indicador
0, // índice do buffer do indicador
0, // posição de ínicio da cópia
10, // número de valores para copiar
ema // array que recebe os valores
);
if(copied<0) return;
// .... outro código
}
Também Veja
Organizando Acesso aos Dados
O mecanismo de referência de servidor para solicitar dados não depende de como a solicitação foi
iniciada - por um usuário ao navegar em um gráfico ou por meio de um programa na linguagem MQL5.
Os dados são escritos em arquivos com extensão .hcc. Cada arquivo armazena dados de barras de um
minuto para um ano. Por exemplo, o arquivo nomeado 2009.hcc na pasta EURUS D contém barras de
um minuto de EURUS D para o ano de 2009. Estes arquivos são usados para preparar dados de preço
para todas as janelas de tempo e não são destinados para acesso direto.
Para economizar recursos, os dados em uma janela de tempo são armazenados e guardamos em R AM
somente se necess ário. Se não for chamado por um longo tempo, eles são liberados da R AM e salvos
em um arquivo. Para cada janela de tempo, os dados são preparados independentemente se existem
dados prontos ou não para outras janelas de tempo. R egras para formação e acesso aos dados são as
mesmas para todas as janelas de tempo. Isso significa que apesar da unidade de dados armazenada
em H CC ser de um minuto, a disponibilidade de dados H CC não significa a disponibilidade de dados na
janela de tempo M 1 como H C no mesmo volume.
O parâmetro " M áx bars no gráfico" restringe o número de barras em formato H C disponível para
gráficos, indicadores e programas mql5. Isso é v álido para todas as janelas de tempo disponíveis e
serve, primeiramente, para economizar recursos do computador.
Ao definir um grande valor para este parâmetro, deve ser lembrado que se dados de preço de histórico
longo para pequenas janelas de tempo estiverem disponíveis, a memória usada para armazenadas a
série de preços e buffers de indicadores podem se tornar centenas de megabytes e alcançar a restrição
de R AM do programa terminal cliente (2Gb para aplicativos 32-bit do MS W indows).
A alteração do parâmetro " M áx. barras no gráfico" produz efeito após o terminal cliente ser reiniciado.
A alteração deste parâmetro não causa referência automática a um servidor por dados adicionais, e
nem formação de barras adicionais de séries de tempo. Dados de preço adicionais são solicitados ao
servidor, e séries de preço são atualizadas levando em conta a nova limitação, em caso de rolagem de
um gráfico para uma área sem dados, ou quando dados são solicitado por um programas MQL5 .
Disponibilidade de Dados
A presença de dados no formato H CC ou mesmo no formato preparado H C não significa sempre a
absoluta disponibilidade destes dados para serem exibidos em um gráfico ou usados em um programa
mql5.
Ao acessar dados de preços ou valores de indicadores a partir de um programa mql5 deve ser lembrado
que a sua disponibilidade em um certo momento do tempo ou iniciando a partir de um certo momento
de tempo não é garantida. Isso está relacionado com fato de que para economizar recursos, a cópia
completa dos dados necess ários para um programa mql5 não é armazenada no MetaT rader 5; apenas
um acesso direto à base de dados do terminal é fornecida.
O histórico de preços para todas as janelas de tempo é construído a partir de dados comuns em
formato H CC, e qualquer atualização dos dados a partir de um servidor conduz à atualização de dados
para todas as janelas de tempo e ao recálculo dos indicadores. Devido a isso, o acesso aos dados pode
ficar fechado, mesmo se estes dados estiverem disponíveis a um momento atrás.
Algoritmos usando ciclos de latência não são a melhor solução. A única exceção neste caso são os
scripts, porque eles não nenhuma escolha de algoritmo alternativo porque eles não tem manipuladores
de evento. Para indicadores customizados tais algoritmos, bem como quaisquer outros ciclos de
latência são fortemente não recomendados, porque levam a finalização do cálculo de todos os
indicadores e qualquer outro manipulador de dados de preço do ativo.
Para Expert Advisor e indicadores, é melhor usar o modelo de eventos de manipulação. Se durante a
manipulação dos eventos OnT ick () ou OnCalculate(), o recebimento de dados para a janela de tempo
requerida falhar, você deve sair do manipulador de evento, confiando na disponibilidade de acesso
durante a próxima chamada do manipulador.
Escreve todas as ações relacionadas a recepção de dados como uma função separada,
Check LoadH istory(s ymbol, timeframe, start_date):
A função Check LoadH istory() é projetada como uma função universal que pode ser chamada de
qualquer programa (Expert Advisor, script ou indicador); e portanto ela solicita três parâmetros de
entrada: nome do ativo, período e data de inicio para indicar o começo do histórico de preço que você
necessita.
Insira as verificações necess árias no código da função antes de solicitar o histórico faltante.
Primeiramente, nós devemos assegurar que o nome do ativo e valor de período estão corretos :
Então vamos nos assegurar que o ativo está disponível na janela Observador de Mercado, isto é, o
histórico para o ativo estará disponível durante o envio de uma solicitação a um servidor de
negociação. Se não houver tal ativo no Observador de Mercado, adicionar ele usando a função
S ymbolSelect().
if(!SymbolInfoInteger(symbol,SYMBOL_SELECT))
{
if(GetLastError()==ERR_MARKET_UNKNOWN_SYMBOL) return(-1);
SymbolSelect(symbol,true);
}
Agora nós devemos receber a data de início do histórico disponível para o par ativo/período indicado.
T alvez, o valor do parâmetro de entrada startdate, passado para Check LoadH istory(), já esteja
disponível no histórico; então a solicitação a um servidor de negociação não é necess ária. A fim de
obter a primeira data para o ativo-período, a função Series InfoInteger() com o modificador
SERIES _FIR S TDAT E é usada.
SeriesInfoInteger(symbol,period,SERIES_FIRSTDATE,first_date);
if(first_date>0 && first_date<=start_date) return(1);
A próxima importante verificação é o tipo do programa, a partir do qual a função é chamada. Note que
enviar uma solicitação de atualização de série de tempo com o mesmo período do indicador, que
chama a atualização, não é desejável. O problema de solicitar dados sobre o mesmo ativo-período que
o do indicador está relacionado ao fato de que a atualização de dados de histórico é realizada na
mesma thread onde o indicador opera. Assim a possibilidade de ocorrência de conflito é alta. Para
verificar isso use a função MQL5InfoInteger() com o modificador MQL5_PR OGR AM _TYPE.
Se todas as verificações tiverem passado com sucesso, faça a última tentativa de acesso sem se
referir ao servidor de negociação Primeiramente, descubra a data de início, para qual dados de minuto
no formato H CC estão disponíveis. Solicite este valor usando a função Series InfoInteger() com o
modificador SERIES _T ER M INAL _FIR S TDAT E e compare novamente ele com o valor do parâmetro
start_date.
if(SeriesInfoInteger(symbol,PERIOD_M1,SERIES_TERMINAL_FIRSTDATE,first_date))
{
//--- existe dados carregados para construir a série de tempo
if(first_date>0)
{
//--- força a construção da série de tempo
CopyTime(symbol,period,first_date+PeriodSeconds(period),1,times);
//--- verifica
if(SeriesInfoInteger(symbol,period,SERIES_FIRSTDATE,first_date))
if(first_date>0 && first_date<=start_date) return(2);
}
}
int max_bars=TerminalInfoInteger(TERMINAL_MAXBARS);
Nós precisaremos dele para evitar solicitar dados extra. Então encontre a primeira data no sistema do
ativo no servidor de negociação (independentemente do período) usando a já conhecida função
Series InfoInteger() com o modificador SERIES _SERVER_FIR S TDAT E.
datetime first_server_date=0;
while(!SeriesInfoInteger(symbol,PERIOD_M1,SERIES_SERVER_FIRSTDATE,first_server_date) && !IsStopp
Sleep(5);
Já que a solicitação é uma operação assíncrona, a função é chamada no ciclo com uma espera de 5
milissegundos até a variável first_server_date receber um valor, ou a execução do ciclo ser terminada
por um usuário (IsStopped() retornará true neste caso). Vamos indicar um valor correto da data de
início, começando a partir do qual nós solicitamos dados de preço de um servidor de negociação.
if(first_server_date>start_date) start_date=first_server_date;
if(first_date>0 && first_date<first_server_date)
Print("Aviso: primeira data de servidor ",first_server_date," para",
symbol," não coincide com a primeira data de série ",first_date);
Se a data de início first_server_date do servidor for menor que o data de início first_date do ativo em
formato H CC, a correspondente entrada será impressa no diário.
Agora nós estamos prontos para fazer uma solicitação a um servidor de negociação por dados de preço
faltantes. Faça a solicitação na forma de um ciclo e comece preenchendo seu corpo:
while(!IsStopped())
{
//1. espere pela sincronização entre a série de tempo reconstruída e o histórico intermediári
//2. receba o número corrente de barra n desta série de tempo
// se bars for maior que Max_bars_in_char, nós podem sair, o trabalho está terminado,
//3. obter a data de início first_date na série de tempo reconstruída e comparar ela com stra
// se first_date for menor que start_date, nós podemos sair, o trabalho está terminado
//4. solicitar a um servidor uma nova parte do histórico - 100 barras começando da última bar
}
while(!IsStopped())
{
//--- 1. esperar até o processo de reconstrução da série de tempo acabar
while(!SeriesInfoInteger(symbol,period,SERIES_SYNCHRONIZED) && !IsStopped())
Sleep(5);
//--- 2. solicitar quantas barras nós tempos
int bars=Bars(symbol,period);
if(bars>0)
{
//--- barras mais que podem ser desenhadas no gráfico, sair
if(bars>=max_bars) return(-2);
//--- 3. retorne a data de início corrente na série de tempo
if(SeriesInfoInteger(symbol,period,SERIES_FIRSTDATE,first_date))
// data de início foi anterior a aquela solicitada, tarefa concluída
if(first_date>0 && first_date<=start_date) return(0);
}
//4. Solicitar a um servidor uma nova parte do histórico - 100 barras começando da última bar
}
Sobrou o quarto último ponto - solicitar histórico. Nós não podemos referenciar a um servidor
diretamente, mas toda função-Copy inicia automaticamente uma solicitação de envio a um servidor,
se o histórico em formato H CC não for suficiente. Já que a hora da primeira data de início na variável
first_date é um simples e natural critério para avaliar o grau de execução de uma solicitação, então a
forma mais fácil é usar a função CopyT ime().
Ao chamar funções que copiam quaisquer dados de séries de tempo, deve ser notado que o parâmetro
start (número da barra, começando a partir do qual dados de preço devem ser copiados) deve sempre
estar dentro do histórico de terminal disponível. Se você tiver somente 100 barras, é inútil tentar
copiar 300 barras começando da barra com o índice 500. T al solicitação será entendida como um error
e não será tratada, isto é, nenhum histórico adicional será carregado de um servidor de negociação.
Esta é a razão porque nós copiaremos 100 barras começando da barra com o índice bars . Isso
fornecerá uma carga suave de histórico faltando doe um servidor de negociação. Na verdade, um
pouco mais que as 100 barras solicitadas serão carregadas, já que o servidor envia um histórico
superdimensionado.
int copied=CopyTime(symbol,period,bars,100,times);
Após a operação de cópia, nós devemos analizar o número de elementos copiados. Se a tentativa
falhar, então o valor copiado será igual a null e o valor do contador fail_cnt será aumentado em 1.
Após 100 tentativas com falha, a operação da função será interrompida.
int fail_cnt=0;
...
int copied=CopyTime(symbol,period,bars,100,times);
if(copied>0)
{
//--- verifica dados
if(times[0]<=start_date) return(0); // o valor copiado é menor, pronto
if(bars+copied>=max_bars) return(-2); // as barras são mais do que se pode desenhar no gráfic
fail_cnt=0;
}
else
{
//--- não mais que 100 tentativas falhando em sucessão
fail_cnt++;
if(fail_cnt>=100) return(-5);
Sleep(10);
}
Então, não somente manipulação correta da situação corrente em cada momento de execução está
implementada na função, mas também o código de finalização é retornado, que pode ser tratado
depois chamando a função Check LoadH istory() para obtenção de informações adicionais. Por exemplo,
desta forma:
int res=CheckLoadHistory(InpLoadedSymbol,InpLoadedPeriod,InpStartDate);
switch(res)
{
case -1 : Print("Unknown symbol ",InpLoadedSymbol); break;
case -2 : Print("More requested bars than can be drawn in the chart"); break;
case -3 : Print("Execution stopped by user"); break;
case -4 : Print("Indicator mustn't load its own data"); break;
case -5 : Print("Loading failed"); break;
case 0 : Print("All data loaded"); break;
case 1 : Print("Already available data in timeseries are enough"); break;
case 2 : Print("Timeseries is built from available terminal data"); break;
default : Print("Execution result undefined");
}
O código completo da função pode ser encontrado no exemplo de um script que mostra a correta
organização de acesso de quaisquer dados com a manipulação de resultados de solicitação.
Code:
//+------------------------------------------------------------------+
//| 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
//--- parâmetros de entrada
input string InpLoadedSymbol="NZDUSD"; // Ativo a ser carregado
input ENUM_TIMEFRAMES InpLoadedPeriod=PERIOD_H1; // Perídio a ser carregado
input datetime InpStartDate=D'2006.01.01'; // Data de início
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
Print("Start load",InpLoadedSymbol+","+GetPeriodName(InpLoadedPeriod),"from",InpStartDate);
//---
int res=CheckLoadHistory(InpLoadedSymbol,InpLoadedPeriod,InpStartDate);
switch(res)
{
case -1 : Print("Unknown symbol ",InpLoadedSymbol); break;
case -2 : Print("Requested bars more than max bars in chart"); break;
case -3 : Print("Program was stopped"); break;
case -4 : Print("Indicator shouldn't load its own data"); break;
case -5 : Print("Load failed"); break;
case 0 : Print("Loaded OK"); break;
case 1 : Print("Loaded previously"); break;
case 2 : Print("Loaded previously and built"); break;
default : Print("Unknown result");
}
//---
datetime first_date;
SeriesInfoInteger(InpLoadedSymbol,InpLoadedPeriod,SERIES_FIRSTDATE,first_date);
int bars=Bars(InpLoadedSymbol,InpLoadedPeriod);
Print("Primeira data ",first_date," - ",bars," barres");
//---
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int CheckLoadHistory(string symbol,ENUM_TIMEFRAMES period,datetime start_date)
{
datetime first_date=0;
datetime times[100];
//--- verifica ativo e período
if(symbol==NULL || symbol=="") symbol=Symbol();
if(period==PERIOD_CURRENT) period=Period();
//--- verifica se o ativo está selecionado no Observador de Mercado
if(!SymbolInfoInteger(symbol,SYMBOL_SELECT))
{
if(GetLastError()==ERR_MARKET_UNKNOWN_SYMBOL) return(-1);
SymbolSelect(symbol,true);
}
//--- verifica se os dados estão presentes
SeriesInfoInteger(symbol,period,SERIES_FIRSTDATE,first_date);
if(first_date>0 && first_date<=start_date) return(1);
//--- não pede para carregar seus próprios dados se ele for um indicador
if(MQL5InfoInteger(MQL5_PROGRAM_TYPE)==PROGRAM_INDICATOR && Period()==period && Symbol()==symbol
return(-4);
//--- segunda tentativa
if(SeriesInfoInteger(symbol,PERIOD_M1,SERIES_TERMINAL_FIRSTDATE,first_date))
{
//--- existe dados carregados para construir a série de tempo
if(first_date>0)
{
//--- força a construção da série de tempo
CopyTime(symbol,period,first_date+PeriodSeconds(period),1,times);
//--- verifica
if(SeriesInfoInteger(symbol,period,SERIES_FIRSTDATE,first_date))
if(first_date>0 && first_date<=start_date) return(2);
}
}
//--- máximo de barras em um gráfico a partir de opções do terminal
int max_bars=TerminalInfoInteger(TERMINAL_MAXBARS);
//--- carrega informações de histórico do ativo
datetime first_server_date=0;
while(!SeriesInfoInteger(symbol,PERIOD_M1,SERIES_SERVER_FIRSTDATE,first_server_date) && !IsStopp
Sleep(5);
//--- corrige data de início para carga
if(first_server_date>start_date) start_date=first_server_date;
if(first_date>0 && first_date<first_server_date)
Print("Aviso: primeira data de servidor ",first_server_date," para ",symbol,
" não coincide com a primeira data de série ",first_date);
//--- carrega dados passo a passo
int fail_cnt=0;
while(!IsStopped())
{
//--- espera pela construção da série de tempo
while(!SeriesInfoInteger(symbol,period,SERIES_SYNCHRONIZED) && !IsStopped())
Sleep(5);
//--- pede por construir barras
int bars=Bars(symbol,period);
if(bars>0)
{
if(bars>=max_bars) return(-2);
//--- pede pela primeira data
if(SeriesInfoInteger(symbol,period,SERIES_FIRSTDATE,first_date))
if(first_date>0 && first_date<=start_date) return(0);
}
SeriesInfoInteger
R etorna informações sobre o estado de dados históricos. Existem 2 variantes de chamada da função.
Parâmetros
symbol_name
[in] Nome do ativo.
timeframe
[in] Período.
prop_id
[in] Identificador da propriedade solicitada, valor da enumeração ENUM _SERIES _INFO_INT EGER .
long_var
[out] Variável para onde o valor da propriedade solicitada é colocado.
Valor do Retorno
No primeiro caso, ela retorna valor do tipo long.
Para o segundo caso, ela retorna true, se a propriedade especificada estiver disponível e seu valor é
colocada na variável long _var, caso contrário ela returna false. Para mais detalhes sobre um erro,
chame a função GetLastError().
Exemplo:
void OnStart()
{
//---
Print("Total number of bars for the symbol-period at this moment = ",
SeriesInfoInteger(Symbol(),Period(),SERIES_BARS_COUNT));
Print("The first date in the history for the symbol-period on the server = ",
(datetime)SeriesInfoInteger(Symbol(),Period(),SERIES_SERVER_FIRSTDATE));
Bars
R etorna o número de barras no histórico para um ativo e período específicos. Existe 2 variantes de
chamada da função.
Parâmetros
symbol_name
[in] Nome do ativo.
timeframe
[in] Período.
start_time
[in] H ora da barra correspondente ao primeiro elemento.
stop_time
[in] H ora da barra correspondente ao último elemento.
Valor do Retorno
Se os parâmetros start_time e stop_time estiverem definidos, a função retorna o número de barras
no intervalo de tempo especificado, caso contrário retorna o número total de barras.
Observação
Se os dados para a série de tempo com parâmetros especificados não estiverem formados no
terminal na hora que a função Bars() for chamada, ou dados da série de tempo não estiverem
sincronizados com um servidor de negociação no momento da chamada da função, a função retorna
o valor zero.
Ao solicitar o número de barras, no intervalo estabelecido de datas, são levados em conta apenas as
barras cujo tempo de abertura está dentro desse intervalo. Por exemplo, se o dia da semana é
s ábado, ao pedir o número de barras semanais indicando start_time=última_terça_feira e
stop_time=última_sexta_feira, a função retorna 0, pois, por um lado, o tempo de abertura no
timeframe semanal sempre coincide com um domingo e, por outro, não há nenhuma barra semanal
que fique dentro do intervalo estabelecido.
Veja Também
Funções de Processamento de Eventos
BarsCalculated
R etorna o número de dados calculados para o indicador especificado.
int BarsCalculated(
int indicator_handle, // handle do indicador
);
Parâmetros
indicator_handle
[in] O handle do indicador, retornado pela função do indicador correspondente.
Valor do Retorno
R etorna a quantidade de dados calculados no buffer de indicador, ou -1 em caso de erro (dados
ainda não calculados)
Observação
A função é útil quando é necess ário obter os dados do indicador imediatamente após sua criação (o
handle do indicador está disponível).
Exemplo:
void OnStart()
{
double Ups[];
//--- define a ordenação de série de tempo para os arrays
ArraySetAsSeries(Ups,true);
//--- cria handle para o indicador Fractal
int FractalsHandle=iFractals(NULL,0);
//--- redefine o código de erro
ResetLastError();
//--- tenta copiar os valores do indicador
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("Failed to copy upper fractals. Erro = ",GetLastError(),
"i = ",i," copiado = ",copied);
return;
}
else
Print("Upper fractals copied",
"i = ",i," copiado = ",copied);
}
else Print("Upper fractals copied. ArraySize = ",ArraySize(Ups));
}
IndicatorCreate
A função retorna o handle de um indicador técnico especificado criado baseado no array de parâmetros
de tipo MqlParam.
int IndicatorCreate(
string symbol, // nome do ativo
ENUM_TIMEFRAMES period, // janela de tempo
ENUM_INDICATOR indicator_type, // tipo de indicador a partir da enumeração
int parameters_cnt=0, // número de parâmetros
const MqlParam& parameters_array[]=NULL, // array de parâmetros
);
Parâmetros
symbol
[in] Nome de um ativo, sobre cujos dados o indicador é calculado. NULL significa o ativo corrente.
period
[in] O valor da janela de tempo pode ser um dos valores da enumeração ENUM _TIMEFR AMES, 0
significa a janela de tempo corrente.
indicator_type
[in] T ipo de indicador, pode ser um dos valores da enumeração ENUM _INDICAT OR .
parameters_cnt
[in] O número de parâmetros passados no array parameters _array[]. Os elementos do array têm
uma estrutura especial de tipo MqlParam. Por default, zero - parâmetros são passados. Se você
especificar um número não zero de parâmetros, o parâmetro parameters_array é obrigatório. Você
não pode passar mais que 64 parâmetros.
parameters_array[]=NULL
[in] Um array do tipo MqlParam, cujos elementos contém o tipo e valor de cada parâmetro de
input de um indicador técnico.
Valor de retorno
R etorna o handle de um indicador técnico especificado, em caso de falha retorna INVAL ID_H ANDLE.
Observação
Se o handle de indicador de tipo IND_CUS T OM for criado, o campo type do primeiro elemento do
array de parâmetros de entrada parameters_array deve ter o valor TYPE_S TRING da enumeração
ENUM _DAT ATYPE, e o campo string_value do primeiro elemento deve conter o nome do indicador
customizado. O indicador customizado deve estar compilado (arquivo com extensão EX5) e
localizado no diretório MQL5/Indicators do terminal cliente ou em um subdiretório.
Indicadores que requerem teste são definidos automaticamente a partir da chamada da função
iCustom(), se o correspondente parâmetro for definido através de um string constante. Para todos
os outros casos (uso da função IndicatorCreate() ou uso de uma string não-constante no parâmetro
de define o nome do indicador) a propriedade #property tester_indicator é requerida:
#property tester_indicator "indicator_name.ex5"
Se primeira forma da chamada for usada em um indicador customizado, você pode adicionalmente
indicar como último parâmetro sobre quais dados o indicador será calculado, ao passar os
parâmetros de input. Se o parâmetro " Apply to" não for especificado explicitamente, o cálculo
default é baseado no valores de PRICE_CLOSE.
Exemplo:
void OnStart()
{
MqlParam params[];
int h_MA,h_MACD;
//--- criar iMA("EURUSD",PERIOD_M15,8,0,MODE_EMA,PRICE_CLOSE);
ArrayResize(params,4);
//--- define ma_period
params[0].type =TYPE_INT;
params[0].integer_value=8;
//--- define ma_shift
params[1].type =TYPE_INT;
params[1].integer_value=0;
//--- define ma_method
params[2].type =TYPE_INT;
params[2].integer_value=MODE_EMA;
//--- define applied_price
params[3].type =TYPE_INT;
params[3].integer_value=PRICE_CLOSE;
//--- criar MA
h_MA=IndicatorCreate("EURUSD",PERIOD_M15,IND_MA,4,params);
//--- criar iMACD("EURUSD",PERIOD_M15,12,26,9,h_MA);
ArrayResize(params,4);
//--- define ma_period rápido
params[0].type =TYPE_INT;
params[0].integer_value=12;
//--- define ma_period lento
params[1].type =TYPE_INT;
params[1].integer_value=26;
//--- define período de suavização por diferença
params[2].type =TYPE_INT;
params[2].integer_value=9;
//--- define o handle do indicador como applied_price
params[3].type =TYPE_INT;
params[3].integer_value=h_MA;
//--- criar MACD baseado em média móvel
h_MACD=IndicatorCreate("EURUSD",PERIOD_M15,IND_MACD,4,params);
//--- usa os indicadores
//--- . . .
//--- libera os indicatores (primeiro h_MACD)
IndicatorRelease(h_MACD);
IndicatorRelease(h_MA);
}
IndicatorParameters
Baseado no handle especificado, retorna o número de parâmetros de entrada do indicador, bem como
os valores e tipos dos parâmetros.
int IndicatorParameters(
int indicator_handle, // handle do indicador
ENUM_INDICATOR& indicator_type, // uma variável para receber o tipo do indicador
MqlParam& parameters[] // um array para receber parâmetros
);
Parâmetros
indicator_handle
[in] O handle do indicador, para o qual você precisa saber o número de parâmetros sobre os quais
o indicador é calculado.
indicator_type
[out] Uma variável de tipo ENUM _INDICAT OR , na qual o tipo do indicador será escrito.
parameters[]
[out] Um array dinâmico para receber valores do tipo MqlParam, na qual a lista de parâmetros do
indicador será escrito. O tamanho do array é retornado pela função IndicatorParameters().
Valor do Retorno
O número de parâmetros de entrada do indicador com o handle especificado. No caso de um erro,
retorna -1. Para mais detalhes sobre o erro chame a função GetLastError().
Exemplo:
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
//--- O número de janelas no gráfico (ao menos uma janela principal está sempre presente)
int windows=(int)ChartGetInteger(0,CHART_WINDOWS_TOTAL);
//--- Varre as janelas do gráfico
for(int w=0;w<windows;w++)
{
//--- O número de indicadores nesta janela/sub-janela
int total=ChartIndicatorsTotal(0,w);
//--- Pega todos os indicadores na janela
for(int i=0;i<total;i++)
{
//--- Obtém o nome abreviado do indicador
string name=ChartIndicatorName(0,w,i);
//--- Obtém o handle do indicador
int handle=ChartIndicatorGet(0,w,name);
//--- Adicionar o log
Também Veja
ChartIndicatorGet()
IndicatorRelease
A função remove um handle de indicador e libera o bloco de cálculo do indicador, se ele não for usado
por ninguém mais.
bool IndicatorRelease(
int indicator_handle, // handle do indicador
);
Valor de retorno
R etorna true no caso de sucesso, caso contrário retorna false.
Observação
A função permite remover um handle de indicador, se ele não mais for necess ário, deste modo,
economizando memória . O handle é removido imediatamente, o bloco de cálculo é excluído em
algum momento (se ele não for chamado por ninguém mais).
Exemplo:
//+------------------------------------------------------------------+
//| 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"
//--- parâmetros de entrada
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;
//--- armazenará o handle de indicador
int MA_handle=INVALID_HANDLE;
//+------------------------------------------------------------------+
//| Função de inicialização do Expert |
//+------------------------------------------------------------------+
int OnInit()
{
//--- cria um handle de indicador
MA_handle=iMA(Symbol(),0,MA_Period,MA_shift,MA_smooth,PRICE_CLOSE);
//--- exclui variável global
if(GlobalVariableCheck("MA_value"))
GlobalVariableDel("MA_value");
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
CopyBuffer
Obtém dados de um buffer especificado de um certo indicador na quantidade necess ária.
A contagem de elementos de dados copiados (buffer de indicador com o índice buffer_num) da posição
de início é realizada do presente para o passado, isto é, posição de início 0 significa a barra corrente
(valor do indicador para a barra corrente).
Ao copiar uma quantidade ainda desconhecida de dados, é recomendado usar um array dinâmico como
um buffer[] recipiente, porque a função CopyBuffer() tenta alocar o tamanho do array receptor ao
tamanho dos dados copiados. Se um buffer de indicador (array que é pré-alocado para armazenar
valores de um indicador através da função SetIndex Bufer()) for usado como um array recipiente
buffer[], uma copia parcial é permitida. Um exemplo pode ser encontrado no indicador customizado
Awesome_Oscillator.mql5 no pacote padrão do terminal.
Se você precisar fazer uma cópia parcial dos valores de um indicador em um outro array (um não
buffer de indicador), você deve usar um array intermediário, para o qual o número desejado é
copiado. Após isso, conduza uma cópia elemento a elemento do requerido número de valores para os
lugares requeridos em um array de recepção a partir deste array intermediário.
Se você souber a quantidade de dados que você precisa para copiar, é melhor usar um buffer alocado
estaticamente, a fim de evitar a alocação de memória excessiva.
Não importa qual seja a propriedade do array destino - como series =true ou como series =false. Os
dados serão copiados de tal maneira que o elemento mais antigo será localizado no início da memória
física alocada para o array. Exitem 3 variantes de chamada da função.
Parâmetros
indicator_handle
[in] O handle do indicador, retornado pela função do indicador correspondente.
buffer_num
[in] O número do buffer do indicador.
start_pos
[in] A posição do primeiro elemento para copiar.
count
[in] Quantidade de dados para copiar.
start_time
[in] H ora da barra, correspondente ao primeiro elemento.
stop_time
[in] H ora da barra, correspondente ao último elemento.
buffer[]
[out] Array de tipo double.
Valor do Retorno
R etorna a quantidade de dados copiados ou -1 no caso de um erro.
Observação
Ao solicitar dados de um indicador, se as séries de tempo solicitadas não estiverem ainda
construídas ou elas precisarem serem baixadas do servidor, a função imediatamente retornará -1,
mas o processo de download/construção será iniciado.
Ao solicitar dados de um Expert Advisor ou script, o download do servidor será iniciado se o terminal
não tiver estes dados localmente, ou a construção da série de tempo solicitada iniciará, se os dados
puderem ser construídas a partir do histórico local mas eles não estiverem prontos ainda. A função
retornará a quantidade de dados que estará pronta no momento da expiração do tempo limite.
Exemplo:
//+------------------------------------------------------------------+
//| 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
//---- plotar MA
#property indicator_label1 "MA"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- parâmetros de entrada
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 do indicador
double MABuffer[];
int ma_handle;
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado |
//+------------------------------------------------------------------+
int OnInit()
{
//--- mapeamento de buffers do indicador
SetIndexBuffer(0,MABuffer,INDICATOR_DATA);
Print("Parameter AsSeries = ",AsSeries);
Print("Buffer do indicador após SetIndexBuffer() é timeseries = ",
ArrayGetAsSeries(MABuffer));
//--- define o nome abreviado do indicador
IndicatorSetString(INDICATOR_SHORTNAME,"MA("+period+")"+AsSeries);
//--- define AsSeries(depende do parâmetro de entrada)
ArraySetAsSeries(MABuffer,AsSeries);
Print("Buffer do indicador após ArraySetAsSeries(MABuffer,true); é timeseries = ",
ArrayGetAsSeries(MABuffer));
//---
ma_handle=iMA(Symbol(),0,period,shift,smootMode,price);
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
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[])
{
//--- verifica se todos os dados estão calculados
if(BarsCalculated(ma_handle)<rates_total) return(0);
//--- nós não podemos copiar todos os dados
int to_copy;
if(prev_calculated>rates_total || prev_calculated<=0) to_copy=rates_total;
else
{
to_copy=rates_total-prev_calculated;
//--- o último valor é sempre copiado
to_copy++;
}
//--- tenta copiar
if(CopyBuffer(ma_handle,0,0,to_copy,MABuffer)<=0) return(0);
//--- valor retorno de prev_calculated para a próxima chamada
return(rates_total);
}
//+------------------------------------------------------------------+
O exemplo acima ilustra como um buffer de indicador é preenchido com os valores de um outro buffer
de indicador a partir de um indicador sobre o mesmo ativo/período.
Veja uma exemplo detalhado de solicitação de dados históricos na seção Métodos de Vinculação de
Objetos. O script disponível nesta seção mostra como obter os valores do indicador iFractals nas
últimas 1000 barras e como exibir os últimos 10 fractais de alta e os últimos 10 fractais de baixa no
gráfico. Uma técnica simular pode ser usada para todos os indicadores que têm dados faltantes e que
são usualmente desenhados usando os seguintes estilos :
· DR AW_SECTI ON,
· DR AW_ARR OW ,
· DR AW_ZIGZAG,
· DR AW_COLOR_SECTI ON,
· DR AW_COLOR_ARR OW ,
· DR AW_COLOR_ZIGZAG.
Também Veja
Propriedades de Indicadores Customizados, SetIndex Buffer
CopyRates
Obtém dados históricos de estrutura MqlR ates de um ativo-período especificado na quantidade
especificada no array rates _array. A ordenação dos elementos dos dados copiados é do presente para
o passado, isto é, a posição de início 0 significa a barra corrente.
Ao copiar uma quantidade desconhecida de dados, é recomendável usar um array dinâmico como array
destino, porque se a quantidade solicitada de dados for menor (ou maior) que o comprimento do array
destino, a função tenta realocar a memória de qual forma que os dados solicitados caibam
completamente.
Se você souber a quantidade de dados que você precisa para copiar, é melhor usar um buffer alocado
estaticamente, a fim de evitar a alocação de memória excessiva.
Não importa qual seja a propriedade do array destino - como series =true ou como series =false. Os
dados serão copiados de tal maneira que o elemento mais antigo será localizado no início da memória
física alocada para o array. Exitem 3 variantes de chamada da função.
Parâmetros
symbol_name
[in] Nome do ativo.
timeframe
[in] Período.
start_time
[in] H ora da barra do primeiro elemento para copiar.
start_pos
[in] A posição de início do primeiro elemento para copiar.
count
[in] Quantidade de dados para copiar.
stop_time
[in] H ora da barra, correspondente ao último elemento para copiar.
rates_array[]
[out] Array de tipo MqlR ates.
Valor do Retorno
R etorna o número de elementos copiados ou -1 no caso de um erro.
Observação
Se o intervalo inteiro de dados solicitados não estiver disponível no servidor, a função retorna -1.
Se dados fora do T ER M INAL _MAXBAR S (número máximo de barras no gráfico) for solicitado, a
função também retornará -1.
Ao solicitar dados de um Expert Advisor ou script, o download do servidor será iniciado se o terminal
não tiver estes dados localmente, ou a construção da série de tempo solicitada iniciará, se os dados
puderem ser construídas a partir do histórico local mas eles não estiverem prontos ainda. A função
retornará a quantidade de dados que estará pronta no momento da expiração do tempo limite, mas
o download do histórico continuará, e na próximo solicitação simular, a função retornará mais
dados.
Ao solicitar dados através da data de início e do número de elementos requeridos, somente dados
cuja data seja menor (anterior) ou igual a data especificada são retornados. Isso significa que a
hora de abertura de qualquer barra, para cujo valor é retornado (volume, spread, valor no buffer de
indicador, preços de Abertura, M áximo, Mínimo, Fechamento ou H ora de Abertura) é sempre menor
ou igual ao valor especificado.
Ao solicitar dados em uma faixa especificada de datas, somente dados deste intervalo serão
retornados. O intervalo é definido e contado em segundos. Isso significa que a hora de abertura de
qualquer barra, para cujo valor é retornado (volume, spread, valor no buffer de indicador, preços de
Abertura, M áximo, Mínimo, Fechamento ou H ora de Abertura) é sempre dentro do intervalo
solicitado.
Assim, se o dia corrente for s ábado, e em uma tentativa de copiar dados usando a janela de tempo
semanal, você especificar start_time=Last_Tuesday e stop_time=Last_Friday, a função retornará 0,
porque a hora de abertura em uma janela de tempo semanal é sempre domingo, e nenhum barra
semanal cairá no intervalo especificado.
Se você precisar retornar o valor correspondente para a barra corrente incompleta, você pode usar a
primeira forma de chamada, especificando start_pos =0 e count=1.
Exemplo:
void OnStart()
{
//---
MqlRates rates[];
ArraySetAsSeries(rates,true);
int copied=CopyRates(Symbol(),0,0,100,rates);
if(copied>0)
{
Print("Barres copiados: "+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("Falha ao receber dados históricos para o símbolo ",Symbol());
}
· DR AW_SECTI ON,
· DR AW_ARR OW ,
· DR AW_ZIGZAG,
· DR AW_COLOR_SECTI ON,
· DR AW_COLOR_ARR OW ,
· DR AW_COLOR_ZIGZAG.
Também Veja
Estruturas e Classes, T imeT oString, String Format
CopyTime
A função obtém em time_array o histórico de dados da hora de abertura de barras para o par ativo-
período especificado na quantidade especificada. Deve ser notado que a ordenação dos elementos é do
presente para o passado, isto é, a posição de início 0 significa a barra corrente.
Ao copiar uma quantidade desconhecida de dados, é recomendável usar um array dinâmico como array
destino, porque se a quantidade solicitada de dados for menor (ou maior) que o comprimento do array
destino, a função tenta realocar a memória de qual forma que os dados solicitados caibam
completamente.
Se você souber a quantidade de dados que você precisa para copiar, é melhor usar um buffer alocado
estaticamente, a fim de evitar a alocação de memória excessiva.
Não importa qual seja a propriedade do array destino - como series =true ou como series =false. Os
dados serão copiados de tal maneira que o elemento mais antigo será localizado no início da memória
física alocada para o array. Exitem 3 variantes de chamada da função.
Parâmetros
symbol_name
[in] Nome do ativo.
timeframe
[in] Período.
start_pos
[in] A posição de início do primeiro elemento para copiar.
count
[in] Quantidade de dados para copiar.
start_time
[in] A hora de início para o primeiro elemento para copiar.
stop_time
[in] H ora da barra, correspondente ao último elemento para copiar.
time_array[]
[out] Array de tipo datetime.
Valor do Retorno
R etorna a quantidade de dados copiados ou -1 no caso de um erro.
Observação
Se o intervalo inteiro de dados solicitados não estiver disponível no servidor, a função retorna -1.
Se dados fora do T ER M INAL _MAXBAR S (número máximo de barras no gráfico) for solicitado, a
função também retornará -1.
Ao solicitar dados de um Expert Advisor ou script, o download do servidor será iniciado se o terminal
não tiver estes dados localmente, ou a construção da série de tempo solicitada iniciará, se os dados
puderem ser construídas a partir do histórico local mas eles não estiverem prontos ainda. A função
retornará a quantidade de dados que estará pronta no momento da expiração do tempo limite, mas
o download do histórico continuará, e na próximo solicitação simular, a função retornará mais
dados.
Ao solicitar dados através da data de início e do número de elementos requeridos, somente dados
cuja data seja menor (anterior) ou igual a data especificada são retornados. Isso significa que a
hora de abertura de qualquer barra, para cujo valor é retornado (volume, spread, valor no buffer de
indicador, preços de Abertura, M áximo, Mínimo, Fechamento ou H ora de Abertura) é sempre menor
ou igual ao valor especificado.
Ao solicitar dados em uma faixa especificada de datas, somente dados deste intervalo serão
retornados. O intervalo é definido e contado em segundos. Isso significa que a hora de abertura de
qualquer barra, para cujo valor é retornado (volume, spread, valor no buffer de indicador, preços de
Abertura, M áximo, Mínimo, Fechamento ou H ora de Abertura) é sempre dentro do intervalo
solicitado.
Assim, se o dia corrente for s ábado, e em uma tentativa de copiar dados usando a janela de tempo
semanal, você especificar start_time=Last_Tuesday e stop_time=Last_Friday, a função retornará 0,
porque a hora de abertura em uma janela de tempo semanal é sempre domingo, e nenhum barra
semanal cairá no intervalo especificado.
Se você precisar retornar o valor correspondente para a barra corrente incompleta, você pode usar a
primeira forma de chamada, especificando start_pos =0 e count=1.
· DR AW_SECTI ON,
· DR AW_ARR OW ,
· DR AW_ZIGZAG,
· DR AW_COLOR_SECTI ON,
· DR AW_COLOR_ARR OW ,
· DR AW_COLOR_ZIGZAG.
CopyOpen
A função obtém em open_array os dados históricos de preços de abertura de barras para o par ativo-
período selecionado na quantidade especificada. Deve ser notado que a ordenação dos elementos é do
presente para o passado, isto é, a posição de início 0 significa a barra corrente.
Ao copiar uma quantidade desconhecida de dados, é recomendável usar um array dinâmico como array
destino, porque se a quantidade solicitada de dados for menor (ou maior) que o comprimento do array
destino, a função tenta realocar a memória de qual forma que os dados solicitados caibam
completamente.
Se você souber a quantidade de dados que você precisa para copiar, é melhor usar um buffer alocado
estaticamente, a fim de evitar a alocação de memória excessiva.
Não importa qual seja a propriedade do array destino - como series =true ou como series =false. Os
dados serão copiados de tal maneira que o elemento mais antigo será localizado no início da memória
física alocada para o array. Exitem 3 variantes de chamada da função.
Parâmetros
symbol_name
[in] Nome do ativo.
timeframe
[in] Período.
start_pos
[in] A posição de início do primeiro elemento para copiar.
count
[in] Quantidade de dados para copiar.
start_time
[in] A hora de início para o primeiro elemento para copiar.
stop_time
[in] A hora de início para o último elemento para copiar.
open_array[]
[out] Array de tipo double.
Valor do Retorno
R etorna o número de elementos no array ou -1 no caso de um erro.
Observação
Se o intervalo inteiro de dados solicitados não estiver disponível no servidor, a função retorna -1.
Se dados fora do T ER M INAL _MAXBAR S (número máximo de barras no gráfico) for solicitado, a
função também retornará -1.
Ao solicitar dados de um Expert Advisor ou script, o download do servidor será iniciado se o terminal
não tiver estes dados localmente, ou a construção da série de tempo solicitada iniciará, se os dados
puderem ser construídas a partir do histórico local mas eles não estiverem prontos ainda. A função
retornará a quantidade de dados que estará pronta no momento da expiração do tempo limite, mas
o download do histórico continuará, e na próximo solicitação simular, a função retornará mais
dados.
Ao solicitar dados através da data de início e do número de elementos requeridos, somente dados
cuja data seja menor (anterior) ou igual a data especificada são retornados. Isso significa que a
hora de abertura de qualquer barra, para cujo valor é retornado (volume, spread, valor no buffer de
indicador, preços de Abertura, M áximo, Mínimo, Fechamento ou H ora de Abertura) é sempre menor
ou igual ao valor especificado.
Ao solicitar dados em uma faixa especificada de datas, somente dados deste intervalo serão
retornados. O intervalo é definido e contado em segundos. Isso significa que a hora de abertura de
qualquer barra, para cujo valor é retornado (volume, spread, valor no buffer de indicador, preços de
Abertura, M áximo, Mínimo, Fechamento ou H ora de Abertura) é sempre dentro do intervalo
solicitado.
Assim, se o dia corrente for s ábado, e em uma tentativa de copiar dados usando a janela de tempo
semanal, você especificar start_time=Last_Tuesday e stop_time=Last_Friday, a função retornará 0,
porque a hora de abertura em uma janela de tempo semanal é sempre domingo, e nenhum barra
semanal cairá no intervalo especificado.
Se você precisar retornar o valor correspondente para a barra corrente incompleta, você pode usar a
primeira forma de chamada, especificando start_pos =0 e count=1.
· DR AW_SECTI ON,
· DR AW_ARR OW ,
· DR AW_ZIGZAG,
· DR AW_COLOR_SECTI ON,
· DR AW_COLOR_ARR OW ,
· DR AW_COLOR_ZIGZAG.
CopyHigh
A função obtém em high_array os dados históricos dos preços de barra mais altos para o par ativo-
período selecionado na quantidade especificada. Deve ser notado que a ordenação dos elementos é do
presente para o passado, isto é, a posição de início 0 significa a barra corrente.
Ao copiar uma quantidade desconhecida de dados, é recomendável usar um array dinâmico como array
destino, porque se a quantidade solicitada de dados for menor (ou maior) que o comprimento do array
destino, a função tenta realocar a memória de qual forma que os dados solicitados caibam
completamente.
Se você souber a quantidade de dados que você precisa para copiar, é melhor usar um buffer alocado
estaticamente, a fim de evitar a alocação de memória excessiva.
Não importa qual seja a propriedade do array destino - como series =true ou como series =false. Os
dados serão copiados de tal maneira que o elemento mais antigo será localizado no início da memória
física alocada para o array. Exitem 3 variantes de chamada da função.
Parâmetros
symbol_name
[in] Nome do ativo.
timeframe
[in] Período.
start_pos
[in] A posição de início do primeiro elemento para copiar.
count
[in] Quantidade de dados para copiar.
start_time
[in] A hora de início para o primeiro elemento para copiar.
stop_time
[in] H ora da barra, correspondente ao último elemento para copiar.
high_array[]
[out] Array de tipo double.
Valor do Retorno
R etorna a quantidade de dados copiados ou -1 no caso de um erro.
Observação
Se o intervalo inteiro de dados solicitados não estiver disponível no servidor, a função retorna -1.
Se dados fora do T ER M INAL _MAXBAR S (número máximo de barras no gráfico) for solicitado, a
função também retornará -1.
Ao solicitar dados de um Expert Advisor ou script, o download do servidor será iniciado se o terminal
não tiver estes dados localmente, ou a construção da série de tempo solicitada iniciará, se os dados
puderem ser construídas a partir do histórico local mas eles não estiverem prontos ainda. A função
retornará a quantidade de dados que estará pronta no momento da expiração do tempo limite, mas
o download do histórico continuará, e na próximo solicitação simular, a função retornará mais
dados.
Ao solicitar dados através da data de início e do número de elementos requeridos, somente dados
cuja data seja menor (anterior) ou igual a data especificada são retornados. Isso significa que a
hora de abertura de qualquer barra, para cujo valor é retornado (volume, spread, valor no buffer de
indicador, preços de Abertura, M áximo, Mínimo, Fechamento ou H ora de Abertura) é sempre menor
ou igual ao valor especificado.
Ao solicitar dados em uma faixa especificada de datas, somente dados deste intervalo serão
retornados. O intervalo é definido e contado em segundos. Isso significa que a hora de abertura de
qualquer barra, para cujo valor é retornado (volume, spread, valor no buffer de indicador, preços de
Abertura, M áximo, Mínimo, Fechamento ou H ora de Abertura) é sempre dentro do intervalo
solicitado.
Assim, se o dia corrente for s ábado, e em uma tentativa de copiar dados usando a janela de tempo
semanal, você especificar start_time=Last_Tuesday e stop_time=Last_Friday, a função retornará 0,
porque a hora de abertura em uma janela de tempo semanal é sempre domingo, e nenhum barra
semanal cairá no intervalo especificado.
Se você precisar retornar o valor correspondente para a barra corrente incompleta, você pode usar a
primeira forma de chamada, especificando start_pos =0 e count=1.
Exemplo:
#property copyright "2009, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property description "An example for output of the High[i] and Low[i]"
#property description "for a random chosen bars"
double High[],Low[];
//+------------------------------------------------------------------+
//| Obtém Mínimo para o índice de barra especificado |
//+------------------------------------------------------------------+
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);
}
//+------------------------------------------------------------------+
//| Obtém o Máximo para o índice de barra especificado |
//+------------------------------------------------------------------+
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);
}
//+------------------------------------------------------------------+
//| Função tick (ponto) de um Expert |
//+------------------------------------------------------------------+
void OnTick()
{
//--- em cada tick nós imprimimos os valores de Máximo e Mínimo para a barra com índice,
//--- que seja igual ao segundo, no qual o tick chegou
datetime t=TimeCurrent();
int sec=t%60;
printf("High[%d] = %G Low[%d] = %G",
sec,iHigh(Symbol(),0,sec),
sec,iLow(Symbol(),0,sec));
}
· DR AW_SECTI ON,
· DR AW_ARR OW ,
· DR AW_ZIGZAG,
· DR AW_COLOR_SECTI ON,
· DR AW_COLOR_ARR OW ,
· DR AW_COLOR_ZIGZAG.
CopyLow
A função obtém em low_array os dados históricos de preços de barra mínimos para o par ativo-período
selecionado na quantidade especificada. Deve ser notado que a ordenação dos elementos é do
presente para o passado, isto é, a posição de início 0 significa a barra corrente.
Ao copiar uma quantidade desconhecida de dados, é recomendável usar um array dinâmico como array
destino, porque se a quantidade solicitada de dados for menor (ou maior) que o comprimento do array
destino, a função tenta realocar a memória de qual forma que os dados solicitados caibam
completamente.
Se você souber a quantidade de dados que você precisa para copiar, é melhor usar um buffer alocado
estaticamente, a fim de evitar a alocação de memória excessiva.
Não importa qual seja a propriedade do array destino - como series =true ou como series =false. Os
dados serão copiados de tal maneira que o elemento mais antigo será localizado no início da memória
física alocada para o array. Exitem 3 variantes de chamada da função.
Parâmetros
symbol_name
[in] Ativo.
timeframe
[in] Período.
start_pos
[in] A posição de início do primeiro elemento para copiar.
count
[in] Quantidade de dados para copiar.
start_time
[in] H ora da barra, correspondente ao último elemento para copiar.
stop_time
[in] H ora da barra, correspondente ao último elemento para copiar.
low_array[]
[out] Array de tipo double.
Valor do Retorno
R etorna a quantidade de dados copiados ou -1 no caso de um erro.
Observação
Se o intervalo inteiro de dados solicitados não estiver disponível no servidor, a função retorna -1.
Se dados fora do T ER M INAL _MAXBAR S (número máximo de barras no gráfico) for solicitado, a
função também retornará -1.
Ao solicitar dados de um Expert Advisor ou script, o download do servidor será iniciado se o terminal
não tiver estes dados localmente, ou a construção da série de tempo solicitada iniciará, se os dados
puderem ser construídas a partir do histórico local mas eles não estiverem prontos ainda. A função
retornará a quantidade de dados que estará pronta no momento da expiração do tempo limite, mas
o download do histórico continuará, e na próximo solicitação simular, a função retornará mais
dados.
Ao solicitar dados através da data de início e do número de elementos requeridos, somente dados
cuja data seja menor (anterior) ou igual a data especificada são retornados. Isso significa que a
hora de abertura de qualquer barra, para cujo valor é retornado (volume, spread, valor no buffer de
indicador, preços de Abertura, M áximo, Mínimo, Fechamento ou H ora de Abertura) é sempre menor
ou igual ao valor especificado.
Ao solicitar dados em uma faixa especificada de datas, somente dados deste intervalo serão
retornados. O intervalo é definido e contado em segundos. Isso significa que a hora de abertura de
qualquer barra, para cujo valor é retornado (volume, spread, valor no buffer de indicador, preços de
Abertura, M áximo, Mínimo, Fechamento ou H ora de Abertura) é sempre dentro do intervalo
solicitado.
Assim, se o dia corrente for s ábado, e em uma tentativa de copiar dados usando a janela de tempo
semanal, você especificar start_time=Last_Tuesday e stop_time=Last_Friday, a função retornará 0,
porque a hora de abertura em uma janela de tempo semanal é sempre domingo, e nenhum barra
semanal cairá no intervalo especificado.
Se você precisar retornar o valor correspondente para a barra corrente incompleta, você pode usar a
primeira forma de chamada, especificando start_pos =0 e count=1.
· DR AW_SECTI ON,
· DR AW_ARR OW ,
· DR AW_ZIGZAG,
· DR AW_COLOR_SECTI ON,
· DR AW_COLOR_ARR OW ,
· DR AW_COLOR_ZIGZAG.
Também Veja
CopyH igh
CopyClose
A função obtém em close_array os dados históricos de preços de fechamento de barra para o par
ativo-período selecionado na quantidade especificada. Deve ser notado que a ordenação dos
elementos é do presente para o passado, isto é, a posição de início 0 significa a barra corrente.
Ao copiar uma quantidade desconhecida de dados, é recomendável usar um array dinâmico como array
destino, porque se a quantidade solicitada de dados for menor (ou maior) que o comprimento do array
destino, a função tenta realocar a memória de qual forma que os dados solicitados caibam
completamente.
Se você souber a quantidade de dados que você precisa para copiar, é melhor usar um buffer alocado
estaticamente, a fim de evitar a alocação de memória excessiva.
Não importa qual seja a propriedade do array destino - como series =true ou como series =false. Os
dados serão copiados de tal maneira que o elemento mais antigo será localizado no início da memória
física alocada para o array. Exitem 3 variantes de chamada da função.
Parâmetros
symbol_name
[in] Nome do ativo.
timeframe
[in] Período.
start_pos
[in] A posição de início do primeiro elemento para copiar.
count
[in] Quantidade de dados para copiar.
start_time
[in] A hora de início para o primeiro elemento para copiar.
stop_time
[in] H ora da barra, correspondente ao último elemento para copiar.
close_array[]
[out] Array de tipo double.
Valor do Retorno
R etorna a quantidade de dados copiados ou -1 no caso de um erro.
Observação
Se o intervalo inteiro de dados solicitados não estiver disponível no servidor, a função retorna -1.
Se dados fora do T ER M INAL _MAXBAR S (número máximo de barras no gráfico) for solicitado, a
função também retornará -1.
Ao solicitar dados de um Expert Advisor ou script, o download do servidor será iniciado se o terminal
não tiver estes dados localmente, ou a construção da série de tempo solicitada iniciará, se os dados
puderem ser construídas a partir do histórico local mas eles não estiverem prontos ainda. A função
retornará a quantidade de dados que estará pronta no momento da expiração do tempo limite, mas
o download do histórico continuará, e na próximo solicitação simular, a função retornará mais
dados.
Ao solicitar dados através da data de início e do número de elementos requeridos, somente dados
cuja data seja menor (anterior) ou igual a data especificada são retornados. Isso significa que a
hora de abertura de qualquer barra, para cujo valor é retornado (volume, spread, valor no buffer de
indicador, preços de Abertura, M áximo, Mínimo, Fechamento ou H ora de Abertura) é sempre menor
ou igual ao valor especificado.
Ao solicitar dados em uma faixa especificada de datas, somente dados deste intervalo serão
retornados. O intervalo é definido e contado em segundos. Isso significa que a hora de abertura de
qualquer barra, para cujo valor é retornado (volume, spread, valor no buffer de indicador, preços de
Abertura, M áximo, Mínimo, Fechamento ou H ora de Abertura) é sempre dentro do intervalo
solicitado.
Assim, se o dia corrente for s ábado, e em uma tentativa de copiar dados usando a janela de tempo
semanal, você especificar start_time=Last_Tuesday e stop_time=Last_Friday, a função retornará 0,
porque a hora de abertura em uma janela de tempo semanal é sempre domingo, e nenhum barra
semanal cairá no intervalo especificado.
Se você precisar retornar o valor correspondente para a barra corrente incompleta, você pode usar a
primeira forma de chamada, especificando start_pos =0 e count=1.
· DR AW_SECTI ON,
· DR AW_ARR OW ,
· DR AW_ZIGZAG,
· DR AW_COLOR_SECTI ON,
· DR AW_COLOR_ARR OW ,
· DR AW_COLOR_ZIGZAG.
CopyTickVolume
A função obtém em volume_array os dados históricos de volumes de tick para o par ativo-período
selecionado na quantidade especificada. Deve ser notado que a ordenação dos elementos é do
presente para o passado, isto é, a posição de início 0 significa a barra corrente.
Ao copiar uma quantidade desconhecida de dados, é recomendável usar um array dinâmico como array
destino, porque se a quantidade solicitada de dados for menor (ou maior) que o comprimento do array
destino, a função tenta realocar a memória de qual forma que os dados solicitados caibam
completamente.
Se você souber a quantidade de dados que você precisa para copiar, é melhor usar um buffer alocado
estaticamente, a fim de evitar a alocação de memória excessiva.
Não importa qual seja a propriedade do array destino - como series =true ou como series =false. Os
dados serão copiados de tal maneira que o elemento mais antigo será localizado no início da memória
física alocada para o array. Exitem 3 variantes de chamada da função.
Parâmetros
symbol_name
[in] Nome do ativo.
timeframe
[in] Período.
start_pos
[in] A posição de início do primeiro elemento para copiar.
count
[in] Quantidade de dados para copiar.
start_time
[in] A hora de início para o primeiro elemento para copiar.
stop_time
[in] H ora da barra, correspondente ao último elemento para copiar.
volume_array[]
[out] Array de tipo long.
Valor do Retorno
R etorna a quantidade de dados copiados ou -1 no caso de um erro.
Observação
Se o intervalo inteiro de dados solicitados não estiver disponível no servidor, a função retorna -1.
Se dados fora do T ER M INAL _MAXBAR S (número máximo de barras no gráfico) for solicitado, a
função também retornará -1.
Ao solicitar dados de um Expert Advisor ou script, o download do servidor será iniciado se o terminal
não tiver estes dados localmente, ou a construção da série de tempo solicitada iniciará, se os dados
puderem ser construídas a partir do histórico local mas eles não estiverem prontos ainda. A função
retornará a quantidade de dados que estará pronta no momento da expiração do tempo limite, mas
o download do histórico continuará, e na próximo solicitação simular, a função retornará mais
dados.
Ao solicitar dados através da data de início e do número de elementos requeridos, somente dados
cuja data seja menor (anterior) ou igual a data especificada são retornados. Isso significa que a
hora de abertura de qualquer barra, para cujo valor é retornado (volume, spread, valor no buffer de
indicador, preços de Abertura, M áximo, Mínimo, Fechamento ou H ora de Abertura) é sempre menor
ou igual ao valor especificado.
Ao solicitar dados em uma faixa especificada de datas, somente dados deste intervalo serão
retornados. O intervalo é definido e contado em segundos. Isso significa que a hora de abertura de
qualquer barra, para cujo valor é retornado (volume, spread, valor no buffer de indicador, preços de
Abertura, M áximo, Mínimo, Fechamento ou H ora de Abertura) é sempre dentro do intervalo
solicitado.
Assim, se o dia corrente for s ábado, e em uma tentativa de copiar dados usando a janela de tempo
semanal, você especificar start_time=Last_Tuesday e stop_time=Last_Friday, a função retornará 0,
porque a hora de abertura em uma janela de tempo semanal é sempre domingo, e nenhum barra
semanal cairá no intervalo especificado.
Se você precisar retornar o valor correspondente para a barra corrente incompleta, você pode usar a
primeira forma de chamada, especificando start_pos =0 e count=1.
Exemplo:
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1
//---- plotar 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
//--- parâmetros de entrada
input int bars=3000;
//--- buffers do indicador
double TickVolumeBuffer[];
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado |
//+------------------------------------------------------------------+
void OnInit()
{
//--- mapeamento de buffers do indicador
SetIndexBuffer(0,TickVolumeBuffer,INDICATOR_DATA);
IndicatorSetInteger(INDICATOR_DIGITS,0);
//---
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
· DR AW_SECTI ON,
· DR AW_ARR OW ,
· DR AW_ZIGZAG,
· DR AW_COLOR_SECTI ON,
· DR AW_COLOR_ARR OW ,
· DR AW_COLOR_ZIGZAG.
CopyRealVolume
A função obtém em volume_array os dados históricos de volumes de negociação para o par ativo-
período selecionado na quantidade especificada. Deve ser notado que a ordenação dos elementos é do
presente para o passado, isto é, a posição de início 0 significa a barra corrente.
Ao copiar uma quantidade desconhecida de dados, é recomendável usar um array dinâmico como array
destino, porque se a quantidade solicitada de dados for menor (ou maior) que o comprimento do array
destino, a função tenta realocar a memória de qual forma que os dados solicitados caibam
completamente.
Se você souber a quantidade de dados que você precisa para copiar, é melhor usar um buffer alocado
estaticamente, a fim de evitar a alocação de memória excessiva.
Não importa qual seja a propriedade do array destino - como series =true ou como series =false. Os
dados serão copiados de tal maneira que o elemento mais antigo será localizado no início da memória
física alocada para o array. Exitem 3 variantes de chamada da função.
Parâmetros
symbol_name
[in] Nome do ativo.
timeframe
[in] Período.
start_pos
[in] A posição de início do primeiro elemento para copiar.
count
[in] Quantidade de dados para copiar.
start_time
[in] A hora de início para o primeiro elemento para copiar.
stop_time
[in] H ora da barra, correspondente ao último elemento para copiar.
volume_array[]
[out] Array de tipo long.
Valor do Retorno
R etorna a quantidade de dados copiados ou -1 no caso de erro.
Observação
Se o intervalo inteiro de dados solicitados não estiver disponível no servidor, a função retorna -1.
Se dados fora do T ER M INAL _MAXBAR S (número máximo de barras no gráfico) for solicitado, a
função também retornará -1.
Ao solicitar dados de um Expert Advisor ou script, o download do servidor será iniciado se o terminal
não tiver estes dados localmente, ou a construção da série de tempo solicitada iniciará, se os dados
puderem ser construídas a partir do histórico local mas eles não estiverem prontos ainda. A função
retornará a quantidade de dados que estará pronta no momento da expiração do tempo limite, mas
o download do histórico continuará, e na próximo solicitação simular, a função retornará mais
dados.
Ao solicitar dados através da data de início e do número de elementos requeridos, somente dados
cuja data seja menor (anterior) ou igual a data especificada são retornados. Isso significa que a
hora de abertura de qualquer barra, para cujo valor é retornado (volume, spread, valor no buffer de
indicador, preços de Abertura, M áximo, Mínimo, Fechamento ou H ora de Abertura) é sempre menor
ou igual ao valor especificado.
Ao solicitar dados em uma faixa especificada de datas, somente dados deste intervalo serão
retornados. O intervalo é definido e contado em segundos. Isso significa que a hora de abertura de
qualquer barra, para cujo valor é retornado (volume, spread, valor no buffer de indicador, preços de
Abertura, M áximo, Mínimo, Fechamento ou H ora de Abertura) é sempre dentro do intervalo
solicitado.
Assim, se o dia corrente for s ábado, e em uma tentativa de copiar dados usando a janela de tempo
semanal, você especificar start_time=Last_Tuesday e stop_time=Last_Friday, a função retornará 0,
porque a hora de abertura em uma janela de tempo semanal é sempre domingo, e nenhum barra
semanal cairá no intervalo especificado.
Se você precisar retornar o valor correspondente para a barra corrente incompleta, você pode usar a
primeira forma de chamada, especificando start_pos =0 e count=1.
· DR AW_SECTI ON,
· DR AW_ARR OW ,
· DR AW_ZIGZAG,
· DR AW_COLOR_SECTI ON,
· DR AW_COLOR_ARR OW ,
· DR AW_COLOR_ZIGZAG.
CopySpread
A função obtém em spread_array os dados históricos de valores de spread para o par selecionado
ativo-período na quantidade especificada. Deve ser notado que a ordenação dos elementos é do
presente para o passado, isto é, a posição de início 0 significa a barra corrente.
Ao copiar uma quantidade desconhecida de dados, é recomendável usar um array dinâmico como array
destino, porque se a quantidade solicitada de dados for menor (ou maior) que o comprimento do array
destino, a função tenta realocar a memória de qual forma que os dados solicitados caibam
completamente.
Se você souber a quantidade de dados que você precisa para copiar, é melhor usar um buffer alocado
estaticamente, a fim de evitar a alocação de memória excessiva.
Não importa qual seja a propriedade do array destino - como series =true ou como series =false. Os
dados serão copiados de tal maneira que o elemento mais antigo será localizado no início da memória
física alocada para o array. Exitem 3 variantes de chamada da função.
Parâmetros
symbol_name
[in] Nome do ativo.
timeframe
[in] Período.
start_pos
[in] A posição de início do primeiro elemento para copiar.
count
[in] Quantidade de dados para copiar.
start_time
[in] A hora de início para o primeiro elemento para copiar.
stop_time
[in] H ora da barra, correspondente ao último elemento para copiar.
spread_array[]
[out] Array de tipo int.
Valor do Retorno
R etorna a quantidade de dados copiados ou -1 no caso de um erro.
Observação
Se o intervalo inteiro de dados solicitados não estiver disponível no servidor, a função retorna -1.
Se dados fora do T ER M INAL _MAXBAR S (número máximo de barras no gráfico) for solicitado, a
função também retornará -1.
Ao solicitar dados de um Expert Advisor ou script, o download do servidor será iniciado se o terminal
não tiver estes dados localmente, ou a construção da série de tempo solicitada iniciará, se os dados
puderem ser construídas a partir do histórico local mas eles não estiverem prontos ainda. A função
retornará a quantidade de dados que estará pronta no momento da expiração do tempo limite, mas
o download do histórico continuará, e na próximo solicitação simular, a função retornará mais
dados.
Ao solicitar dados através da data de início e do número de elementos requeridos, somente dados
cuja data seja menor (anterior) ou igual a data especificada são retornados. Isso significa que a
hora de abertura de qualquer barra, para cujo valor é retornado (volume, spread, valor no buffer de
indicador, preços de Abertura, M áximo, Mínimo, Fechamento ou H ora de Abertura) é sempre menor
ou igual ao valor especificado.
Ao solicitar dados em uma faixa especificada de datas, somente dados deste intervalo serão
retornados. O intervalo é definido e contado em segundos. Isso significa que a hora de abertura de
qualquer barra, para cujo valor é retornado (volume, spread, valor no buffer de indicador, preços de
Abertura, M áximo, Mínimo, Fechamento ou H ora de Abertura) é sempre dentro do intervalo
solicitado.
Assim, se o dia corrente for s ábado, e em uma tentativa de copiar dados usando a janela de tempo
semanal, você especificar start_time=Last_Tuesday e stop_time=Last_Friday, a função retornará 0,
porque a hora de abertura em uma janela de tempo semanal é sempre domingo, e nenhum barra
semanal cairá no intervalo especificado.
Se você precisar retornar o valor correspondente para a barra corrente incompleta, você pode usar a
primeira forma de chamada, especificando start_pos =0 e count=1.
Exemplo:
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1
//---- plotar Spread
#property indicator_label1 "Spread"
#property indicator_type1 DRAW_HISTOGRAM
#property indicator_color1 clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- parâmetros de entrada
input int bars=3000;
//--- buffers do indicador
double SpreadBuffer[];
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado |
//+------------------------------------------------------------------+
void OnInit()
{
//--- mapeamento de buffers do indicador
SetIndexBuffer(0,SpreadBuffer,INDICATOR_DATA);
IndicatorSetInteger(INDICATOR_DIGITS,0);
//---
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
· DR AW_SECTI ON,
· DR AW_ARR OW ,
· DR AW_ZIGZAG,
· DR AW_COLOR_SECTI ON,
· DR AW_COLOR_ARR OW ,
· DR AW_COLOR_ZIGZAG.
CopyTicks
A função obtém, dentro da matriz tick s _array, tick s no formato MqlT ick , além disso a indexação é
realizada do passado para o presente, ou seja, o tick com índice 0 é o mais antigo na matriz. Para a
análise de tick s, é necess ário verificar o campo flags , que indica o que foi alterado nesse tick .
int CopyTicks(
string symbol_name, // nome do símbolo
MqlTick& ticks_array[], // matriz para recebimento de ticks
uint flags=COPY_TICKS_ALL, // sinalizador que define o tipo de ticks obtidos
ulong from=0, // data a partir da qual são solicitados os ticks
uint count=0 // número de ticks que é necessário obter
);
Parâmetros
symbol_name
[in] Símbolo.
ticks_array
[out] Matriz do tipo MqlT ick para recebimento de tick s.
flags
[in] sinalizador que especifica o tipo de tick s solicitados. COPY_TICKS _INFO – tick s chamados
pelas alterações do Bid e/ou As k , COPY_TICKS _TR ADE – tick s com alterações em Last e Volume,
COPY_TICKS _ALL – todos os tick s. Em qualquer tipo de solicitação, nos restantes campos da
estrutura MqlT ick são acrescentados os valores do tick anterior.
from
[in] Data a partir da qual são solicitados os tick s. É especificada em milissegundos desde
01.01.1970. Se o parâmetro from=0, são entregues as últimas count de tick s.
count
[in] Número de tick s solicitados. Se os parâmetros from e count não forem definidos, no matriz
tick s _array[] serão registrados todos os últimos tick s disponíveis, mas não mais de 2 000.
Valor de retorno
Núerod de tick s copiados ou -1 em caso de OnCalculate() nos indicadores é chamada após a entrada
de cada tick .
Nos EAs e scripts, a função CopyTicks() pode esperar até 45 segundos antes de obter o
resultado: Em contraste com o indicador, cada EA e script opera em seu próprio thread e, portanto,
pode esperar 45 segundos até a conclusão da sincronização. Se, durante este tempo, a quantidade
necess ária de tick s não forem sincronizados, CopyT ick s () irá retornar tick s disponíveis, por tempo
esgotado, e continuará a sincronização. A função OnT ick () nos EAs não é processador de tick s, ela
simplesmente notifica o EA sobre as mudanças no mercado. Essas mudanças podem ser um lote: o
terminal pode fazer simultaneamente alguns tick s, mas a função OnT ick () será chamada somente
uma vez para notificar o EA do estado mais recente do mercado.
Velocidade de retorno de dados: o terminal armazena, para cada símbolo, os últimos 4096 ticks no
cache para acesso rápido (para símbolos com livro de ofertas serão 65536 tick s), as solicitações de
esses dados são feitas com maior velocidade. Ao solicitar tick s da sessão de negociação atual fora
dos limites do cache, a CopyT ick s() chama os tick s que são armazenados na memória do terminal,
estas solicitações exigem mais tempo de execução. As mais lentas são as solicitações de tick s para
outros dias, como, neste caso, os dados são lidos a partir do disco.
Exemplo:
#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
//+------------------------------------------------------------------+
//| Função de início do programa script |
//+------------------------------------------------------------------+
void OnStart()
{
//---
int attempts=0; // Contagem de tentativas
bool success=false; // A flag de uma cópia bem sucedida de ticks
MqlTick tick_array[]; // Tick recebendo o array
MqlTick lasttick; // Para receber os últimos dados do tick
SymbolInfoTick(_Symbol,lasttick);
//--- Faça 3 tentativas de receber ticks
while(attempts<3)
{
//--- Medição da hora de início antes de receber os ticks
uint start=GetTickCount();
//--- Solicitando o histórico de ticks desde 1970.01.01 00:00.001 (parâmetro para=1 ms)
int received=CopyTicks(_Symbol,tick_array,COPY_TICKS_ALL,1,getticks);
if(received!=-1)
{
//--- Mostrando informações sobre o número de ticks e tempo gasto
PrintFormat("%s: received %d ticks in %d ms",_Symbol,received,GetTickCount()-start);
//--- Se o histórico de ticks é sincronizado, o código de erro é igual a zero
if(GetLastError()==0)
{
success=true;
break;
}
else
PrintFormat("%s: Ticks ainda não estão sincronizados, %d ticks recebidos por %d ms. Err
_Symbol,received,GetTickCount()-start,_LastError);
}
//--- Contagem de tentativas
attempts++;
//--- Uma pausa de um segundo para aguardar o fim da sincronização da base de dados de ticks
Sleep(1000);
}
//--- A recepção de ticks solicitados no início do histórico de ticks falhou em três tentativas
if(!success)
{
PrintFormat("Error! Falha em receber %d ticks do %s em três tentativas",getticks,_Symbol);
return;
}
int ticks=ArraySize(tick_array);
//--- Mostrando a hora da primeira marca no array
datetime firstticktime=tick_array[ticks-1].time;
PrintFormat("Horário do último tick = %s.%03I64u",
TimeToString(firstticktime,TIME_DATE|TIME_MINUTES|TIME_SECONDS),tick_array[ticks-1].
//--- Obtivemos o último tick no array
datetime lastticktime=tick_array[0].time;
PrintFormat("Horário do primeiro tick = %s.%03I64u",
TimeToString(lastticktime,TIME_DATE|TIME_MINUTES|TIME_SECONDS),tick_array[0].time_ms
//---
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);
//--- Mostrando os primeiros 100 ticks do último dia
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]));
}
}
//--- Mostrando as primeiras 100 ofertas do último dia
counter=0;
for(int i=0;i<ticks;i++)
{
datetime time=tick_array[i].time;
Veja também
S ymbolInfoT ick , Estrutura para recebimento de preços atuais, OnT ick ()
CopyTicksRange
A função recebe, na matriz tick s _array, tick s em formato MqlT ick , no intervalo de datas especificado.
Além disso, a indexação é realizada do passado para o presente, ou seja, o tick com índice 0 é o mais
antigo na matriz. Para analisar o tick , é necess ário verificar o campo flags , ele notifica sobre as
alterações levadas a cabo.
int CopyTicksRange(
const string symbol_name, // nome do símbolo
MqlTick& ticks_array[], // matriz para recebimento de ticks
uint flags=COPY_TICKS_ALL, // sinalizador que define o tipo de ticks obtidos
ulong from_msc=0, // data a partir da qual são solicitados os ticks
ulong to_msc=0 // data em que são solicitados os ticks
);
Parâmetros
symbol_name
[in] Símbolo.
ticks_array
[out] Matriz estática ou dinâmica MqlT ick para recebimento de tick s. Se na matriz estática não
caberem todos os tick s do intervalo solicitado, serão obtidos tantos tick s quanto caberem na
matriz. Além disso, a função gerará o erro ERR_HIS T ORY_SMALL _BUFFER (4407) .
flags
[in] sinalizador que especifica o tipo de tick s solicitados. COPY_TICKS _INFO – tick s chamados
pelas alterações do Bid e/ou As k , COPY_TICKS _TR ADE – tick s com alterações em Last e Volume,
COPY_TICKS _ALL – todos os tick s. Em qualquer tipo de solicitação, nos restantes campos da
estrutura MqlT ick são acrescentados os valores do tick anterior.
from_msc
[in] Data a partir da qual são solicitados os tick s. É especificada em milissegundos desde
01.01.1970. Se o parâmetro from_msc não estiver especificado, são enviados os tick s a partir do
início do histórico. São enviados os tick s com tempo >= from_msc.
to_msc
[in] Data na qual são solicitados os tick s. Especificado em milissegundos desde 01.01.1970. Se o
parâmetro to_msc não estiver especificado, são enviados todos os tick s do histórico. Número de
tick s solicitados. São enviados os tick s com tempo <= to_msc.
Valor de retorno
Número de tick s copiados ou -1 em caso de erro. GetLastError() pode retornar os seguintes erros :
· ERR_HI S T ORY_TI MEOUT – esgotado o tempo de espera de sincronização, a função enviou todo o
que havia.
· ERR_HI S T ORY_SMALL _BUFFER – o buffer estático é muito pequeno, enviado tanto, quanto cabia
na matriz.
· ERR_NOT_ENOUGH_MEMORY – não há memória suficiente para obter o histórico a partir do
intervalo especificado na matriz dinâmica de tick s. Falha ao selecionar a quantidade certa de
memória para uma matriz de tick s.
Observação
A função CopyT ick s R ange() é usada para solicitar tick s a partir de um intervalo antigo, por exemplo,
os tick s de um dia determinado no histórico. Enquanto a CopyT ick s() permite definir apenas a data
de início, por exemplo, obter todos os tick s desde o início do mês até o momento atual.
Veja também
S ymbolInfoT ick , Estrutura para recebimento de preços atuais, OnT ick , CopyT ick s
iBars
R etorna o número de barras - no histórico - do símbolo e do período correspondentes.
int iBars(
const string symbol, // símbolo
ENUM_TIMEFRAMES timeframe // período
);
Parâmetros
symbol
[in] Nome simbólico do instrumento. NULL significa o símbolo atual.
timeframe
[in] Período. Pode ser um dos valores da enumeração ENUM _TIMEFR AMES. 0 significa o período
do gráfico atual.
Valor de retorno
Número de barras - no histórico - do símbolo e do período correspondentes, mas não mais do que o
especificado nas configurações da plataforma pelo parâmetro "Número máx. de barras na
janela" (" Max bars in chart" )
Exemplo:
Print("Bar count on the 'EURUSD,H1' is ",iBars("EURUSD",PERIOD_H1));
Veja também
Bars
iBarShift
Busca de barra segundo o tempo. A função retorna o índice da barra na qual o tempo especificado
coincide.
int iBarShift(
const string symbol, // símbolo
ENUM_TIMEFRAMES timeframe, // período
datetime time, // tempo
bool exact=false // modo
);
Parâmetros
symbol
[in] Nome simbólico do instrumento. NULL significa o símbolo atual.
timeframe
[in] Período. Pode ser um dos valores da enumeração ENUM _TIMEFR AMES. PERIOD_CURR ENT
significa o período atual do gráfico atual.
time
[in] Valor do tempo para a pesquisa.
exact=false
[in] Valor retornado se a barra não for encontrada para o tempo especificado. Se exact=false,
iBarShift retorna o índice da barra mais próxima cujo tempo de abertura é menor do que o
especificado (time_open<time). Se essa barra não for encontrada (não há histórico antes do
tempo especificado), a função retornará -1. Se exact=true, não é pesquisada a barra mais próxima
e a função iBarShift retorna imediatamente -1.
Valor de retorno
Índice da barra que coincide com o tempo especificado. Se não houver barra para o tempo
especificado (" buraco" no histórico), a função retorna -1 ou o índice da barra mais próxima
(dependendo do parâmetro exact).
Exemplo:
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- data é no domingo
datetime time=D'2002.04.25 12:00';
string symbol="GBPUSD";
ENUM_TIMEFRAMES tf=PERIOD_H1;
bool exact=false;
//--- se não houver barra para o tempo especificado, iBarShift retornará o índice da barra mais pró
int bar_index=iBarShift(symbol,tf,time,exact);
//--- verificamos o código de erro após chamada de iBarShift()
int error=GetLastError();
if(error!=0)
{
PrintFormat("iBarShift(): GetLastError=%d - data solicitada %s "+
"para %s %s no histórico disponível não encontrada",
error,TimeToString(time),symbol,EnumToString(tf));
return;
}
//--- função iBarShift() executada com sucesso, imprimimos os resultados para exact=false
PrintFormat("1. %s %s %s(%s): bar index is %d (exact=%s)",
symbol,EnumToString(tf),TimeToString(time),
DayOfWeek(time),bar_index,string(exact));
datetime bar_time=iTime(symbol,tf,bar_index);
PrintFormat("Time of bar #%d is %s (%s)",
bar_index,TimeToString(bar_time),DayOfWeek(bar_time));
//--- precisamos encontrar o índice da barra para o tempo especificado, se ele não existir, obterem
exact=true;
bar_index=iBarShift(symbol,tf,time,exact);
//--- função iBarShift() executada com sucesso, imprimimos os resultados para exact=true
PrintFormat("2. %s %s %s (%s):bar index is %d (exact=%s)",
symbol,EnumToString(tf),TimeToString(time)
,DayOfWeek(time),bar_index,string(exact));
}
//+------------------------------------------------------------------+
//| Retorna o nome do dia da semana |
//+------------------------------------------------------------------+
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;
}
//+------------------------------------------------------------------+
/* Resultado da execução
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)
*/
iClose
R etorna o valor do preço de fechamento da barra (indicado pelo parâmetro shift) do gráfico
correspondente.
double iClose(
const string symbol, // símbolo
ENUM_TIMEFRAMES timeframe, // período
int shift // deslocamento
);
Parâmetros
symbol
[in] Nome simbólico do instrumento. NULL significa o símbolo atual.
timeframe
[in] Período. Pode ser um dos valores da enumeração ENUM _TIMEFR AMES. 0 significa o período
do gráfico atual.
shift
[in] Índice do valor recebido do timeseries (deslocamento - número especificado de barras atrás -
em relação à barra atual).
Valor de retorno
Valor do preço de fechamento da barra (indicado pelo parâmetro shift) do gráfico correspondente ou
0 no caso de erro. Para mais informações sobre o erro, deve-se chamar a função GetLastError().
Observação
A função sempre retorna dados relevantes, para isso, a cada chamada, faz uma solicitação aos
timeseries para o símbolo/período especificado. Isso significa que, se não houver dados prontos na
primeira chamada de função, preparar o resultado poderá levar algum tempo.
A função não armazena os resultados de chamadas anteriores, pois não há cache local para retorno
rápido do valor.
Exemplo:
input int shift=0;
//+------------------------------------------------------------------+
//| Function-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"
);
}
Veja também
CopyClose, CopyR ates
iHigh
R etorna o valor do preço máximo da barra (especificado pelo parâmetro shift) do gráfico
correspondente.
double iHigh(
const string symbol, // símbolo
ENUM_TIMEFRAMES timeframe, // período
int shift // deslocamento
);
Parâmetros
symbol
[in] Nome simbólico do instrumento. NULL significa o símbolo atual.
timeframe
[in] Período. Pode ser um dos valores da enumeração ENUM _TIMEFR AMES. 0 significa o período
do gráfico atual.
shift
[in] Índice do valor recebido do timeseries (deslocamento - número especificado de barras atrás -
em relação à barra atual).
Valor de retorno
Valor do preço máximo da barra (indicado pelo parâmetro shift) do gráfico correspondente ou 0 no
caso de erro. Para mais informações sobre o erro, deve-se chamar a função GetLastError().
Observação
A função sempre retorna dados relevantes, para isso, a cada chamada, faz uma solicitação aos
timeseries para o símbolo/período especificado. Isso significa que, se não houver dados prontos na
primeira chamada de função, preparar o resultado poderá levar algum tempo.
A função não armazena os resultados de chamadas anteriores, pois não há cache local para retorno
rápido do valor.
Exemplo:
input int shift=0;
//+------------------------------------------------------------------+
//| Function-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"
);
}
Veja também
CopyH igh, CopyR ates
iHighest
R etorna o índice do maior valor encontrado (deslocamento relativo à barra atual) do gráfico
correspondente.
int iHighest(
const string symbol, // símbolo
ENUM_TIMEFRAMES timeframe, // período
ENUM_SERIESMODE type, // identificador de timeseries
int count=WHOLE_ARRAY, // número de itens
int start=0 // índice
);
Parâmetros
symbol
[in] Símbolo em que será realizada a pesquisa. NULL significa o símbolo atual.
timeframe
[in] Período. Pode ser um dos valores da enumeração ENUM _TIMEFR AMES. 0 significa o período
do gráfico atual.
type
[in] Identificador de timeseries em que será realizada a pesquisa. Pode ser qualquer um dos
valores ENUM _SERIESMODE.
count=WHOLE_ARRAY
[in] Número de itens de timeseries (na direção tanto da barra atual quanto do aumento do
índice), entre os quais deve ser realizada a pesquisa.
start=0
[in] Índice (deslocamento em relação à barra atual) da barra inicial a partir do qual começa a
pesquisa do maior valor. Valores negativos são ignorados e substituídos por um valor zero.
Valor de retorno
Índice do maior valor encontrado (deslocamento em relação à barra atual) do gráfico correspondente
ou -1 no caso de erro. Para mais informações sobre o erro, deve-se chamar a função GetLastError().
Exemplo:
double val;
//--- cálculo do valor máximo do preço Close em 20 barras consecutivas
//--- a partir do índice 4 e terminando no índice 23, inclusive no gráfico atual
int val_index=iHighest(NULL,0,MODE_CLOSE,20,4);
if(val_index!=-1)
val=High[val_index];
else
PrintFormat("Erro ao chamar iHighest(). Código de erro=%d",GetLastError());
iLow
R etorna o valor do preço mínimo da barra (indicado pelo parâmetro shift) do gráfico correspondente.
double iLow(
const string symbol, // símbolo
ENUM_TIMEFRAMES timeframe, // período
int shift // deslocamento
);
Parâmetros
symbol
[in] Nome simbólico do instrumento. NULL significa o símbolo atual.
timeframe
[in] Período. Pode ser um dos valores da enumeração ENUM _TIMEFR AMES. 0 significa o período
do gráfico atual.
shift
[in] Índice do valor recebido do timeseries (deslocamento - número especificado de barras atrás -
em relação à barra atual).
Valor de retorno
Valor do preço mínimo da barra (indicado pelo parâmetro shift) do gráfico correspondente ou 0 no
caso de erro. Para mais informações sobre o erro, deve-se chamar a função GetLastError().
Observação
A função sempre retorna dados relevantes, para isso, a cada chamada, faz uma solicitação aos
timeseries para o símbolo/período especificado. Isso significa que, se não houver dados prontos na
primeira chamada de função, preparar o resultado poderá levar algum tempo.
A função não armazena os resultados de chamadas anteriores, pois não há cache local para retorno
rápido do valor.
Exemplo:
input int shift=0;
//+------------------------------------------------------------------+
//| Function-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"
);
}
Veja também
CopyLow, CopyR ates
iLowest
R etorna o índice do menor valor encontrado (deslocamento relativo à barra atual) do gráfico
correspondente.
int iLowest(
const string symbol, // símbolo
ENUM_TIMEFRAMES timeframe, // período
ENUM_SERIESMODE type, // identificador de timeseries
int count=WHOLE_ARRAY, // número de itens
int start=0 // índice
);
Parâmetros
symbol
[in] Símbolo em que será realizada a pesquisa. NULL significa o símbolo atual.
timeframe
[in] Período. Pode ser um dos valores da enumeração ENUM _TIMEFR AMES. 0 indica o período do
gráfico atual.
type
[in] Identificador de timeseries em que será realizada a pesquisa. Pode ser qualquer um dos
valores ENUM _SERIESMODE.
count=WHOLE_ARRAY
[in] Número de itens de timeseries (na direção tanto da barra atual quanto do aumento do
índice), entre os quais deve ser realizada a pesquisa.
start=0
[in] Índice (deslocamento em relação à barra atual) da barra inicial a partir do qual começa a
busca do menor valor. Valores negativos são ignorados e substituídos por um valor zero.
Valor de retorno
Índice do menor valor encontrado (deslocamento em relação à barra atual) do gráfico
correspondente ou -1 no caso de erro. Para mais informações sobre o erro, deve-se chamar a função
GetLastError().
Exemplo:
double val;
//--- pesquisa da barra com um valor mínimo do volume real em 15 barras consecutivas
//--- a partir do índice 10 e terminando no índice 24, inclusive no gráfico atual
int val_index=iLowest(NULL,0,MODE_REAL_VOLUME,15,10);
if(val_index!=-1)
val=Low[val_index];
else
PrintFormat("Erro ao chamar iLowest(). Código de erro=%d",GetLastError());
iOpen
R etorna o valor do preço de abertura da barra (indicado pelo parâmetro shift) do gráfico
correspondente.
double iOpen(
const string symbol, // símbolo
ENUM_TIMEFRAMES timeframe, // período
int shift // deslocamento
);
Parâmetros
symbol
[in] Nome simbólico do instrumento. NULL significa o símbolo atual.
timeframe
[in] Período. Pode ser um dos valores da enumeração ENUM _TIMEFR AMES. 0 significa o período
do gráfico atual.
shift
[in] Índice do valor recebido do timeseries (deslocamento - número especificado de barras atrás -
em relação à barra atual).
Valor de retorno
Valor do preço de abertura da barra (indicado pelo parâmetro shift) do gráfico correspondente ou 0
no caso de erro. Para mais informações sobre o erro, deve-se chamar a função GetLastError().
Observação
A função sempre retorna dados relevantes, para isso, a cada chamada, faz uma solicitação aos
timeseries para o símbolo/período especificado. Isso significa que, se não houver dados prontos na
primeira chamada de função, preparar o resultado poderá levar algum tempo.
A função não armazena os resultados de chamadas anteriores, pois não há cache local para retorno
rápido do valor.
Exemplo:
input int shift=0;
//+------------------------------------------------------------------+
//| Function-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"
);
}
Veja também
CopyOpen, CopyR ates
iTime
R etorna o valor do tempo de abertura da barra (indicado pelo parâmetro shift) do gráfico
correspondente.
datetime iTime(
const string symbol, // símbolo
ENUM_TIMEFRAMES timeframe, // período
int shift // deslocamento
);
Parâmetros
symbol
[in] Nome simbólico do instrumento. NULL significa o símbolo atual.
timeframe
[in] Período. Pode ser um dos valores da enumeração ENUM _TIMEFR AMES. 0 significa o período
do gráfico atual.
shift
[in] Índice do valor recebido do timeseries (deslocamento - número especificado de barras atrás -
em relação à barra atual).
Valor de retorno
Valor do tempo de abertura da barra (indicado pelo parâmetro shift) do gráfico correspondente ou 0
no caso de erro. Para mais informações sobre o erro, deve-se chamar a função GetLastError().
Observação
A função sempre retorna dados relevantes, para isso, a cada chamada, faz uma solicitação aos
timeseries para o símbolo/período especificado. Isso significa que, se não houver dados prontos na
primeira chamada de função, preparar o resultado poderá levar algum tempo.
A função não armazena os resultados de chamadas anteriores, pois não há cache local para retorno
rápido do valor.
Exemplo:
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- data é no domingo
datetime time=D'2018.06.10 12:00';
string symbol="GBPUSD";
ENUM_TIMEFRAMES tf=PERIOD_H1;
bool exact=false;
//--- se não houver barra para o tempo especificado, iBarShift retornará o índice da barra mais pró
int bar_index=iBarShift(symbol,tf,time,exact);
PrintFormat("1. %s %s %s(%s): bar index is %d (exact=%s)",
symbol,EnumToString(tf),TimeToString(time),DayOfWeek(time),bar_index,string(exact));
datetime bar_time=iTime(symbol,tf,bar_index);
PrintFormat("Time of bar #%d is %s (%s)",
bar_index,TimeToString(bar_time),DayOfWeek(bar_time));
//PrintFormat(iTime(symbol,tf,bar_index));
//--- precisamos encontrar o índice da barra para o tempo especificado, se ele não existir, retorna
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));
}
//+------------------------------------------------------------------+
//| Retorna o nome do dia da semana |
//+------------------------------------------------------------------+
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;
}
/* Resultado:
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)
*/
Veja também
CopyT ime, CopyR ates
iTickVolume
R etorna o valor do volume de tick (especificado pelo parâmetro shift) do gráfico correspondente.
long iTickVolume(
const string symbol, // símbolo
ENUM_TIMEFRAMES timeframe, // período
int shift // deslocamento
);
Parâmetros
symbol
[in] Nome simbólico do instrumento. NULL significa o símbolo atual.
timeframe
[in] Período. Pode ser um dos valores da enumeração ENUM _TIMEFR AMES. 0 significa o período
do gráfico atual.
shift
[in] Índice do valor recebido do timeseries (deslocamento - número especificado de barras atrás -
em relação à barra atual).
Valor de retorno
Valor do volume de tick da barra (indicado pelo parâmetro shift) do gráfico correspondente ou 0 no
caso de erro. Para mais informações sobre o erro, deve-se chamar a função GetLastError().
Observação
A função sempre retorna dados relevantes, para isso, a cada chamada, faz uma solicitação aos
timeseries para o símbolo/período especificado. Isso significa que, se não houver dados prontos na
primeira chamada de função, preparar o resultado poderá levar algum tempo.
A função não armazena os resultados de chamadas anteriores, pois não há cache local para retorno
rápido do valor.
Exemplo:
input int shift=0;
//+------------------------------------------------------------------+
//| Function-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"
);
}
Veja também
CopyT ickVolume, CopyR ates
iRealVolume
R etorna o valor do volume real da barra (indicado pelo parâmetro shift) do gráfico correspondente.
long iRealVolume(
const string symbol, // símbolo
ENUM_TIMEFRAMES timeframe, // período
int shift // deslocamento
);
Parâmetros
symbol
[in] Nome simbólico do instrumento. NULL significa o símbolo atual.
timeframe
[in] Período. Pode ser um dos valores da enumeração ENUM _TIMEFR AMES. 0 significa o período
do gráfico atual.
shift
[in] Índice do valor recebido do timeseries (deslocamento - número especificado de barras atrás -
em relação à barra atual).
Valor de retorno
O valor do volume real da barra (indicado pelo parâmetro shift) do gráfico correspondente ou 0 no
caso de erro. Para mais informações sobre o erro, deve-se chamar a função GetLastError().
Observação
A função sempre retorna dados relevantes, para isso, a cada chamada, faz uma solicitação aos
timeseries para o símbolo/período especificado. Isso significa que, se não houver dados prontos na
primeira chamada de função, preparar o resultado poderá levar algum tempo.
A função não armazena os resultados de chamadas anteriores, pois não há cache local para retorno
rápido do valor.
Exemplo:
input int shift=0;
//+------------------------------------------------------------------+
//| Function-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"
);
}
Veja também
CopyR ealVolume, CopyR ates
iVolume
R etorna o valor do volume de tick (especificado pelo parâmetro shift) do gráfico correspondente.
long iVolume(
const string symbol, // símbolo
ENUM_TIMEFRAMES timeframe, // período
int shift // deslocamento
);
Parâmetros
symbol
[in] Nome simbólico do instrumento. NULL significa o símbolo atual.
timeframe
[in] Período. Pode ser um dos valores da enumeração ENUM _TIMEFR AMES. 0 significa o período
do gráfico atual.
shift
[in] Índice do valor recebido do timeseries (deslocamento - número especificado de barras atrás -
em relação à barra atual).
Valor de retorno
Valor do volume de tick da barra (indicado pelo parâmetro shift) do gráfico correspondente ou 0 no
caso de erro. Para mais informações sobre o erro, deve-se chamar a função GetLastError().
Observação
A função sempre retorna dados relevantes, para isso, a cada chamada, faz uma solicitação aos
timeseries para o símbolo/período especificado. Isso significa que, se não houver dados prontos na
primeira chamada de função, preparar o resultado poderá levar algum tempo.
A função não armazena os resultados de chamadas anteriores, pois não há cache local para retorno
rápido do valor.
Exemplo:
input int shift=0;
//+------------------------------------------------------------------+
//| Function-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"
);
}
Veja também
CopyT ickVolume, CopyR ates
iSpread
R etorna o valor do spread da barra (indicado pelo parâmetro shift) do gráfico correspondente.
long iSpread(
const string symbol, // símbolo
ENUM_TIMEFRAMES timeframe, // período
int shift // deslocamento
);
Parâmetros
symbol
[in] Nome simbólico do instrumento. NULL significa o símbolo atual.
timeframe
[in] Período. Pode ser um dos valores da enumeração ENUM _TIMEFR AMES. 0 significa o período
do gráfico atual.
shift
[in] Índice do valor recebido do timeseries (deslocamento - número especificado de barras atrás -
em relação à barra atual).
Valor de retorno
Valor do spread da barra (indicado pelo parâmetro shift) do gráfico correspondente ou 0 no caso de
erro. Para mais informações sobre o erro, deve-se chamar a função GetLastError().
Observação
A função sempre retorna dados relevantes, para isso, a cada chamada, faz uma solicitação aos
timeseries para o símbolo/período especificado. Isso significa que, se não houver dados prontos na
primeira chamada de função, preparar o resultado poderá levar algum tempo.
A função não armazena os resultados de chamadas anteriores, pois não há cache local para retorno
rápido do valor.
Exemplo:
input int shift=0;
//+------------------------------------------------------------------+
//| Function-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"
);
}
Veja também
CopySpread, CopyR ates
Símbolos personalizados
Funções para criar e editar as propriedades dos símbolos personalizados.
O grupo de funções nesta seção permite criar seus próprios símbolos personalizados. Para fazer isso, é
possível criar os símbolos existentes do servidor de negociação, arquivos de texto ou históricos de
dados externos.
Função Ação
CustomS ymbolCreate Cria um símbolo personalizado com o nome
especificado no grupo definido
CustomT ick sAdd Adds data from an array of the MqlT ick type to
the price history of a custom s ymbol. T he
custom s ymbol must be selected in the Mark et
W atch window.
CustomSymbolCreate
Cria um símbolo personalizado com o nome especificado no grupo definido.
bool CustomSymbolCreate(
const string symbol_name, // nome do símbolo personalizado
const string symbol_path="", // nome do grupo em que será criado o símbolo
const string symbol_origin=NULL // nome do símbolo com base no qual será criado o símbolo
);
Parâmetros
symbol_name
[in] Nome do símbolo personalizado. Ele não deve conter grupos ou sub-grupos em que se
encontre o símbolo.
symbol_path=""
[in] Nome do grupo em que é criado o símbolo.
symbol_origin=NULL
[in] Nome do símbolo a partir do qual serão copiadas as propriedades do símbolo personalizado
gerado. Depois de criar um símbolo personalizado, você pode alterar qualquer propriedade para o
valor desejado com as funções correspondentes.
Valor retornado
true, em caso de sucesso, caso contrário, false. Para obter informações sobre o erro, você deve
chamar a função GetLastError().
Observação
T odos os símbolos personalizados são gerados na seção especial Custom. Se o nome de grupo não
for especificado (o parâmetro symbol_path na função CustomS ymbolCreate contém uma string vazia
ou NULL), o símbolo personalizado será criado na raiz da seção Custom. Aqui você pode fazer uma
analogia com o sistema de arquivos, onde grupos e subgrupos podem ser vistos como pastas e
subpastas
O nome do símbolo e descrição do grupo são definidos apenas por caracteres latinos sem pontuação,
espaços e caracteres especiais (são permitidos " ." , "_" , "&" e "#" ). Não é recomendado usar - nos
nomes dos símbolos - os caracteres <, >, :, " , /, |, ?, *.
O nome do símbolo personalizado deve ser único, independentemente do nome do grupo em que ele
é criado. Se já existir um símbolo com o mesmo nome, a função CustomS ymbolCreate() retornará
false, enquanto a chamada subsequente de GetLastError() gerará o erro 5300
(ERR_NOT_CUS T OM _S YM BOL) ou 5304 (ERR_CUS T OM _S YM BOL _EXIS T ).
O nome do símbolo não deve exceder 31 caracteres, caso contrário, CustomS ymbolCreate()
retornará false e será gerado o ero 5302 – ERR_CUS T OM _S YM BOL _NAME_LONG.
Deve-se ter em mente que a propriedade S YM BOL _PATH retorna o caminho com o nome do símbolo
no final. Portanto, você não pode simplesmente copiá-lo sem alterações, se quiser criar um símbolo
personalizado exatamente no mesmo grupo. Nesse caso, é necess ário cortar o nome do símbolo para
não obter o resultado descrito acima.
Se como parâmetro symbol_origin for especificado um símbolo inexistente, o símbolo personalizado
será criado vazio, como se o parâmetro symbol_origin não tivesse sido especificado. Nesse caso,
será gerado o erro 4301 – ERR_MARKET_UNKNOWN_S YM BOL.
O comprimento do parâmetro symbol_path não deve exceder 127 caracteres considerando " Custom\
\" , separador de grupo "\\" e nome do símbolo se for indicado no final.
Veja também
S ymbolName, S ymbolSelect, CustomS ymbolDelete
CustomSymbolDelete
R emove o símbolo personalizado com o nome especificado.
bool CustomSymbolDelete(
const string symbol_name // nome do símbolo personalizado
);
Parâmetros
symbol
[in] Nome do símbolo personalizado. Não deve corresponder ao nome do símbolo existente.
Valor de retorno
true, em caso de sucesso, caso contrário, false. Para obter informações sobre o erro, você deve
chamar a função GetLastError().
Observação
O símbolo personalizado que aparece na observação do mercado (Mark et W atch) ou que abre o
gráfico não pode ser excluído.
Veja também
S ymbolName, S ymbolSelect, CustomS ymbolCreate
CustomSymbolSetInteger
Define o valor do tipo inteiro para o símbolo personalizado.
bool CustomSymbolSetInteger(
const string symbol_name, // nome do símbolo
ENUM_SYMBOL_INFO_INTEGER property_id, // identificador de propriedade
long property_value // valor de propriedade
);
Parâmetros
symbol_name
[in] Nome do símbolo personalizado.
property_id
[in] Identificador da propriedade do símbolo. O valor pode ser um dos valores da enumeração
ENUM _S YM BOL _INFO_INT EGER .
property_value
[in] Variável de tipo long contendo o valor da propriedade.
Valor de retorno
true, em caso de sucesso, caso contrário, false. Para obter informações sobre o erro, você deve
chamar a função GetLastError().
Observação
H istórico de minuto e de tick s do símbolo personalizado é completamente removido, se, na
especificação do símbolo, for alterada qualquer uma destas propriedades :
· S YM BOL _CH ART_MODE – tipo de preço usado para plotagem de barras (Bid ou Last)
· S YM BOL _DIGIT S – número de casas decimais para exibição do preço
Após a remoção do histórico personalizado, o terminal tentará criar um novo histórico usando as
propriedades atualizadas. A mesma coisa acontece quando você altera manualmente as
propriedades do símbolo personalizado.
Veja também
S ymbolInfoInteger
CustomSymbolSetDouble
Define o valor do tipo real para o símbolo personalizado.
bool CustomSymbolSetDouble(
const string symbol_name, // nome do símbolo
ENUM_SYMBOL_INFO_DOUBLE property_id, // identificador de propriedade
double property_value // valor da propriedade
);
Parâmetros
symbol_name
[in] Nome do símbolo personalizado.
property_id
[in] Identificador da propriedade do símbolo. O valor pode ser um dos valores da enumeração
ENUM _S YM BOL _INFO_DOUBLE.
property_value
[in] Variável de tipo double contendo o valor da propriedade.
Valor de retorno
true, em caso de sucesso, caso contrário, false. Para obter informações sobre o erro, você deve
chamar a função GetLastError().
Observação
H istórico de minuto e de tick s do símbolo personalizado é completamente removido, se, na
especificação do símbolo, for alterada qualquer uma destas propriedades :
· S YM BOL _POINT – valor de um ponto
· S YM BOL _TR ADE_TI CK_S IZE – valor do tick que define o variação mínima permitida no preço
· S YM BOL _TR ADE_TI CK_VAL UE – custo quado o preço varia um tick para posição lucrativa
Após a remoção do histórico personalizado, o terminal tentará criar um novo histórico usando as
propriedades atualizadas. A mesma coisa acontece quando você altera manualmente as
propriedades do símbolo personalizado.
Veja também
S ymbolInfoDouble
CustomSymbolSetString
Define o valor do tipo cadeia de caracteres para o símbolo personalizado.
bool CustomSymbolSetString(
const string symbol_name, // nome do símbolo
ENUM_SYMBOL_INFO_STRING property_id, // identificador de propriedade
string property_value // valor de propriedade
);
Parâmetros
symbol_name
[in] Nome do símbolo personalizado.
property_id
[in] Identificador da propriedade do símbolo. O valor pode ser um dos valores da enumeração
ENUM _S YM BOL _INFO_S TRING.
property_value
[in] Variável de tipo string contendo o valor da propriedade.
Valor de retorno
true, em caso de sucesso, caso contrário, false. Para obter informações sobre o erro, você deve
chamar a função GetLastError().
Observação
H istórico de minuto e de tick s do símbolo personalizado é completamente removido, se, na
especificação do símbolo, for alterada a propriedade S YM BOL _FOR M ULA, ela define a fórmula para
plotagem do preço do símbolo personalizado. Após a remoção do histórico personalizado, o terminal
tentará criar um novo histórico com base na nova fórmula. A mesma coisa acontece quando você
altera manualmente a fórmula do símbolo personalizado.
Veja também
S ymbolInfoString
CustomSymbolSetMarginRate
Define o coeficiente de cobrança da margem - dependendo do tipo e direção da ordem - para o símbolo
personalizado.
bool CustomSymbolSetMarginRate(
const string symbol_name, // nome do símbolo
ENUM_ORDER_TYPE order_type, // tipo de ordem
double initial_margin_rate, // coeficiente de cobrança da margem inicial
double maintenance_margin_rate // coeficiente de cobrança da margem de manutenção
);
Parâmetros
symbol_name
[in] Nome do símbolo personalizado.
order_type
[in] T ipo de ordem.
initial_margin_rate
[in] Variável de tipo double com o valor de coeficiente de cobrança da margem inicial. A margem
inicial é o tamanho da soma de garantia (margem) das transações concluídas com volume de um
lote para a direção correspondente. Ao multiplicar o coeficiente pela margem inicial, nós podemos
obter o montante que será reservado na conta ao colocar a ordem do tipo especificado.
maintenance_margin_rate
[in] Variável do tipo double com o valor de coeficiente de cobrança da margem de manutenção. A
margem de manutenção é a quantidade mínima para manter uma posição aberta com volume de
um lote para a direção correspondente. Ao multiplicar o coeficiente pela margem de manutenção,
nós podemos obter o montante que será reservado na conta após a ativação da ordem do tipo
especificado.
Valor de retorno
true, em caso de sucesso, caso contrário, false. Para obter informações sobre o erro, você deve
chamar a função GetLastError().
Veja também
S ymbolInfoMarginR ate
CustomSymbolSetSessionQuote
Define a hora de início e fim da sessão de cotação especificada para o símbolo especificado e dia da
semana.
bool CustomSymbolSetSessionQuote(
const string symbol_name, // nome do símbolo
ENUM_DAY_OF_WEEK day_of_week, // dia da semana
uint session_index, // número de sessão
datetime from, // hora de início da sessão
datetime to // hora de fim da sessão
);
Parâmetros
symbol_name
[in] Nome do símbolo personalizado.
ENUM_DAY_OF_WEEK
[in] Dia da semana toma um valor da enumeração ENUM _DAY_OF_W EEK.
uint
[in] Número de ordem da sessão para a qual é necess ário definir a hora de início e fim. Indexação
de sess ões começa por 0.
from
[in] H ora de início de sessão em segundos - a partir de 00:00 -, o valor da data será ignorado na
variável.
to
[in] H ora de fim de sessão em segundos - a partir de 00:00 -, o valor da data será ignorado na
variável.
Valor de retorno
true, em caso de sucesso, caso contrário, false. Para obter informações sobre o erro, você deve
chamar a função GetLastError().
Observação
Se a sessão com o session_index definido já existir, a função simplesmente editará o início e fim da
sessão.
Se transferidos parâmetros nulos de início e fim para a sessão, isto é, especificados from=0 e to=0,
a sessão correspondente com índice session_index será removida, enquanto a numeração das
sess ões será deslocada para baixo.
É possível adicionar sess ões só sequencialmente, isto é, a sessão com índice session_index=1 pode
ser adicionada apenas se já existir uma sessão com um índice igual a 0. Ao violar esta regra, não é
criada uma nova sessão, e a função retornará false.
Veja também
S ymbolInfoSessionQuote, Informações sobre o instrumento , T imeT oStruct, Estrutura de data
CustomSymbolSetSessionTrade
Define a hora de início e fim da sessão de negociação especificada para o símbolo especificado e dia
da semana.
bool CustomSymbolSetSessionTrade(
constg symbol_name, // nome do símbolo
ENUM_DAY_OF_WEEK day_of_week, // dia da semana
uint session_index, // número de sessão
datetime from, // hora de início da sessão
datetime to // hora de fim da sessão
);
Parâmetros
symbol_name
[in] Nome do símbolo personalizado.
ENUM_DAY_OF_WEEK
[in] Dia da semana toma um valor da enumeração ENUM _DAY_OF_W EEK.
uint
[in] Número de ordem da sessão para a qual é necess ário definir a hora de início e fim. Indexação
de sess ões começa por 0.
from
[in] H ora de início de sessão em segundos - a partir de 00:00 -, o valor da data será ignorado na
variável.
to
[in] H ora de fim de sessão em segundos - a partir de 00:00 -, o valor da data será ignorado na
variável.
Valor de retorno
true, em caso de sucesso, caso contrário, false. Para obter informações sobre o erro, você deve
chamar a função GetLastError().
Observação
Se a sessão com o session_index definido já existir, a função simplesmente editará o início e fim da
sessão.
Se transferidos parâmetros nulos de início e fim para a sessão, isto é, especificados from=0 e to=0,
a sessão correspondente com índice session_index será removida, enquanto a numeração das
sess ões será deslocada para baixo.
É possível adicionar sess ões só sequencialmente, isto é, a sessão com índice session_index=1 pode
ser adicionada apenas se já existir uma sessão com um índice igual a 0. Ao violar esta regra, não é
criada uma nova sessão, e a função retornará false.
Veja também
S ymbolInfoSessionT rade, Informações sobre o instrumento, T imeT oStruct, Estrutura de data
CustomRatesDelete
Exclui todas as barras no histórico de preço do instrumento personalizado, no intervalo de tempo
selecionado.
int CustomRatesDelete(
const string symbol, // nome do símbolo
datetime from, // a partir de qual data
datetime to // até qual data
);
Parâmetros
symbol
[in] Nome do instrumento personalizado.
from
[in] T empo da primeira barra no histórico de preço, na faixa definida a ser removida.
to
[in] T empo da última barra no histórico de preço, na faixa definida a ser removida.
Valor de retorno
Número de barras removidas ou -1 em caso de erro.
Veja também
CustomR ates R eplace, CustomR ates Update, CopyR ates
CustomRatesReplace
Substitui todo o histórico de preço do instrumento personalizado pelos dados na matriz do tipo
MqlR ates, no intervalo de tempo definido.
int CustomRatesReplace(
const string symbol, // nome do símbolo
datetime from, // a partir de qual data
datetime to, // até qual data
const MqlRates& rates[], // matriz com dados que é necessário aplicar ao instrumento
uint count=WHOLE_ARRAY // número de elementos a serem usados na matriz rates[]
);
Parâmetros
symbol
[in] Nome do instrumento personalizado.
from
[in] T empo da primeira barra no histórico de preço, na faixa definida a ser atualizada.
to
[in] T empo da última barra no histórico de preço, na faixa definida a ser atualizada.
rates[]
[in] Matriz de dados históricos do tipo MqlR ates para o período M 1.
count=WHOLE_ARRAY
[in] Número de elementos da matriz rates[] a serem usados para substituição. O valor
WH OLE_ARR AY indica que para substituição é necess ário usar todos os elementos da matriz
rates[].
Valor de retorno
Número de barras atualizadas ou -1 em caso de erro.
Geral
Se a barra na matriz rates[] ficar fora do intervalo definido, ela será ignorada. Se essa barra existir
no histórico de preço e ficar dentro do intervalo definido, ela será substituída. T odas as outras
barras - no histórico de preço atual - fora do intervalo definido permanecem inalteradas. Os dados
da matriz rates[] devem estar corretas em relação aos preços OH LC, enquanto o tempo de abertura
de barras deve corresponder ao período M 1.
Veja também
CustomR ates Delete, CustomR ates Update, CopyR ates
CustomRatesUpdate
Adiciona ao histórico do instrumento personalizado as barras que faltam e substitui os dados
existentes na matriz do tipo MqlR ates.
int CustomRatesUpdate(
const string symbol, // nome do símbolo personalizado
const MqlRates& rates[], // matriz com dados que devem ser aplicadas ao instrumento
uint count=WHOLE_ARRAY // número de elementos a serem usados na matriz rates[]
);
Parâmetros
symbol
[in] Nome do instrumento personalizado.
rates[]
[in] Matriz de dados históricos do tipo MqlR ates para o período M 1.
count=WHOLE_ARRAY
[in] Número de elementos da matriz rates[] a serem usados para atualização. O valor
WH OLE_ARR AY indica que é necess ário usar todos os elementos da matriz rates[].
Valor de retorno
Número de barras atualizadas ou -1 em caso de erro.
Geral
Se a barra na matriz rates[] não existir no histórico atual do instrumento personalizado, ela será
adicionada. Se essa barra já existir, ela será é substituída. T odas as outras barras no histórico de
preço atual permanecem inalteradas. Os dados da matriz rates[] devem estar corretas em relação
aos preços OH LC, enquanto o tempo de abertura de barras deve corresponder ao período M 1.
Veja também
CustomR ates R eplace, CustomR ates Delete, CopyR ates
CustomTicksAdd
Adds data from an array of the MqlT ick type to the price history of a custom s ymbol. T he custom
s ymbol must be selected in the Mark et W atch window.
int CustomTicksAdd(
const string symbol, // Symbol name
const MqlTick& ticks[], // The array with tick data that should be applied to the c
uint count=WHOLE_ARRAY // número de elementos a serem usados a partir da matriz ti
);
Parameters
symbol
[in] T he name of the custom s ymbol.
ticks[]
[in] An array of tick data of the MqlT ick type arranged in order of time from earlier data to more
recent ones, i.e. tick s [k].time_msc <= tick s [n].time_msc, if k<n.
count=WHOLE_ARRAY
[in] Número de elementos da matriz ticks[] a serem utilizados para adição. O valor
WH OLE_ARR AY indica que é necess ário usar todos os elementos da matriz ticks[].
Return Value
T he number of added tick s or -1 in case of an error.
Further Note
T he CustomT ick sAdd function only work s for custom s ymbols opened in the Mark et W atch window. If
the s ymbol is not selected in Mark et W atch, then you should add tick s using CustomT ick s R eplace.
A função CustomT ick sAdd permite transmitir tick s como se chegassem desde o servidor da
corretora. Os dados não são salvos diretamente no banco de dados de tick s, em vez disso, são
enviados para a janela " Observação do mercado" . É a partir dela que o terminal armazena os tick s
em sua base. Quando a quantidade de dados transferidos por chamada é grande, a função altera seu
comportamento para poupar recursos. Se forem transferidos mais de 256 tick s, os dados serão
divididos em duas partes. A primeira parte (grande) é imediatamente carregada diretamente na
base de tick s (como faz a CustomT ick s R eplace). A segunda parte, que consiste nos últimos 128
tick s, é transferida para a janela " Observação do mercado" e, em seguida, é salva pelo terminal no
banco de dados de tick s.
A estrutura MqlT ick possui dois valores de campo com valores temporais, isto é, time (hora do tick
em segundos) e time_msc (hora de tick em milissegundos). Eles realizam o cálculo desde 01 de
janeiro de 1970. Nos tick s adicionados, o processamento destes campos é realizado acordo com as
seguintes regras na ordem estabelecida:
1. se o valor for tick s [k].time_msc!=0, usamo-lo para preenchimento do campo tick s [k].time, quer
dizer, para o tick é definido o tempo tick s [k].time=tick s [k].time_msc/1000 (divisão inteira)
2. se tick s [k].time_msc==0 e tick s [k].time!=0, a hora em milissegundos é obtida pela multiplicação
por 1000, isto é, tick s [k].time_msc=tick s [k].time*1000
3. se tick s [k].time_msc==0 e tick s [k].time==0, nestes campos é registrado o tempo atual do
servidor de negociação em milissegundos quando chamada a funçãoCustomT ick sAdd.
Se o valor dos campos tick s [k].bid, tick s [k].as k , tick s [k].last ou tick s [k].volume for maior do que
zero, no campo tick s [k].flags, é escrita a combinação dos sinalizadores correspondentes :
· TI CK_FLAG_BID – tick alterou o preço Bid
· TI CK_FLAG_AS K – tick alterou o preço As k
· TI CK_FLAG_LAS T – tick alterou o preço da última transação
· TI CK_FLAG_VOL UME – tick mudou o volume
Se o valor de campo é menor ou igual a zero, o sinalizador correspondente não é gravado nos campo
tick s [k].flags.
See also
CustomR ates Delete, CustomR ates Update, CustomT ick s R eplace, CopyT ick s, CopyT ick s R ange
CustomTicksDelete
Exclui todos os tick s no histórico de preço do instrumento personalizado, no intervalo de tempo
selecionado.
int CustomTicksDelete(
const string symbol, // nome do símbolo
long from_msc, // a partir de qual data
long to_msc // até qual data
);
Parâmetros
symbol
[in] Nome do instrumento personalizado.
from_msc
[in] T empo do primeiro tick no histórico de preço, na faixa definida a ser removida. T empo em
milissegundos desde 01.01.1970.
to_msc
[in] T empo do último tick no histórico de preço, na faixa definida a ser removida. T empo em
milissegundos desde 01.01.1970.
Valor de retorno
Número de tick s removidos ou -1 em caso de erro.
Veja também
CustomR ates Delete, CustomR ates Update, CustomT ick s R eplace, CopyT ick s, CopyT ick s R ange
CustomTicksReplace
Substitui todo o histórico de preço do instrumento personalizado pelos dados na matriz do tipo
MqlT ick , no intervalo de tempo definido.
int CustomTicksReplace(
const string symbol, // nome do símbolo
datetime from_msc, // a partir de qual data
datetime to_msc, // até qual data
const MqlTick& ticks[], // matriz com dados de tick que se devem aplicar ao instrume
uint count=WHOLE_ARRAY // número de elementos a serem usados a partir da matriz tic
);
Parâmetros
symbol
[in] Nome do instrumento personalizado.
from_msc
[in] T empo do primeiro tick no histórico de preço, na faixa definida a ser removida. T empo em
milissegundos desde 01.01.1970.
to_msc
[in] T empo do último tick no histórico de preço, na faixa definida a ser removida. T empo em
milissegundos desde 01.01.1970.
ticks[]
[in] Matriz dos dados de tick - de tipo MqlT ick - classificados segundo o tempo em ordem
crescente.
count=WHOLE_ARRAY
[in] Número de elementos da matriz ticks[] que será usado para substituir no intervalo de tempo
especificado. O valor WH OLE_ARR AY indica que é necess ário usar todos os elementos da matriz
ticks[].
Valor de retorno
Número de tick s atualizados ou -1 em caso de erro.
Geral
Como, no canal de cotações, muitas vezes alguns tick s podem ter o mesmo tempo com uma
precisão de milissegundos (a hora do tick é armazenado no campo time_msc da estrutura MqlT ick ),
a função CustomT ick s R eplace não classifica automaticamente os elementos da matriz ticks[] de
acordo com o tempo. Portanto, a matriz de tick s deve ser pré-ordenada por tempo ascendente.
Os tick s são substituídos sequencialmente, dia após dia, até a hora especificada em to_msc ou até
que ocorra um erro. Primeiro, é processado o primeiro dia da faixa especificada, em seguida, o
seguinte, e assim por diante. Assim que encontrada uma discrepância no tempo do tick quanto à
ordem crescente (não decrescente), é interrompido o processo de substituição de tick s para o dia
atual. Ao acontecer isto, os tick s do dia anterior são substituídos com sucesso, enquanto o dia atual
(no momento do tick errado) e todos os dias restantes no intervalo definido permanecerão
inalterados.
Se, na matriz ticks[], não existirem dados de tick um certo dia (de um modo geral, um intervalo de
qualquer duração), após serem implementados os tick s da ticks[], no histórico do instrumento
personalizado é formado um " buraco" , que corresponde aos dados em falta. Em outras palavras, a
chamada de CustomT ick s R eplace com os tick s em falta para uma determinada faixa será
equivalente à remoção da parte do histórico de negociação, como se fosse chamado
CustomT ick s Delete com um intervalo " buracado" .
A função CustomT ick s R eplace funciona diretamente com o banco de dados de tick s.
Veja também
CustomR ates Delete, CustomR ates Update, CustomT ick s Delete, CopyT ick s, CopyT ick s R ange
CustomBookAdd
Envia o estado do livro de ofertas do instrumento personalizado. A função permite transmitir o livro
de ofertas como se ele viesse do servidor da corretora.
int CustomBookAdd(
const string symbol, // nome do símbolo
const MqlBookInfo& books[] // array com as descrições dos elementos do livro de ofer
uint count=WHOLE_ARRAY // número de elementos a serem usados
);
Parâmetros
symbol
[in] Nome do instrumento personalizado.
books[]
[in] Array de dados do tipo MqlBookInfo descrevendo completamente o estado do livro de ofertas
— todos os pedidos de compra e de venda. O estado de livro de ofertas enviado substitui
completamente o anterior.
count=WHOLE_ARRAY
[in] Número do elementos do array books que deve ser enviado para a função. Por padrão, é
usado o array inteiro.
Valor retornado
Número de tick s adicionados ou -1 no caso de erro.
Observação
Função CustomBook Add funciona apenas para símbolos personalizados em que o livro de ofertas
está aberto — por meio da interface da plataforma ou função Mark etBook Add.
Ao adicionar ao livro de ofertas, os preços Bid e As k do instrumento não são atualizados. Você deve
controlar de forma independente a mudança dos melhores preços e adicionar tick s com a ajuda de
CustomT ick sAdd.
Os dados transmitidos são verificados quanto à exatidão: os preços e volumes não devem ser
negativos, pois, para cada tipo de elemento, devem ser indicados preço e volume
(MqlBookInfo.volume ou MqlBookInfo.volume_real). Se pelo menos um elemento do livro de ofertas
for descrito incorretamente, o sistema descartará completamente o estado transmitido.
O volume com maior precisão MqlBookInfo.volume_real tem uma prioridade mais alta que o habitual
MqlBookInfo.volume. Se, para o elemento do livro de ofertas, ambos os valores forem
especificados, será usado volume_real.
A sequência de elementos MqlBookInfo no array books não importa. Ao salvar dados, o terminal os
classifica por preço independentemente.
Exemplo:
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- ativamos o livro de ofertas para o instrumento a partir do qual vamos tomas dados
MarketBookAdd(Symbol());
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| Tick function |
//+------------------------------------------------------------------+
void OnTick(void)
{
MqlTick ticks[];
ArrayResize(ticks,1);
//--- copiamos os preços atuais a partir de um instrumento habitual para um instrumento personaliza
if(SymbolInfoTick(Symbol(),ticks[0]))
{
string symbol_name=Symbol()+".SYN";
CustomTicksAdd(symbol_name,ticks);
}
}
//+------------------------------------------------------------------+
//| Book function |
//+------------------------------------------------------------------+
void OnBookEvent(const string &book_symbol)
{
//--- copiamos o estado atual do livro de ofertas a partir de um instrumento habitual para um instr
if(book_symbol==Symbol())
{
MqlBookInfo book_array[];
if(MarketBookGet(Symbol(),book_array))
{
string symbol_name=Symbol()+".SYN";
CustomBookAdd(symbol_name,book_array);
}
}
}
//+------------------------------------------------------------------+
Veja também
Mark etBook Add, CustomT ick sAdd, OnBook Event
Operações de Gráficos
As funções para definir as propriedades do gráfico (ChartSetInteger, ChartSetDouble e ChartSetString)
são assíncronas e servem para o envio de alterações para o gráfico. Quando essas funções são
executadas com sucesso, o comando entra na fila geral de eventos do gráfico. A alteração das
propriedades do gráfico é feita durante o processamento da fila de eventos de dado gráfico.
Por esse motivo, você não deve esperar uma atualização imediata do gráfico, após chamar funções
assíncronas. Para forçar a atualização de aparência e propriedades do gráfico, use a função
ChartR edraw().
Função Ação
ChartApplyT emplate Aplica o modelo específico de um arquivo
especificado para o gráfico
ChartApplyTemplate
Aplica-se um modelo específico de um arquivo especificado para o gráfico. O comando é adicionado
para plotar uma fila de mensagens de gráfico e será executado após o processamento de todos os
comandos anteriores.
bool ChartApplyTemplate(
long chart_id, // ID Gráfico
const string filename // Nome Arquivo Modelo (Template)
);
Parâmetros
chart_id
[in] ID Gráfico. Significa o gráfico atual.
filename
[in] O nome do arquivo contendo o modelo.
Valor do Retorno
R etorna verdadeiro se o comando foi adicionado à fila do gráfico, caso contrário será falso. Para
obter uma informação sobre o erro, chamar a função GetLastError().
Observação
O Assessor Especialista (Expert Advisor) será descarregado e não poderá ser capaz de continuar
operando em caso de carregamento bem sucedido de um novo modelo de gráfico que estiver
anexado.
Ao aplicar o modelo ao gráfico, permiss ões de negociação podem ser limitadas devido a razões de
segurança:
A permissão de negociação ao vivo não pode ser estendida para os Expert Advisors
lançados aplicando o modelo usando a função ChartApplyTemplate().
Se o programa mql5 chamar a função ChartApplyT emplate() não possuir permissão para negociar, o
Expert Advisor lançado através do modelo também não será capaz de negociar, independentemente
das configurações do modelo.
Se o programa mql5 chamar a função ChartApplyT emplate() possuir permissão para negociar,
enquanto não há tal permissão nas configurações do modelo, o Expert Advisor lançado através do
modelo não será capaz de negociar.
· Cor da grade;
· Cor da barra de alta, sombra e borda da barra de alta (também denominado como castiçal ou vela de
alta);
· Cor da barra de baixa, sombra e borda da barra de baixa (também denominado como castiçal ou
vela de baixa);
· Cor da linha do gráfico e barra Doji (também denominado como castiçal ou vela Doji);
· Cor do corpo da barra de alta (também denominado como castiçal ou vela de alta);
· Cor do corpo da barra de baixa (também denominado como castiçal ou vela de baixa);
· Cor dos níveis das ordens de paradas, Parar Perda e T omar Lucro (Stop Loss e T ak e Profit).
Além disso, pode haver múltiplos objetos gráficos e indicadores sobre um gráfico. Você pode
configurar um gráfico com todos os indicadores necess ários uma única vez e salvar como um modelo
(template). Este modelo salvo poderá ser aplicado em qualquer gráfico.
· se a barra invertida "\" separador (escrito como "\\" ) é colocada no início do percurso, o modelo
(template) é procurado em relação ao caminho _terminal_dados _diretório\ MQL5 (path
_terminal_data_directory\MQL5);
· se não existir uma barra invertida, o modelo é procurado em relação ao arquivo executável EX5, em
que é chamado o ChartApplyT emplate();
· se um modelo não é encontrado nas duas primeiras variantes, a pesquisa é executada na pasta
terminal_diretorio\Profiles \T emplates \.
Aqui o terminal_directory é a pasta onde o T erminal do Cliente MetaT rader 5 está sendo executado, e
o terminal_dados _diretório (terminal_data_directory) é a pasta em que os arquivos editáveis são
armazenados, a sua localização depende do sistema operacional,nome do usuário e as configurações
de segurança do computador. Normalmente, eles são pastas diferentes, mas em alguns casos, eles
podem coincidir.
A localização das pastas terminal_data_directory e terminal_directory pode ser obtida utilizando a
função T erminalInfoString().
//--- diretório de onde o terminal é iniciado
string terminal_path=TerminalInfoString(TERMINAL_PATH);
Print("Terminal diretório:",terminal_path);
//--- terminal dados diretório, em que a pasta MQL5 com os EAs e indicadores estão localizados
string terminal_data_path=TerminalInfoString(TERMINAL_DATA_PATH);
Print("Terminal dados diretório:",terminal_data_path);
Por exemplo:
Exemplo:
//+------------------------------------------------------------------+
//| Função de início do programa script |
//+------------------------------------------------------------------+
void OnStart()
{
//--- Exemplo de aplicação do modelo, localizado em \MQL5\Files
if(FileIsExist("my_template.tpl"))
{
Print("O arquivo my_template.tpl foi encontrado em \Files'");
//--- Aplicar modelo
if(ChartApplyTemplate(0,"\\Files\\my_template.tpl"))
{
Print("O modelo 'my_template.tpl' foi aplicado com sucesso");
//--- redesenhar gráfico
ChartRedraw();
}
else
Print("Falha ao aplicar'my_template.tpl', código de erro ",GetLastError());
}
else
{
Print("Arquivo 'my_template.tpl' não encontrado em"
+TerminalInfoString(TERMINAL_PATH)+"\\MQL5\\Files");
}
}
Também Veja
R ecursos
ChartSaveTemplate
Salva as configurações atuais do gráfico em um template (modelo) com um nome especificado.
bool ChartSaveTemplate(
long chart_id, // ID Gráfico
const string filename // Nome do arquivo para salvar o template (modelo)
);
Parâmetros
chart_id
[in] ID Gráfico. Significa o gráfico atual.
filename
[in] O nome do arquivo para salvar o template (modelo). A extensão " .tpl" será adicionada
automaticamente no arquivo, onde não é preciso especificá-lo. O template (modelo) é salvo no
terminal_directory\Profiles \Templates \ e pode ser utilizado para a aplicação manual no terminal.
Se já existir um template (modelo) com o mesmo nome de arquivo, os conteúdos deste arquivo
serão substituídos.
Valor do Retorno
Se bem sucedida, a função retorna true, caso contrário ela retorna false. Para obter informação
sobre o erro, chamar a função GetLastError().
Observação
Usando templates (modelos), você pode salvar as configurações de gráfico com todos os indicadores
e objetos gráficos aplicados, para depois aplicá-los em outro gráfico.
Exemplo:
//+------------------------------------------------------------------+
//| 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
//--- parâmetros de entrada
input string symbol="GBPUSD"; // O símbolo do novo gráfico
input ENUM_TIMEFRAMES period=PERIOD_H3; // O prazo do novo gráfico
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
//--- Primeiros indicadores anexados ao gráfico
int handle;
ResetLastError();
//--- Copiar os últimos 100 valores do indicador
int copied=CopyBuffer(handle,0,0,size,values);
//--- Conferir o número de valores copiados
if(copied<100)
{
PrintFormat("%s: Falha para copiar valores %d do indicador com o handle=%d. Código de erro %d
__FUNCTION__,size,handle,GetLastError());
return false;
}
//--- Definir a ordem de acesso para a array como um tempo de series (timeseries)
ArraySetAsSeries(values,true);
//--- Escreva aqui o número de baras, em que foram encontradas fracturas
int positions[];
//--- Definir tamanhos de array
ArrayResize(get_values,3); ArrayResize(get_times,3); ArrayResize(positions,3);
//--- Contadores
int i=0,k=0;
//--- Comece a procurar por fracturas
while(i<100)
{
double v=values[i];
//--- Nós não estamos interessados em valores vazios
if(v!=0.0)
{
//--- Relembra o número de barras
positions[k]=i;
//--- Relembra o valor do zigzag sobre a fractura
get_values[k]=values[i];
PrintFormat("%s: Zigzag[%d]=%G",__FUNCTION__,i,values[i]);
//--- Aumentar o contador
k++;
//--- Se duas fraturas encontrados, quebrar o loop (ciclo)
if(k>2) break;
}
i++;
}
//--- Definir a ordem de acesso às arrays como nas séries de tempo (timeseries)
ArraySetAsSeries(times,true); ArraySetAsSeries(get_times,true);
if(CopyTime(_Symbol,_Period,0,size,times)<=0)
{
PrintFormat("%s: Falha ao copiar valores %d a partir CopyTime(). Código de erro %d",
__FUNCTION__,size,GetLastError());
return false;
}
//--- Abra o tempo da abertura da barra, que ocorreu nas duas últias fracturas
get_times[0]=times[positions[1]];// O último, mas um valor será escrito como a primeira fractura
get_times[1]=times[positions[2]];// O valor em terceiro lugar, a partir do final será a segunda
PrintFormat("%s: primeiro=%s, segundo=%s",__FUNCTION__,TimeToString(get_times[1]),TimeToString(
Também Veja
ChartApplyT emplate(), R ecursos
ChartW indowFind
A função retorna o número para uma sub-janela quando um indicador é desenhado. Existem 2
variantes da função.
1. As pesquisas de função no gráfico indicado para a sub-janela especificado com o " nome abreviado"
do indicador (o nome abreviado é exibida na parte superior esquerda da sub-janela), e retorna o
número da sub-janela em caso de sucesso.
int ChartWindowFind(
long chart_id, // identificar gráfico
string indicator_shortname // nome abreviado do indicador, veja INDICATOR_SHORTNAME
2. A função deve ser chamado a partir de um indicador personalizado. R etorna o número de uma sub-
janela onde um indicador está funcionando.
int ChartWindowFind();
Parâmetros
chart_id
[in] ID Gráfico. 0 (zero) indica a sub-janela gráfico principal.
indicator_shortname
[in] Nome abreviado do indicador.
Valor do Retorno
Número da sub-janela em caso de sucesso. Em caso de falha a função retorna -1.
Observação
Se a segunda variante da função (sem parâmetros) é chamado de um script ou Expert Advisor, a
função retorna -1.
Não confundir o nome abreviado de um indicador e um nome de arquivo, que é especificado quando
o indicador é criado usando as funções iCustom() e IndicatorCreate(). Se o nome abreviado de um
indicador não é definido de forma explicita, então o nome do arquivo contendo o código-fonte do
indicador será especificado durante a compilação.
Exemplo:
#property script_show_inputs
//--- parâmetros de entrada
input string shortname="MACD(12,26,9)";
//+------------------------------------------------------------------+
//| Retorna o múmero da janela do gráfico com este indicador |
//+------------------------------------------------------------------+
Também Veja
ObjectCreate(), ObjectFind()
ChartTimePriceToXY
Converte as coordenadas do gráfico a partir da representação tempo/preço para as coordenadas X e Y.
bool ChartTimePriceToXY(
long chart_id, // ID Gráfico
int sub_window, // O número de sub-janelas
datetime time, // Tempo do Gráfico
double price, // Preço no gráfico
int& x, // A coordenada X para o tempo no gráfico
int& y // A coordenada Y para o tempo no gráfico
);
Parâmetros
chart_id
[in] ID Gráfico. Significa o gráfico atual.
sub_window
[in] O numero da sub-janela do gráfico. 0 (zero) significa a principal janela do gráfico.
time
[in] O valor do tempo do gráfico, valores em pixels para o qual vai ser recebido ao longo do eixo
X. A origem está no canto superior esquerdo da principal janela do gráfico.
price
[in] O valor do preço no gráfico, valores em pixels para o qual vai ser recebido ao longo do eixo
Y. A origem está no canto superior esquerdo da principal janela do gráfico.
x
[out] A variável, dentro do qual a conversão do tempo para X será recebida.
y
[out] A variável, dentro do qual a conversão do preço para Y será recebida.
Valor do Retorno
R etorna true se bem sucedido, caso contrário false. Para obter informação sobre o erro, chamar a
função GetLastError().
Também Veja
ChartXYT oT imePrice()
ChartXYToTimePrice
Converte as coordenadas X e Y no gráfico para os valores de tempo e preço.
bool ChartXYToTimePrice(
long chart_id, // ID Gráfico
int x, // A coordenada X no Gráfico
int y, // A coordenada Y no Gráfico
int& sub_window, // O numero da sub-janela
datetime& time, // Tempo no gráfico
double& price // Preço no gráfico
);
Parâmetros
chart_id
[in] ID Gráfico. Significa o gráfico atual.
x
[in] A coordenada X.
y
[in] A coordenada Y.
sub_window
[out] A variável, em que o número de sub-janela gráfico será escrito. 0 (zero) significa a principal
janela do gráfico.
time
[out] O valor do tempo do gráfico, valores em pixels para o qual vai ser recebido ao longo do eixo
X. A origem está no canto superior esquerdo da principal janela do gráfico.
price
[out] O valor do preço no gráfico, valores em pixels para o qual vai ser recebido ao longo do eixo
Y. A origem está no canto superior esquerdo da principal janela do gráfico.
Valor do Retorno
R etorna true se bem sucedido, caso contrário false. Para obter informação sobre o erro, chamar a
função GetLastError().
Exemplo:
//+------------------------------------------------------------------+
//| Função ChartEvent |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
const long &lparam,
const double &dparam,
const string &sparam)
{
//--- Mostra os parâmetros do evento no gráfico
Também Veja
ChartT imePriceT oXY()
ChartOpen
Abre um novo gráfico com o símbolo e período especificado.
long ChartOpen(
string symbol, // Nome Simbolo
ENUM_TIMEFRAMES period // Período
);
Parâmetros
symbol
[in] Simbolo do gráfico. NULL significa o símbolo do gráfico de corrente (Expert Advisor é
anexado).
period
[in] Período do Gráfico (Prazo). Pode ser um dos valores de ENUM _TIMEFR AMES. 0 (zero) significa
o período do atual gráfico.
Valor do Retorno
Se com sucesso, retorna à abertura do ID gráfico. Do contrário retorna 0(zero).
Observação
O número máximo possível de cartas abertas simultaneamente no terminal não pode exceder o valor
CH ART S _MAX.
ChartFirst
R etorna o ID do primeiro gráfico do terminal de cliente.
long ChartFirst();
Valor do Retorno
ID Gráfico.
ChartNext
R etorna o ID do gráfico do próximo gráfico para um especificado.
long ChartNext(
long chart_id // ID gráfico
);
Parâmetros
chart_id
[in] ID Gráfico. 0 (zero) não significa o quadro atual. 0 (zero) significa " retornar o ID do primeiro
gráfico" .
Valor do Retorno
ID Gráfico. Se este for o fim da lista de gráfico, ele retorna -1.
Exemplo:
//--- variáveis para ID gráfico
long currChart,prevChart=ChartFirst();
int i=0,limit=100;
Print("ChartFirst =",ChartSymbol(prevChart)," ID =",prevChart);
while(i<limit)// Temos certamente não mais do que 100 gráficos abertos
{
currChart=ChartNext(prevChart); // Obter o ID do novo gráfico usando o ID gráfico anterior
if(currChart<0) break; // Ter atingido o fim da lista de gráfico
Print(i,ChartSymbol(currChart)," ID =",currChart);
prevChart=currChart;// vamos salvar o ID do gráfico atual para o ChartNext()
i++;// Não esqueça de aumentar o contador
}
ChartClose
Fechando um gráfico especificado.
bool ChartClose(
long chart_id=0 // ID gráfico
);
Parâmetros
chart_id=0
[in] ID Gráfico. Significa o gráfico atual.
Valor do Retorno
Se com sucesso, retorna true, caso contrário é false.
ChartSymbol
R etorna o nome do símbolo do gráfico especificado.
string ChartSymbol(
long chart_id=0 // ID gráfico
);
Parâmetros
chart_id=0
[in] ID Gráfico. Significa o gráfico atual.
Valor do Retorno
Se o gráfico não existe, o resultado será uma string (seqüência) vazia.
Também Veja
ChartSetS ymbolPeriod
ChartPeriod
R etorna o prazo doperiodo do gráfico especificado.
ENUM_TIMEFRAMES ChartPeriod(
long chart_id=0 // ID gráfico
);
Parâmetros
chart_id=0
[in] ID Gráfico. Significa o gráfico atual.
Valor do Retorno
A função retorna um valor de ENUM _TIMEFR AMES. Se gráfico não existir retorna 0 (zero).
ChartRedraw
Chama um redesenho forçado de um gráfico especificado.
void ChartRedraw(
long chart_id=0 // ID gráfico
);
Parâmetros
chart_id=0
[in] ID Gráfico. Significa o gráfico atual.
Observação
Normalmente é utilizado após mudar a propriedade do objeto.
Também Veja
Funções de objetos
ChartSetDouble
Define um valor para a propriedade de correspondência de um gráfico especificado. Propriedade de
gráfico deve ser do tipo double. O comando é adicionado para plotar uma fila de mensagens de gráfico
e será executado após o processamento de todos os comandos anteriores.
bool ChartSetDouble(
long chart_id, // ID Gráfico
int prop_id, // ID Propriedade
double value // Valor
);
Parâmetros
chart_id
[in] ID Gráfico. Significa o gráfico atual.
prop_id
[in] ID Propriedade do gráfico. Pode ser um valores de ENUM _CH ART_PR OPERTY_DOUBLE (exceto
apenas a leitura das propriedades).
value
[in] Valor da Propriedade.
Valor do Retorno
R etorna verdadeiro se o comando foi adicionado à fila do gráfico, caso contrário será falso. Para
obter uma informação sobre o erro, chamar a função GetLastError().
Observação
A função é assíncrona, isto é, ela não espera a execução do comando que foi colocado com sucesso
na fila do gráfico especificado, em vez disso, ela retorna o controle imediatamente. A propriedade
será alterada somente após o processamento do comando na fila do gráfico. Para executar
imediatamente comandos na fila de agendamento, você precisa chamar a função ChartR edraw.
Se quiser alterar v árias propriedades gráficas de uma só vez, você deverá executar as funções
correspondentes (ChartSetString, ChartSetDouble, ChartSetString) num bloco de código e, em
seguida, chamar uma vez ChartR edraw.
Para verificar o resultado da execução, você pode usar a função que solicita a propriedade
especificada do gráfico (ChartGetInteger, ChartGetDouble, ChartSetString). Ao fazer isto, deve-se
ter em mente que essas funções são síncronas e esperam o resultado da execução.
ChartSetInteger
Define um valor para a propriedade de correspondência de um gráfico especificado. Propriedade do
gráfico deve obrigatoriamente ser datetime, int, color, bool ou char. O comando é adicionado para
plotar uma fila de mensagens de gráfico e será executado após o processamento de todos os
comandos anteriores.
bool ChartSetInteger(
long chart_id, // ID Gráfico
int prop_id, // ID Propriedade
long value // Valor
);
bool ChartSetInteger(
long chart_id, // ID Gráfico
int prop_id, // ID Propriedade
int sub_window, // Número da sub-janela
long value // Valor
);
Parâmetros
chart_id
[in] ID Gráfico. Significa o gráfico atual.
prop_id
[in] ID Propriedade do gráfico. Pode ser um valores de ENUM _CH ART_PR OPERTY_INT EGER (exceto
apenas a leitura das propriedades).
sub_window
[in] Número de sub-janela do gráfico. Para o primeiro caso, o valor padrão é 0 (janela do gráfico
principal). A maioria das propriedades não requerem uma número de sub-janela.
value
[in] Valor de propriedade.
Valor do Retorno
R etorna verdadeiro se o comando foi adicionado à fila do gráfico, caso contrário será falso. Para
obter uma informação sobre o erro, chamar a função GetLastError().
Observação
A função é assíncrona, isto é, ela não espera a execução do comando que foi colocado com sucesso
na fila do gráfico especificado, em vez disso, ela retorna o controle imediatamente. A propriedade
será alterada somente após o processamento do comando na fila do gráfico. Para executar
imediatamente comandos na fila de agendamento, você precisa chamar a função ChartR edraw.
Se quiser alterar v árias propriedades gráficas de uma só vez, você deverá executar as funções
correspondentes (ChartSetString, ChartSetDouble, ChartSetString) num bloco de código e, em
seguida, chamar uma vez ChartR edraw.
Para verificar o resultado da execução, você pode usar a função que solicita a propriedade
especificada do gráfico (ChartGetInteger, ChartGetDouble, ChartSetString). Ao fazer isto, deve-se
ter em mente que essas funções são síncronas e esperam o resultado da execução.
Exemplo:
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
void OnInit()
{
//--- incluir mensagens sobre o movimento do mouse na janela do gráfico
ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,1);
//--- a atualização forçada das propriedades do gráfico garante a prontidão para o processamento de
ChartRedraw();
}
//+------------------------------------------------------------------+
//| MouseState |
//+------------------------------------------------------------------+
string MouseState(uint state)
{
string res;
res+="\nML: " +(((state& 1)== 1)?"DN":"UP"); // mouse left
res+="\nMR: " +(((state& 2)== 2)?"DN":"UP"); // mouse right
res+="\nMM: " +(((state&16)==16)?"DN":"UP"); // mouse middle
res+="\nMX: " +(((state&32)==32)?"DN":"UP"); // mouse first X key
res+="\nMY: " +(((state&64)==64)?"DN":"UP"); // mouse second X key
res+="\nSHIFT: "+(((state& 4)== 4)?"DN":"UP"); // shift key
res+="\nCTRL: " +(((state& 8)== 8)?"DN":"UP"); // control key
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
Define um valor para a propriedade de correspondência de um gráfico especificado. Propriedade de
Gráfico deve ser do tipo string (seqüência). O comando é adicionado para plotar uma fila de
mensagens de gráfico e será executado após o processamento de todos os comandos anteriores.
bool ChartSetString(
long chart_id, // ID Gráfico
int prop_id, // ID Propriedade
string str_value // Valor
);
Parâmetros
chart_id
[in] ID Gráfico. Significa o gráfico atual.
prop_id
[in] ID Propriedade do gráfico. Pode ser um valores de ENUM _CH ART_PR OPERTY_S TRING (exceto
apenas a leitura das propriedades).
str_value
[in] Valor de propriedade string. Comprimento da seqüência não pode exceder 2045 caracteres
(caracteres extras serão truncados).
Valor do Retorno
R etorna verdadeiro se o comando foi adicionado à fila do gráfico, caso contrário será falso. Para
obter uma informação sobre o erro, chamar a função GetLastError().
Observação
ChartSetString pode ser usado para um comentário de saída no gráfico ao invés da função
Comment.
A função é assíncrona, isto é, ela não espera a execução do comando que foi colocado com sucesso
na fila do gráfico especificado, em vez disso, ela retorna o controle imediatamente. A propriedade
será alterada somente após o processamento do comando na fila do gráfico. Para executar
imediatamente comandos na fila de agendamento, você precisa chamar a função ChartR edraw.
Se quiser alterar v árias propriedades gráficas de uma só vez, você deverá executar as funções
correspondentes (ChartSetString, ChartSetDouble, ChartSetString) num bloco de código e, em
seguida, chamar uma vez ChartR edraw.
Para verificar o resultado da execução, você pode usar a função que solicita a propriedade
especificada do gráfico (ChartGetInteger, ChartGetDouble, ChartSetString). Ao fazer isto, deve-se
ter em mente que essas funções são síncronas e esperam o resultado da execução.
Exemplo:
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("Imprimindo preços:\nAsk = %G\nBid = %G\nSpread = %d",
Ask,Bid,Spread);
ChartSetString(0,CHART_COMMENT,comment);
}
Também Veja
Comment, ChartGetString
ChartGetDouble
R etorna o valor de a propriedade correspondente do gráfico especificado. Propriedade do gráfico deve
ser do tipo double. Existem duas variantes desta função.
2. R etorna true ou false, dependendo do sucesso na execução da função. Se for bem sucedido, o valor
da propriedade é colocado num alvo variável double_var passado como referência.
bool ChartGetDouble(
long chart_id, // ID Gráfico
int prop_id, // ID Propriedade
int sub_window, // Número da sub-janela
double& double_var // Alvo variável para a propriedade de gráfico
);
Parâmetros
chart_id
[in] ID Gráfico. Significa o gráfico atual.
prop_id
[in] ID Propriedade do gráfico. Este valor pode ser um dos valores
ENUM _CH ART_PR OPERTY_DOUBLE.
sub_window
[in] Número de sub-janela do gráfico. Para o primeiro caso, o valor padrão é 0 (janela do gráfico
principal). A maioria das propriedades não requerem uma número de sub-janela.
double_var
[out] Variável alvo de tipo double (duplo) para a propriedade solicitada.
Valor do Retorno
Valor de tipo double.
Para a segunda chamada caso retorne verdadeiro (true) se a propriedade especificada está
disponível e seu valor foi armazenado dentro da variável double_var, caso contrário retorna false.
Para obter uma informação adicional sobre o erro, é necess ário chamar a função GetLastError().
Observação
A função é síncrona, isto é, ela espera a execução de todos os comandos, que foram colocados na
fila do gráfico antes de serem chamados.
Exemplo:
void OnStart()
{
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
R etorna o valor de uma propriedade correspondente do gráfico especificado. Propriedade do gráfico é
obrigatório ser do tipo datetime, int ou bool . Existem duas variantes das chamadas desta função.
2. R etorna true ou false, dependendo do sucesso na execução da função. Se for bem sucedido, o valor
da propriedade é colocado num alvo variável long _var passado como referência.
bool ChartGetInteger(
long chart_id, // ID Gráfico
int prop_id, // ID Propriedade
int sub_window, // Número da sub-janela
long& long_var // Alvo variável para a propriedade
);
Parâmetros
chart_id
[in] ID Gráfico. Significa o gráfico atual.
prop_id
[in] ID Propriedade do gráfico. Este valor pode ser um dos valores
ENUM _CH ART_PR OPERTY_INT EGER .
sub_window
[in] Número de sub-janela do gráfico. Para o primeiro caso, o valor padrão é 0 (janela do gráfico
principal). A maioria das propriedades não requerem uma número de sub-janela.
long_var
[out] Alvo variável do tipo long para a propriedade solicitada.
Valor do Retorno
Valor de tipo long.
Para a segunda chamada caso retorne true se a propriedade especificada está disponível e seu valor
foi armazenado dentro da variável long _var, caso contrário retorna false. Para obter uma
informação adicional sobre o error, é necess ário chamar a função GetLastError().
Observação
A função é síncrona, isto é, ela espera a execução de todos os comandos, que foram colocados na
fila do gráfico antes de serem chamados.
Exemplo:
void OnStart()
{
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
R etorna o valor de uma propriedade correspondente do gráfico especificado. Propriedade de Gráfico
deve ser do tipo string. Existem duas variantes das chamadas desta função.
2. R etorna true ou false, dependendo do sucesso na execução da função. Se for bem sucedido, o valor
da propriedade é colocado num alvo variável string _var passado como referência.
bool ChartGetString(
long chart_id, // ID Gráfico
int prop_id, // ID Propriedade
string& string_var // Alvo variável para a propriedade
);
Parâmetros
chart_id
[in] ID Gráfico. Significa o gráfico atual.
prop_id
[in] ID Propriedade do gráfico. Este valor pode ser um dos valores
ENUM _CH ART_PR OPERTY_S TRING.
string_var
[out] Alvo variável do tipo string para a propriedade solicitada.
Valor do Retorno
Valor de tipo string.
Para a segunda chamada caso retorne true se a propriedade especificada está disponível e seu valor
foi armazenado dentro da variável string _var, caso contrário retorna false. Para obter uma
informação adicional sobre o error, é necess ário chamar a função GetLastError().
Observação
ChartGetString pode ser usado para leitura dos comentários plotados no gráfico usando funções
Comment ou ChartSetString.
A função é síncrona, isto é, ela espera a execução de todos os comandos, que foram colocados na
fila do gráfico antes de serem chamados.
Exemplo:
void OnStart()
{
ChartSetString(0,CHART_COMMENT,"Comentário de teste.\nSegunda linha.\nTerceira!");
ChartRedraw();
Sleep(1000);
string comm=ChartGetString(0,CHART_COMMENT);
Print(comm);
}
Também Veja
Comment, ChartSetString
ChartNavigate
Executa deslocamento do gráfico especificado pelo número especificado de barras em relação a
posição especificada no gráfico.
bool ChartNavigate(
long chart_id, // ID Gráfico
ENUM_CHART_POSITION position, // Posição
int shift=0 // Valor deslocamento
);
Parâmetros
chart_id
[in] ID Gráfico. Significa o gráfico atual.
position
[in] Posição do gráfico para realizar um deslocamento. Pode ser um dos valores
ENUM _CH ART_POS ITION.
shift=0
[in] Número de barras para deslocar o gráfico. Valor positivo significa que o deslocamento é para
a direita (para o fim do gráfico), o valor negativo significa que o desvio é para a esquerda (para o
início do gráfico). O deslocamento zero pode ser usado para navegar ao início ou para ao fim do
gráfico.
Valor do Retorno
R etorna true se bem sucedido, caso contrário false.
Exemplo:
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
//--- manipular gráfico atual
long handle=ChartID();
string comm="";
if(handle>0) //se bem sucedida, configurar o gráfico
{
//--- desabilitar auto rolagem
ChartSetInteger(handle,CHART_AUTOSCROLL,false);
//--- definir uma mudança da margem direita do gráfico
ChartSetInteger(handle,CHART_SHIFT,true);
//--- desenhar castiçais
ChartSetInteger(handle,CHART_MODE,CHART_CANDLES);
//--- definir o modo de exibição para volume de tick (ponto)
ChartSetInteger(handle,CHART_SHOW_VOLUMES,CHART_VOLUME_TICK);
Comment(comm);
}
}
ChartID
R etorna o ID do gráfico atual.
long ChartID();
Valor do Retorno
Valor tipo long.
ChartIndicatorAdd
Adiciona um indicador com o identificador especificado para uma janela de gráfico especificado.
Indicador e gráfico devem ser gerados sobre o mesmo símbolo e prazo.
bool ChartIndicatorAdd(
long chart_id, // ID Gráfico
int sub_window // número da sub-janela
int indicator_handle // manipulador do indicador
);
Parâmetros
chart_id
[in] ID Gráfico. Significa o gráfico atual.
sub_window
[in] O número de sub-janelas do gráfico. 0 (zero) significa a principal janela do gráfico. Para
adicionar um indicador em uma nova janela,o parâmetro obrigatoriamente deve ser maior do que
o índice da última janela existente, isto é, igual a CH ART_WINDOW S _T OT AL. Se o valor do
parâmetro é maior que CH ART_WINDOW S _T OT AL, uma nova janela não será criada, e o indicador
não será adicionado.
indicator_handle
[in] O identificador do indicador.
Valor do Retorno
A função retorna verdadeira (true) em caso de sucesso, caso contrário ela retorna false. A fim de
obter informação sobre erro, chama a função GetLastError(). Erro 4114 significa que o gráfico e um
indicador adicionado difere pelo seus símbolos ou prazo.
Observação
Se um indicador deve ser elaborado numa sub-janela separada (por exemplo, construindo um iMACD
ou um indicador personalizado com propriedade especificada #property indicator_separate_window)
é aplicada à janela de gráfico principal,não pode ser visível embora ainda estará presente na lista
de indicadores. Isto significa que a escala do indicador é diferente da escala do gráfico de preço, e
aplicado ao valor do indicador não se enquadra na faixa visualizada do gráfico de preço. Neste caso,
GetLastError() retorna código zero indicando a aus ência de um erro. Os valores de tal indicador
" invisível" pode ser visto na Janela de Dados (Data W indow) e recebidos a partir de outras
aplicações MQL5.
Exemplo:
#property description "Expert Advisor demonstrando o trabalho com a função ChartIndicatorAdd()."
#property description "Após o lançamento no gráfico (e receber o erro no Jornal), abrir"
#property description "Propriedades do Expert Advisor e especificar <símbolo> correto e os parâmetr
#property description "Indicador MACD sera adicionado no grafico."
int indicator_handle=INVALID_HANDLE;
//+------------------------------------------------------------------+
//| Função de inicialização do Expert |
//+------------------------------------------------------------------+
int OnInit()
{
//---
indicator_handle=iMACD(symbol,period,fast_ema_period,slow_ema_period,signal_period,apr);
//--- tentar adicionar o indicador no gráfico
if(!AddIndicator())
{
//--- Função AddIndicator() recusou acrescentar o indicador no gráfico
int answer=MessageBox("Você quer adicionar MACD do gráfico de qualquer maneira?",
"Símbolo e/ou prazo de tempo incorreto para adicionar o indicador",
MB_YESNO // "Sim" e "Não" botões de seleção será mostrado
);
//--- se um usuário ainda insiste no uso incorreto de ChartIndicatorAdd()
if(answer==IDYES)
{
//--- em primeiro lugar, uma entrada jornal será publicado sobre isso
PrintFormat("Atenção! %s: Tentando adicionar indicador MACD(%s/%s) em gráfico %s/%s. Receb
__FUNCTION__,symbol,EnumToString(period),_Symbol,EnumToString(_Period));
//---receber o número de uma nova sub-janela, para a qual vamos tentar adicionar o indicad
int subwindow=(int)ChartGetInteger(0,CHART_WINDOWS_TOTAL);
//--- agora faz uma tentativa fadada a falhar
if(!ChartIndicatorAdd(0,subwindow,indicator_handle))
PrintFormat("Falha ao adicionar o indicador MACD %d na janela do gráfico. Código de err
subwindow,GetLastError());
}
}
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função tick (ponto) de um Expert |
//+------------------------------------------------------------------+
void OnTick()
{
// Assessor especialista (expert advisor) não executa nada
}
//+------------------------------------------------------------------+
//| Função para verificar e adicionar o indicador no gráfico |
//+------------------------------------------------------------------+
bool AddIndicator()
{
//--- mensagem exibida
string message;
//--- verificar se o símbolo do indicador e símbolo do gráfico combinam entre si
if(symbol!=_Symbol)
{
message="Exibindo o uso da função Demo_ChartIndicatorAdd():";
message=message+"\r\n";
message=message+"Não é possível adicionar o indicador calculado com outro símbolo no gráfico.
message=message+"\r\n";
message=message+"Especifique o símbolo gráfico na propriedade do Expert Advisor - "+_Symbol+"
Alert(message);
//---saída prematura, o indicador não será adicionado no gráfico
return false;
}
//--- verificar se o indicador e prazo do gráfico combinam entre si
if(period!=_Period)
{
message="Não é possível adicionar o indicador calculado em outro prazo de tempo no gráfico.";
message=message+"\r\n";
message=message+"Especifique o prazo de tempo do gráfico na propriedades do Expert Advisor -
Alert(message);
//---saída prematura, o indicador não será adicionado no gráfico
return false;
}
//--- todas verificações completadas, simbolo e prazo do indicador corresponde ao gráfico
if(indicator_handle==INVALID_HANDLE)
{
Print(__FUNCTION__," Criando indicador MACD");
indicator_handle=iMACD(symbol,period,fast_ema_period,slow_ema_period,signal_period,apr);
if(indicator_handle==INVALID_HANDLE)
{
Print("Falha para criar indicador MACD. Código de erro ",GetLastError());
}
}
//--- redefine o código de erro
ResetLastError();
//--- aplicar o indicador para o gráfico
Print(__FUNCTION__," Adicionando indicador MACD no gráfico");
Print("MACD é gerada em ",symbol,"/",EnumToString(period));
//---receber o número de uma nova sub-janela, para o qual é adicionado o indicador MACD
int subwindow=(int)ChartGetInteger(0,CHART_WINDOWS_TOTAL);
PrintFormat("Adicionado indicador MACD na janela do gráfico %d",subwindow);
if(!ChartIndicatorAdd(0,subwindow,indicator_handle))
{
PrintFormat("Falha para adicionar indicador MACD na janela do gráfico %d. Código de erro %d",
subwindow,GetLastError());
}
//--- indicador adicionado com sucesso
return(true);
}
Veja também
ChartIndicatorDelete(), ChartIndicatorName(), ChartIndicators T otal(), iCustom(), IndicatorCreate()
ChartIndicatorDelete
R emove um indicador com um nome especificado a partir de janela do gráfico especificado.
bool ChartIndicatorDelete(
long chart_id, // ID Gráfico
int sub_window // número da sub-janela
const string indicator_shortname // nome abreviado do indicador
);
Parâmetros
chart_id
[in] ID Gráfico. 0 (zero) indica a sub-janela gráfico principal.
sub_window
[in] Número de sub-janela do gráfico. 0 (zero) indica o sub-janela gráfico principal.
const indicator_shortname
[in] O nome abreviado do indicador que é definido na propriedade do INDICAT OR_S H ORTNAME
com a função IndicatorSetString(). Para obter o nome abreviado de um indicador usar a função
ChartIndicatorName().
Valor do Retorno
R etorna true em caso de sucesso deletando o indicador. Do contrário ele retorna false. Para obter
detalhes do erro use a função GetLastError().
Observação
Se houver dois indicadores com nove abreviados iguais na subjanela do gráfico, o primeiro da linha
será deletado.
Se outros indicadores neste gráfico são baseadas nos valores do indicador que está sendo deletado,
estes indicadores também serão deletados.
Não confundir o nome abreviado do indicador e o nome do arquivo que é especificado ao criar um
indicador usando as funções iCustom() e IndicatorCreate(). Se o nome abreviado de um indicador
não é definido de forma explicita, o nome do arquivo contendo o código-fonte do indicador será
especificado durante a compilação.
Deletando um indicador de um gráfico não significa que seu cálculo será excluído da me mória do
terminal. Para liberar o manuseio do indicador usar a função IndicatorR elease().
//| 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
//--- plotar Histograma
#property indicator_label1 "Histogram"
#property indicator_type1 DRAW_HISTOGRAM
#property indicator_color1 clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- parâmetros de entrada
input int first_param=1;
input int second_param=2;
input int third_param=3;
input bool wrong_init=true;
//--- buffers do indicador
double HistogramBuffer[];
string shortname;
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado |
//+------------------------------------------------------------------+
int OnInit()
{
int res=INIT_SUCCEEDED;
//---Vincular a array HistogramBuffer para a buffer (memória temporária) do indicador
SetIndexBuffer(0,HistogramBuffer,INDICATOR_DATA);
//--- Construir um nome abreviado de indicador baseado nos parâmetro de entrada
shortname=StringFormat("Demo_ChartIndicatorDelete(%d,%d,%d)",
first_param,second_param,third_param);
IndicatorSetString(INDICATOR_SHORTNAME,shortname);
//--- Se a conclusão forçada de um indicador está definida, retornar um valor não-zero
if(wrong_init) res=INIT_FAILED;
return(res);
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
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[],
Também Veja
ChartIndicatorAdd(), ChartIndicatorName(), ChartIndicators T otal(), iCustom(), IndicatorCreate(),
IndicatorSetString()
ChartIndicatorGet
R etorna o manuseio do indicador com nome abreviado especificado na janela do gráfico especificado.
int ChartIndicatorGet(
long chart_id, // ID gráfico\
int sub_window // O numero da sub-janela
const string indicator_shortname // Nome abreviado do indicador
);
Parâmetros
chart_id
[in] ID Gráfico. Significa o gráfico atual.
sub_window
[in] O numero da sub-janela do gráfico. 0 (zero) significa a principal janela do gráfico.
const indicator_shortname
[in] O nome abreviado do indicador que é definido na propriedade INDICAT OR_S H ORTNAME será
escrita usando a função IndicatorSetString(). Para obter o nome abreviado de um indicador usar a
função ChartIndicatorName().
Valor do Retorno
A função retorna bem sucedida, caso contrário retorna INVAL ID_H ANDLE. Para obter informações
sobre o erro, chame a função GetLastError().
Observação
O handle do indicador obtido com ajuda da função ChartIndicatorGet() aumenta o contador interno
de uso desse indicador. O sistema de execução do terminal mantém carregados todos os indicadores
cujo contador é maior que zero. Por isso, um handle de indicador desnecess ário deve ser imediata e
explicitamente liberado com ajuda de IndicatorR elease() no mesmo programa que o recebe,
conforme mostrado no exemplo abaixo. Caso contrário, será impossível encontrar o identificador
" abandonado" e liberá-lo corretamente desde outro programa.
Ao criar um indicador, tenha cuidado para formar sua abreviação, o que está escrito na propriedade
INDICAT OR_S H ORTNAME usando a função IndicatorSetString(). É recomendado que o nome
abreviado deve conter valores de todos os parâmetros de entrada do indicador, porque sendo o
indicador excluído do gráfico pela função ChartIndicatorGet() ele é identificado pelo nome
abreviado.
Outra forma de identificar o indicador é obtendo uma lista de seus parâmetros para um
manipulador, usando a função IndicatorParameters() e, em seguida, analisar os valores obtidos.
Exemplo:
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
//--- O número de janelas no gráfico (ao menos uma janela principal está sempre presente)
int windows=(int)ChartGetInteger(0,CHART_WINDOWS_TOTAL);
//--- Verifique todas as janelas
for(int w=0;w<windows;w++)
{
//--- o número de indicadores nesta janela/sub-janela
int total=ChartIndicatorsTotal(0,w);
//--- Passar por todos os indicadores na janela
for(int i=0;i<total;i++)
{
//--- obtém o nome abreviado do indicador
string name=ChartIndicatorName(0,w,i);
//--- obter o manipulador (handle) de um indicador
int handle=ChartIndicatorGet(0,w,name);
//--- Adicionar o log
PrintFormat("Janela=%d, índice=%d, nome=%s, manipulador (handle)=%d",w,i,name,handle);
//--- You should obligatorily release the indicator handle when it is no longer needed
IndicatorRelease(handle);
}
}
}
Também Veja
ChartIndicatorAdd(), ChartIndicatorName(), ChartIndicators T otal(), IndicatorParameters()
ChartIndicatorName
R etorna o nome abreviado do indicador pelo número na lista de indicadores sobre a janela do gráfico
especificado.
string ChartIndicatorName(
long chart_id, // ID gráfico
int sub_window // numero de sub-janelas
int index // índice do indicador na lista de indicadores adicionada a sub-janela do g
);
Parâmetros
chart_id
[in] ID Gráfico. 0 (zero) indica a sub-janela gráfico principal.
sub_window
[in] Número de sub-janela do gráfico. 0 (zero) indica o sub-janela gráfico principal.
index
[in] índice do indicador na lista de indicadores. A numeração de indicadores começam com zero,
ou seja, o primeiro indicador da lista tem o índice 0. Para obter o código do último erro, você
também pode usar a função ChartIndicators T otal().
Valor do Retorno
O nome abreviado do indicador que é definido na propriedade INDICAT OR_S H ORTNAME com a
função IndicatorSetString(). Para obter detalhes do erro use a função GetLastError().
Observação
Não confundir o nome abreviado do indicador e o nome do arquivo que é especificado ao criar um
indicador usando as funções iCustom() e IndicatorCreate(). Se o nome abreviado de um indicador
não é definido de forma explicita, o nome do arquivo contendo o código-fonte do indicador será
especificado durante a compilação.
Também Veja
ChartIndicatorAdd(), ChartIndicatorDelete(), ChartIndicators T otal(), iCustom(), IndicatorCreate(),
IndicatorSetString()
ChartIndicatorsTotal
R etorna o número de todos indicadores utilizados para a janela do gráfico especificado
int ChartIndicatorsTotal(
long chart_id, // ID gráfico
int sub_window // numero de sub-janelas
);
Parâmetros
chart_id
[in] ID Gráfico. 0 (zero) indica a sub-janela gráfico principal.
sub_window
[in] Número de sub-janela do gráfico. 0 (zero) indica o sub-janela gráfico principal.
Valor do Retorno
O número de indicadores na janela de gráfico especificado. Para obter detalhes do erro use a função
GetLastError().
Observação
A função permite uma buscar através de todos os indicadores anexados ao gráfico. A função
permite uma pesquisa através de todos os indicadores anexados ao gráfico. O número de todas as
janelas do gráfico pode ser obtido a partir da propriedade CH ART_WINDOW S _T OT AL usando a
função ChartGetInteger().
Também Veja
ChartIndicatorAdd(), ChartIndicatorDelete(), iCustom(), IndicatorCreate(), IndicatorSetString()
ChartW indowOnDropped
R etorna o número (índice) da sub-janela do gráfico, o Assessor Especialista (Expert Advisor) ou Script
foi derrubado. 0 (zero) significa a principal janela do gráfico.
int ChartWindowOnDropped();
Valor do Retorno
Valor do tipo int.
Exemplo:
int myWindow=ChartWindowOnDropped();
int windowsTotal=ChartGetInteger(0,CHART_WINDOWS_TOTAL);
Print("Script é executado na janela #"+myWindow+
". Total de janelas no gráfico "+ChartSymbol()+":",windowsTotal);
Também Veja
ChartPriceOnDropped, ChartT imeOnDropped, ChartXOnDropped, ChartYOnDropped
ChartPriceOnDropped
R etorna a coordenada de preço do ponto do gráfico, o Assessor Especialista (Expert Advisor) ou Script
foi derrubado.
double ChartPriceOnDropped();
Valor do Retorno
Value of double type.
Exemplo:
double p=ChartPriceOnDropped();
Print("ChartPriceOnDropped() = ",p);
Também Veja
ChartXOnDropped, ChartYOnDropped
ChartTimeOnDropped
R etorna a coordenada de tempo correspondente ao ponto do gráfico, o Assessor Especialista (Expert
Advisor) ou Script foi derrubado.
datetime ChartTimeOnDropped();
Valor do Retorno
Valor tipo datetime.
Exemplo:
datetime t=ChartTimeOnDropped();
Print("Script foi lançado sobre "+t);
Também Veja
ChartXOnDropped, ChartYOnDropped
ChartXOnDropped
R etorna a coordenada X do ponto do gráfico, o Assessor Especialista (Expert Advisor) ou Script foi
derrubado.
int ChartXOnDropped();
Valor do Retorno
O valor da coordenada X.
Observação
Direção do eixo X a partir da esquerda para a direita.
Exemplo:
int X=ChartXOnDropped();
int Y=ChartYOnDropped();
Print("(X,Y) = ("+X+","+Y+")");
Também Veja
ChartW indowOnDropped, ChartPriceOnDropped, ChartT imeOnDropped
ChartYOnDropped
R etorna a coordenada X do ponto do gráfico, o Assessor Especialista (Expert Advisor) ou Script foi
derrubado.
int ChartYOnDropped();
Valor do Retorno
O valor da coordenada Y.
Observação
Direção do eixo Y a partir de cima para baixo.
Também Veja
ChartW indowOnDropped, ChartPriceOnDropped, ChartT imeOnDropped
ChartSetSymbolPeriod
Modifica o valor do símbolo e um período do gráfico especificado. A função é assíncrona, ou seja,
envia o comando e não espera a conclusão da execução. O comando é adicionado para plotar uma fila
de mensagens de gráfico e será executado após o processamento de todos os comandos anteriores.
bool ChartSetSymbolPeriod(
long chart_id, // ID Gráfico
string symbol, // Nome símbolo
ENUM_TIMEFRAMES period // Período
);
Parâmetros
chart_id
[in] ID Gráfico. Significa o gráfico atual.
symbol
[in] Simbolo do gráfico. Valor NULL significa o símbolo gráfico atual (Expert Advisor é anexado)
period
[in] Período do Gráfico (Prazo). Pode ser um dos valores de ENUM _TIMEFR AMES. 0 (zero) significa
o período do atual gráfico.
Valor do Retorno
R etorna verdadeiro se o comando foi adicionado à fila do gráfico, caso contrário será falso. Para
obter uma informação sobre o erro, chamar a função GetLastError().
Observação
O símbolo/período de mudança conduz à ré-inicialização do Expert Advisor, anexado a um gráfico.
A chamada da função ChartSetS ymbolPeriod, com o mesmo símbolo e timeframe, pode ser utilizada
para atualizar o gráfico (semelhante ao comando R efresh no terminal). A atualização do gráfico, por
sua vez , inicia o recálculo dos indicadores ligados a ele. Assim, você pode calcular o indicador no
gráfico, mesmo na aus ência de tick s (por exemplo, nos fins -de-semana e feriados).
Veja Também
ChartS ymbol, ChartPeriod
ChartScreenShot
Providencia uma imagem do gráfico de seu estado atual para um formato GIF, PNG ou BMP
dependendo da extensão especificada.
bool ChartScreenShot(
long chart_id, // ID Gráfico
string filename, // Nome do Símbolo
int width, // Largura
int height, // Altura
ENUM_ALIGN_MODE align_mode=ALIGN_RIGHT // Tipo de alinhamento
);
Parâmetros
chart_id
[in] ID Gráfico. Significa o gráfico atual.
filename
[in] Nome do arquivo de imagem. Não pode exceder 63 caracteres. Arquivos de captura de tela
são colocados no \Files diretório.
width
[in] Captura de tela com largura em pixels.
height
[in] Captura de tela com altura em pixels.
align_mode=ALIGN_RIGHT
[in] Modo de saída de uma Captura de tela estreita. O valor da enumeração ENUM _AL IGN_MODE.
AL IGN_RIGHT significa alinhamento para a margem direita (a saída a partir do final). AL IGN_LEFT
significa justificar esquerda.
Valor do Retorno
R etorna true se bem sucedido, caso contrário false.
Observação
Se você precisa tomar uma captura de tela de um gráfico a partir de uma determinada posição, em
primeiro lugar, é necess ário posicionar o gráfico usando a função ChartNavigate(). Se o tamanho
horizontal da captura de tela é menor do que a janela do gráfico, ou a parte direita da janela do
gráfico, ou a sua parte esquerda está de saída, depende das configurações do align_mode.
Exemplo:
#property description "O Expert Advisor demonstra como criar uma série de captura de tela atualizad
#property description gráfico usando a função ChartScreenShot(). Por conveniência, o nome do arqui
#property description "mostrando sobre o gráfico. A altura e a largura das imagens são definidas po
}
//+------------------------------------------------------------------+
//| Função ChartEvent |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
const long &lparam,
const double &dparam,
const string &sparam)
{
//--- Mostra o nome da função, chamar tempo e identificador de evento
Print(__FUNCTION__,TimeCurrent()," id=",id," mode=",mode);
//--- Manipular o evento CHARTEVENT_CLICK ("Um clique do mouse sobre o gráfico")
if(id==CHARTEVENT_CLICK)
{
//--- Deslocamento inicial para a borda do gráfico
int pos=0;
//--- Operação com a borda esquerda do gráfico
if(mode>0)
{
//--- Rolar o gráfico para a borda esquerda
ChartNavigate(0,CHART_BEGIN,pos);
for(int i=0;i<pictures;i++)
{
//--- Preparar o texto para mostrar no gráfico e um nome de arquivo
string name="ChartScreenShot"+"CHART_BEGIN"+string(pos)+".gif";
//--- Mostrar o nome no gráfico como um comentário
Comment(name);
//--- Salvar a captura de tela do gráfico em um arquivo no terminal_directory\MQL5\File
if(ChartScreenShot(0,name,WIDTH,HEIGHT,ALIGN_LEFT))
Print("Nós salvamos a captura de tela ",name);
//---
pos+=bars_shift;
//--- Dê tempo ao utilizador para olhar a nova parte nova do gráfico
Sleep(3000);
//--- Rolar o gráfico diante da atual posição do bars_shift bars para a direita
ChartNavigate(0,CHART_CURRENT_POS,bars_shift);
}
//--- Altere o modo para o oposto
mode*=-1;
}
else // Operação com a borda direita do gráfico
{
//--- Rolar o gráfico para a borda direita
ChartNavigate(0,CHART_END,pos);
for(int i=0;i<pictures;i++)
{
//--- Preparar o texto para mostrar no gráfico e um nome de arquivo
string name="ChartScreenShot"+"CHART_END"+string(pos)+".gif";
//--- Mostrar o nome no gráfico como um comentário
Comment(name);
//--- Salvar a captura de tela do gráfico em um arquivo no terminal_directory\MQL5\File
if(ChartScreenShot(0,name,WIDTH,HEIGHT,ALIGN_RIGHT))
Print("Nós salvamos a captura de tela ",name);
//---
pos+=bars_shift;
//--- Dê tempo ao utilizador para olhar a nova parte nova do gráfico
Sleep(3000);
//--- Rolar o gráfico diante da atual posição do bars_shift bars para a direita
ChartNavigate(0,CHART_CURRENT_POS,-bars_shift);
}
//--- Altere o modo para o oposto
mode*=-1;
}
} // End of CHARTEVENT_CLICK event handling
//--- Fim do manipulador (handler) OnChartEvent()
}
Também Veja
ChartNavigate(), R ecursos
Antes de começar a estudar as funções da plataforma, você deve compreender claramente todos os
termos e funções : ordem, transação e posição:
· Ordem — solicitação feita pela empresa de corretagem para comprar ou vender um instrumento
financeiro. Existem dois tipos de ordens básicos : de mercado e pendentes. Além disso, existem
ordens especiais T ak e Profit e Stop Loss.
· T ransação — fato da compra ou venda de um instrumento financeiro. A compra (Buy) acontece
segundo o preço de demanda (As k ) e a venda acontece segundo o preço de oferta (Bid). A transação
pode ser feita como resultado da execução de uma ordem de mercado ou ativação de uma operação
pendente. Você deve ter em conta que, em alguns casos, v árias transações podem ser o resultado
da execução de uma ordem.
· Posição — obrigação de mercado, número de contratos comprados ou vendidos de um instrumento
financeiro. Uma posição longa (Long) é um instrumento financeiro adquirido com base no aumento
do preço e uma posição curta (Short) é uma obrigação colocada com base na diminuição de preços
no futuro.
Informações gerais sobre operações de negociação estão disponíveis no manual do usuário do terminal
do cliente.
As funções de negociação podem ser usadas em Experts Advisors e scripts. Funções de negociação só
podem ser chamadas se as propriedades do Expert Advisor ou script estiverem habilitadas na sua
caixa de controle " Permitir negociação ao vivo" .
A negociação pode ser permitida ou proibida dependendo de v ários fatores descritos na seção T rade
Permission.
Função Ação
OrderCalcMargin Calcula a margem necess ária para o tipo de
ordem especificado, na moeda de depósito
apropriadas
OrderCalcMargin
A função calcula a margem necess ária para o tipo de ordem especificado, na conta corrente, no
ambiente de mercado atual não tendo em conta os pedidos pendentes atuais e posições abertas. Ele
permite a avaliação da margem para a operação comercial prevista. O valor é retornado na moeda da
conta.
bool OrderCalcMargin(
ENUM_ORDER_TYPE action, // tipo de ordem
string symbol, // nome do símbolo
double volume, // volume
double price, // preço aberto
double& margin // valor para a obtenção do valor da margem
);
Parâmetros
action
[in] O tipo de pedido, pode ser um dos valores da enumeração ENUM _ORDER_TYPE.
symbol
[in] Nome do ativo.
volume
[in] Volume das operações de Negócios (comércio).
price
[in] Preço de abertura.
margin
[out] A variável, para o qual o valor da margem requerida será escrito no caso da função ser
executada com êxito. O cálculo é realizado como se não houvesse ordens pendentes e posições
abertas na conta corrente. O valor da margem depende de muitos fatores, e pode variar em
diferentes ambientes de mercado.
Valor do Retorno
A função retorna true em caso de sucesso, caso contrário ela retorna false. A fim de obter
informações sobre o erro, chamar a função GetLastError().
Também Veja
OrderSend(), Order Properties, T ipos de Operações de Negociação (T rade)
OrderCalcProfit
A função calcula o lucro para a conta corrente, nas atuais condições de mercado, baseado nos
parâmetros passados . A função é usado para a pré-avaliação do resultado de uma operação de negócio
(comércio). O valor é retornado na moeda da conta.
bool OrderCalcProfit(
ENUM_ORDER_TYPE action, // tipo da ordem (ORDER_TYPE_BUY ou ORDER_TYPE_SELL)
string symbol, // nome do símbolo
double volume, // volume
double price_open, // preço de abertura
double price_close, // preço de fechamento
double& profit // variável para a obtenção do valor de lucro
);
Parâmetros
action
[in] T ipo de ordem, pode um dos dois valores da enumeração ENUM _ORDER_TYPE:
ORDER_TYPE_BUY ou ORDER_TYPE_SELL.
symbol
[in] Nome do ativo.
volume
[in] Volume das operações de Negócios (comércio).
price_open
[in] Preço de abertura.
price_close
[in] Preço de fechamento.
profit
[out] A variável, para o qual o valor calculado do lucro será escrito, em caso da função ser
executada com sucesso. O valor do lucro estimado depende de muitos fatores, e pode variar em
diferentes ambientes de mercado.
Valor do Retorno
A função retorna true em caso de sucesso, caso contrário ela retorna false. Se um tipo de ordem
inv álida for especificada, a função retornará falsa. Na ordem para obter informações sobre o erro,
chamar GetLastError().
Também Veja
OrderSend(), Order Properties, T ipos de Operações de Negociação (T rade)
OrderCheck
A função OrderCheck () verifica se há dinheiro suficiente para executar uma operação de comércio
necess ária. Os resultados da verificação são colocadas para os campos da estrutura
MqlT radeCheckR esult.
bool OrderCheck(
MqlTradeRequest& request, // estrutura solicitada
MqlTradeCheckResult& result // resultado da estrutura
);
Parâmetros
request
[in] Ponteiro para a estrutura do tipo MqlT radeR equest que descreve a ação de comércio
requerida.
result
[in,out] Ponteiro para a estrutura do tipo MqlT radeCheckR esult, em que o resultado da verificação
será colocada.
Valor do Retorno
Se os fundos não são suficientes para a operação, ou os parâmetros são preenchidos
incorretamente, a função retorna falsa. Em caso de sucesso na verificação básica de estruturas
(verifique os ponteiros), ele retorna verdadeira. No entanto, isto não é uma indicação de que a
operação comercial solicitada, deixe de ser executado com sucesso. Para uma descrição mais
detalhada do resultado da execução da função, analise os campos do resultado da estrutura.
Também Veja
OrderSend(), T ipos de operações de negociação, Pedido de Estrutura de Comércio, Estrutura do
Pedido pelos resultados, Estrutura de um Pedido do resultado de negociação
OrderSend
A função OrderSend() é usada para a execução de operações de negociação enviando solicitações para
um servidor de negociação.
bool OrderSend(
MqlTradeRequest& request, // estrutura de pedido
MqlTradeResult& result // estrutura da resposta
);
Parâmetros
request
[in] Ponteiro para uma estrutura de tipo MqlT radeR equest descrevendo a atividade de negociação
do cliente.
result
[in,out] Ponteiro para uma estrutura do tipo MqlT radeR esult descrevendo o resultado da operação
comercial, no caso de uma realização bem sucedida (se T rue é retornado).
Valor do Retorno
Em caso de sucesso na verificação básica de estruturas (verificação do índice) retorna T rue. No
entanto, este não é um sinal de sucesso com execução de uma operação de negociação . Para
uma descrição mais detalhada do resultado da execução da função, analisar os domínios da
estrutura de resultado.
Observação
Os pedidos de negociação passar por v árias etapas de verificação de um servidor de negociação.
Primeiro de tudo, ele verifica se todos os campos obrigatórios dos parâmetros de solicitação estão
preenchidos corretamente. Se não houver erros nesta guia, você pode iniciar o programa no
terminal cliente. Se o pedido for aceito com sucesso pelo servidor de negociação, o OrderSend()
retorna T rue.
R ecomenda-se verificar o pedido antes de enviá-lo para um servidor de negociação. Para verificar
os pedidos, use a função OrderCheck (). Ele verifica se há fundos suficientes para executar a
operação de negociação, e retorna muitos parâmetros úteis nos resultados da verificação do pedido
de negociação:
· código de retorno contém informações sobre erros no pedido verificado;
· Valor de saldo após a execução da operação de negociação;
· valor de eqüidade que irá aparecer após a operação comercial é executado;
· valor de ponto flutuante que irá aparecer após a operação de negociação for executado;
· Margem requerida para a operação de negociação;
· quantidade de capital livre que permanecerá após a execução da operação de negociação;
· o nível da margem que será definido após a operação de negociação for executado;
· Comentário sobre o código da resposta, descrição do erro.
Ao enviar uma ordem a mercado (MqlT radeR equest.action=TR ADE_ACTION_DEAL), o resultado bem-
sucedido da função OrderSend() não significa que a ordem tenha sido executada (executadas as
transações correspondentes): neste caso, true apenas significa que a ordem foi colocada
corretamente no sistema de negociação para execução posterior. Na estrutura do resultado result a
ser retornada, o servidor de negociação pode preencher os valores dos campos deal ou order, se
esse dados forem conhecidos por ele, no momento da formação da resposta à chamada da
OrderSend(). Em geral, o(s) evento(s) da execução das transações, da ordem correspondente,
podem ocorrer após ter sido enviada a resposta à chamada da OrderSend(). Por isso, para qualquer
tipo de solicitação de negociação, após obtido o resultado da execução da OrderSend(), é
necess ário, antes de tudo, verificar o código de retorno do servidor de negociação retcode e o
código de resposta do sistema de negociação externo retcode_external (se necess ário), que estão
disponíveis na estrutura do resultado result a ser retornada.
Cada pedido aceito é armazenado no servidor de negociação esperando o processamento até que
ocorre uma das condições para a sua execução:
· expiração,
· aparecimento de uma solicitação oposta,
· execução da ordem, quando o preço de execução aparece,
· uma solicitação para cancelar a ordem é recebido.
O resultado da execução do pedido de negociação sobre o servidor enviado pela função OrderSend()
pode ser controlada pelo handler (Manipulador) OnT radeT ransaction. Deve ser observado que o
handler (manipulador) OnT radeT ransaction será chamado v árias vezes durante a execução de um
pedido de negociação.
Por exemplo, ao enviar uma ordem de compra de mercado, ela é tratada, uma ordem de compra
apropriada é criada para a conta, a ordem é então executada e removida da lista de ordens em
aberto, e então ela é adicionada ao histórico de ordens, uma apropriada operação (deal) é
adicionada ao histórico e uma nova posição é criada. Função OnT radeT ransaction será chamado
para cada um desses eventos.
Exemplo:
//--- valor para ORDER_MAGIC
input long order_magic=55555;
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
//--- Ter a certeza que é uma conta demonstração
if(AccountInfoInteger(ACCOUNT_TRADE_MODE)==ACCOUNT_TRADE_MODE_REAL)
{
Alert("Operação de script não é permitido em uma conta real!");
return;
}
//--- Colocar ou deletar uma ordem
if(GetOrdersTotalByMagic(order_magic)==0)
{
//--- Não ordens atuais - colocar uma ordem
uint res=SendRandomPendingOrder(order_magic);
Print("Retorna código do servidor de negociação",res);
}
else // existem ordens - deletar ordens
{
DeleteAllOrdersByMagic(order_magic);
}
//---
}
//+------------------------------------------------------------------+
//| Receber o número das atuais ordens atuais com especificação |
//+------------------------------------------------------------------+
int GetOrdersTotalByMagic(long const magic_number)
{
ulong order_ticket;
int total=0;
//--- passar por todas as ordens pendentes
for(int i=0;i<OrdersTotal();i++)
if((order_ticket=OrderGetTicket(i))>0)
if(magic_number==OrderGetInteger(ORDER_MAGIC)) total++;
//---
return(total);
}
//+------------------------------------------------------------------+
//| Deletar todas as ordens pendentes com especificação ORDER_MAGIC |
//+------------------------------------------------------------------+
void DeleteAllOrdersByMagic(long const magic_number)
{
ulong order_ticket;
//--- passar por todas as ordens pendentes
for(int i=OrdersTotal()-1;i>=0;i--)
if((order_ticket=OrderGetTicket(i))>0)
//--- ordem com apropriado ORDER_MAGIC
if(magic_number==OrderGetInteger(ORDER_MAGIC))
{
MqlTradeResult result={};
MqlTradeRequest request={};
request.order=order_ticket;
request.action=TRADE_ACTION_REMOVE;
OrderSend(request,result);
//--- escrever a resposta do servidor para log
Print(__FUNCTION__,": ",result.comment," reply code ",result.retcode);
}
//---
}
//+------------------------------------------------------------------+
//| Definir uma ordem pendente de maneira aleatória |
//+------------------------------------------------------------------+
uint SendRandomPendingOrder(long const magic_number)
{
//--- preparar um pedido
MqlTradeRequest request={};
request.action=TRADE_ACTION_PENDING; // definição de uma ordem pendente
request.magic=magic_number; // ORDER_MAGIC
request.symbol=_Symbol; // símbolo
request.volume=0.1; // volume em 0.1 lotes
request.sl=0; // Stop Loss (Parar Perda) não é especificado
request.tp=0; // Take Profit (Tomar Lucro) não é especificado
//--- formar o tipo de ordem
request.type=GetRandomType(); // tipo de ordem
//--- formar o preço para uma ordem pendente
request.price=GetRandomPrice(request.type); // preço de abertura
//--- enviar um pedido de negociação
MqlTradeResult result={};
OrderSend(request,result);
//--- escrever resposta do servido para log
Print(__FUNCTION__,":",result.comment);
if(result.retcode==10016) Print(result.bid,result.ask,result.price);
//--- código de retorno da resposta do servidor de negociação
return result.retcode;
}
//+------------------------------------------------------------------+
//| tipo de retorno de uma ordem pendente de maneira aleatória |
//+------------------------------------------------------------------+
ENUM_ORDER_TYPE GetRandomType()
{
int t=MathRand()%4;
//--- 0<=t<4
switch(t)
{
case(0):return(ORDER_TYPE_BUY_LIMIT);
case(1):return(ORDER_TYPE_SELL_LIMIT);
case(2):return(ORDER_TYPE_BUY_STOP);
case(3):return(ORDER_TYPE_SELL_STOP);
}
//--- valor incorreto
return(WRONG_VALUE);
}
//+------------------------------------------------------------------+
//| retorno do preço de forma aleatória |
//+------------------------------------------------------------------+
double GetRandomPrice(ENUM_ORDER_TYPE type)
{
int t=(int)type;
//--- níveis de stop (parar) para símbolo
int distance=(int)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL);
//--- receber dados do último tick (ponto)
MqlTick last_tick={};
SymbolInfoTick(_Symbol,last_tick);
//--- calcular o preço de acordo com o tipo
double price;
if(t==2 || t==5) // ORDER_TYPE_BUY_LIMIT ou ORDER_TYPE_SELL_STOP
{
price=last_tick.bid; // divergir do preço de compra
price=price-(distance+(MathRand()%10)*5)*_Point;
}
else // ORDER_TYPE_SELL_LIMIT ou ORDER_TYPE_BUY_STOP
{
price=last_tick.ask; // divergir do preço de venda
price=price+(distance+(MathRand()%10)*5)*_Point;
}
//---
return(price);
}
Veja Também
T ipos de Operação de Negociação, Estrutura de Solicitação de Negociação, Estrutura de Solicitação
de Verificação de R esultados, Estrutura de uma Solicitação de R esultado de Negociação
OrderSendAsync
A função OrderSendAs ync() é usada para a realização de operações de negócio assíncronos sem
esperar a resposta do servidor de negócio a um pedido enviado. A função é projetado para negociação
de alta freqüência, quando, nos termos do algoritmo de negociação é inaceitável perder tempo à
espera de uma resposta do servidor.
bool OrderSendAsync(
MqlTradeRequest& request, // Estrutura solicitada
MqlTradeResult& result // Resultado da estrutura
);
Parâmetros
request
[in] Um ponteiro para uma estrutura do tipo MqlT radeR equestque descreve a ação comercial do
cliente.
result
[in,out] Ponteiro para uma estrutura do tipo MqlT radeR esultdescrevendo o resultado da operação
comercial, no caso de uma realização bem sucedida (se verdadeiro é retornado).
Valor do Retorno
R etorna verdadeiro se o pedido é enviado para um servidor de negócio. No caso de o pedido não for
enviado, ele retorna falsa. No caso de o pedido é enviado, na variável resultado o código de
resposta contém o valor TR ADE_R ET CODE_PLACED (código 10008) – " order placed" . Execução bem
sucedida significa que apenas o fato de enviar, mas não dá qualquer garantia de que o pedido
chegou ao servidor de comércio e foi aceito para processamento. Ao processar o pedido recebido,
um servidor de de negócio envia uma resposta a um terminal do cliente notificando a alteração no
estado atual de posições, ordens e promoções, o que leva à geração do evento de negociação.
O resultado da execução do pedido de negócio sobre o servidor enviado pela função OrderSend()
pode ser controlada pelo handler (Manipulador) OnT radeT ransaction. Deve ser observado que o
handler (manipulador) OnT radeT ransaction será chamado v árias vezes durante a execução de um
pedido de negócio.
Por exemplo, ao enviar uma ordem de compra de mercado, ela é tratada, uma ordem de compra
apropriada é criada para a conta, a ordem é então executada e removida da lista de ordens em
aberto, e então ela é adicionada ao histórico de ordens, uma apropriada operação (deal) é
adicionada ao histórico e uma nova posição é criada. Função OnT radeT ransaction será chamado
para cada um desses eventos. Para obter alguns desses dados, os parâmetros da função deve ser
analisada:
· trans - este parâmetro obtém a estrutura MqlTradeTransaction descrevendo uma transação de
negociação aplicada a uma conta de negócio.
· request - este parâmetro recebe estruturaMqlT radeR equest descrevendo o pedido de negócio
resultou em uma transação comercial.
· result - este parâmetro obtém a estrutura MqlT radeR esult descrevendo o resultado da execução
de uma solicitação de negociação.
Observação
Exemplo:
#property description "Expert Advisor for sending trade requests "
" using OrderSendAsync() function.\r\n"
#property description "Handling trading events using"
" OnTrade() and OnTradeTransaction() handler functions is displayed\r\n"
#property description "Expert Advisor parameters allow setting Magic Number"
" (unique ID) "
#property description "and the mode of displaying messages in Experts log. All details are displaye
//--- parâmetros de entrada
input int MagicNumber=1234567; // Expert Advisor ID
input bool DescriptionModeFull=true; // Modo de saída detalhada
//--- chamada de variável para uso em HistorySelect()
datetime history_start;
//+------------------------------------------------------------------+
//| Função de inicialização do Expert |
//+------------------------------------------------------------------+
int OnInit()
{
//--- verificar se negociação automática (autotrading) é permitido
if(!TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
{
Alert("Autotrading in the terminal is disabled, Expert Advisor will be removed.");
ExpertRemove();
return(-1);
}
//--- inabilitada a negociação com uma conta real
if(AccountInfoInteger(ACCOUNT_TRADE_MODE)==ACCOUNT_TRADE_MODE_REAL)
{
Alert("Expert Advisor cannot trade on a real account!");
ExpertRemove();
return(-2);
}
//--- verificar se é possível negociar com esta conta (por exemplo, a negociação é impossível quand
if(!AccountInfoInteger(ACCOUNT_TRADE_ALLOWED))
{
Alert("Trading on this account is disabled");
ExpertRemove();
return(-3);
}
//--- economizar o tempo do lançamento do Expert Advisor para receber histórico de negociação
history_start=TimeCurrent();
//---
CreateBuySellButtons();
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de Desinicialização do Expert |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- deletar todos os gráficos objetos
ObjectDelete(0,"Buy");
ObjectDelete(0,"Sell");
//---
}
//+------------------------------------------------------------------+
//| Função TradeTransaction |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
const MqlTradeRequest &request,
const MqlTradeResult &result)
{
//--- título nomeado após negociação da função handler do evento
Print("=> ",__FUNCTION__," at ",TimeToString(TimeCurrent(),TIME_SECONDS));
//--- receber tipo de transação como valor de enumeração
ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
//--- se a transação é o resultado da solicitação de manipulação
if(type==TRADE_TRANSACTION_REQUEST)
{
//--- visualizar nome da transação
Print(EnumToString(type));
//--- em seguida visualizar a descrição do string do pedido tratado
Print("------------RequestDescription\r\n",
RequestDescription(request,DescriptionModeFull));
//--- e mostrar descrição do resultado requisitado
Print("------------ ResultDescription\r\n",
TradeResultDescription(result,DescriptionModeFull));
}
else // visualizar a descrição completa da transação para as transações de outro tipo
{
Print("------------ TransactionDescription\r\n",
TransactionDescription(trans,DescriptionModeFull));
}
//---
}
//+------------------------------------------------------------------+
//| Função Trade |
//+------------------------------------------------------------------+
void OnTrade()
{
//--- membros estáticos para o armazenamento de negociação do status da conta
static int prev_positions=0,prev_orders=0,prev_deals=0,prev_history_orders=0;
ObjectSetInteger(0,"Buy",OBJPROP_STATE,false);
}
//--- Se o botão "Vender" é pressionado, então vender
if(sparam=="Sell")
{
PrintFormat("Sell %s %G lot",_Symbol,volume_min);
SellAsync(volume_min);
//--- desfazer pressionando o botão
ObjectSetInteger(0,"Sell",OBJPROP_STATE,false);
}
ChartRedraw();
}
//---
}
//+------------------------------------------------------------------+
//| Retorna o texto de descrição de uma transação |
//+------------------------------------------------------------------+
string TransactionDescription(const MqlTradeTransaction &trans,
const bool detailed=true)
{
//--- preparar uma string para o retorno a partir da função
string desc=EnumToString(trans.type)+"\r\n";
//--- todos os dados possíveis é adicionado em modo detalhado
if(detailed)
{
desc+="Ativo: "+trans.symbol+"\r\n";
desc+="Bilhetagem (ticket) da operação: "+(string)trans.deal+"\r\n";
desc+="Tipo de operação: "+EnumToString(trans.deal_type)+"\r\n";
desc+="Bilhetagem (ticket) da ordem: "+(string)trans.order+"\r\n";
desc+="Tipo de ordem: "+EnumToString(trans.order_type)+"\r\n";
desc+="Estado da ordem: "+EnumToString(trans.order_state)+"\r\n";
desc+="Ordem do tipo time: "+EnumToString(trans.time_type)+"\r\n";
desc+="Expiração da ordem: "+TimeToString(trans.time_expiration)+"\r\n";
desc+="Preço: "+StringFormat("%G",trans.price)+"\r\n";
desc+="Gatilho do preço: "+StringFormat("%G",trans.price_trigger)+"\r\n";
desc+="Stop Loss: "+StringFormat("%G",trans.price_sl)+"\r\n";
desc+="Take Profit: "+StringFormat("%G",trans.price_tp)+"\r\n";
desc+="Volume: "+StringFormat("%G",trans.volume)+"\r\n";
}
//--- retornar a string recebida
return desc;
}
//+--------------------------------------------------------------------+
//| Retorne o texto de descrição do resultado da manipulação de pedido |
//+--------------------------------------------------------------------+
string RequestDescription(const MqlTradeRequest &request,
const bool detailed=true)
{
//--- preparar uma string para o retorno a partir da função
string desc=EnumToString(request.action)+"\r\n";
//--- adicionar todos os dados disponíveis em modo detalhado
if(detailed)
{
desc+="Ativo: "+request.symbol+"\r\n";
desc+="Número mágico: "+StringFormat("%d",request.magic)+"\r\n";
desc+="Bilhetagem (ticket) da ordem: "+(string)request.order+"\r\n";
desc+="Tipo de ordem: "+EnumToString(request.type)+"\r\n";
desc+="Preenchimento da ordem: "+EnumToString(request.type_filling)+"\r\n";
desc+="Ordem do tipo time: "+EnumToString(request.type_time)+"\r\n";
desc+="Expiração da ordem: "+TimeToString(request.expiration)+"\r\n";
desc+="Preço: "+StringFormat("%G",request.price)+"\r\n";
desc+="Pontos de desvio: "+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+="Comentário: "+request.comment+"\r\n";
}
//--- retornar string recebida
return desc;
}
//+--------------------------------------------------------------------+
//| Retorne o texto de descrição do resultado da manipulação de pedido |
//+--------------------------------------------------------------------+
string TradeResultDescription(const MqlTradeResult &result,
const bool detailed=true)
{
//--- preparar a string para o retorno a partir da função
string desc="Retcode "+(string)result.retcode+"\r\n";
//--- adicionar todos os dados disponíveis em modo detalhado
if(detailed)
{
desc+="ID da Solicitação: "+StringFormat("%d",result.request_id)+"\r\n";
desc+="Bilhetagem (ticket) da ordem: "+(string)result.order+"\r\n";
desc+="Bilhetagem (ticket) da operação: "+(string)result.deal+"\r\n";
desc+="Volume: "+StringFormat("%G",result.volume)+"\r\n";
desc+="Preço: "+StringFormat("%G",result.price)+"\r\n";
desc+="Compra (Ask): "+StringFormat("%G",result.ask)+"\r\n";
desc+="Venda (Bid): "+StringFormat("%G",result.bid)+"\r\n";
desc+="Comentário: "+result.comment+"\r\n";
}
//--- retornar string recebida
return desc;
}
//+------------------------------------------------------------------+
//| Criar dois botões de compra e venda |
//+------------------------------------------------------------------+
void CreateBuySellButtons()
{
//--- checar a presença do objeto chamado "Buy" (comprar)
if(ObjectFind(0,"Buy")>=0)
{
//--- se o objeto encontrado não é um botão, deletar-lo
if(ObjectGetInteger(0,"Buy",OBJPROP_TYPE)!=OBJ_BUTTON)
ObjectDelete(0,"Buy");
}
else
ObjectCreate(0,"Buy",OBJ_BUTTON,0,0,0); // criar botão "Buy" (comprar)
//--- configurar botão "Buy" (comprar)
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);
//--- checar a presença do objeto chamado "Sell" (comprar)
if(ObjectFind(0,"Sell")>=0)
{
//--- se o objeto encontrado não é um botão, deletar-lo
if(ObjectGetInteger(0,"Sell",OBJPROP_TYPE)!=OBJ_BUTTON)
ObjectDelete(0,"Sell");
}
else
ObjectCreate(0,"Sell",OBJ_BUTTON,0,0,0); // criar botão "Sell" (vender)
//--- configurar botão "Sell" (comprar)
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);
//--- realizar atualização forçada do gráfico para ver imediatamente os botões
ChartRedraw();
//---
}
//+------------------------------------------------------------------+
//| Comprar usando a função OrderSendAsync() assíncrona |
//+------------------------------------------------------------------+
void BuyAsync(double volume)
{
//--- preparar o pedido
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 ="Comprar usando OrderSendAsync()";
MqlTradeResult res={};
if(!OrderSendAsync(req,res))
{
Print(__FUNCTION__,": erro ",GetLastError(),", retcode = ",res.retcode);
}
//---
}
//+------------------------------------------------------------------+
//| Vender usando a função OrderSendAsync() assíncrona |
//+------------------------------------------------------------------+
void SellAsync(double volume)
{
//--- preparar o pedido
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 ="Vende usando OrderSendAsync()";
MqlTradeResult res={};
if(!OrderSendAsync(req,res))
{
Print(__FUNCTION__,": erro ",GetLastError(),", retcode = ",res.retcode);
}
//---
}
//+------------------------------------------------------------------+
PositionsTotal
R etorna o número de posições em aberto.
int PositionsTotal();
Valor do Retorno
Valor do tipo int.
Observação
Ao usar o registro de posições com " cobertura" (ACCOUNT_MARGIN_MODE_R ET AIL _NETTING e
ACCOUNT_MARGIN_MODE_EXCH ANGE) segundo cada símbolo, a qualquer momento, pode estar
aberta apenas a posição que seja o resultado de uma o mais transações. Não confunda as posições e
as ordens pendentes ativas que são exibidas na guia "Negociação" na janela " Caixa de ferramentas " .
Também Veja
PositionGetS ymbol(), PositionSelect(), Propriedades de uma Posição
PositionGetSymbol
R etorna o símbolo correspondente para a posição aberta e seleciona automaticamente a posição para
posteriormente trabalhar com ele usando as funções PositionGetDouble, PositionGetInteger,
PositionGetString.
string PositionGetSymbol(
int index // Número na lista de posições
);
Parâmetros
index
[in] Número de posição na lista de posições abertas.
Valor do Retorno
Valor do tipo string. Se a posição não foi encontrada, uma string vazia será retornada. Para obter
um código de erro, chamar a função GetLastError().
Observação
Ao usar o registro de posições com " cobertura" (ACCOUNT_MARGIN_MODE_R ET AIL _NETTING e
ACCOUNT_MARGIN_MODE_EXCH ANGE) segundo cada símbolo, a qualquer momento, pode estar
aberta apenas a posição que seja o resultado de uma o mais transações. Não confunda as posições e
as ordens pendentes ativas que são exibidas na guia "Negociação" na janela " Caixa de ferramentas " .
Também Veja
Positions T otal(), PositionSelect(), Propriedades de uma Posição
PositionSelect
Escolhe uma posição aberta para posteriormente trabalhar com ele. R etorna true se a função for
concluída com êxito. R etorna false em caso de falha. Para obter informações sobre o erro,
chameGetLastError().
bool PositionSelect(
string symbol // Nome Simbolo
);
Parâmetros
symbol
[in] Nome da segurança financeira.
Valor do Retorno
Valor do tipo bool.
Observação
Ao usar o registro de posições com " cobertura" (ACCOUNT_MARGIN_MODE_R ET AIL _NETTING e
ACCOUNT_MARGIN_MODE_EXCH ANGE) segundo cada símbolo, a qualquer momento, pode estar
aberta apenas a posição que seja o resultado de uma o mais transações. Não confunda as posições e
as ordens pendentes ativas que são exibidas na guia "Negociação" na janela " Caixa de ferramentas " .
A função PositionSelect() copia os dados sobre a posição para o ambiente do programa, bem como
outras chamadas de PositionGetDouble(), PositionGetInteger() e PositionGetString() retornar os
dados copiados anteriormente. Isto significa que a posição em si já não podem existir (ou é o
volume, orientação, etc mudou), mas ainda podem ser obtidos dados desta posição. Para garantir o
recebimento de novos dados sobre a posição, é recomendado chamar PositionSelect() logo antes
referindo-se a eles.
Também Veja
PositionGetS ymbol(), Positions T otal(), Propriedades de uma Posição
PositionSelectByTicket
Seleciona uma posição aberta para trabalhar no futuro com ela segundo o bilhete indicado. R etorna
true se a função for bem-sucedida. R etorna false se a função falhar. Para obter informações sobre o
erro, você deve chamar a função GetLastError().
bool PositionSelectByTicket(
ulong ticket // bilhete da posição
);
Parâmetros
ticket
[in] Bilhete da posição.
valor de retorno
Valor do tipo bool.
Observação
A função PositionSelectByT ick et() copia os dados da posição para o ambiente do sofware, e as
chamadas subseqüentes da PositionGetDouble(), PositionGetInteger() e PositionGetString() retornar
os dados de copiados anteriormente. Isto significa que a posição em si pode já não existir (ou ter
alterado o volume, a direção, etc), e ainda pode receber os dados desta posição. Para garantir a
recepção de novos dados sobre as posições, é recomendável chamar a função
PositionSelectByT ick et() imediatamente antes de se dirigir a elas.
Veja também
PositionGetS ymbol(), Positions T otal(), Propriedades das posições
PositionGetDouble
A função retorna a propriedade solicitada de uma posição aberta, pré-selecionado usando
PositionGetS ymbol ou PositionSelect. A propriedade de negócio deve ser do tipo double. Existem 2
variantes da função.
2. R etorna true ou false dependendo do sucesso da execução da função. Se for bem sucedido, o valor
da propriedade é colocada em uma variável de recebimento passada por referência no último
parâmetro.
bool PositionGetDouble(
ENUM_POSITION_PROPERTY_DOUBLE property_id, // Identificador de propriedade
double& double_var // Aqui nós aceitamos o valor da propriedade
);
Parâmetros
property_id
[in] Identificador de uma propriedade de operação. O valor pode ser um dos valores da
enumeração ENUM _POS ITION_PR OPERTY_DOUBLE.
double_var
[out] Variável de tipo double, que aceita o valor da propriedade requerida.
Valor do Retorno
Valor do tipo double. Se a função falhar, será retornado 0.
Observação
Ao usar o registro de posições com " cobertura" (ACCOUNT_MARGIN_MODE_R ET AIL _NETTING e
ACCOUNT_MARGIN_MODE_EXCH ANGE) segundo cada símbolo, a qualquer momento, pode estar
aberta apenas a posição que seja o resultado de uma o mais transações. Não confunda as posições e
as ordens pendentes ativas que são exibidas na guia "Negociação" na janela " Caixa de ferramentas " .
Também Veja
PositionGetS ymbol(), PositionSelect(), Propriedades de uma Posição
PositionGetInteger
A função retorna a propriedade solicitada de uma posição aberta, pré-selecionado usando
PositionGetS ymbol ou PositionSelect. A propriedade de operação deve ser de tipo datetime, int.
Existem 2 variantes da função.
2. R etorna true ou false dependendo do sucesso da execução da função. Se for bem sucedido, o valor
da propriedade é colocada em uma variável de recebimento passada por referência no último
parâmetro.
bool PositionGetInteger(
ENUM_POSITION_PROPERTY_INTEGER property_id, // Identificador de propriedade
long& long_var // Aqui nós aceitamos o valor da propriedade
);
Parâmetros
property_id
[in] Identificador de uma propriedade de operação. O valor pode ser um dos valores de
enumeração ENUM _POS ITION_PR OPERTY_INT EGER .
long_var
[out] Variável de tipo double, que aceita o valor da propriedade requerida.
Valor do Retorno
Valor do tipo long. Se a função falhar, será retornado 0.
Observação
For the " netting " interpretation of positions (ACCOUNT_MARGIN_MODE_R ET AIL _NETTING and
ACCOUNT_MARGIN_MODE_EXCH ANGE), only one position can exist 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.
Exemplo:
//+------------------------------------------------------------------+
//| Função Trade |
//+------------------------------------------------------------------+
void OnTrade()
{
Também Veja
PositionGetS ymbol(), PositionSelect(), Propriedades de uma Posição
PositionGetTicket
A função retorna o bilhete da posição segundo o índice na lista de posições abertas e seleciona
automaticamente esta posição para trabalhar com ela no futuro usando as funções PositionGetDouble,
PositionGetInteger, PositionGetString.
ulong PositionGetTicket(
int index // número na lista de posições
);
Parâmetros
index
[Em] Índice da posição na lista de posições abertas, começando com 0.
valor de retorno
Bilhete da posição. No caso de uma execução sem êxito retorna 0.
Observação
Ao usar o registro de posições com " cobertura" (ACCOUNT_MARGIN_MODE_R ET AIL _NETTING e
ACCOUNT_MARGIN_MODE_EXCH ANGE) segundo cada símbolo, a qualquer momento, pode estar
aberta apenas a posição que seja o resultado de uma o mais transações. Não confunda as posições e
as ordens pendentes ativas que são exibidas na guia "Negociação" na janela " Caixa de ferramentas " .
Para garantir a recepção de novos dados sobre as posições, é recomendável chamar a função
PositionSelect() imediatamente antes de se dirigir a elas.
Veja também
PositionGetS ymbol(), PositionSelect(), Propriedades das posições
PositionGetString
A função retorna a propriedade solicitada de uma posição aberta, pré-selecionado usando
PositionGetS ymbol ou PositionSelect. A propriedade de negócio deve ser do tipo string. Existem 2
variantes da função.
2. R etorna true ou false dependendo do sucesso da execução da função. Se for bem sucedido, o valor
da propriedade é colocada em uma variável de recebimento passada por referência no último
parâmetro.
bool PositionGetString(
ENUM_POSITION_PROPERTY_STRING property_id, // Identificador de propriedade
string& string_var // Aqui nós aceitamos o valor de propriedade
);
Parâmetros
property_id
[in] Identificador de uma propriedade de operação. O valor pode ser um dos valores da
enumeração ENUM _POS ITION_PR OPERTY_S TRING.
string_var
[out] Variável de tipo string, que aceita o valor da propriedade requerida.
Valor do Retorno
Valor do tipo string. Se a função falhar, uma string vazia é retornada.
Observação
For the " netting " interpretation of positions (ACCOUNT_MARGIN_MODE_R ET AIL _NETTING and
ACCOUNT_MARGIN_MODE_EXCH ANGE), only one position can exist 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.
Também Veja
PositionGetS ymbol(), PositionSelect(), Propriedades de uma Posição
OrdersTotal
R etorna o número de ordens.
int OrdersTotal();
Valor do Retorno
Valor do tipo double.
Observação
Não confunda atuais ordens pendentes com posições, que também são exibidos na aba " negócios " da
" caixa de ferramentas " do terminal do cliente. Uma ordem é um pedido para conduzir a transação,
enquanto que uma posição é um resultado de um ou mais negócios.
Também Veja
OrderSelect(), OrderGetT ick et(), Propriedades de uma Ordem
OrderGetTicket
R etorna o tick et de uma ordem correspondente, selecionando automaticamente a ordem para
trabalhos posteriores usando funções.
ulong OrderGetTicket(
int index // Número na lista de posições
);
Parâmetros
index
[in] Número de ordem na lista de ordens atuais.
Valor do Retorno
Valor do tipo ulong. Se a função falhar, será retornado 0.
Observação
Não confunda atuais ordens pendentes com posições, que também são exibidos na aba " negócios " da
" caixa de ferramentas " do terminal do cliente. Uma ordem é um pedido para conduzir a transação,
enquanto que uma posição é um resultado de um ou mais negócios.
OrderGetT ick et() função copia os dados sobre uma ordem para o ambiente do programa, e
posteriormente chamadas de OrderGetDouble(), OrderGetInteger(), OrderGetString() retornar os
dados copiados anteriormente. Isto significa que a própria ordem pode já não existir (ou seu preço
de abertura, Stop Loss /T ak e Profit, níveis de lucro ou expiração mudou), mas ainda podem ser
obtidos dados dessa ordem. Para garantir o recebimento de novos dados sobre a posição, é
recomendado chamar PositionSelect() logo antes referindo-se a eles.
Exemplo:
void OnStart()
{
//--- variáveis para retornar valores das propriedades de ordem
ulong ticket;
double open_price;
double initial_volume;
datetime time_setup;
string symbol;
string type;
long order_magic;
long positionID;
//--- Numero de ordens atuais pendentes
uint total=OrdersTotal();
Também Veja
Orders T otal(), OrderSelect(), OrderGetInteger()
OrderSelect
Seleciona uma ordem para trabalhar. R etorna verdadeiro se a função tenha sido concluída com êxito.
R etorna false se a conclusão função falhou. Para mais informações sobre um erro, chame
GetLastError().
bool OrderSelect(
ulong ticket // Ticket de ordem
);
Parâmetros
ticket
[in] T ick et de ordem.
Valor do Retorno
Valor do tipo bool.
Observação
Não confunda atuais ordens pendentes com posições, que também são exibidos na aba " negócios " da
" caixa de ferramentas " do terminal do cliente.
A função OrderGetT ick et() função copia os dados sobre uma ordem para o ambiente do programa, e
posteriormente chamadas de OrderGetDouble(), OrderGetInteger(), OrderGetString() retornar os
dados copiados anteriormente. Isto significa que a própria ordem pode já não existir (ou seu preço
de abertura, Stop Loss /T ak e Profit, níveis de lucro ou expiração mudou), mas ainda podem ser
obtidos dados dessa ordem. Para garantir o recebimento de novos dados sobre a posição, é
recomendado chamar OrderSelect() logo antes referindo-se a eles.
Também Veja
OrderGetInteger(), OrderGetDouble(), OrderGetString(), OrderCalcProfit(), OrderGetT ick et(),
Propriedades de uma Ordem
OrderGetDouble
R etorna a propriedade solicitada de uma ordem, pré-selecionado usando OrderGetT ick et ou
OrderSelect. A propriedade da ordem deve ser do tipo double. Existem 2 variantes da função.
2. R etorna true ou false, dependendo do sucesso na execução da função. Se for bem sucedido, o valor
da propriedade é colocado em uma variável alvo passado por referência até ao último parâmetro.
bool OrderGetDouble(
ENUM _ORDER_PR OPERTY_DOUBLE property_id, // Identificador de propriedade
double& double_var // Aqui nós aceitamos o valor da propriedade
);
Parâmetros
property_id
[in] Identificador da propriedade ordem. O valor pode ser um dos valores da enumeração
ENUM _ORDER_PR OPERTY_DOUBLE.
double_var
[out] Variável de tipo double, que aceita o valor da propriedade requerida.
Valor do Retorno
Valor do tipo double. Se a função falhar, será retornado 0.
Observação
Não confunda atuais ordens pendentes com posições, que também são exibidos na aba " negócios " da
" caixa de ferramentas " do terminal do cliente.
Para garantir o recebimento de novos dados sobre a posição, é recomendado chamar OrderSelect()
logo antes referindo-se a eles.
Também Veja
Orders T otal(), OrderGetT ick et(), Propriedades de uma Ordem
OrderGetInteger
R etorna a propriedade solicitada de uma ordem, pré-selecionado usando OrderGetT ick et ou
OrderSelect. Propriedade de uma Ordem deve ser da tipo datetime, int. Existem 2 variantes da
função.
2. R etorna true ou false dependendo do sucesso da função. Se for bem sucedido, o valor da
propriedade está situada dentro de uma variável de destino passado por referência pelo último
parâmetro.
bool OrderGetInteger(
ENUM_ORDER_PROPERTY_INTEGER property_id, // Identificador de propriedade
long& long_var // Aqui nós aceitamos o valor da propriedade
);
Parâmetros
property_id
[in] Identificador da propriedade ordem. O valor pode ser um dos valores da enumeração
ENUM _ORDER_PR OPERTY_INT EGER .
long_var
[out] Variável do tipo long que aceita o valor da propriedade requerida.
Valor do Retorno
Valor do tipo long. Se a função falhar, será retornado 0.
Observação
Não confunda atuais ordens pendentes com posições, que também são exibidos na aba " negócios " da
" caixa de ferramentas " do terminal do cliente.
Para garantir o recebimento de novos dados sobre a posição, é recomendado chamar OrderSelect()
logo antes referindo-se a eles.
Também Veja
Orders T otal(), OrderGetT ick et(), Propriedades de uma Ordem
OrderGetString
R etorna a propriedade solicitada de uma ordem, pré-selecionado usando OrderGetT ick et ou
OrderSelect. A propriedade da ordem deve ser do tipo string. Existem 2 variantes da função.
2. R etorna true ou false dependendo do sucesso da função. Se for bem sucedido, o valor da
propriedade está situada dentro de uma variável de destino passado por referência pelo último
parâmetro.
bool OrderGetString(
ENUM_ORDER_PROPERTY_STRING property_id, // Identificador de propriedade
string& string_var // Aqui nós aceitamos o valor de propriedade
);
Parâmetros
property_id
[in] Identificador da propriedade ordem. O valor pode ser um dos valores da enumeração
ENUM _ORDER_PR OPERTY_S TRING.
string_var
[out] Variável de tipo string que aceita o valor da propriedade requerida...
Valor do Retorno
Valor do tipo string.
Observação
Não confunda atuais ordens pendentes com posições, que também são exibidos na aba " negócios " da
" caixa de ferramentas " do terminal do cliente.
Para garantir o recebimento de novos dados sobre a posição, é recomendado chamar OrderSelect()
logo antes referindo-se a eles.
Também Veja
Orders T otal(), OrderGetT ick et(), Propriedades de uma Ordem
HistorySelect
R ecupera o histórico de transações e ordens para o período do tempo de servidor especificado.
bool HistorySelect(
datetime from_date, // a partir da data
datetime to_date // até à data
);
Parâmetros
from_date
[in] Data de inicio do pedido.
to_date
[in] Data de término do pedido.
Valor do Retorno
R etorna verdadeiro true se bem sucedido, caso contrário false.
Observação
H istorySelect() cria uma lista de pedidos e uma lista de comércios em um programa de MQL5, para
posterior referindo-se aos elementos da lista usando as funções correspondentes. O tamanho da
lista de negócios pode ser devolvido através da função H istoryDeals T otal() o tamanho da lista de
encomendas na história pode ser obtida usando H istoryOrders T otal(). Seleção na lista de pedidos
deve ser melhor realizado por H istoryOrderGetT ick et(), para itens na lista de negócios
H istoryDealGetT ick et() se encaixarem melhor.
Exemplo:
void OnStart()
{
color BuyColor =clrBlue;
color SellColor=clrRed;
//--- história do negócio pedido
HistorySelect(0,TimeCurrent());
//--- cria objetos
string name;
uint total=HistoryDealsTotal();
ulong ticket=0;
double price;
double profit;
datetime time;
string symbol;
long type;
long entry;
//--- para todos os negócios
for(uint i=0;i<total;i++)
{
//--- tentar obter ticket negócios
if((ticket=HistoryDealGetTicket(i))>0)
{
//--- obter as propriedades negócios
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);
//--- apenas para o símbolo atual
if(price && time && symbol==Symbol())
{
//--- cria o preço do objeto
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);
//--- definir propriedades do objeto
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));
}
}
}
//--- aplicar no gráfico
ChartRedraw();
}
Também Veja
H istoryOrderSelect(), H istoryDealSelect()
HistorySelectByPosition
R ecupera o histórico de transações e ordens para o período do tempo de servidor especificado.
bool HistorySelectByPosition(
long position_id // identificar posição - POSITION_IDENTIFIER
);
Parâmetros
position_id
[in] Identificador de posição que está definido para cada ordem executada e cada negócio.
Valor do Retorno
R etorna verdadeiro true se bem sucedido, caso contrário false.
Observação
Não confundir ordens de um histórico de negociação com as ordens pendentes que aparecem no
separador " Comércio (T rade) da barra de " caixa de ferramentas " (T oolbox). A lista de ordens que
foram cancelados ou levaram a uma transação, pode ser visto na aba "H istórico" da " caixa de
ferramentas " do terminal do cliente.
H istorySelectByPosition() cria em um programa MQL5 uma lista de pedidos e uma lista de ofertas
com um identificador de posição especificada para referência futura para os elementos da lista,
utilizando as funções apropriadas. Para conhecer o tamanho da lista de promoções, utilizar a função
H istoryDeals T otal(), o tamanho da lista de encomendas na história pode ser obtida usando
H istoryOrders T otal(). Para percorrer os elementos da lista de encomendas, utilize
H istoryOrderGetT ick et(), para os elementos da lista de ordens - H istoryDealGetT ick et().
Também Veja
H istorySelect(), H istoryOrderGetT ick et(), Propriedades de uma Ordem
HistoryOrderSelect
Seleciona uma ordem a partir do histórico para posterior chamada através de funções apropriadas.
R etorna true se a função tenha sido concluída com êxito. R etorna false se a função teve falha. Para
maiores detalhes sobre erro chamar GetLastError().
bool HistoryOrderSelect(
ulong ticket // Ticket de ordem
);
Parâmetros
ticket
[in] T ick et de ordem.
Valor do Retorno
R etorna true se bem sucedido, caso contrário false.
Observação
Não confundir ordens de um histórico de negociação com as ordens pendentes que aparecem no
separador " Comércio (T rade) da barra de " caixa de ferramentas " (T oolbox). A lista de ordens que
foram cancelados ou levaram a uma transação, pode ser visto na aba "H istórico" da " caixa de
ferramentas " do terminal do cliente.
Também Veja
H istorySelect(), H istoryOrderGetT ick et(), Propriedades de uma Ordem
HistoryOrdersTotal
R etorna o número de ordens no histórico. Antes de chamar H istoryOrders T otal(), primeiro é
necess ário receber o histórico de negócios e ordens usando a função H istorySelect() ou a função
H istorySelectByPosition().
int HistoryOrdersTotal();
Valor do Retorno
Valor do tipo double.
Observação
Não confundir ordens de um histórico de negociação com as ordens pendentes que aparecem no
separador " Comércio (T rade) da barra de " caixa de ferramentas " (T oolbox). A lista de ordens que
foram cancelados ou levaram a uma transação, pode ser visto na aba "H istórico" da " caixa de
ferramentas " do terminal do cliente.
Também Veja
H istorySelect(), H istoryOrderSelect(), H istoryOrderGetT ick et(), Propriedades de uma Ordem
HistoryOrderGetTicket
R etornar o tick et de uma ordem correspondente no histórico. Antes de chamar H istoryDealGetT ick et(),
primeiro é necess ário receber o histórico de negócios e ordens utilizando a função H istorySelect() ou a
função H istorySelectByPosition().
ulong HistoryOrderGetTicket(
int index // Número na lista de posições
);
Parâmetros
index
[in] Número de ordens em uma lista de ordens.
Valor do Retorno
Valor do tipo ulong. Se a função falhar, será retornado 0.
Observação
Não confundir ordens de um histórico de negociação com as ordens pendentes que aparecem no
separador " Comércio (T rade) da barra de " caixa de ferramentas " (T oolbox). A lista de ordens que
foram cancelados ou levaram a uma transação, pode ser visto na aba "H istórico" da " caixa de
ferramentas " do terminal do cliente.
Exemplo:
void OnStart()
{
datetime from=0;
datetime to=TimeCurrent();
//--- solicitar todo o histórico
HistorySelect(from,to);
//--- variáveis para retornar valores das propriedades de ordem
ulong ticket;
double open_price;
double initial_volume;
datetime time_setup;
datetime time_done;
string symbol;
string type;
long order_magic;
long positionID;
//--- Numero de ordens atuais pendentes
uint total=HistoryOrdersTotal();
//--- passar por ordens em um loop
for(uint i=0;i<total;i++)
{
//--- voltar ticket ordem por sua posição na lista
if((ticket=HistoryOrderGetTicket(i))>0)
{
Também Veja
H istorySelect(), H istoryOrders T otal(), H istoryOrderSelect(), Propriedades de uma Ordem
HistoryOrderGetDouble
R etorna a requisição de propriedade de ordem. A propriedade da ordem deve ser do tipo double.
Existem 2 variantes da função.
2. R etorna true ou false dependendo do sucesso da função. Se for bem sucedido, o valor da
propriedade está situada dentro de uma variável de destino passado por referência pelo último
parâmetro.
bool HistoryOrderGetDouble(
ulong ticket_number, // Ticket (bilhete)
ENUM_ORDER_PROPERTY_DOUBLE property_id, // Identificar propriedade
double& double_var // Aqui nós aceitamos o valor da propriedade
);
Parâmetros
ticket_number
[in] T ick et de ordem.
property_id
[in] Identificador da propriedade ordem. O valor pode ser um dos valores da enumeração
ENUM _ORDER_PR OPERTY_DOUBLE.
double_var
[out] Variável de tipo double, que aceita o valor da propriedade requerida.
Valor do Retorno
Valor do tipo double.
Observação
Não confundir ordens de um histórico de negociação com as ordens pendentes que aparecem no
separador " Comércio (T rade) da barra de " caixa de ferramentas " (T oolbox). A lista de ordens que
foram cancelados ou levaram a uma transação, pode ser visto na aba "H istórico" da " caixa de
ferramentas " do terminal do cliente.
Também Veja
H istorySelect(), H istoryOrders T otal(), H istoryOrderSelect(), Propriedades de uma Ordem
HistoryOrderGetInteger
R etorna a propriedade solicitada de uma ordem. A propriedade de operação deve ser de tipo datetime,
int. Existem 2 variantes da função.
2. R etorna true ou false dependendo do sucesso da função. Se for bem sucedido, o valor da
propriedade está situada dentro de uma variável de destino passado por referência pelo último
parâmetro.
bool HistoryOrderGetInteger(
ulong ticket_number, // Ticket (bilhete)
ENUM_ORDER_PROPERTY_INTEGER property_id, // Identificador de propriedade
long& long_var // Aqui nós aceitamos o valor da propriedade
);
Parâmetros
ticket_number
[in] T ick et de ordem.
property_id
[in] Identificador da propriedade ordem. O valor pode ser um dos valores da enumeração
ENUM _ORDER_PR OPERTY_INT EGER .
long_var
[out] Variável do tipo long que aceita o valor da propriedade requerida.
Valor do Retorno
Valor do tipo long.
Observação
Não confundir ordens de um histórico de negociação com as ordens pendentes que aparecem no
separador " Comércio (T rade) da barra de " caixa de ferramentas " (T oolbox). A lista de ordens que
foram cancelados ou levaram a uma transação, pode ser visto na aba "H istórico" da " caixa de
ferramentas " do terminal do cliente.
Exemplo:
//+------------------------------------------------------------------+
//| Função Trade |
//+------------------------------------------------------------------+
void OnTrade()
{
//--- receber ticket da última ordem do histórico comercial da semana
ulong last_order=GetLastOrderTicket();
if(HistoryOrderSelect(last_order))
{
//--- tempo de colocar um ordem em milissegundos desde 01.01.1970
long time_setup_msc=HistoryOrderGetInteger(last_order,ORDER_TIME_SETUP_MSC);
PrintFormat("Ordem #%d ORDER_TIME_SETUP_MSC=%i64 => %s",
last_order,time_setup_msc,TimeToString(time_setup_msc/1000));
//--- execução/cancelamento de ordens em milissegundos desde 01.01.1970
long time_done_msc=HistoryOrderGetInteger(last_order,ORDER_TIME_DONE_MSC);
PrintFormat("Ordem #%d ORDER_TIME_DONE_MSC=%i64 => %s",
last_order,time_done_msc,TimeToString(time_done_msc/1000));
}
else // notificação sobre falha
PrintFormat("HistoryOrderSelect() falhou por #%d. Código de erro=%d",
last_order,GetLastError());
//---
}
//+------------------------------------------------------------------+
//| Retorna o último ticket de ordem em histórico ou -1 |
//+------------------------------------------------------------------+
ulong GetLastOrderTicket()
{
requisita o histórico para os últimos 7 dias
if(!GetTradeHistory(7))
{
//--- notificar sobre chamada sem sucesso e retorno -1
Print(__FUNCTION__," HistorySelect() retornou false");
return -1;
}
//---
ulong first_order,last_order,orders=HistoryOrdersTotal();
//--- trabalhar com ordens se houver alguma
if(orders>0)
{
Print("Ordens = ",orders);
first_order=HistoryOrderGetTicket(0);
PrintFormat("first_order = %d",first_order);
if(orders>1)
{
last_order=HistoryOrderGetTicket((int)orders-1);
PrintFormat("last_order = %d",last_order);
return last_order;
}
return first_order;
}
//--- nenhuma ordem encontrada, retornar -1
return -1;
}
//+---------------------------------------------------------------------------------+
//| Solicitações de histórico para os últimos dias e retorna false em caso de falha |
//+---------------------------------------------------------------------------------+
bool GetTradeHistory(int days)
{
//--- define um período da semana para solicitar histórico da operação
datetime to=TimeCurrent();
datetime from=to-days*PeriodSeconds(PERIOD_D1);
ResetLastError();
//--- fazer um pedido e verificar o resultado
if(!HistorySelect(from,to))
{
Print(__FUNCTION__," HistorySelect=false. Código de erro=",GetLastError());
return false;
}
//--- histórico recebido com sucesso
return true;
}
Também Veja
H istorySelect(), H istoryOrders T otal(), H istoryOrderSelect(), Propriedades de uma Ordem
HistoryOrderGetString
R etorna a propriedade solicitada de uma ordem. A propriedade da ordem deve ser do tipo string.
Existem 2 variantes da função.
2. R etorna true ou false dependendo do sucesso da função. Se for bem sucedido, o valor da
propriedade está situada dentro de uma variável de destino passado por referência pelo último
parâmetro.
bool HistoryOrderGetString(
ulong ticket_number, // Ticket (bilhete)
ENUM_ORDER_PROPERTY_STRING property_id, // Identificador de propriedade
string& string_var // Aqui nós aceitamos o valor de propriedade
);
Parâmetros
ticket_number
[in] T ick et de ordem.
property_id
[in] Identificador da propriedade ordem. O valor pode ser um dos valores da enumeração
ENUM _ORDER_PR OPERTY_S TRING.
string_var
[out] Variável do tipo string.
Valor do Retorno
Valor do tipo string.
Observação
Não confundir ordens de um histórico de negociação com as ordens pendentes que aparecem no
separador " Comércio (T rade) da barra de " caixa de ferramentas " (T oolbox). A lista de ordens que
foram cancelados ou levaram a uma transação, pode ser visto na aba "H istórico" da " caixa de
ferramentas " do terminal do cliente.
Também Veja
H istorySelect(), H istoryOrders T otal(), H istoryOrderSelect(), Propriedades de uma Ordem
HistoryDealSelect
Seleciona um negócio no histórico para posterior chamada através de funções apropriadas. R etorna
true se a função tenha sido concluída com êxito. R etorna false se a função teve falha. Para maiores
detalhes sobre erro chamar GetLastError().
bool HistoryDealSelect(
ulong ticket // Ticket de negócio
);
Parâmetros
ticket
[in] T ick et de operação.
Valor do Retorno
R etorna true se bem sucedido, caso contrário false.
Observação
Não confunda ordens, operações e posições. Cada operação é o resultado da execução de uma
ordem, cada posição é o resumo de um ou mais operações.
Também Veja
H istorySelect(), H istoryDealGetT ick et(), Propriedades de Negócio
HistoryDealsTotal
R etorna o número de ordens no histórico. R etorna o número de negócio no histórico. Antes de chamar
H istoryDeals T otal(), primeiro é necess ário receber o histórico de negócios e ordens utilizando a função
H istorySelect() ou a função H istorySelectByPosition().
int HistoryDealsTotal();
Valor do Retorno
Valor do tipo double.
Observação
Não confunda ordens, operações e posições. Cada operação é o resultado da execução de uma
ordem, cada posição é o resumo de um ou mais operações.
Também Veja
H istorySelect(), H istoryDealGetT ick et(), Propriedades de Negócio
HistoryDealGetTicket
A função seleciona um negócio para processamento posterior e retorna o tick et de negócio na história.
Antes de chamar H istoryDealGetT ick et (), primeiro é necess ário receber o histórico de negócios e
ordens utilizando a função H istorySelect() ou a função H istorySelectByPosition().
ulong HistoryDealGetTicket(
int index // ticket de negócio
);
Parâmetros
index
[in] Número de um negócio na lista de negociações
Valor do Retorno
Valor do tipo ulong. Se a função falhar, será retornado 0.
Observação
Não confunda ordens, operações e posições. Cada operação é o resultado da execução de uma
ordem, cada posição é o resumo de um ou mais operações.
Exemplo:
void OnStart()
{
ulong deal_ticket; // bilhetagem da operação (deal)
ulong order_ticket; // ticket da ordem que o negócio foi executado em
datetime transaction_time; // tempo de execução de um negócio
long deal_type ; // tipo de operação comercial
long position_ID; // ID posição
string deal_description; // descrição da operação
double volume; // volume da operação
string symbol; // ativo da negociação
//--- definir a data inicial e final para solicitar o histórico dos negócios
datetime from_date=0; // desde o princípio
datetime to_date=TimeCurrent();//até o momento atual
//--- solicita o histórico das negociações no período especificado
HistorySelect(from_date,to_date);
//--- número total na lista das negócios
int deals=HistoryDealsTotal();
//--- agora processar cada trade (negócio)
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
//--- realizar uma boa formatação para o número de negócio
string print_index=StringFormat("% 3d",i);
//--- mostrar informações sobre o negócio
Print(print_index+": deal #",deal_ticket," em ",transaction_time,deal_description);
}
}
//+------------------------------------------------------------------+
//| Retorna a descrição string da operação |
//+------------------------------------------------------------------+
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 ("correção");
case DEAL_TYPE_BUY: descr="compra"; break;
case DEAL_TYPE_SELL: descr="vender"; break;
case DEAL_TYPE_BONUS: return ("bonus");
case DEAL_TYPE_COMMISSION: return ("comissão adicional");
case DEAL_TYPE_COMMISSION_DAILY: return ("comissão diária");
case DEAL_TYPE_COMMISSION_MONTHLY: return ("comissão mensal");
case DEAL_TYPE_COMMISSION_AGENT_DAILY: return ("comissão de agente diário");
case DEAL_TYPE_COMMISSION_AGENT_MONTHLY: return ("comissão de agente mensal");
case DEAL_TYPE_INTEREST: return ("taxa de juros");
case DEAL_TYPE_BUY_CANCELED: descr="cancelado comprar negócio"; break;
case DEAL_TYPE_SELL_CANCELED: descr="cancelado vender negócio"; break;
}
descr=StringFormat("%s %G %s (ordem #%d, a posição ID %d)",
descr, // descrição atual
volume, // volume de negócio
symbol, // ativo de negócio
ticket, // ticket da ordem que provocou o negócio
pos_ID // ID de uma posição, na qual a negócio é incluído
);
return(descr);
//---
}
Também Veja
H istorySelect(), H istoryDeals T otal(), H istoryDealSelect(), Propriedades de uma Operação
HistoryDealGetDouble
R etorna a propriedade solicitada de uma operação. A propriedade de negócio deve ser do tipo double.
Existem 2 variantes da função.
2. R etorna true ou false dependendo do sucesso da função. Se for bem sucedido, o valor da
propriedade está situada dentro de uma variável de destino passado por referência pelo último
parâmetro.
bool HistoryDealGetDouble(
ulong ticket_number, // Ticket (bilhete)
ENUM_DEAL_PROPERTY_DOUBLE property_id, // Identificador de propriedade
double& double_var // Aqui nós aceitamos o valor da propriedade
);
Parâmetros
ticket_number
[in] T ick et de operação.
property_id
[in] Identificador de uma propriedade de operação. O valor pode ser um dos valores da
enumeração ENUM _DEAL _PR OPERTY_DOUBLE.
double_var
[out] Variável de tipo double, que aceita o valor da propriedade requerida.
Valor do Retorno
Valor do tipo double.
Observação
Não confunda ordens, operações e posições. Cada operação é o resultado da execução de uma
ordem, cada posição é o resumo de um ou mais operações.
Também Veja
H istorySelect(), H istoryDeals T otal(), H istoryDealSelect(), Propriedades de uma Operação
HistoryDealGetInteger
R etorna a propriedade solicitada de uma operação. A propriedade de operação deve ser de tipo
datetime, int. Existem 2 variantes da função.
2. R etorna true ou false dependendo do sucesso da função. Se for bem sucedido, o valor da
propriedade está situada dentro de uma variável de destino passado por referência pelo último
parâmetro.
bool HistoryDealGetInteger(
ulong ticket_number, // Ticket (bilhete)
ENUM_DEAL_PROPERTY_INTEGER property_id, // Identificador de propriedade
long& long_var // Aqui nós aceitamos o valor da propriedade
);
Parâmetros
ticket_number
[in] T ick et (bilhete) de negócio.
property_id
[in] Identificador da propriedade de operação. O valor pode ser um dos valores da enumeração
ENUM _DEAL _PR OPERTY_INT EGER .
long_var
[out] Variável do tipo long que aceita o valor da propriedade requerida.
Valor do Retorno
Valor do tipo long.
Observação
Não confunda ordens, operações e posições. Cada operação é o resultado da execução de uma
ordem, cada posição é o resumo de um ou mais operações.
Exemplo:
//+------------------------------------------------------------------+
//| Função Trade |
//+------------------------------------------------------------------+
void OnTrade()
{
//--- receber ticket da última operação do histórico comercial da semana
ulong last_deal=GetLastDealTicket();
if(HistoryDealSelect(last_deal))
{
//--- tempo de operações executadas em milissegundos desde 01.01.1970
long deal_time_msc=HistoryDealGetInteger(last_deal,DEAL_TIME_MSC);
PrintFormat("Deal #%d DEAL_TIME_MSC=%i64 => %s",
last_deal,deal_time_msc,TimeToString(deal_time_msc/1000));
}
else
PrintFormat("HistoryDealSelect() falhou por #%d. Código de erro=%d",
last_deal,GetLastError());
//---
}
//+------------------------------------------------------------------+
//| Retorna o último bilhete de operação no histórico ou -1 |
//+------------------------------------------------------------------+
ulong GetLastDealTicket()
{
requisita o histórico para os últimos 7 dias
if(!GetTradeHistory(7))
{
//--- notificar sobre chamada sem sucesso e retorno -1
Print(__FUNCTION__," HistorySelect() retornou false");
return -1;
}
//---
ulong first_deal,last_deal,deals=HistoryOrdersTotal();
//--- trabalhar com ordens se houver alguma
if(deals>0)
{
Print("Deals = ",deals);
first_deal=HistoryDealGetTicket(0);
PrintFormat("first_deal = %d",first_deal);
if(deals>1)
{
last_deal=HistoryDealGetTicket((int)deals-1);
PrintFormat("last_deal = %d",last_deal);
return last_deal;
}
return first_deal;
}
//--- nenhuma operação encontrada, retornar -1
return -1;
}
//+---------------------------------------------------------------------------------+
//| Solicitações de histórico para os últimos dias e retorna false em caso de falha |
//+---------------------------------------------------------------------------------+
bool GetTradeHistory(int days)
{
//--- define um período da semana para solicitar histórico da operação
datetime to=TimeCurrent();
datetime from=to-days*PeriodSeconds(PERIOD_D1);
ResetLastError();
//--- fazer um pedido e verificar o resultado
if(!HistorySelect(from,to))
{
Print(__FUNCTION__," HistorySelect=false. Código de erro=",GetLastError());
return false;
}
//--- histórico recebido com sucesso
return true;
}
Também Veja
H istorySelect(), H istoryDeals T otal(), H istoryDealSelect(), Propriedades de uma Operação
HistoryDealGetString
R etorna a propriedade solicitada de uma operação. A propriedade de negócio deve ser do tipo string.
Existem 2 variantes da função.
2. R etorna true ou false dependendo do sucesso da função. Se for bem sucedido, o valor da
propriedade está situada dentro de uma variável de destino passado por referência pelo último
parâmetro.
bool HistoryDealGetString(
ulong ticket_number, // Ticket (bilhete)
ENUM_DEAL_PROPERTY_STRING property_id, // Identificador de propriedade
string& string_var // Aqui nós aceitamos o valor de propriedade
);
Parâmetros
ticket_number
[in] T ick et de operação.
property_id
[in] Identificador da propriedade de operação. O valor pode ser um dos valores da enumeração
ENUM _DEAL _PR OPERTY_S TRING.
string_var
[out] Variável de tipo string que aceita o valor da propriedade requerida...
Valor do Retorno
Valor do tipo string.
Observação
Não confunda ordens, operações e posições. Cada operação é o resultado da execução de uma
ordem, cada posição é o resumo de um ou mais operações.
Também Veja
H istorySelect(), H istoryDeals T otal(), H istoryDealSelect(), Propriedades de uma Operação
Gerenciamento de sinais
Grupo de funções para gerenciar sinais de negociação. Essas funções permitem:
função Ação
SignalBaseGetDouble R etorna o valor da propriedade do tipo double
para o sinal selecionado
SignalBaseGetDouble
R etorna o valor da propriedade do tipo double para o sinal selecionado.
double SignalBaseGetDouble(
ENUM_SIGNAL_BASE_DOUBLE property_id, // identificador da propriedade
);
Parâmetros
property_id
[in] Identificador da propriedade do sinal. Pode ser um dos valores da enumeração
ENUM _S IGNAL _BASE_DOUBLE.
valor de retorno
O valor do tipo double da propriedade indicada do sinal.
SignalBaseGetInteger
R etorna o valor da propriedade do tipo integer para o sinal selecionado
long SignalBaseGetInteger(
ENUM_SIGNAL_BASE_INTEGER property_id, // identificador da propriedade
);
Parâmetros
property_id
[in] Identificador da propriedade do sinal. Pode ser um dos valores da enumeração
ENUM _S IGNAL _BASE_INT EGER .
valor de retorno
O valor do tipo integer da propriedade indicada do sinal.
SignalBaseGetString
R etorna o valor da propriedade do tipo string para o sinal selecionado
string SignalBaseGetString(
ENUM_SIGNAL_BASE_STRING property_id, // identificador da propriedade
);
Parâmetros
property_id
[in] Identificador da propriedade do sinal. Pode ser um dos valores da enumeração
ENUM _S IGNAL _BASE_S TRING.
valor de retorno
O valor do tipo string da propriedade indicada do sinal.
SignalBaseSelect
Seleciona o sinal na base de sinais de negociação disponíveis no terminal.
bool SignalBaseSelect(
int index // índice de registro do sinal
);
Parâmetros
index
[in] Índice de registro do sinal na base dos sinais de negociação.
valor de retorno
R etorna true se a função for bem-sucedida ou false no caso de erro. Para obter informações sobre o
erro, você deve chamar a função GetLastError ().
Exemplo:
void OnStart()
{
// --- pedimos o número total de sinais na base de dados
int total=SignalBaseTotal();
// --- ciclo de acordo com todos os sinais
for(int i=0;i<total;i++)
{
//--- selecionamos um sinal para o trabalho futuro
if(SignalBaseSelect(i))
{
//--- obtenção das propriedades do sinal
long id =SignalBaseGetInteger(SIGNAL_BASE_ID); // id do sinal
long pips =SignalBaseGetInteger(SIGNAL_BASE_PIPS); // resultado da negociaçáo em
long subscr=SignalBaseGetInteger(SIGNAL_BASE_SUBSCRIBERS); // número de assinantes
string name =SignalBaseGetString(SIGNAL_BASE_NAME); // nome do sinal
double price =SignalBaseGetDouble(SIGNAL_BASE_PRICE); // preço de assinatura do sin
string curr =SignalBaseGetString(SIGNAL_BASE_CURRENCY); // moeda do sinal
//--- exibimos todos os sinais rentáveis livres com zero de assinantes
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("Erro na seleção do sinal. Código de erro=%d",GetLastError());
}
}
SignalBaseTotal
R etorna o número total de sinais disponíveis no terminal.
int SignalBaseTotal();
valor de retorno
Número total de sinais disponíveis no terminal.
SignalInfoGetDouble
R etorna, a partir das configurações de cópia do sinal de negociação, o valor do tipo double.
double SignalInfoGetDouble(
ENUM_SIGNAL_INFO_DOUBLE property_id, // identificador da propriedade
);
Parâmetros
property_id
[in] Identificador da propriedade para configurar a cópia do sinal de negociação.. Pode ser um dos
valores da enumeração ENUM _S IGNAL _INFO_DOUBLE.
valor de retorno
O valor do tipo double da propriedade indicada do sinal.
SignalInfoGetInteger
R etorna, a partir das configurações de cópia do sinal de negociação, o valor do tipo integer.
long SignalInfoGetInteger(
ENUM_SIGNAL_INFO_INTEGER property_id, // identificador da propriedade
);
Parâmetros
property_id
[in] Identificador da propriedade para configurar a cópia do sinal de negociação.. Pode ser um dos
valores da enumeração ENUM _S IGNAL _INFO_INT EGER .
valor de retorno
O valor do tipo integer da propriedade indicada do sinal.
SignalInfoGetString
R etorna, a partir das configurações de cópia do sinal de negociação, o valor do tipo string.
string SignalInfoGetString(
ENUM_SIGNAL_INFO_STRING property_id, // identificador da propriedade
);
Parâmetros
property_id
[in] Identificador da propriedade para configurar a cópia do sinal de negociação.. O valor pode ser
um dos valores da enumeração ENUM _S IGNAL _INFO_S TRING.
valor de retorno
O valor do tipo string da propriedade indicada do sinal.
SignalInfoSetDouble
Define, nas configurações de cópia do sinal de negociação, o valor do tipo double.
bool SignalInfoSetDouble(
ENUM_SIGNAL_INFO_DOUBLE property_id, // identificador da propriedade
double value // valor da propriedade
);
Parâmetros
property_id
[in] Identificador da propriedade para configurar a cópia do sinal de negociação.. Pode ser um dos
valores da enumeração ENUM _S IGNAL _INFO_DOUBLE.
value
[in] Valor da propriedade para configurar a cópia do sinal de negociação.
valor de retorno
R etorna true, se a alteração da propriedade for bem-sucedida, caso contrário, retorna false. Para
mais informações sobre o erro, você deve chamar a função GetLastError().
SignalInfoSetInteger
Define, nas configurações de cópia do sinal de negociação, o valor do tipo integer.
bool SignalInfoSetInteger(
ENUM_SIGNAL_INFO_INTEGER property_id, // identificador da propriedade
long value // valor da propriedade
);
Parâmetros
property_id
[in] Identificador da propriedade para configurar a cópia do sinal de negociação.. Pode ser um dos
valores da enumeração ENUM _S IGNAL _INFO_INT EGER .
value
[in] Valor da propriedade para configurar a cópia do sinal de negociação.
valor de retorno
R etorna true, se a alteração da propriedade for bem-sucedida, caso contrário, retorna false. Para
mais informações sobre o erro, você deve chamar a função GetLastError().
SignalSubscribe
R ealiza uma assinatura para copiar o sinal de negociação.
bool SignalSubscribe(
long signal_id // id do sinal
);
Parâmetros
signal_id
[in] Identificador do sinal.
valor de retorno
R etorna true, se a assinatura para copiar o sinal de negociação for bem-sucedida, caso contrário,
retorna false. Para mais informações sobre o erro, você deve chamar a função GetLastError().
SignalUnsubscribe
Cancela a assinatura para copiar o sinal de negociação
bool SignalUnsubscribe();
valor de retorno
R etorna true, se a cancelação da assinatura do sinal de negociação for bem-sucedida, caso contrário,
retorna false. false. Para mais informações sobre o GetLastError().
Funções de rede
Os programas MQL5 podem trocar dados com servidores remotos, enviar notificações push, e-mails e
dados FT P.
· O grupo de funções Sock et* permite que você crie uma conexão T CP (incluindo uma conexão T LS
segura) com um host remoto por meio de soquetes de sistema. O esquema de trabalho é simples :
você cria o soquete, conecta-se ao servidor, e, assim, começaler e registrar dados.
· A função W ebR equest é projetada para trabalhar com recursos da W eb e facilita o envio de
solicitações HTT P (incluindo GET e POS T ).
· SendFT P, SendMail e SendNotification são uma função mais simples para enviar arquivos, e-mail e
notificações móveis.
Para segurança do usuário final, no lado do terminal do cliente é implementada uma lista de endereços
IP permitidos, com a qual o programa MQL5 pode ser conectado usando as funções Sock et* e
W ebR equest. Por exemplo, se ela precisar se conectar a https ://www.someserver.com, esse endereço
deverá ser explicitamente indicado pelo usuário do terminal na lista de permitidos. Via software não é
possível adicionar o endereço.
Para notificar o usuário sobre a necessidade de configuração adicional, inclua uma mensagem explícita
no programa MQL5. Por exemplo, via #property description, Alert ou Print.
Função Ação
Sock etCreate Cria um soquete com os sinalizadores
especificados e retorna seu identificador
Sock etIs R eadable Obtém o número de bytes que podem ser lidos
do soquete.
SocketCreate
Cria um soquete com os sinalizadores especificados e retorna seu identificador.
int SocketCreate(
uint flags // sinalizadores
);
Parâmetros
flags
[in] Combinação de sinalizadores definindo o modo de operação com o soquete. Atualmente, é
suportado um sinalizador — SOCKET_DEFAUL T .
Valor retornado
Após a criação bem-sucedida de um soquete, retorna seu identificador, caso contrário,
INVAL ID_H ANDLE.
Comentário:
Para liberar a memória do computador de um soquete não utilizado, chame para ele Sock etClose.
De um programa MQL5 você pode criar um máximo de 128 soquetes. Quando exceder o limite em
_LastError é registrado o erro 5271 (ERR_NET SOCKET_T OO_MANY_OPENED).
A função só pode ser chamada por EAs e scripts, pois eles trabalham em seu próprio fluxo de
execução. Quando chamado do indicador GetLastError() retorna o erro 4014 – "Função do sistema
não permitida para chamada" .
Exemplo:
//+------------------------------------------------------------------+
//| 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 "Para o exemplo funcionar, adicione Address à lista de permitidos nas configu
#property script_show_inputs
if(len<0)
return(false);
//--- se for usada uma conexão TLS segura pela porta 443
if(ExtTLS)
return(SocketTlsSend(socket,req,len)==len);
//--- se for usada uma conexão TCP normal
return(SocketSend(socket,req,len)==len);
}
//+------------------------------------------------------------------+
//| Lendo a resposta do servidor |
//+------------------------------------------------------------------+
bool HTTPRecv(int socket,uint timeout)
{
char rsp[];
string result;
uint timeout_check=GetTickCount()+timeout;
//--- lê dados do soquete enquanto eles existem, mas não mais tempo do que o timeout
do
{
uint len=SocketIsReadable(socket);
if(len)
{
int rsp_len;
//--- diferentes comandos de leitura dependendo de se a conexão é segura ou não
if(ExtTLS)
rsp_len=SocketTlsRead(socket,rsp,len);
else
rsp_len=SocketRead(socket,rsp,len,timeout);
//--- analisa a resposta
if(rsp_len>0)
{
result+=CharArrayToString(rsp,0,rsp_len);
//--- imprime apenas o cabeçalho da resposta
int header_end=StringFind(result,"\r\n\r\n");
if(header_end>0)
{
Print("Cabeçalho HTTP de resposta recebido:");
Print(StringSubstr(result,0,header_end));
return(true);
}
}
}
}
while(GetTickCount()<timeout_check && !IsStopped());
return(false);
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
int socket=SocketCreate();
//--- verifica o identificador
if(socket!=INVALID_HANDLE)
{
//--- se tudo estiver em ordem, conecte-se
if(SocketConnect(socket,Address,Port,1000))
{
Print("Conectado a ",Address,":",Port);
string subject,issuer,serial,thumbprint;
datetime expiration;
//--- se a conexão estiver protegida por um certificado, exibe seus dados
if(SocketTlsCertificate(socket,subject,issuer,serial,thumbprint,expiration))
{
Print("Certificado TLS:");
Print(" Proprietário: ",subject);
Print(" Emissor: ",issuer);
Print(" Número: ",serial);
Print(" Impressão digital: ",thumbprint);
Print(" Expiração: ",expiration);
ExtTLS=true;
}
//--- envia um pedido GET ao servidor
if(HTTPSend(socket,"GET / HTTP/1.1\r\nHost: www.mql5.com\r\n\r\n"))
{
Print("Solicitação GET enviada");
//--- leia a resposta
if(!HTTPRecv(socket,1000))
Print("Falha ao obter resposta, erro ",GetLastError());
}
else
Print("Falha ao enviar solicitação GET, erro ",GetLastError());
}
else
{
Print("Falhou conexão a ",Address,":",Port,", erro ",GetLastError());
}
//--- fecha o soquete após ser usado
SocketClose(socket);
}
else
Print("Não foi possível criar o soquete, erro ",GetLastError());
}
//+------------------------------------------------------------------+
SocketClose
Fecha o soquete.
bool SocketClose(
const int socket // identificador do soquete
);
Parâmetros
socket
[in] Identificador do soquete que deve ser fechado. O identificador é retornado pela função
Sock etCreate. Ao passar um identificador inv álido para _LastError é registrado o erro 5270
(ERR_NET SOCKET_INVAL IDH ANDLE).
Valor retornado
R etorna true em caso de sucesso, caso contrário, false.
Observação
Se, para o soquete, anteriormente foi criada uma conexão Sock etConnect, ela será interrompida.
A função só pode ser chamada por EAs e scripts, pois eles trabalham em seu próprio fluxo de
execução. Quando chamado do indicador GetLastError() retorna o erro 4014 – "Função do sistema
não permitida para chamada" .
Exemplo:
//+------------------------------------------------------------------+
//| 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 "Para o exemplo funcionar, adicione Address à lista de permitidos nas configu
#property script_show_inputs
//--- se for usada uma conexão TLS segura pela porta 443
if(ExtTLS)
return(SocketTlsSend(socket,req,len)==len);
//--- se for usada uma conexão TCP normal
return(SocketSend(socket,req,len)==len);
}
//+------------------------------------------------------------------+
//| Lendo a resposta do servidor |
//+------------------------------------------------------------------+
bool HTTPRecv(int socket,uint timeout)
{
char rsp[];
string result;
uint timeout_check=GetTickCount()+timeout;
//--- lê dados do soquete enquanto eles existem, mas não mais tempo do que o timeout
do
{
uint len=SocketIsReadable(socket);
if(len)
{
int rsp_len;
//--- diferentes comandos de leitura dependendo de se a conexão é segura ou não
if(ExtTLS)
rsp_len=SocketTlsRead(socket,rsp,len);
else
rsp_len=SocketRead(socket,rsp,len,timeout);
//--- analisa a resposta
if(rsp_len>0)
{
result+=CharArrayToString(rsp,0,rsp_len);
//--- imprime apenas o cabeçalho da resposta
int header_end=StringFind(result,"\r\n\r\n");
if(header_end>0)
{
Print("Cabeçalho HTTP de resposta recebido:");
Print(StringSubstr(result,0,header_end));
return(true);
}
}
}
}
while(GetTickCount()<timeout_check && !IsStopped());
return(false);
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
int socket=SocketCreate();
//--- verifica o identificador
if(socket!=INVALID_HANDLE)
{
//--- se tudo estiver em ordem, conecte-se
if(SocketConnect(socket,Address,Port,1000))
{
Print("Conectado a ",Address,":",Port);
string subject,issuer,serial,thumbprint;
datetime expiration;
//--- se a conexão estiver protegida por um certificado, exibe seus dados
if(SocketTlsCertificate(socket,subject,issuer,serial,thumbprint,expiration))
{
Print("Certificado TLS:");
Print(" Proprietário: ",subject);
Print(" Emissor: ",issuer);
Print(" Número: ",serial);
Print(" Impressão digital: ",thumbprint);
Print(" Expiração: ",expiration);
ExtTLS=true;
}
//--- envia um pedido GET ao servidor
if(HTTPSend(socket,"GET / HTTP/1.1\r\nHost: www.mql5.com\r\n\r\n"))
{
Print("Solicitação GET enviada");
//--- leia a resposta
if(!HTTPRecv(socket,1000))
Print("Falha ao obter resposta, erro ",GetLastError());
}
else
Print("Falha ao enviar solicitação GET, erro ",GetLastError());
}
else
{
Print("Falhou conexão a ",Address,":",Port,", erro ",GetLastError());
}
//--- fecha o soquete após ser usado
SocketClose(socket);
}
else
Print("Não foi possível criar o soquete, erro ",GetLastError());
}
//+------------------------------------------------------------------+
SocketConnect
Conecta-se ao servidor com controle de tempo limite.
bool SocketConnect(
int socket, // soquete
const string server, // endereço para conexão
uint port, // porto para conexão
uint timeout_receive_ms // tempo limite da conexão
);
Parâmetros
socket
[in] Identificador do soquete retornado pela função Sock etCreate. Ao passar um identificador
inv álido para _LastError é registrado o erro 5270 (ERR_NET SOCKET_INVAL IDH ANDLE).
server
[in] Nome de domínio do servidor ao qual você deseja se conectar ou seu endereço IP.
port
[in] Número da porta para conexão.
timeout_receive_ms
[in] T empo limite de conexão em milissegundos. Se a conexão falhar durante esse período, serão
interrompidas as tentativas.
Valor retornado
R etorna true na conexão bem-sucedida, caso contrário, false.
Observação
O endereço para conexão deve ser adicionado à lista de permitidos no lado do terminal do cliente
(seção Serviços \ Configurações \ Expert Advisors).
A função só pode ser chamada por EAs e scripts, pois eles trabalham em seu próprio fluxo de
execução. Quando chamado do indicador GetLastError() retorna o erro 4014 – "Função do sistema
não permitida para chamada" .
Exemplo:
//+------------------------------------------------------------------+
//| 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 "Para o exemplo funcionar, adicione Address à lista de permitidos nas configu
#property script_show_inputs
Print(StringSubstr(result,0,header_end));
return(true);
}
}
}
}
while(GetTickCount()<timeout_check && !IsStopped());
return(false);
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
int socket=SocketCreate();
//--- verifica o identificador
if(socket!=INVALID_HANDLE)
{
//--- se tudo estiver em ordem, conecte-se
if(SocketConnect(socket,Address,Port,1000))
{
Print("Conectado a ",Address,":",Port);
string subject,issuer,serial,thumbprint;
datetime expiration;
//--- se a conexão estiver protegida por um certificado, exibe seus dados
if(SocketTlsCertificate(socket,subject,issuer,serial,thumbprint,expiration))
{
Print("Certificado TLS:");
Print(" Proprietário: ",subject);
Print(" Emissor: ",issuer);
Print(" Número: ",serial);
Print(" Impressão digital: ",thumbprint);
Print(" Expiração: ",expiration);
ExtTLS=true;
}
//--- envia um pedido GET ao servidor
if(HTTPSend(socket,"GET / HTTP/1.1\r\nHost: www.mql5.com\r\n\r\n"))
{
Print("Solicitação GET enviada");
//--- leia a resposta
if(!HTTPRecv(socket,1000))
Print("Falha ao obter resposta, erro ",GetLastError());
}
else
Print("Falha ao enviar solicitação GET, erro ",GetLastError());
}
else
{
SocketIsConnected
Verifica se há um soquete conectado atualmente.
bool SocketIsConnected(
const int socket // identificador do soquete
);
Parâmetros
socket
[in] Identificador do soquete retornado pela função Sock etCreate(). Ao passar um identificador
inv álido para _LastError é registrado o erro 5270 (ERR_NET SOCKET_INVAL IDH ANDLE).
Valor retornado
R etorna true se o soquete estiver conectado, caso contrário, false.
Observação
Usando a função Sock etIsConnected(), você pode verificar a conexão do soquete em um
determinado momento.
A função só pode ser chamada por EAs e scripts, pois eles trabalham em seu próprio fluxo de
execução. Quando chamado do indicador GetLastError() retorna o erro 4014 – "Função do sistema
não permitida para chamada" .
Veja também
Sock etConnect, Sock etIs W ritable, Sock etCreate, Sock etClose
SocketIsReadable
Obtém o número de bytes que podem ser lidos a partir do soquete.
uint SocketIsReadable(
const int socket // identificador do soquete
);
Parâmetros
socket
[in] Identificador do soquete retornado pela função Sock etCreate. Ao passar um identificador
inv álido para _LastError é registrado o erro 5270 (ERR_NET SOCKET_INVAL IDH ANDLE).
Valor retornado
Número de bytes que podem ser lidos. Em caso de erro, retorna 0.
Observação
Se ocorrer um erro durante a execução desta função no soquete do sistema, a conexão estabelecida
Sock etconnect será interrompida.
Antes de chamar Sock etR ead, verifique se o soquete tem dados que ler. Caso contrário, na aus ência
de dados, a função Sock etR ead irá esperar em vão dados durante timeout_ms, atrasando a
execução do programa.
A função só pode ser chamada por EAs e scripts, pois eles trabalham em seu próprio fluxo de
execução. Quando chamado do indicador GetLastError() retorna o erro 4014 – "Função do sistema
não permitida para chamada" .
Exemplo:
//+------------------------------------------------------------------+
//| 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 "Para o exemplo funcionar, adicione Address à lista de permitidos nas configu
#property script_show_inputs
int len=StringToCharArray(request,req)-1;
if(len<0)
return(false);
//--- se for usada uma conexão TLS segura pela porta 443
if(ExtTLS)
return(SocketTlsSend(socket,req,len)==len);
//--- se for usada uma conexão TCP normal
return(SocketSend(socket,req,len)==len);
}
//+------------------------------------------------------------------+
//| Lendo a resposta do servidor |
//+------------------------------------------------------------------+
bool HTTPRecv(int socket,uint timeout)
{
char rsp[];
string result;
uint timeout_check=GetTickCount()+timeout;
//--- lê dados do soquete enquanto eles existem, mas não mais tempo do que o timeout
do
{
uint len=SocketIsReadable(socket);
if(len)
{
int rsp_len;
//--- diferentes comandos de leitura dependendo de se a conexão é segura ou não
if(ExtTLS)
rsp_len=SocketTlsRead(socket,rsp,len);
else
rsp_len=SocketRead(socket,rsp,len,timeout);
//--- analisa a resposta
if(rsp_len>0)
{
result+=CharArrayToString(rsp,0,rsp_len);
//--- imprime apenas o cabeçalho da resposta
int header_end=StringFind(result,"\r\n\r\n");
if(header_end>0)
{
Print("Cabeçalho HTTP de resposta recebido:");
Print(StringSubstr(result,0,header_end));
return(true);
}
}
}
}
while(GetTickCount()<timeout_check && !IsStopped());
return(false);
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
int socket=SocketCreate();
//--- verifica o identificador
if(socket!=INVALID_HANDLE)
{
//--- se tudo estiver em ordem, conecte-se
if(SocketConnect(socket,Address,Port,1000))
{
Print("Conectado a ",Address,":",Port);
string subject,issuer,serial,thumbprint;
datetime expiration;
//--- se a conexão estiver protegida por um certificado, exibe seus dados
if(SocketTlsCertificate(socket,subject,issuer,serial,thumbprint,expiration))
{
Print("Certificado TLS:");
Print(" Proprietário: ",subject);
Print(" Emissor: ",issuer);
Print(" Número: ",serial);
Print(" Impressão digital: ",thumbprint);
Print(" Expiração: ",expiration);
ExtTLS=true;
}
//--- envia um pedido GET ao servidor
if(HTTPSend(socket,"GET / HTTP/1.1\r\nHost: www.mql5.com\r\n\r\n"))
{
Print("Solicitação GET enviada");
//--- leia a resposta
if(!HTTPRecv(socket,1000))
Print("Falha ao obter resposta, erro ",GetLastError());
}
else
Print("Falha ao enviar solicitação GET, erro ",GetLastError());
}
else
{
Print("Falhou conexão a ",Address,":",Port,", erro ",GetLastError());
}
//--- fecha o soquete após ser usado
SocketClose(socket);
}
else
Print("Não foi possível criar o soquete, erro ",GetLastError());
}
//+------------------------------------------------------------------+
SocketIsW ritable
Verifica se os dados podem ser gravados no soquete no momento atual.
bool SocketIsWritable(
const int socket // identificador do soquete
);
Parâmetros
socket
[in] Identificador do soquete retornado pela função Sock etCreate. Ao passar um identificador
inv álido para _LastError é registrado o erro 5270 (ERR_NET SOCKET_INVAL IDH ANDLE).
Valor retornado
R etorna true se o registro for possível, caso contrário, false.
Observação
Usando esta função, você pode verificar se os dados podem ser gravados no soquete agora.
Se ocorrer um erro durante a execução desta função no soquete do sistema, a conexão estabelecida
Sock etconnect será interrompida.
A função só pode ser chamada por EAs e scripts, pois eles trabalham em seu próprio fluxo de
execução. Quando chamado do indicador GetLastError() retorna o erro 4014 – "Função do sistema
não permitida para chamada" .
SocketTimeouts
Define os tempos limite para receber e enviar dados para o objeto de sistema do soquete.
bool SocketTimeouts(
int socket, // soquete
uint timeout_send_ms, // tempo limite para envio de dados
uint timeout_receive_ms // tempo limite de aquisição de dados
);
Parâmetros
socket
[in] Identificador do soquete retornado pela função Sock etCreate. Ao passar um identificador
inv álido para _LastError é registrado o erro 5270 (ERR_NET SOCKET_INVAL IDH ANDLE).
timeout_send_ms
[in] T empo limite de envio de dados em milissegundos.
timeout_receive_ms
[in] T empo limite para receber dados em milissegundos.
Valor retornado
R etorna true em caso de sucesso, caso contrário, false.
Observação
Não confunda o tempo limite dos objetos do sistema e o tempo limite definido ao ler os dados via
Sock etR ead. Sock etT imeout define os tempos limite uma vez para o objeto do soquete no sistema
operacional. Esses tempos limite serão aplicados a todas as funções de leitura e de envio de dados
através desse soquete. Em Sock etR ead, o tempo limite é definido para uma operação de leitura de
dados específica.
A função só pode ser chamada por EAs e scripts, pois eles trabalham em seu próprio fluxo de
execução. Quando chamado do indicador GetLastError() retorna o erro 4014 – "Função do sistema
não permitida para chamada" .
SocketRead
L ê dados do soquete.
int SocketRead(
int socket, // soquete
uchar& buffer[], // buffer para ler dados do soquete
uint buffer_maxlen, // número de bytes necessário para leitura
uint timeout_ms // tempo limite de leitura
);
Parâmetros
socket
[in] Identificador do soquete retornado pela função Sock etCreate. Ao passar um identificador
inv álido para _LastError é registrado o erro 5270 (ERR_NET SOCKET_INVAL IDH ANDLE).
buffer
[out] R eferência para array do tipo uchar em que serão lidos os dados. O tamanho da matriz
dinâmica é aumentado pelo número de bytes lidos. O tamanho da matriz não pode exceder
INT_MAX (2147483647).
buffer_maxlen
[in] Número de bytes que devem ser lidos na matriz buffer[]. Os dados que não se encaixam na
matriz permanecerão no soquete. Eles podem ser obtidos pela seguinte chamada Sock etR ead. O
valor buffer_maxlen não pode exceder INT_MAX (2147483647).
timeout_ms
[in] T empo limite de leitura de dados em milissegundos. Se os dados não puderem ser
recuperados durante esse tempo, as tentativas serão concluídas e a função retornará -1.
Valor retornado
Se bem-sucedido, retorna o número de bytes lidos, em caso de erro, retorna -1.
Observação
Se ocorrer um erro durante a execução desta função no soquete do sistema, a conexão estabelecida
Sock etconnect será interrompida.
A função só pode ser chamada por EAs e scripts, pois eles trabalham em seu próprio fluxo de
execução. Quando chamado do indicador GetLastError() retorna o erro 4014 – "Função do sistema
não permitida para chamada" .
Exemplo:
//+------------------------------------------------------------------+
//| 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("Cabeçalho HTTP de resposta recebido:");
Print(StringSubstr(result,0,header_end));
return(true);
}
}
}
}
while(GetTickCount()<timeout_check && !IsStopped());
return(false);
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
int socket=SocketCreate();
//--- verifica o identificador
if(socket!=INVALID_HANDLE)
{
//--- se tudo estiver em ordem, conecte-se
if(SocketConnect(socket,Address,Port,1000))
{
Print("Conectado a ",Address,":",Port);
string subject,issuer,serial,thumbprint;
datetime expiration;
//--- se a conexão estiver protegida por um certificado, exibe seus dados
if(SocketTlsCertificate(socket,subject,issuer,serial,thumbprint,expiration))
{
Print("Certificado TLS:");
Print(" Proprietário: ",subject);
Print(" Emissor: ",issuer);
Print(" Número: ",serial);
Print(" Impressão digital: ",thumbprint);
Print(" Expiração: ",expiration);
ExtTLS=true;
}
//--- envia um pedido GET ao servidor
if(HTTPSend(socket,"GET / HTTP/1.1\r\nHost: www.mql5.com\r\n\r\n"))
{
Print("Solicitação GET enviada");
//--- leia a resposta
if(!HTTPRecv(socket,1000))
Print("Falha ao obter resposta, erro ",GetLastError());
}
else
Veja também
Sock etT imeouts, MathSwap
SocketSend
R egistra dados no soquete.
int SocketSend(
int socket, // soquete
const uchar& buffer[], // buffer para dados
uint buffer_len // tamanho do buffer
);
Parâmetros
socket
[in] Identificador do soquete retornado pela função Sock etCreate. Ao passar um identificador
inv álido para _LastError é registrado o erro 5270 (ERR_NET SOCKET_INVAL IDH ANDLE).
buffer
[in] R eferência para o array do tipo uchar com os dados que é preciso enviar para o soquete.
buffer_len
[in] T amanho do array buffer.
Valor retornado
Se bem-sucedido, retorna o número de bytes registrados no sock et. Em caso de erro, retorna -1.
Observação
Se ocorrer um erro durante a execução desta função no soquete do sistema, a conexão estabelecida
Sock etconnect será interrompida.
A função só pode ser chamada por EAs e scripts, pois eles trabalham em seu próprio fluxo de
execução. Quando chamado do indicador GetLastError() retorna o erro 4014 – "Função do sistema
não permitida para chamada" .
Exemplo:
//+------------------------------------------------------------------+
//| 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 "Para o exemplo funcionar, adicione Address à lista de permitidos nas configu
#property script_show_inputs
}
}
while(GetTickCount()<timeout_check && !IsStopped());
return(false);
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
int socket=SocketCreate();
//--- verifica o identificador
if(socket!=INVALID_HANDLE)
{
//--- se tudo estiver em ordem, conecte-se
if(SocketConnect(socket,Address,Port,1000))
{
Print("Conectado a ",Address,":",Port);
string subject,issuer,serial,thumbprint;
datetime expiration;
//--- se a conexão estiver protegida por um certificado, exibe seus dados
if(SocketTlsCertificate(socket,subject,issuer,serial,thumbprint,expiration))
{
Print("Certificado TLS:");
Print(" Proprietário: ",subject);
Print(" Emissor: ",issuer);
Print(" Número: ",serial);
Print(" Impressão digital: ",thumbprint);
Print(" Expiração: ",expiration);
ExtTLS=true;
}
//--- envia um pedido GET ao servidor
if(HTTPSend(socket,"GET / HTTP/1.1\r\nHost: www.mql5.com\r\n\r\n"))
{
Print("Solicitação GET enviada");
//--- leia a resposta
if(!HTTPRecv(socket,1000))
Print("Falha ao obter resposta, erro ",GetLastError());
}
else
Print("Falha ao enviar solicitação GET, erro ",GetLastError());
}
else
{
Print("Falhou conexão a ",Address,":",Port,", erro ",GetLastError());
}
//--- fecha o soquete após ser usado
SocketClose(socket);
}
else
Print("Não foi possível criar o soquete, erro ",GetLastError());
}
//+------------------------------------------------------------------+
Veja também
Sock etT imeouts, MathSwap, String T oCharArray
SocketTlsHandshake
Inicia uma conexão T LS (SSL) segura com o host especificado usando o protocolo T LS H andshak e.
Durante o H andshak e, o cliente e o servidor concordam com os parâmetros de conexão: a versão do
protocolo usado e o método de criptografia de dados.
bool SocketTlsHandshake(
int socket, // soquete
const string host // endereço do host
);
Parâmetros
socket
[in] Identificador do soquete retornado pela função Sock etCreate. Ao passar um identificador
inv álido para _LastError é registrado o erro 5270 (ERR_NET SOCKET_INVAL IDH ANDLE).
host
[in] Endereço do host com o qual é estabelecida uma conexão segura.
Valor retornado
R etorna true em caso de sucesso, caso contrário, false.
Comentário:
Antes de uma conexão segura, o programa deve estabelecer uma conexão T CP normal ao host
usando Sock etConnect.
Em caso de falha ao estabelecer uma conexão segura, em _LastError é registrado o erro 5274
(ERR_NET SOCKET_H ANDS H AKE_FAILED).
Não é necess ária a chamada desta função, se a conexão é realizada para a porta 443. Essa é a porta
T CP padrão usada para conex ões T LS (SSL) seguras.
A função só pode ser chamada por EAs e scripts, pois eles trabalham em seu próprio fluxo de
execução. Quando chamado do indicador GetLastError() retorna o erro 4014 – "Função do sistema
não permitida para chamada" .
SocketTlsCertificate
Obtém informações sobre o certificado usado para proteger uma conexão de rede.
int SocketTlsCertificate(
int socket, // soquete
string& subject, // proprietário do certificado
string& issuer, // emissor do certificado
string& serial, // número de série do certificado
string& thumbprint, // impressão digital do certificado
datetime& expiration // data de expiração do certificado
);
Parâmetros
socket
[in] Identificador do soquete retornado pela função Sock etCreate. Ao passar um identificador
inv álido para _LastError é registrado o erro 5270 (ERR_NET SOCKET_INVAL IDH ANDLE).
subject
[in] Nome do proprietário do certificado. Corresponde ao campo Subject.
issuer
[in] Nome do emissor do certificado. Corresponde ao campo Issuer.
serial
[in] Número de série do certificado. Corresponde ao campo SerialNumber.
thumbprint
[in] Impressão digital do certificado. Corresponde ao hash S H A-1 do arquivo de certificado inteiro
(todos os campos, incluindo a assinatura do editor).
expiration
[in] Data de expiração do certificado no formato datetime.
Valor retornado
R etorna true em caso de sucesso, caso contrário, false.
Observação
A solicitação de dados do certificado só é possível após estabelecer uma conexão segura usando
Sock etT ls H andshak e.
A função só pode ser chamada por EAs e scripts, pois eles trabalham em seu próprio fluxo de
execução. Quando chamado do indicador GetLastError() retorna o erro 4014 – "Função do sistema
não permitida para chamada" .
Exemplo:
//+------------------------------------------------------------------+
//| 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 "Para o exemplo funcionar, adicione Address à lista de permitidos nas configu
#property script_show_inputs
if(rsp_len>0)
{
result+=CharArrayToString(rsp,0,rsp_len);
//--- imprime apenas o cabeçalho da resposta
int header_end=StringFind(result,"\r\n\r\n");
if(header_end>0)
{
Print("Cabeçalho HTTP de resposta recebido:");
Print(StringSubstr(result,0,header_end));
return(true);
}
}
}
}
while(GetTickCount()<timeout_check && !IsStopped());
return(false);
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
int socket=SocketCreate();
//--- verifica o identificador
if(socket!=INVALID_HANDLE)
{
//--- se tudo estiver em ordem, conecte-se
if(SocketConnect(socket,Address,Port,1000))
{
Print("Conectado a ",Address,":",Port);
string subject,issuer,serial,thumbprint;
datetime expiration;
//--- se a conexão estiver protegida por um certificado, exibe seus dados
if(SocketTlsCertificate(socket,subject,issuer,serial,thumbprint,expiration))
{
Print("Certificado TLS:");
Print(" Proprietário: ",subject);
Print(" Emissor: ",issuer);
Print(" Número: ",serial);
Print(" Impressão digital: ",thumbprint);
Print(" Expiração: ",expiration);
ExtTLS=true;
}
//--- envia um pedido GET ao servidor
if(HTTPSend(socket,"GET / HTTP/1.1\r\nHost: www.mql5.com\r\n\r\n"))
{
Print("Solicitação GET enviada");
//--- leia a resposta
if(!HTTPRecv(socket,1000))
Print("Falha ao obter resposta, erro ",GetLastError());
}
else
Print("Falha ao enviar solicitação GET, erro ",GetLastError());
}
else
{
Print("Falhou conexão a ",Address,":",Port,", erro ",GetLastError());
}
//--- fecha o soquete após ser usado
SocketClose(socket);
}
else
Print("Não foi possível criar o soquete, erro ",GetLastError());
}
//+------------------------------------------------------------------+
SocketTlsRead
L ê dados de uma conexão T LS segura
int SocketTlsRead(
int socket, // soquete
uchar& buffer[], // buffer para ler dados do soquete
uint buffer_maxlen // número de bytes necessário para leitura
);
Parâmetros
socket
[in] Identificador do soquete retornado pela função Sock etCreate. Ao passar um identificador
inv álido para _LastError é registrado o erro 5270 (ERR_NET SOCKET_INVAL IDH ANDLE).
buffer
[out] R eferência para array do tipo uchar em que serão lidos os dados. O tamanho da matriz
dinâmica é aumentado pelo número de bytes lidos. O tamanho da matriz não pode exceder
INT_MAX (2147483647).
buffer_maxlen
[in] Número de bytes que devem ser lidos na matriz buffer[]. Os dados que não se encaixam na
matriz permanecerão no soquete. Eles podem ser recebidos pela seguinte chamada
Sock etT LS R ead. O valor buffer_maxlen não pode exceder INT_MAX (2147483647).
Valor retornado
Se bem-sucedido, retorna o número de bytes lidos, em caso de erro, retorna -1.
Observação
Se ocorrer um erro durante a execução desta função no soquete do sistema, a conexão estabelecida
Sock etconnect será interrompida.
A função é executada até que receba a quantidade especificada de dados ou ocorra o tempo limite
(Sock etT imeouts).
A função só pode ser chamada por EAs e scripts, pois eles trabalham em seu próprio fluxo de
execução. Quando chamado do indicador GetLastError() retorna o erro 4014 – "Função do sistema
não permitida para chamada" .
Exemplo:
//+------------------------------------------------------------------+
//| 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("Cabeçalho HTTP de resposta recebido:");
Print(StringSubstr(result,0,header_end));
return(true);
}
}
}
}
while(GetTickCount()<timeout_check && !IsStopped());
return(false);
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
int socket=SocketCreate();
//--- verifica o identificador
if(socket!=INVALID_HANDLE)
{
//--- se tudo estiver em ordem, conecte-se
if(SocketConnect(socket,Address,Port,1000))
{
Print("Conectado a ",Address,":",Port);
string subject,issuer,serial,thumbprint;
datetime expiration;
//--- se a conexão estiver protegida por um certificado, exibe seus dados
if(SocketTlsCertificate(socket,subject,issuer,serial,thumbprint,expiration))
{
Print("Certificado TLS:");
Print(" Proprietário: ",subject);
Print(" Emissor: ",issuer);
Print(" Número: ",serial);
Print(" Impressão digital: ",thumbprint);
Print(" Expiração: ",expiration);
ExtTLS=true;
}
//--- envia um pedido GET ao servidor
if(HTTPSend(socket,"GET / HTTP/1.1\r\nHost: www.mql5.com\r\n\r\n"))
{
Print("Solicitação GET enviada");
//--- leia a resposta
if(!HTTPRecv(socket,1000))
Print("Falha ao obter resposta, erro ",GetLastError());
}
else
Print("Falha ao enviar solicitação GET, erro ",GetLastError());
}
else
{
Print("Falhou conexão a ",Address,":",Port,", erro ",GetLastError());
}
//--- fecha o soquete após ser usado
SocketClose(socket);
}
else
Print("Não foi possível criar o soquete, erro ",GetLastError());
}
//+------------------------------------------------------------------+
Veja também
Sock etT imeouts, MathSwap
SocketTlsReadAvailable
L ê todos os dados disponíveis a partir de uma conexão T LS segura.
int SocketTlsReadAvailable(
int socket, // soquete
uchar& buffer[], // buffer para ler dados do soquete
const uint buffer_maxlen // número de bytes necessário para leitura
);
Parâmetros
socket
[in] Identificador do soquete retornado pela função Sock etCreate. Ao passar um identificador
inv álido para _LastError é registrado o erro 5270 (ERR_NET SOCKET_INVAL IDH ANDLE).
buffer
[out] R eferência para array do tipo uchar em que serão lidos os dados. O tamanho da matriz
dinâmica é aumentado pelo número de bytes lidos. O tamanho da matriz não pode exceder
INT_MAX (2147483647).
buffer_maxlen
[in] Número de bytes que devem ser lidos no array buffer[]. Os dados que não se encaixam na
matriz permanecerão no soquete. Eles estarão disponíveis chamando Sock etT ls R eadAvailable
ou Sock etT ls R ead. O valor Buffer_maxlen não pode exceder INT_MAX (2147483647).
Valor retornado
Se bem-sucedido, retorna o número de bytes lidos, em caso de erro, retorna -1.
Observação
Se ocorrer um erro durante a execução desta função no soquete do sistema, a conexão estabelecida
Sock etconnect será interrompida.
A função só pode ser chamada por EAs e scripts, pois eles trabalham em seu próprio fluxo de
execução. Quando chamado do indicador GetLastError() retorna o erro 4014 – "Função do sistema
não permitida para chamada" .
Veja também
Sock etT imeouts, MathSwap
SocketTlsSend
Envia dados por meio de uma conexão T LS segura.
int SocketTlsSend(
int socket, // soquete
const uchar& buffer[], // buffer para dados
uint buffer_len // tamanho do buffer
);
Parâmetros
socket
[in] Identificador do soquete retornado pela função Sock etCreate. Ao passar um identificador
inv álido para _LastError é registrado o erro 5270 (ERR_NET SOCKET_INVAL IDH ANDLE).
buffer
[in] R eferência para o array do tipo uchar com os dados que é preciso enviar.
buffer_len
[in] T amanho do array buffer.
Valor retornado
Se bem-sucedido, retorna o número de bytes registrados no sock et. Em caso de erro, retorna -1.
Observação
Se ocorrer um erro durante a execução desta função no soquete do sistema, a conexão estabelecida
Sock etconnect será interrompida.
A função só pode ser chamada por EAs e scripts, pois eles trabalham em seu próprio fluxo de
execução. Quando chamado do indicador GetLastError() retorna o erro 4014 – "Função do sistema
não permitida para chamada" .
Veja também
Sock etT imeouts, MathSwap, String T oCharArray
W ebRequest
A função envia uma solicitação HTT P para um servidor especificado. A função possui duas vers ões :
Parâmetros
método
[in] método HTT P.
url
[in] UR L.
cabeçalho
[in] Cabeçalhos de solicitação do tipo "k ey: valor" , separados por uma quebra de linha "\r\n" .
cookie
[in] Valor do cook ie.
referer
[in] Valor do cabeçalho R eferer do pedido HTT P.
timeout
[in] T empo limite em milissegundos.
data[]
[in] Matriz de dados do corpo da mensagem HTT P.
data_size
[in] T amanho do array data[].
result[]
[out] Um array contendo dados de resposta do servidor.
result_headers
[out] Cabeçalhos de resposta do servidor.
Valor retornado
Código de resposta do servidor HTT P ou -1 para um erro.
Nota
Para usar a função W ebR equest(), adicione os endereços dos servidores necess ários na lista de UR Ls
permitidos na guia " Expert Advisors " da janela " Options " . A porta do servidor é automaticamente
selecionada com base no protocolo especificado - 80 para " http://" e 443 para " https ://" .
A função W ebR equest() é síncrona, o que significa que interrompe a execução do programa e
aguarda a resposta do servidor solicitado. Uma vez que os atrasos na recepção de uma resposta
podem ser grandes, a função não está disponível para chamadas a partir dos indicadores, porque os
indicadores são executados em uma linha comum compartilhada por todos os indicadores e gráficos
em um símbolo. O atraso de desempenho do indicador em um dos gráficos de um símbolo pode
interromper a atualização de todos os gráficos do mesmo símbolo.
A função pode ser chamada somente de Expert Advisors e scripts, como eles executam em seus
próprios tópicos de execução. Se você tentar chamar a função de um indicador, GetLastError()
retornará o erro 4014 – "Função não é permitida" .
void OnStart()
{
string cookie=NULL,headers;
char post[],result[];
string url="https://finance.yahoo.com";
//--- para trabalhar com o servidor é necessário adicionar a URL "https://finance.yahoo.com"
//--- na lista de URLs permitidas (menu Principal->Ferramentas->Opções, guia "Experts"):
//--- redefinimos o código do último erro
ResetLastError();
//--- download da página html do Yahoo Finance
int res=WebRequest("GET",url,cookie,NULL,500,post,0,result,headers);
if(res==-1)
{
Print("Erro no WebRequest. Código de erro =",GetLastError());
//--- é possível que a URL não esteja na lista, exibimos uma mensagem sobre a necessidade de
MessageBox("É necessário adicionar um endereço '"+url+"' à lista de URL permitidas na guia 'E
}
else
{
if(res==200)
{
//--- download bem-sucedido
PrintFormat("O arquivo foi baixado com sucesso, tamanho %d bytes.",ArraySize(result));
//PrintFormat("Cabeçalhos do servidor: %s",headers);
//--- salvamos os dados em um arquivo
int filehandle=FileOpen("url.htm",FILE_WRITE|FILE_BIN);
if(filehandle!=INVALID_HANDLE)
{
//--- armazenamos o conteúdo do array result[] no arquivo
FileWriteArray(filehandle,result,0,ArraySize(result));
//--- fechamos o arquivo
FileClose(filehandle);
}
else
Print("Erro em FileOpen. Código de erro =",GetLastError());
}
else
PrintFormat("Erro de download '%s', código %d",url,res);
}
}
SendFTP
Envia um arquivo no endereço especificado na janela de configurações da guia "FT P" .
bool SendFTP(
string filename, // nome do arquivo enviado
string ftp_path=NULL // catálogo FTP
);
Parâmetros
filename
[in] Nome do arquivo enviado.
ftp_path=NULL
[in] Catálogo FT P. Se um diretório não for especificado, o diretório descrito nas configurações é
usado.
Valor do Retorno
Em caso de falha retorna false.
Observação
O arquivo enviado deve estar localizado na pasta terminal_directory\MQL5\files ou em suas
subpastas. O envio não ocorre se o endereço FT P e/ou a senha de acesso não estiverem
especificados nas configurações.
SendMail
Envia um email no endereço especificado na janela de configurações da guia " Email" .
bool SendMail(
string subject, // cabeçalho
string some_text // texto de e-mail
);
Parâmetros
subject
[in] Cabeçalho do email.
some_text
[in] Corpo do email.
Valor do Retorno
true – se um email é colocado na fila de envio, caso contrário - false.
Observação
O envio de emails pode ser proibido em configurações, o endereço de email pode ser omitido
também. Para informações do erro chamar GetLastError().
SendNotification
Envia notificações push para terminais móveis, cujo MetaQuotes ID estão especificados na guia
"Notificações " .
bool SendNotification(
string text // Texto da notificação
);
Parâmetros
text
[in] O texto da notificação. O comprimento da mensagem não deve exceder 255 caracteres.
Valor do Retorno
true se uma notificação foi enviada com sucesso do terminal; em caso de falha retorna false. Ao
verificar após uma falha de envio de notificação, GetLastError () pode retornar um dos seguintes
erros :
· 4515 – ERR_NOTIFI CATI ON_SEND_FAI LED,
· 4516 – ERR_NOTIFI CATI ON_WR ONG_PAR AMET ER ,
· 4517 – ERR_NOTIFI CATI ON_WR ONG_SETTINGS,
· 4518 – ERR_NOTIFI CATI ON_T OO_FR EQUENT .
Observação
R ígidas restrições de uso estão definidas para a função SendNotification(): não mais que 2
chamadas por segundo e não mais que 10 chamadas por minuto. O monitoramento da freqüência de
uso é dinâmico. A função pode ser desabilitada em caso de violação da restrição.
Variáveis globais do terminal de cliente não deve ser confundida com as variáveis declaradas no
escopo global do programa mql5.
Variáveis globais são guardadas no terminal de cliente por 4 semanas desde o último acesso, então
elas serão excluídas automaticamente. Um acesso para a variável global não é somente a definição de
um novo valor, mas a leitura do valor da varável global, também.
Função Ação
GlobalVariableCheck Verifica a existência de uma variável global
com o nome especificado
GlobalVariableCheck
Verifica a existência de uma variável global com o nome especificado
bool GlobalVariableCheck(
string name // Nome da variável global
);
Parâmetros
name
[in] Nome da variável global.
Valor do Retorno
R etorna true, se a variável global existe, caso contrário, retorna false.
As variáveis globais existem no terminal do cliente durante 4 semanas desde a última utilização,
então eles são excluídos automaticamente.
Também Veja
GlobalVariableT ime()
GlobalVariableTime
R etorna o tempo em que a variável global foi acessado pela última vez.
datetime GlobalVariableTime(
string name // nome
);
Parâmetros
name
[in] Nome da variável global.
Valor do Retorno
A função retorna hora do último acesso à variável global especificada. Chamando uma variável para
obter um valor também é considerado como um acesso a ele. A fim de obter os detalhes do erro
chamar a função GetLastError().
Observação
As variáveis globais existem no terminal do cliente durante 4 semanas desde a última utilização.
Depois disso, eles são excluídos automaticamente.
Também Veja
GlobalVariableCheck ()
GlobalVariableDel
Exclui uma variável global a partir do terminal do cliente.
bool GlobalVariableDel(
string name // Nome da variável global
);
Parâmetros
name
[in] Nome da variável global.
Valor do Retorno
Se bem sucedida, a função retorna true, caso contrário ela retorna false. Para obter uma informação
sobre o erro é necess ário chamar a função GetLastError().
Observação
As variáveis globais existem no terminal do cliente durante 4 semanas desde a última utilização,
então eles são excluídos automaticamente.
GlobalVariableGet
R etorna o valor de uma variável global existente do terminal do cliente. Existem 2 variantes da
função.
2. R etorna true ou false dependendo do sucesso da execução da função. Se for bem sucedido, a
variável global do terminal do cliente é colocado em uma variável passada por referência no segundo
parâmetro.
bool GlobalVariableGet(
string name, // Nome da variável global
double& double_var // Esta variável irá conter o valor da variável global
);
Parâmetros
name
[in] Nome da variável global.
double_var
[out] Alvo variável do tipo duplo, que aceita o valor armazenado em uma variável global do
terminal do cliente.
Valor do Retorno
O valor da variável global existente ou 0(zero) em caso de um erro. Para mais detalhes sobre o erro,
chamar GetLastError().
Observação
As variáveis globais existem no terminal do cliente durante 4 semanas desde a última utilização,
então eles são excluídos automaticamente.
GlobalVariableName
R etorna o nome de uma variável global, que é o número ordinal.
string GlobalVariableName(
int index // Número variável global na lista de variáveis globais
);
Parâmetros
index
[in] Número de seqüência na lista de variáveis globais. Ele deve ser maior ou igual a 0(zero) e
menor do que GlobalVariables T otal().
Valor do Retorno
Nome da variável global, que é o número ordinal na lista de variáveis globais. Para mais detalhes
sobre o erro, chamar GetLastError().
Observação
As variáveis globais existem no terminal do cliente durante 4 semanas desde a última utilização,
então eles são excluídos automaticamente.
GlobalVariableSet
Define um novo valor para uma variável global. Se a variável não existir, o sistema cria uma nova
variável global.
datetime GlobalVariableSet(
string name, // Nome da variável global
double value // Valor a ser definido
);
Parâmetros
name
[in] Nome da variável global.
value
[in] O novo valor numérico.
Valor do Retorno
Se for bem sucedido, a função retorna a última modificação, caso contrário, 0 (zero). Para mais
detalhes sobre o erro, chamar GetLastError().
Observação
Um nome de variável global não deve exceder 63 caracteres. As variáveis globais existem no
terminal do cliente durante 4 semanas desde a última utilização, então eles são excluídos
automaticamente.
GlobalVariablesFlush
Salva forçadamente o conteúdo de todas as varáveis globais num disco.
void GlobalVariablesFlush();
Valor do Retorno
Sem valor de retorno.
Observação
O terminal escreve todas as variáveis globais quando o trabalho é em excesso, mas os dados podem
ser perdidos em uma falha s úbita de operação do computador. Esta função permite controle
independente do processo de salvar variáveis globais em caso de conting ência.
GlobalVariableTemp
A função tenta criar uma variável global temporária. Se a variável não existir, o sistema cria uma
nova variável global temporária.
bool GlobalVariableTemp(
string name // Nome da variável global
);
Parâmetros
name
[in] O nome de uma variável global temporária.
Valor do Retorno
Se for bem sucedido, a função retorna true, caso contrário - false. Para obter detalhes sobre o erro,
você deve chamar a função GetLastError().
Observação
Variáveis globais temporários existem apenas enquanto o terminal do cliente está sendo executado,
após o desligamento do terminal eles são excluídos automaticamente. Note-se que durante a
execução de GlobalVariables Flush() variáveis g lobais temporárias não são gravados em um disco.
Depois de uma variável global temporário tiver sido criado, pode ser acedido e modificado a mesma
variável global do terminal do cliente.
GlobalVariableSetOnCondition
Define o novo valor da variável global existente, se o valor da corrente é igual ao terceiro parâmetro
check_value. Se não houver nenhuma variável global, a função irá gerar um erro
ERR_GLOBAL VARIABLE_NOT_FOUND (4501) e voltar false.
bool GlobalVariableSetOnCondition(
string name, // Nome da variável global
double value, // Novo valor para a variável, se a condição for verdadeira
double check_value // Verifique condição de valor
);
Parâmetros
name
[in] O nome de uma variável global.
value
[in] Novo valor.
check_value
[in] O valor para verificar o valor atual da variável global.
Valor do Retorno
Se bem sucedida, a função retorna true, caso contrário ela retorna false. Para obter detalhes sobre
o erro chamar GetLastError(). Se o valor atual da variável global é diferente de check_value, a
função retorna false.
Observação
Função fornece acesso atômico a variável global, para que ele possa ser utilizado para a prestação
de uma exclusão mútua na interação de v ários consultores especializados trabalhando
simultaneamente dentro de um terminal de cliente.
GlobalVariablesDeleteAll
Apaga as variáveis globais do terminal do cliente.
int GlobalVariablesDeleteAll(
string prefix_name=NULL, // Todas as variáveis globais com nomes que começam com o prefi
datetime limit_data=0 // Todas as variáveis globais que foram alteradas antes desta d
);
Parâmetros
prefix_name=NULL
[in] Prefixo do nome de variáveis globais para remover. Se você especificar um prefixo NULL ou
string vazia, então todas as variáveis que atendam o critério dados serão apagados.
limit_data=0
[in] Data para selecionar as variáveis globais no momento de sua última modificação. A função
remove variáveis globais, que foram alteradas antes desta data. Se o parâmetro for zero, então
todas as variáveis que atendam o primeiro critério (prefixo) são excluídos.
Valor do Retorno
O número de variáveis apagados.
Observação
Se ambas as opções são iguais a zero (prefix _name = NULL e limit_data = 0), então função exclui
todas as variáveis globais da terminação. Se ambos os parâmetros são especificados, então ele
elimina variáveis globais correspondentes a ambos os parâmetros.
As variáveis globais existem no terminal do cliente durante 4 semanas desde suas última utilização,
então eles são excluídos automaticamente.
GlobalVariablesTotal
R etorna o número total de Variáveis Globais do T erminal de Cliente.
int GlobalVariablesTotal();
Valor do Retorno
Número de variáveis globais.
Observação
As variáveis globais existem no terminal do cliente durante 4 semanas desde a última utilização,
então eles são excluídos automaticamente. Chamada de uma variável global está a definir não só
um novo valor, mas também a leitura do valor da variável global.
Funções de Arquivo
Este é um grupo de funções para trabalhar com arquivos.
Por razões de segurança, o trabalho com arquivos é estritamente controlada na língua MQL5. Arquivos
com que as operações de arquivo são conduzidas usando os meios MQL5, não podem estar fora da
caixa de proteção do arquivo.
· terminal_data_folder\ MQL5\FI LES \ (no menu do terminal selecione para ver " Arquivo" - " Abrir o
diretório de dados " );
· na pasta comum para todos os terminais instalados no computador - geralmente no diretório C:
\Documents and Settings \All Users \Application Data\MetaQuotes \T erminal\Common\Files (C:
\Documentos e Configurações \T odos Usuários \Dados de Aplicativos \MetaQuotes \Comum\Files).
Existe um método de programa para obter nome destes catálogos usando a função
T erminalInfoString(), usando a enumeração ENUM _T ER M INAL _INFO_S TRING:
Funções de arquivo permitem trabalhar com os assim chamados " pipes nomeados " . Para isto, chamar
simplesmente a função FileOpen() com o parâmetro apropriado.
Função Ação
FileSelectDialog Cria uma caixa de diálogo para abrir/criar um
arquivo ou pasta
FileSelectDialog
Cria uma caixa de diálogo para abrir/criar um arquivo ou pasta.
int FileSelectDialog(
string caption, // barra de título
string initial_dir, // pasta inicial
string filter, // filtro de extensão
uint flags, // combinação de sinalizadores
string& filenames[], // matriz contendo os nomes dos arquivos
string default_filename // nome do arquivo por padrão
);
Parâmetros
caption
[in] T ítulo da caixa de diálogo.
initial_dir
[in] Nome da pasta inicial relativa à pasta MQL5\Files, cujo conteúdo será exibido na caixa de
diálogo. Se o valor for igual a NULL, na caixa de diálogo será mostrada a pasta MQL5\Files.
filter
[in] Filtro de extens ões de arquivos que serão mostradas na caixa de diálogo para serem
selecionadas. Arquivos de outros formatos ficarão ocultos.
flags
[in] Combinação de sinalizadores que define o modo da caixa de diálogo. Os sinalizadores são
definidos da seguinte maneira:
FS D_WRIT E_FILE – diálogo de abertura de arquivo
FS D_SELECT_FOL DER – permite selecionar apenas pastas ;
FS D_ALLOW_M UL TISELECT – permite selecionar alguns arquivos ;
FS D_FILE_M US T_EXIS T – os arquivos selecionados devem existir;
FS D_COMMON_FOL DER – o arquivo está localizado na pasta compartilhada de terminais do cliente
\T erminal\Common\Files.
filenames[]
[out] Matriz de linhas na qual serão colocados os nomes dos arquivos /pastas selecionados.
default_filename
[in] Nome do arquivo/pasta por padrão. Se especificado, esse nome será automaticamente
substituído no diálogo de abertura e retornado na matriz filenames[] durante o teste.
Valor retornado
Se for bem-sucedida, a função retornará o número de arquivos selecionados cujos nomes podem ser
obtidos em filenames[]. Se o usuário não selecionar o arquivo e fechar a caixa de diálogo, a função
retornará 0. Em caso de execução mal sucedida retornará um valor menor que 0, código de erro
poderá ser obtido com a ajuda de GetLastError().
Observação
A função é proibida em indicadores personalizados, uma vez que a chamada para FileSelectDialog()
interrompe o trabalho do thread de execução durante todo o tempo de espera pela resposta do
usuário. Como todos os indicadores de cada símbolo são executados num único thread, o
funcionamento de todos os gráficos em todos os períodos gráficos do símbolo em questão será
interrompido.
Exemplo:
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- obtemos os nomes dos arquivos de texto para carregamento a partir da pasta compartilhada de t
string filenames[];
if(FileSelectDialog("Selecionar arquivos para carregamento", NULL,
"Text files (*.txt)|*.txt|All files (*.*)|*.*",
FSD_ALLOW_MULTISELECT|FSD_COMMON_FOLDER, filenames, "data.txt")>0)
{
//--- exibimos o nome de cada arquivo selecionado
int total=ArraySize(filenames);
for(int i=0; i<total; i++)
Print(i, ": ", filenames[i]);
}
else
{
Print("Files not selected");
}
//---
}
Veja também
FileOpen, FileIsExist, FileDelete, FileMove, FolderCreate, FolderDelete, FolderClean, Sinalizadores
de abertura de arquivos
FileFindFirst
A função começa a busca de arquivos e subdiretórios em um diretório de acordo com o filtro
especificado.
long FileFindFirst(
const string file_filter, // String - filtro de pesquisa
string& returned_filename, // Nome do arquivo ou subdiretório encontrado
int common_flag=0 // Define a pesquisa
);
Parâmetros
file_filter
[in] Filtro de pesquisa. Um subdiretório (ou seqüência de subdiretórios aninhados) relativo ao
diretório \Files, em que os arquivos devem ser procurados, podem ser especificados no filtro.
returned_filename
[out] O parâmetro retornado, onde, em caso de sucesso, o nome do primeiro arquivo encontrado
ou subdiretório é colocado. Only the file name is returned (including the extension), the directories
and subdirectories are not included no matter if they are specified or not in the search filter.
common_flag
[in] Bandeira determinando a localização do arquivo. Se common_flag = FILE_COMMON, então o
arquivo está localizado em uma pasta compartilhada para todos os terminais de cliente
\T erminal\Common\Files. Caso contrário, o arquivo está localizado em uma pasta local.
Valor do Retorno
R etorna o manipulador do objeto pesquisado, que deve ser utilizado para posterior triagem dos
arquivos e subdiretórios pela função FileFindNext(), ou INVAL ID_H ANDLE quando não há nenhum
arquivo e subdiretório correspondente ao filtro (no caso particular - quando o diretório está vazio.
Após a pesquisa, o manipulador deve ser fechado usando a função FileFindClose().
Observação
Por razões de segurança, o trabalho com arquivos é estritamente controlada na língua MQL5.
Arquivos com que as operações de arquivo são conduzidas usando os meios MQL5, não podem estar
fora da caixa de proteção do arquivo.
Exemplo:
//--- 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!");
}
Também Veja
FileFindNext, FileFindClose
FileFindNext
A função continua a busca iniciada por FileFindFirst().
bool FileFindNext(
long search_handle, // Manipular pesquisa
string& returned_filename // Nome do arquivo ou subdiretório encontrado
);
Parâmetros
search_handle
[in] Manipulador de pesquisa, recuperado por FileFindFirst().
returned_filename
[out] O nome do próximo arquivo ou subdiretório encontrado. Only the file name is returned
(including the extension), the directories and subdirectories are not included no matter if they are
specified or not in the search filter.
Valor do Retorno
Se bem sucedido retorna verdadeiro, caso contrário false.
Exemplo:
//--- mosta a janela dos parâmetros de entrada quando lançado o script
#property script_show_inputs
//--- filtro
input string InpFilter="*";
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
string file_name;
int i=1;
//--- receber o manipulador de pesquisa na raiz da pasta local
long search_handle=FileFindFirst(InpFilter,file_name);
//--- verificar se FileFindFirst() é executada com sucesso
if(search_handle!=INVALID_HANDLE)
{
//--- verificar se as strings passadas são nomes de arquivo ou diretório no loop
do
{
ResetLastError();
//--- se este é um arquivo, a função retornará verdadeiro, se é um diretório, a função irá
FileIsExist(file_name);
PrintFormat("%d : %s nome = %s",i,GetLastError()==ERR_FILE_IS_DIRECTORY ? "Diretório" : "A
i++;
}
while(FileFindNext(search_handle,file_name));
Também Veja
FileFindFirst, FileFindClose
FileFindClose
A função fecha o identificador pesquisa.
void FileFindClose(
long search_handle // Manipular pesquisa
);
Parâmetros
search_handle
[in] Manipulador de pesquisa, recuperado por FileFindFirst().
Valor do Retorno
Sem valor retornado.
Observação
Função deve ser chamado para liberar recursos do sistema.
Exemplo:
//--- mosta a janela dos parâmetros de entrada quando lançado o script
#property script_show_inputs
//--- filtro
input string InpFilter="*";
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
string file_name;
int i=1;
//--- receber o manipulador de pesquisa na raiz da pasta local
long search_handle=FileFindFirst(InpFilter,file_name);
//--- verificar se FileFindFirst() é executada com sucesso
if(search_handle!=INVALID_HANDLE)
{
//--- verificar se as strings passadas são nomes de arquivo ou diretório no loop
do
{
ResetLastError();
//--- se este é um arquivo, a função retornará verdadeiro, se é um diretório, a função irá
FileIsExist(file_name);
PrintFormat("%d : %s nome = %s",i,GetLastError()==5018 ? "Diretório" : "Arquivo",file_name
i++;
}
while(FileFindNext(search_handle,file_name));
//--- Fechar manipulador de pesquisa
FileFindClose(search_handle);
}
else
Print("Arquivo não encontrado!");
}
Também Veja
FileFindFirst, FileFindNext
FileIsExist
Verifica a existência de um arquivo.
bool FileIsExist(
const string file_name, // Nome do arquivo
int common_flag=0 // Área de pesquisa
);
Parâmetros
file_name
[in] O nome do arquivo a ser verificado
common_flag=0
[in] Bandeira determinando a localização do arquivo. Se common_flag = FILE_COMMON, então o
arquivo está localizado em uma pasta compartilhada para todos os terminais de cliente
\T erminal\Common\Files. Caso contrário, o arquivo está localizado em uma pasta local.
Valor do Retorno
R etorna true, se o arquivo especificado existe.
Observação
Arquivo verificado pode vir a ser um subdiretório. Neste caso, FileIsExist() função retornará falso,
enquanto o erro 5018 será registrada na variável _LastError - " Este é um diretório, não é um
arquivo" (ver exemplo pela função FileFindFirst).
Por razões de segurança, o trabalho com arquivos é estritamente controlada na língua MQL5.
Arquivos com que as operações de arquivo são conduzidas usando os meios MQL5, não podem estar
fora da caixa de proteção do arquivo.
Exemplo:
//--- mostrar a janela de parâmetros de entrada quando do lançamento do script
#property script_show_inputs
//--- data para arquivos antigos
input datetime InpFilesDate=D'2013.01.01 00:00';
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
string file_name; // variável para armazenar os nomes dos arquivos
string filter="*.txt"; // filtrar parar pesquisar os arquivos
datetime create_date; // data de criação do arquivo
string files[]; // lista de nome dos arquivos
int def_size=25; // tamanho do array por padrão
Também Veja
FileFindFirst
FileOpen
A função abre o arquivo com o nome e a bandeira especificada.
int FileOpen(
string file_name, // Nome do arquivo
int open_flags, // Combinação de bandeiras
short delimiter='\t', // Delimitador
uint codepage=CP_ACP // Página de código
);
Parâmetros
file_name
[in] O nome do arquivo pode conter sub-pastas. Se o arquivo é aberto para escrita, estas sub-
pastas serão criadas se elas não existirem.
open_flags
[in] combinação de bandeiras que determinam o modo de operação para o arquivo. As bandeiras
são definidas das seguintes formas :
FILE_R EAD arquivo é aberto para leitura
FILE_WRIT E arquivo é aberto para a escrita
FILE_BIN modo binário de leitura e escrita(sem conversão de uma string e para uma string)
FILE_CS V arquivo do tipo csv (todos os itens registrados são convertidos para as strings de tipo
unicode ou ansi, e são separados por um delimitador)
FILE_TXT um arquivo de texto simples (o mesmo que csv, mas o delimitador não é levado em
conta)
FILE_ANS I linhas do tipo ANS I (símbolos de um byte)
FILE_UNICODE linhas do tipo UNICODE (caracteres de bytes duplos)
FILE_S H AR E_R EAD leitura partilhada entre v ários programas
FILE_S H AR E_WRIT E escrita partilhada entre v ários programas
FILE_COMMON localização do arquivo em uma pasta compartilhada para todos os terminais de
cliente \T erminal\Common\Files.
delimiter='\t'
[in] valor a ser usado como um separador em txt ou csv -file. Se o arquivo .csv delimitador não for
especificado, o padrão é uma tabulação. Se o arquivo .txt delimitador não for especificado, então
nenhum separador é usado. Se o separador está claramente definido para 0, então nenhum
separador é usado.
codepage=CP_ACP
[in] O valor do código de página. Para os mais usados códigos de página forneça as constantes
apropriadas.
Valor do Retorno
Se um arquivo foi aberto com sucesso, a função retorna o manipulador de arquivo, que é então
usado para acessar os dados do arquivo. Em caso de falha retorna INVAL ID_H ANDLE.
Observação
Por razões de segurança, o trabalho com arquivos é estritamente controlada na língua MQL5.
Arquivos com que as operações de arquivo são conduzidas usando os meios MQL5, não podem estar
fora da caixa de proteção do arquivo.
Se o arquivo precisar ser lido em uma codificação específica (o parâmetro codepage é especificado
com o valor da página de códigos), deverá ser definido o sinalizador FILE_ANS I. Se o sinalizador
FILE_ANS I não for especificado, o arquivo de texto será lido em Unicode, sem nenhuma conversão.
" Pipes nomeados " pode ser aberta de acordo com as seguintes regras :
· Nome do pipe é uma string, que deve ter o seguinte aspecto: "\\ servername\ pipe\ pipeName" ,
onde servername - nome do servidor na rede, enquanto pipename é um nome de tubo. Se os
tubos são utilizados no mesmo computador, o nome do servidor pode ser omitido, mas num ponto
devem ser inseridos em vez do mesmo: "\\.\pipe\pipename" . Um cliente tenta conectar o tubo
deve saber o seu nome.
· FileFlush() e FileSeek () deve ser chamado para o início de um arquivo entre as operações
seqüenciais de leitura do tubo e grav á-lo.
Um símbolo '\' especial é usado em strings expostas. Portanto, '\' deve ser redobrada quando se
escreve um nome na aplicação MQL5. Isso significa que o exemplo acima deve ter o seguinte
aspecto no código: "\\\\servername\\pipe\\pipename" .
Mais informações sobre como trabalhar com pipes nomeados pode ser encontrada no artigo
" Communicating W ith MetaT rader 5 Using Named Pipes W ithout Using DLLs " .
Exemplo:
//+------------------------------------------------------------------+
//| Programa Script da funзгo start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
//--- mйtodo de abertura de arquivo incorreto
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("Falha para abrir o arquivo pelo caminho absoluto ");
Print("Cуdigo de erro ",GetLastError());
}
//--- maneira correta de trabalhar no "sandbox arquivo"
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("Operaзгo FileOpen falhou, erro ",GetLastError());
//--- outro exemplo com a criaзгo de um diretуrio fechado em 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("O arquivo serб criado na pasta "+terminal_data_path+"\\"+subfolder);
}
else Print("Falha ao abrir arquivo, erro ",GetLastError());
}
Também Veja
Utilização de uma página de código (Codepage), FileFindFirst, FolderCreate, Bandeiras de abertura
de arquivos
FileClose
Feche o arquivo previamente aberto por FileOpen().
void FileClose(
int file_handle // Manipulador de arquivo
);
Parâmetros
file_handle
[in] Descritor de arquivo retornado pelo FileOpen().
Valor do Retorno
Sem valor retornado.
Exemplo:
//--- mostrar a janela de parâmetros de entrada quando do lançamento do script
#property script_show_inputs
//--- parâmetros de entrada
input string InpFileName="file.txt"; // nome do arquivo
input string InpDirectoryName="Data"; // nome do diretório
input int InpEncodingType=FILE_ANSI; // ANSI=32 ou UNICODE=64
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
//--- Imprimir o caminho para o arquivo que vamos usar
PrintFormat("Trabalhando %s\\Arquivos\\ pasta",TerminalInfoString(TERMINAL_DATA_PATH));
//--- redefine o valor de erro
ResetLastError();
//--- abrir um arquivo para leitura(se não existe arquivo, ocorrerá um erro)
int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_TXT|InpEncodingType);
if(file_handle!=INVALID_HANDLE)
{
//--- imprimir o conteúdo do arquivo
while(!FileIsEnding(file_handle))
Print(FileReadString(file_handle));
//--- fechar o arquivo
FileClose(file_handle);
}
else
PrintFormat("Erro, código = %d",GetLastError());
}
FileCopy
A função copia o arquivo original a partir de uma pasta local ou compartilhada para outro arquivo.
bool FileCopy(
const string src_file_name, // Nome de um arquivo fonte
int common_flag, // Localização
const string dst_file_name, // Nome do arquivo de destino
int mode_flags // Modo de acesso
);
Parâmetros
src_file_name
[in] O nome do arquivo para cópia.
common_flag
[in] Bandeira determinando a localização do arquivo. Se common_flag = FILE_COMMON, então o
arquivo está localizado em uma pasta compartilhada para todos os terminais de cliente
\T erminal\Common\Files. Caso contrário, o arquivo está localizado em uma pasta local (por
exemplo, common_flag=0).
dst_file_name
[in] R esultado nome do arquivo.
mode_flags
[in] Bandeiras de acesso. O parâmetro pode conter apenas duas bandeiras : FILE_R EWRIT E e/ou
FILE_COMMON - outras bandeiras são ignoradas. Se o arquivo já existe, e a bandeira
FILE_R EWRIT E não foi especificado, então o arquivo não será reescrito e a função retornará false.
Valor do Retorno
Em caso de falha a função retornará false.
Observação
Por razões de segurança, o trabalho com arquivos é estritamente controlada na língua MQL5.
Arquivos com que as operações de arquivo são conduzidas usando os meios MQL5, não podem estar
fora da caixa de proteção do arquivo.
Exemplo:
//--- mosta a janela dos parâmetros de entrada quando lançado o script
#property script_show_inputs
//--- parâmetros de entrada
input string InpSrc="source.txt"; // source
input string InpDst="destination.txt"; // copy
input int InpEncodingType=FILE_ANSI; // ANSI=32 ou UNICODE=64
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
//--- exibir o conteúdo de origem (que deve existir)
if(!FileDisplay(InpSrc))
return;
//--- verifique se a cópia do arquivo já existe (não pode ser criado)
if(!FileDisplay(InpDst))
{
//--- a cópia de arquivo não existe, copiando sem a bandeira FILE_REWRITE (cópia correta)
if(FileCopy(InpSrc,0,InpDst,0))
Print("Arquivo está copiado!");
else
Print("Arquivo não está copiado!");
}
else
{
//--- cópia do arquivo já existe, tente copiar sem a bandeira FILE_REWRITE (cópia incorreta)
if(FileCopy(InpSrc,0,InpDst,0))
Print("Arquivo está copiado!");
else
Print("Arquivo não está copiado!");
//--- conteúdo do arquivo InpDst continua o mesmo
FileDisplay(InpDst);
//--- copiar mais uma vez com a bandeira FILE_REWRITE (copiando correto, se o arquivo existe)
if(FileCopy(InpSrc,0,InpDst,FILE_REWRITE))
Print("Arquivo está copiado!");
else
Print("Arquivo não está copiado!");
}
//--- receber cópia de arquivo InpS
FileDisplay(InpDst);
}
//+------------------------------------------------------------------+
//| Ler comentários do arquivo |
//+------------------------------------------------------------------+
bool FileDisplay(const string file_name)
{
//--- redefine o valor de erro
ResetLastError();
//--- abre o arquivo
int file_handle=FileOpen(file_name,FILE_READ|FILE_TXT|InpEncodingType);
if(file_handle!=INVALID_HANDLE)
{
//--- exibir o conteúdo do arquivo no loop
Print("+---------------------+");
PrintFormat("Nome do arquivo = %s",file_name);
while(!FileIsEnding(file_handle))
Print(FileReadString(file_handle));
Print("+---------------------+");
//--- fechar o arquivo
FileClose(file_handle);
return(true);
}
//--- falha para abrir o arquivo
PrintFormat("%s não está aberto, erro = %d",file_name,GetLastError());
return(false);
}
FileDelete
Deletar o arquivo especificado dentro da pasta local do terminal do cliente.
bool FileDelete(
const string file_name, // Nome do arquivo para deletar
int common_flag=0 // Localização do arquivo para deletar
);
Parâmetros
file_name
[in] Nome do arquivo.
common_flag=0
[in] Bandeira determinando a localização do arquivo. Se common_flag = FILE_COMMON, então o
arquivo está localizado em uma pasta compartilhada para todos os terminais de cliente
\T erminal\Common\Files. Caso contrário, o arquivo está localizado em uma pasta local.
Valor do Retorno
Em caso de falha a função retornará false.
Observação
Por razões de segurança, o trabalho com arquivos é estritamente controlada na língua MQL5.
Arquivos com que as operações de arquivo são conduzidas usando os meios MQL5, não podem estar
fora da caixa de proteção do arquivo.
Exclui o arquivo especificado a partir de uma pasta local do terminal do cliente (MQL5\Files ou
MQL5\T ester\Files em caso de testes). Se common_flag = FILE_COMMON, então a função remove o
arquivo da pasta compartilhada para todos os terminais do cliente.
Exemplo:
//--- mostrar a janela de parâmetros de entrada quando do lançamento do script
#property script_show_inputs
//--- data para arquivos antigos
input datetime InpFilesDate=D'2013.01.01 00:00';
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
string file_name; // variável para armazenar os nomes dos arquivos
string filter="*.txt"; // filtrar parar pesquisar os arquivos
datetime create_date; // data de criação do arquivo
string files[]; // lista de nome dos arquivos
int def_size=25; // tamanho do array por padrão
int size=0; // número de arquivos
//--- alocar memória para o array
ArrayResize(files,def_size);
//--- receber o manipulador de pesquisa na raiz da pasta local
long search_handle=FileFindFirst(filter,file_name);
//--- verificar se FileFindFirst() é executada com sucesso
if(search_handle!=INVALID_HANDLE)
{
//--- pesquisando arquivos no loop
do
{
files[size]=file_name;
//--- aumentar o tamanho do array
size++;
if(size==def_size)
{
def_size+=25;
ArrayResize(files,def_size);
}
//--- redefinir o valor de erro
ResetLastError();
//--- receber a data de criação do arquivo
create_date=(datetime)FileGetInteger(file_name,FILE_CREATE_DATE,false);
//--- verificar se o arquivo é antigo
if(create_date<InpFilesDate)
{
PrintFormat("%s arquivo deletado!",file_name);
//--- deletado o arquivo antigo
FileDelete(file_name);
}
}
while(FileFindNext(search_handle,file_name));
//--- fechar o manipulador de pesquisa
FileFindClose(search_handle);
}
else
{
Print("Arquivo não encontrado!");
return;
}
//--- verificar quais os arquivos permanecem
PrintFormat("Resultados:");
for(int i=0;i<size;i++)
{
if(FileIsExist(files[i]))
PrintFormat("%s arquivo existe!",files[i]);
else
PrintFormat("%s arquivo deletado!",files[i]);
}
}
FileMove
Move um arquivo a partir de um local ou a partir de pasta compartilhada para outra pasta.
bool FileMove(
const string src_file_name, // O nome do arquivo para a operação de movimentação
int common_flag, // Locação
const string dst_file_name, // Nome do arquivo de destino
int mode_flags // Modo de acesso
);
Parâmetros
src_file_name
[in] O nome do arquivo para mover/renomear.
common_flag
[in] Bandeira determinando a localização do arquivo. Se common_flag = FILE_COMMON, então o
arquivo está localizado em uma pasta compartilhada para todos os terminais de cliente
\T erminal\Common\Files. Caso contrário, o arquivo está localizado em uma pasta local
(common_flag=0).
dst_file_name
[in] O nome do arquivo após a operação
mode_flags
[in] Bandeiras de acesso. O parâmetro pode conter apenas duas bandeiras : FILE_R EWRIT E e/ou
FILE_COMMON - outras bandeiras são ignoradas. Se o arquivo já existe e a bandeira
FILE_R EWRIT E não for especificada, o arquivo não será reescrito, e a função retornará false.
Valor do Retorno
Em caso de falha a função retornará false.
Observação
Por razões de segurança, o trabalho com arquivos é estritamente controlada na língua MQL5.
Arquivos com que as operações de arquivo são conduzidas usando os meios MQL5, não podem estar
fora da caixa de proteção do arquivo.
Exemplo:
//--- mosta a janela dos parâmetros de entrada quando lançado o script
#property script_show_inputs
//--- parâmetros de entrada
input string InpSrcName="data.txt";
input string InpDstName="newdata.txt";
input string InpSrcDirectory="SomeFolder";
input string InpDstDirectory="OtherFolder";
//+------------------------------------------------------------------+
Também Veja
FileIsExist
FileFlush
Escreve para um disco todos os dados remanescentes dentro da entrada/saída do arquivo buffer.
void FileFlush(
int file_handle // Manipulador de arquivo
);
Parâmetros
file_handle
[in] Descritor de arquivo retornado pelo FileOpen().
Valor do Retorno
Sem valor retornado.
Observação
Ao escrever um arquivo, os dados podem ser realmente encontrados lá só depois de algum tempo.
Para salvar os dados no arquivo instantaneamente, utilize a função FileFlush(). Se a função não é
utilizada, parte dos dados que não tenham sido ainda armazenados no disco, serão forçosamente
escritos lá apenas quando o arquivo é fechado com a funçãoFileClose().
A função deve ser usada quando os dados gravados são de um certo valor. Deve-se ter em mente
que freqüente chamada de função podem afetar a velocidade de operação do programa.
Função FileFlush() deve ser chamado entre as operações de leitura de um arquivo e grav á-lo.
Exemplo:
//--- mostrar a janela de parâmetros de entrada quando do lançamento do script
#property script_show_inputs
//--- Nome do arquivo para escrever
input string InpFileName="example.csv"; // nome do arquivo
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
//--- redefine o valor de erro
ResetLastError();
//--- abre o arquivo
int file_handle=FileOpen(InpFileName,FILE_READ|FILE_WRITE|FILE_CSV);
if(file_handle!=INVALID_HANDLE)
{
//--- gravar dados no arquivo
for(int i=0;i<1000;i++)
{
//--- chamar função de escrever
FileWrite(file_handle,TimeCurrent(),SymbolInfoDouble(Symbol(),SYMBOL_BID),SymbolInfoDouble
//--- salvar os dados no disco a cada iteração (repetição) 128
if((i & 127)==127)
{
//--- agora, os dados serão localizados no arquivo e não serão perdidos no caso de um e
FileFlush(file_handle);
PrintFormat("i = %d, OK",i);
}
//--- 0.01 segunda pausa
Sleep(10);
}
//--- fechar o arquivo
FileClose(file_handle);
}
else
PrintFormat("Erro, código = %d",GetLastError());
}
Também Veja
FileClose
FileGetInteger
Obtém uma propriedade inteira de um arquivo. Existem duas variantes da função.
Parâmetros
file_handle
[in] Descritor de arquivo retornado pelo FileOpen().
file_name
[in] Nome do arquivo.
property_id
[in] Propriedade ID do arquivo. O valor pode ser um dos valores da enumeração
ENUM _FILE_PR OPERTY_INT EGER . Se a segunda variante da função é usada, você pode receber
apenas os valores das seguintes propriedades : FILE_EXIS T S, FILE_CR EAT E_DAT E,
FILE_MODIFY_DAT E, FILE_ACCESS _DAT E e FILE_S IZE.
common_folder=false
[in] Pontos para localização de arquivo. Se o parâmetro é false, pasta de dados do terminal é
visualizada. Caso contrário, presume-se que o arquivo está na pasta compartilhada por todos os
terminais \T erminal\Common\Files(FILE_COMMON).
Valor do Retorno
O valor da propriedade. Em caso de erro, -1 é retornado. Para obter um código de erro usar a função
GetLastError().
Se uma pasta está especificada quando obtida a propriedade pelo nome, a função terá erro 5018
(ERR_MQL _FILE_IS _DIR ECT ORY) em qualquer caso, embora o valor de retorno será correto.
Observação
A função sempre altera o código de erro. Em caso de conclusão bem sucedida, o código de erro é
redefinido para NULL.
Exemplo:
//--- mosta a janela dos parâmetros de entrada quando lançado o script
#property script_show_inputs
//--- parâmetros de entrada
input string InpFileName="data.csv";
input string InpDirectoryName="SomeFolder";
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
string path=InpDirectoryName+"//"+InpFileName;
long l=0;
//--- abre o arquivo
ResetLastError();
int handle=FileOpen(path,FILE_READ|FILE_CSV);
if(handle!=INVALID_HANDLE)
{
//--- imprimir todas as informações sobre o arquivo
Print(InpFileName," informação de arquivo:");
FileInfo(handle,FILE_EXISTS,l,"bool");
FileInfo(handle,FILE_CREATE_DATE,l,"data");
FileInfo(handle,FILE_MODIFY_DATE,l,"data");
FileInfo(handle,FILE_ACCESS_DATE,l,"data");
FileInfo(handle,FILE_SIZE,l,"outros");
FileInfo(handle,FILE_POSITION,l,"outros");
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");
//--- fechar o arquivo
FileClose(handle);
}
else
PrintFormat("%s arquivo não está aberto, ErrorCode = %d",InpFileName,GetLastError());
}
//+------------------------------------------------------------------+
//| Mostrar o valor da propriedade de arquivo |
//+------------------------------------------------------------------+
void FileInfo(const int handle,const ENUM_FILE_PROPERTY_INTEGER id,
long l,const string type)
{
//--- receber o valor da propriedade
ResetLastError();
if((l=FileGetInteger(handle,id))!=-1)
{
//--- o valor recebido, exibi-lo no formato correto
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());
}
Também Veja
Operações de Arquivos, Propriedades de Arquivos
FileIsEnding
Define o final do arquivo em processo de leitura.
bool FileIsEnding(
int file_handle // Manipulador de arquivo
);
Parâmetros
file_handle
[in] Descritor de arquivo retornado pelo FileOpen().
Valor do Retorno
A função retorna verdadeiro se o fim do arquivo foi alcançado no processo de leitura ou em
movimento do ponteiro de arquivo.
Observação
Para definir o final do arquivo, a função tenta ler a próxima string a partir dele. Se a string não
existe, a função retorna true, caso contrário, retorna false.
Exemplo:
//--- mostrar a janela de parâmetros de entrada quando do lançamento do script
#property script_show_inputs
//--- parâmetros de entrada
input string InpFileName="file.txt"; // nome do arquivo
input string InpDirectoryName="Data"; // nome do diretório
input int InpEncodingType=FILE_ANSI; // ANSI=32 ou UNICODE=64
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
//--- Imprimir o caminho para o arquivo que vamos usar
PrintFormat("Trabalhando %s\\Arquivos\\ pasta",TerminalInfoString(TERMINAL_DATA_PATH));
//--- redefine o valor de erro
ResetLastError();
//--- abrir um arquivo para leitura(se não existe arquivo, ocorrerá um erro)
int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_TXT|InpEncodingType);
if(file_handle!=INVALID_HANDLE)
{
//--- imprimir o conteúdo do arquivo
while(!FileIsEnding(file_handle))
Print(FileReadString(file_handle));
//--- fechar o arquivo
FileClose(file_handle);
}
else
PrintFormat("Erro, código = %d",GetLastError());
FileIsLineEnding
Define o final da linha do arquivo de texto em processo de leitura.
bool FileIsLineEnding(
int file_handle // Manipulador de arquivo
);
Parâmetros
file_handle
[in] Descritor de arquivo retornado pelo FileOpen().
Valor do Retorno
R etorna true se no processo de leitura do arquivo txt ou csv chegou ao fim da linha (os caracteres
CR-L F).
Exemplo (o arquivo obtido durante a execução de um exemplo para a função FileW riteString é usado
aqui)
//+------------------------------------------------------------------+
//| 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
//---- Plotar Etiqueta1
#property indicator_label1 "Sobre-compra & Sobre-venda"
#property indicator_type1 DRAW_COLOR_BARS
#property indicator_color1 clrRed, clrBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1 2
//--- paramêtros para leitura de dados
input string InpFileName="RSI.csv"; // nome do arquivo
input string InpDirectoryName="Data"; // nome do diretório
//--- buffers do indicador
double open_buff[];
double high_buff[];
double low_buff[];
double close_buff[];
double color_buff[];
//--- variáveis sobre-comprado
int ovb_ind=0;
int ovb_size=0;
datetime ovb_time[];
//---- definir os valores dos indicadores que não serão visíveis no gráfico
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Ler dados do arquivo da string |
//+------------------------------------------------------------------+
void ReadData(const int file_handle,datetime &arr[],int &size,int &def_size)
{
bool flag=false;
//--- é alcançada a leitura até o final da string ou do arquivo
while(!FileIsLineEnding(file_handle) && !FileIsEnding(file_handle))
{
//--- deslocar o transporte após a leitura do número
if(flag)
FileReadNumber(file_handle);
//--- armazenar a data atual
arr[size]=FileReadDatetime(file_handle);
size++;
//--- aumentar tamanho da array, se necessário
if(size==def_size)
{
def_size+=100;
ArrayResize(arr,def_size);
}
//--- passar despercebido a primeira iteração
flag=true;
}
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
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);
//+------------------------------------------------------------------+
//| Manipulador de eventos ChartEvent |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
const long &lparam,
const double &dparam,
const string &sparam
)
{
//---alterar a largura indicador de acordo com a escala
if(ChartGetInteger(0,CHART_SCALE)>3)
PlotIndexSetInteger(0,PLOT_LINE_WIDTH,2);
else
PlotIndexSetInteger(0,PLOT_LINE_WIDTH,1);
}
Também Veja
FileW riteString
FileReadArray
L ê a partir de um arquivo do tipo arrays BIN de qualquer tipo, exceto string (pode ser uma array de
estruturas, não contendo strings e arrays dinâmicas ).
uint FileReadArray(
int file_handle, // Manipular arquivo
void& array[], // Array para gravar
int start=0, // Iniciar posição array para escrever
int count=WHOLE_ARRAY // contar para ler
);
Parâmetros
file_handle
[in] Descritor de arquivo retornado pelo FileOpen().
array[]
[out] Uma array onde os dados serão carregados.
start=0
[in] Posição inicial para escrever para o array.
count=WHOLE_ARRAY
[in] Número de elementos para ler. Pelo padrão, ler todo o array (count=WH OLE_ARR AY).
Valor do Retorno
Número de elementos para ler.
Observação
Array de seqüências pode ser lido apenas a partir do arquivo do tipo TXT . Se necess ário, a função
tenta aumentar o tamanho do array.
Exemplo (o arquivo obtido após a execução do exemplo pela função FileW riteArray é usado aqui)
//--- mosta a janela dos parâmetros de entrada quando lançado o script
#property script_show_inputs
//--- parâmetros de entrada
input string InpFileName="data.bin";
input string InpDirectoryName="SomeFolder";
//+------------------------------------------------------------------+
//| Estrutura para armazenamento de dados de preços |
//+------------------------------------------------------------------+
struct prices
{
datetime date; // data
double bid; // bid preço
double ask; // ask preço
};
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
//--- estrutura array
prices arr[];
//--- caminho do arquivo
string path=InpDirectoryName+"//"+InpFileName;
//--- abre o arquivo
ResetLastError();
int file_handle=FileOpen(path,FILE_READ|FILE_BIN);
if(file_handle!=INVALID_HANDLE)
{
//--- ler todos os dados do arquivo para o array
FileReadArray(file_handle,arr);
//--- receber o tamanho do array
int size=ArraySize(arr);
//--- imprimir dados a partir do array
for(int i=0;i<size;i++)
Print("Data = ",arr[i].date," Bid = ",arr[i].bid," Ask = ",arr[i].ask);
Print("Dados total = ",size);
//--- fechar o arquivo
FileClose(file_handle);
}
else
Print("Abrir arquivo falhou, erro ",GetLastError());
}
Também Veja
Variáveis,FileW riteArray
FileReadBool
L ê a partir do arquivo de CS V de tipo string a partir da posição atual para um delimitador (ou até o fim
da linha de texto) e converte a leitura string para um valor de tipo bool.
bool FileReadBool(
int file_handle // Manipular arquivo
);
Parâmetros
file_handle
[in] Descritor de arquivo retornado pelo FileOpen().
Valor do Retorno
Linha de leitura pode ser definida como " true" , " false" ou a representação simbólica de inteiros "0"
ou "1" . Um valor diferente de zero é convertido para um true lógico. A função retorna o valor
convertido.
Exemplo (o arquivo obtido após a execução do exemplo pela função FileW rite é usado aqui)
//+------------------------------------------------------------------+
//| 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
//---- Plotar Etiqueta1
#property indicator_label1 "UpSignal"
#property indicator_type1 DRAW_ARROW
#property indicator_color1 clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1 4
//---- plotar Label2
#property indicator_label2 "DownSignal"
#property indicator_type2 DRAW_ARROW
#property indicator_color2 clrRed
#property indicator_style2 STYLE_SOLID
#property indicator_width2 4
//--- paramêtros para leitura de dados
input string InpFileName="MACD.csv"; // file name
input string InpDirectoryName="Data"; // nome do diretório
//--- variáveis globais
int ind=0; // índice
double upbuff[]; // buffers indicador de setas para cima
Também Veja
T ipo bool, FileW rite
FileReadDatetime
L ê a partir do arquivo do tipo CS V uma string de um dos formatos : "YYYY.MM.DD HH:MM :SS " ,
"YYYY.MM.DD" ou "HH:MM :SS " - e converte-os dentro de valor do tipo datetime.
datetime FileReadDatetime(
int file_handle // Manipular arquivo
);
Parâmetros
file_handle
[in] Descritor de arquivo retornado pelo FileOpen().
Valor do Retorno
O valor do tipo datetime.
Exemplo (o arquivo obtido após a execução do exemplo pela função FileW rite é usado aqui)
//+------------------------------------------------------------------+
//| 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
//---- Plotar Etiqueta1
#property indicator_label1 "UpSignal"
#property indicator_type1 DRAW_ARROW
#property indicator_color1 clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1 4
//---- plotar Label2
#property indicator_label2 "DownSignal"
#property indicator_type2 DRAW_ARROW
#property indicator_color2 clrRed
#property indicator_style2 STYLE_SOLID
#property indicator_width2 4
//--- paramêtros para leitura de dados
input string InpFileName="MACD.csv"; // file name
input string InpDirectoryName="Data"; // nome do diretório
//--- variáveis globais
int ind=0; // índice
double upbuff[]; // buffers indicador de setas para cima
double downbuff[]; // buffers indicador de setas para baix
bool sign_buff[]; // sinal array (verdadeiro - comprar, falso - vender)
Também Veja
T ipo datetime, String T oT ime, T imeT oString, FileW rite
FileReadDouble
L ê uma dupla precisão de número de ponto (double) flutuante a partir da posição atual do arquivo
binário.
double FileReadDouble(
int file_handle // Manipular arquivo
);
Parâmetros
file_handle
[in] Descritor de arquivo retornado pelo FileOpen().
Valor do Retorno
Valor de tipo double.
Observação
Para mais detalhes sobre erro, chamar GetLastError().
Exemplo (o arquivo obtido após a execução do exemplo para a função FileW riteDouble é usado aqui)
//+------------------------------------------------------------------+
//| 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
//---- Plotar Etiqueta1
#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
//--- leitura de dados de parâmetros
input string InpFileName="MA.csv"; // nome do arquivo
input string InpDirectoryName="Data"; // nome do diretório
//--- variáveis globais
int ind=0;
int size=0;
double ma_buff[];
datetime time_buff[];
//--- buffer do indicador
double buff[];
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado |
//+------------------------------------------------------------------+
int OnInit()
{
//--- abre o arquivo
ResetLastError();
int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_BIN);
if(file_handle!=INVALID_HANDLE)
{
PrintFormat("%s arquivo está disponível para leitura",InpFileName);
PrintFormat("Caminho do arquivo: %s\\Files\\",TerminalInfoString(TERMINAL_DATA_PATH));
//--- em primeiro lugar, ler a quantidade de dados no arquivo
size=(int)FileReadDouble(file_handle);
//--- alocar memória para os arrays
ArrayResize(ma_buff,size);
ArrayResize(time_buff,size);
//--- ler dados de um arquivo
for(int i=0;i<size;i++)
{
time_buff[i]=(datetime)FileReadDouble(file_handle);
ma_buff[i]=FileReadDouble(file_handle);
}
//--- fechar o arquivo
FileClose(file_handle);
PrintFormat("Os dados são escritos, %s arquivo esta fechado",InpFileName);
}
else
{
PrintFormat("Falha para abrir %s arquivo, Código de erro = %d",InpFileName,GetLastError());
return(INIT_FAILED);
}
//--- Associa o array ao buffer do indicador com índice 0
SetIndexBuffer(0,buff,INDICATOR_DATA);
//---- definir os valores dos indicadores que não serão visíveis no gráfico
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
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[],
Também Veja
T ipos reais (double, float), String T oDouble, DoubleT oString, FileW riteDouble
FileReadFloat
L ê a precisão simples de um número (float) de ponto a partir da posição atual do arquivo binário.
float FileReadFloat(
int file_handle // Manipular arquivo
);
Parâmetros
file_handle
[in] Descritor de arquivo retornado pelo FileOpen().
Valor do Retorno
O valor do tipo float.
Observação
Para mais detalhes sobre erro, chamar GetLastError().
Exemplo (o arquivo obtido após a execução do exemplo pela função FileW riteFloat é usado aqui)
//+------------------------------------------------------------------+
//| 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
//---- Plotar Etiqueta1
#property indicator_label1 "CloseLine"
#property indicator_type1 DRAW_COLOR_LINE
#property indicator_color1 clrRed,clrBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1 2
//--- paramêtros para leitura de dados
input string InpFileName="Close.bin"; // file name
input string InpDirectoryName="Data"; // nome do diretório
//--- variáveis globais
int ind=0;
int size=0;
double close_buff[];
datetime time_buff[];
//--- buffers do indicador
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);
//---o loop para as barras que ainda não foram manipuladas
for(int i=prev_calculated;i<rates_total;i++)
{
//--- 0 por padrão
buff[i]=0;
color_buff[i]=0; // cor vermelha por padrão
//---verificar se todos os dados ainda estão presente
if(ind<size)
{
for(int j=ind;j<size;j++)
{
//--- se as datas coincidem, usar o valor do arquivo
if(time[i]==time_buff[j])
{
//--- receber o preço
buff[i]=close_buff[j];
//--- se o preço atual excede o anterior, a cor é azul
if(buff[i-1]>buff[i])
color_buff[i]=1;
//--- aumentar o contador
ind=j+1;
break;
}
}
}
}
//--- valor retorno de prev_calculated para a próxima chamada
return(rates_total);
}
Também Veja
T ipos R eais (double, float), FileR eadDouble, FileW riteFloat
FileReadInteger
A função lê os valores int, short ou char a partir da posição atual do ponteiro do arquivo, dependendo
do comprimento especificado em bytes.
int FileReadInteger(
int file_handle, // Manipular Arquivo
int size=INT_VALUE // Tamanho de um inteiro em bytes
);
Parâmetros
file_handle
[in] Descritor de arquivo retornado pelo FileOpen().
size=INT_VALUE
[in] Número de bytes (até 4 inclusive), que devem ser lidos. As constantes correspondentes são
fornecidos : CH AR_VAL UE = 1, S H ORT_VAL UE = 2 e INT_VAL UE = 4, então a função pode ler todo o
valor do tipo char, short ou int.
Valor do Retorno
Um valor do tipo int. O resultado desta função deve ser explicitamente convertido para um tipo de
destino, ou seja, para o tipo de dados que você precisa ler. Uma vez que um valor do tipo int é
retornado, ele pode ser facilmente convertido para qualquer valor inteiro. O ponteiro do arquivo é
deslocado pelo número de bytes lidos.
Observação
Quando ler menos do que 4 bytes, o resultado recebido é sempre positivo. Se um ou dois bytes são
lidos, o sinal do número pode ser determinado por colagem explícita do tipo char (1 byte) ou short (2
bytes). R ecebendo o sinal para um número de três bytes não é simples, uma vez que não há
nenhuma correspondente tipo subjacente.
Exemplo (o arquivo obtido após a execução do exemplo pela função FileW riteInteger é usado aqui)
//+------------------------------------------------------------------+
//| 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
//---- Plotar Etiqueta1
#property indicator_label1 "Trends"
#property indicator_type1 DRAW_SECTION
#property indicator_color1 clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- paramêtros para leitura de dados
input string InpFileName="Trend.bin"; // file name
input string InpDirectoryName="Data"; // nome do diretório
//--- variáveis globais
int ind=0;
int size=0;
datetime time_buff[];
//--- buffers do indicador
double buff[];
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado |
//+------------------------------------------------------------------+
int OnInit()
{
int def_size=100;
//--- alocar memória para o array
ArrayResize(time_buff,def_size);
//--- abre o arquivo
ResetLastError();
int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_BIN);
if(file_handle!=INVALID_HANDLE)
{
PrintFormat("%s arquivo está disponível para leitura",InpFileName);
PrintFormat("Caminho do arquivo: %s\\Files\\",TerminalInfoString(TERMINAL_DATA_PATH));
//--- variáveis adicionais
int arr_size;
uchar arr[];
//--- ler dados de um arquivo
while(!FileIsEnding(file_handle))
{
//--- descobrir quantos símbolos são usados para escrever o tempo
arr_size=FileReadInteger(file_handle,INT_VALUE);
ArrayResize(arr,arr_size);
for(int i=0;i<arr_size;i++)
arr[i]=(char)FileReadInteger(file_handle,CHAR_VALUE);
//--- armazenar o valor de tempo
time_buff[size]=StringToTime(CharArrayToString(arr));
size++;
//--- aumentar as dimensões arrays, se são transbordados
if(size==def_size)
{
def_size+=100;
ArrayResize(time_buff,def_size);
}
}
//--- fechar o arquivo
FileClose(file_handle);
PrintFormat("Dados são lidos, %s arquivo está fechado",InpFileName);
}
else
{
PrintFormat("Falha para abrir %s arquivo, Código de erro = %d",InpFileName,GetLastError());
return(INIT_FAILED);
}
//--- ligar array para buffer de indicador
SetIndexBuffer(0,buff,INDICATOR_DATA);
//---- definir os valores dos indicadores que não serão visíveis no gráfico
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
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(close,false);
//---o loop para as barras que ainda não foram manipuladas
for(int i=prev_calculated;i<rates_total;i++)
{
//--- 0 por padrão
buff[i]=0;
//---verificar se todos os dados ainda estão presente
if(ind<size)
{
for(int j=ind;j<size;j++)
{
//--- se as datas coincidem, usar o valor do arquivo
if(time[i]==time_buff[j])
{
//--- receber o preço
buff[i]=close[i];
//--- aumentar o contador
ind=j+1;
break;
}
}
}
}
//--- valor retorno de prev_calculated para a próxima chamada
return(rates_total);
}
Também Veja
IntegerT oString, String T oInteger, T ipos inteiros, FileW riteInteger
FileReadLong
A função lê um inteiro do tipo long (8 bytes) a partir da posição atual do arquivo binário.
long FileReadLong(
int file_handle // Manipular arquivo
);
Parâmetros
file_handle
[in] Descritor de arquivo retornado pelo FileOpen().
Valor do Retorno
Valor de tipo long.
Exemplo (o arquivo obtido durante a execução de um exemplo para a função FileW riteLong é usado
aqui)
//+------------------------------------------------------------------+
//| 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
//---- Plotar Etiqueta1
#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
//--- paramêtros para leitura de dados
input string InpFileName="Volume.bin"; // file name
input string InpDirectoryName="Data"; // directory name
//--- variáveis globais
int ind=0;
int size=0;
long volume_buff[];
datetime time_buff[];
//--- buffers do indicador
double buff[];
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado |
//+------------------------------------------------------------------+
int OnInit()
{
//--- abre o arquivo
ResetLastError();
int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_BIN);
if(file_handle!=INVALID_HANDLE)
{
PrintFormat("%s arquivo está aberto para escrita",InpFileName);
PrintFormat("Caminho do arquivo: %s\\Files\\",TerminalInfoString(TERMINAL_DATA_PATH));
//--- em primeiro lugar, ler a quantidade de dados no arquivo
size=(int)FileReadLong(file_handle);
//--- alocar memória para os arrays
ArrayResize(volume_buff,size);
ArrayResize(time_buff,size);
//--- ler dados de um arquivo
for(int i=0;i<size;i++)
{
time_buff[i]=(datetime)FileReadLong(file_handle);
volume_buff[i]=FileReadLong(file_handle);
}
//--- fechar o arquivo
FileClose(file_handle);
PrintFormat("Dados são lidos, %s arquivo está fechado",InpFileName);
}
else
{
PrintFormat("Falha para abrir %s arquivo, Código de erro = %d",InpFileName,GetLastError());
return(INIT_FAILED);
}
//--- associa o array ao buffer do indicador com índice 0
SetIndexBuffer(0,buff,INDICATOR_DATA);
//---- definir os valores dos indicadores que serão visíveis no gráfico
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
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);
//---o loop para as barras que ainda não foram manipuladas
for(int i=prev_calculated;i<rates_total;i++)
{
//--- 0 por padrão
buff[i]=0;
//---verificar se todos os dados ainda estão presente
if(ind<size)
{
for(int j=ind;j<size;j++)
{
//--- se as datas coincidem, usar o valor do arquivo
if(time[i]==time_buff[j])
{
buff[i]=(double)volume_buff[j];
ind=j+1;
break;
}
}
}
}
//--- valor retorno de prev_calculated para a próxima chamada
return(rates_total);
}
Também Veja
T ipos Inteiros, FileR eadInteger, FileW riteLong
FileReadNumber
A função lê do arquivo CS V uma string a partir da posição atual até um separador (ou até o fim de uma
seqüência de texto) e converte a string de leitura para um valor do tipo double.
double FileReadNumber(
int file_handle // Manipular arquivo
);
Parâmetros
file_handle
[in] Descritor de arquivo retornado pelo FileOpen().
Valor do Retorno
Valor de tipo double.
Exemplo (o arquivo obtido durante a execução de um exemplo para a função FileW riteString é usado
aqui)
//+------------------------------------------------------------------+
//| 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
//---- Plotar Etiqueta1
#property indicator_label1 "Sobre-compra & Sobre-venda"
#property indicator_type1 DRAW_COLOR_BARS
#property indicator_color1 clrRed, clrBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1 2
//--- paramêtros para leitura de dados
input string InpFileName="RSI.csv"; // nome do arquivo
input string InpDirectoryName="Data"; // nome do diretório
//--- buffers do indicador
double open_buff[];
double high_buff[];
double low_buff[];
double close_buff[];
double color_buff[];
//--- variáveis sobre-comprado
int ovb_ind=0;
int ovb_size=0;
datetime ovb_time[];
//---- definir os valores dos indicadores que não serão visíveis no gráfico
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Ler dados do arquivo da string |
//+------------------------------------------------------------------+
void ReadData(const int file_handle,datetime &arr[],int &size,int &def_size)
{
bool flag=false;
//--- é alcançada a leitura até o final da string ou do arquivo
while(!FileIsLineEnding(file_handle) && !FileIsEnding(file_handle))
{
//--- deslocar o transporte após a leitura do número
if(flag)
FileReadNumber(file_handle);
//--- armazenar a data atual
arr[size]=FileReadDatetime(file_handle);
size++;
//--- aumentar tamanho da array, se necessário
if(size==def_size)
{
def_size+=100;
ArrayResize(arr,def_size);
}
//--- passar despercebido a primeira iteração
flag=true;
}
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
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);
//+------------------------------------------------------------------+
//| Manipulador de eventos ChartEvent |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
const long &lparam,
const double &dparam,
const string &sparam
)
{
//---alterar a largura indicador de acordo com a escala
if(ChartGetInteger(0,CHART_SCALE)>3)
PlotIndexSetInteger(0,PLOT_LINE_WIDTH,2);
else
PlotIndexSetInteger(0,PLOT_LINE_WIDTH,1);
}
Também Veja
FileW riteString
FileReadString
A função lê uma string a partir da posição atual do ponteiro de arquivo dentro de um arquivo.
string FileReadString(
int file_handle, // Manipular arquivo
int length=-1 // Comprimento string
);
Parâmetros
file_handle
[in] Descritor de arquivo retornado pelo FileOpen().
length=-1
[in] Número de caracteres para ler.
Valor do Retorno
Ler linha (string).
Observação
Quando ler a partir de um arquivo bin, o tamanho de uma string para ler deve ser especificada.
Quando ler a partir de um arquivo txt, o tamanho da string não é necess ária, e a string será lida a
partir da posição atual para a alimentação da linha caractere "\r\n" . Quando ler a partir de um
arquivo CS V,o tamanho da string não é necess ária também, a string será lida a partir da posição
atual até o mais próximo delimitador ou até string de texto caractere final.
Se o arquivo é aberto com a bandeira FILE_ANS I, então a linha lida é convertida para um Unicode.
Exemplo (o arquivo obtido após a execução do exemplo pela função FileW riteInteger é usado aqui)
//--- mosta a janela dos parâmetros de entrada quando lançado o script
#property script_show_inputs
//--- paramêtros para leitura de dados
input string InpFileName="Trend.bin"; // file name
input string InpDirectoryName="Data"; // nome do diretório
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
//--- abre o arquivo
ResetLastError();
int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_BIN|FILE_ANSI);
if(file_handle!=INVALID_HANDLE)
{
PrintFormat("%s arquivo está disponível para leitura",InpFileName);
PrintFormat("Caminho do arquivo: %s\\Files\\",TerminalInfoString(TERMINAL_DATA_PATH));
//--- variáveis adicionais
int str_size;
string str;
Também Veja
T ipo string, Conversão de Dados, FileW riteInteger
FileReadStruct
A função lê o conteúdo em uma estrutura passada como um parâmetro a partir de um arquivo binário,
começando com a posição atual do ponteiro de arquivo.
uint FileReadStruct(
int file_handle, // Manipular arquivo
const void& struct_object, // estrutura alvo para o qual os conteúdos são lidos
int size=-1 // tamanho da estrutura em bytes
);
Parâmetros
file_handle
[in] Descritor de arquivo para abrir um arquivo bin.
struct_object
[out] O objeto desta estrutura. A estrutura não deve conter strings, arrays dinâmicas, funções
virtuais, objetos de classes, bem como ponteiros para objetos e funções.
size=-1
[in] Número de bytes que devem ser lidos. Se a dimensão não for especificado ou a indicação do
valor é maior do que o tamanho da estrutura, o tamanho exato da especificada estrutura é usado.
Valor do Retorno
Se for bem sucedido, a função retorna o número de bytes lidos. Ponteiro de arquivo é movido pelo
mesmo número de bytes.
Exemplo (o arquivo obtido após a utilização do exemplo para a função FileW riteStruct é usado aqui)
//+------------------------------------------------------------------+
//| 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
//---- Plotar Etiqueta1
#property indicator_label1 "Candles"
#property indicator_type1 DRAW_CANDLES
#property indicator_color1 clrOrange
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
#property indicator_separate_window
//--- parâmetros para recebimento de dados
input string InpFileName="EURUSD.txt"; // nome do arquivo
input string InpDirectoryName="Data"; // nome do diretório
//+------------------------------------------------------------------+
//| Estrutura para armazenar dados candlestick |
//+------------------------------------------------------------------+
struct candlesticks
{
double open; // preço de abertura
double close; // preço de fechamento
double high; // preço de máximo
double low; // preço de mínimo
datetime date; // data
};
//--- buffers do indicador
double open_buff[];
double close_buff[];
double high_buff[];
double low_buff[];
//--- variáveis globais
candlesticks cand_buff[];
int size=0;
int ind=0;
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado |
//+------------------------------------------------------------------+
int OnInit()
{
int default_size=100;
ArrayResize(cand_buff,default_size);
//--- abre o arquivo
ResetLastError();
int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_BIN|FILE_COMMON);
if(file_handle!=INVALID_HANDLE)
{
PrintFormat("%s arquivo está disponível para leitura",InpFileName);
PrintFormat("File path: %s\\Files\\",TerminalInfoString(TERMINAL_COMMONDATA_PATH));
//--- ler dados de um arquivo
while(!FileIsEnding(file_handle))
{
//--- escrever dados para array
FileReadStruct(file_handle,cand_buff[size]);
size++;
//--- verificar se array está transbordando
if(size==default_size)
{
//--- aumentar a dimensão array
default_size+=100;
ArrayResize(cand_buff,default_size);
}
}
//--- fechar o arquivo
FileClose(file_handle);
PrintFormat("Dados são lidos, %s arquivo está fechado",InpFileName);
}
else
{
PrintFormat("Falha para abrir %s arquivo, Código de erro = %d",InpFileName,GetLastError());
return(INIT_FAILED);
}
//--- mapeamento de buffers do indicador
SetIndexBuffer(0,open_buff,INDICATOR_DATA);
SetIndexBuffer(1,high_buff,INDICATOR_DATA);
SetIndexBuffer(2,low_buff,INDICATOR_DATA);
SetIndexBuffer(3,close_buff,INDICATOR_DATA);
//--- valor vazio
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
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);
//--- o loop para os castiçais que ainda não foram manipulados
for(int i=prev_calculated;i<rates_total;i++)
{
//--- 0 por padrão
open_buff[i]=0;
close_buff[i]=0;
high_buff[i]=0;
low_buff[i]=0;
//---verificar se todos os dados ainda estão presente
if(ind<size)
{
for(int j=ind;j<size;j++)
{
//--- se as datas coincidem, usar o valor do arquivo
if(time[i]==cand_buff[j].date)
{
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;
//--- aumentar o contador
ind=j+1;
break;
}
}
}
}
//--- valor retorno de prev_calculated para a próxima chamada
return(rates_total);
}
Também Veja
Estruturas e classes, FileW riteStruct
FileSeek
A função move a posição do ponteiro de arquivo por um certo número de bytes de informação em
relação à posição especificada.
bool FileSeek(
int file_handle, // Manipular arquivo
long offset, // Em bytes
ENUM_FILE_POSITION origin // Posição para referência
);
Parâmetros
file_handle
[in] Descritor de arquivo retornado pelo FileOpen().
offset
[in] A mudança de bytes (pode tomar um valor negativo).
origin
[in] O ponto de partida para o deslocamento. Pode ser um dos valores de ENUM _FILE_POS ITION.
Valor do Retorno
R etorna true se bem sucedido, caso contrário false. Para obter informação sobre o erro chamar
GetLastError().
Observação
Se a execução da função FileSeek () resulta em uma mudança negativa (indo além do " nível limite"
do arquivo), o ponteiro do arquivo será definido para o arquivo de início.
Se a posição for definido para além do " limite direito" do arquivo (maior do que o tamanho do
arquivo),a próxima escrita para o arquivo será executado não a partir do final do arquivo, mas a
partir da posição definida. Neste caso, os valores indefinidos serão escritos para o final do arquivo
anterior e a posição definida.
Exemplo:
//+------------------------------------------------------------------+
//| 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"
//--- mosta a janela dos parâmetros de entrada quando lançado o script
#property script_show_inputs
//--- parâmetros de entrada
input string InpFileName="file.txt"; // nome do arquivo
input string InpDirectoryName="Data"; // nome do diretório
input int InpEncodingType=FILE_ANSI; // ANSI=32 ou UNICODE=64
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
//--- especificar o valor da variável para gerar números aleatórios
_RandomSeed=GetTickCount();
//--- variáveis para posições de pontos de início das strings
ulong pos[];
int size;
//--- redefine o valor de erro
ResetLastError();
//--- abre o arquivo
int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_TXT|InpEncodingType);
if(file_handle!=INVALID_HANDLE)
{
PrintFormat("%s arquivo está disponível para leitura",InpFileName);
//--- receber a posição inicial para cada string no arquivo
GetStringPositions(file_handle,pos);
//--- definir o número de strings no arquivo
size=ArraySize(pos);
if(!size)
{
//--- parar se o arquivo não tem strings
PrintFormat("%s arquivo está vazio!",InpFileName);
FileClose(file_handle);
return;
}
//--- fazer uma seleção aleatória de um número de string
int ind=MathRand()%size;
//--- deslocar posição de ponto de partida da string
if(FileSeek(file_handle,pos[ind],SEEK_SET)==true)
{
//--- ler e imprimir a string com o número ind
PrintFormat("Texto string com %d número: \"%s\"",ind,FileReadString(file_handle));
}
//--- fechar o arquivo
FileClose(file_handle);
PrintFormat("%s arquivo está vazio",InpFileName);
}
else
PrintFormat("Falha para abrir %s arquivo, Código de erro = %d",InpFileName,GetLastError());
}
//+-------------------------------------------------------------------------------+
//| A função define pontos de partida para cada uma das strings no arquivo e |
//| coloca-los em arr array |
//+-------------------------------------------------------------------------------+
void GetStringPositions(const int handle,ulong &arr[])
{
FileSize
A função retorna o tamanho do arquivo em bytes.
ulong FileSize(
int file_handle // Manipular arquivo
);
Parâmetros
file_handle
[in] Descritor de arquivo retornado pelo FileOpen().
Valor do Retorno
O valor do tipo int.
Observação
Para obter informação sobre o erro chamar GetLastError().
Exemplo:
//--- mostrar a janela de parâmetros de entrada quando do lançamento do script
#property script_show_inputs
//--- parâmetros de entrada
input ulong InpThresholdSize=20; // tamanho limite do arquivo em kilobytes
input string InpBigFolderName="big"; // pasta para arquivos grandes
input string InpSmallFolderName="small"; // pasta para arquivo pequeno
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
string file_name; // variável para armazenar os nomes dos arquivos
string filter="*.csv"; // filtro para pesquisar os arquivos
ulong file_size=0; // tamanho do arquivo em bytes
int size=0; // número de arquivos
//--- imprimir o caminho para o arquivo que vamos trabalhar com
PrintFormat("Trabalhando em pasta %s\\Files\\",TerminalInfoString(TERMINAL_COMMONDATA_PATH));
//--- receber o manipulador de pesquisa em comum na raiz da pasta de todos os terminais
long search_handle=FileFindFirst(filter,file_name,FILE_COMMON);
//--- verificar se FileFindFirst() é executada com sucesso
if(search_handle!=INVALID_HANDLE)
{
//--- mover arquivos no loop de acordo com seus tamanhos
do
{
//--- abrir o arquivo
ResetLastError();
int file_handle=FileOpen(file_name,FILE_READ|FILE_CSV|FILE_COMMON);
if(file_handle!=INVALID_HANDLE)
{
//--- receber o tamanho do arquivo
file_size=FileSize(file_handle);
//--- fechar o arquivo
FileClose(file_handle);
}
else
{
PrintFormat("Falha para abrir %s arquivo, Código de erro = %d",file_name,GetLastError()
continue;
}
//--- imprimir o tamanho do arquivo
PrintFormat("Tamanho do %s arquivo é igual para %d bytes",file_name,file_size);
//--- define o caminho para movimentar o arquivo
string path;
if(file_size>InpThresholdSize*1024)
path=InpBigFolderName+"//"+file_name;
else
path=InpSmallFolderName+"//"+file_name;
//--- mover o arquivo
ResetLastError();
if(FileMove(file_name,FILE_COMMON,path,FILE_REWRITE|FILE_COMMON))
PrintFormat("%s arquivo foi movido",file_name);
else
PrintFormat("Erro, código = %d",GetLastError());
}
while(FileFindNext(search_handle,file_name));
//--- fechar o manipulador de pesquisa
FileFindClose(search_handle);
}
else
Print("Arquivo não encontrado!");
}
FileTell
O arquivo retorna a posição atual do ponteiro de arquivo de um arquivo aberto.
ulong FileTell(
int file_handle // Manipular arquivo
);
Parâmetros
file_handle
[in] Descritor de arquivo retornado pelo FileOpen().
Valor do Retorno
Posição atual do descritor de arquivo em bytes a partir do início do arquivo.
Observação
Para obter informação sobre o erro chamar GetLastError().
Exemplo:
//+------------------------------------------------------------------+
//| 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"
//--- mosta a janela dos parâmetros de entrada quando lançado o script
#property script_show_inputs
//--- parâmetros de entrada
input string InpFileName="file.txt"; // nome do arquivo
input string InpDirectoryName="Data"; // nome do diretório
input int InpEncodingType=FILE_ANSI; // ANSI=32 ou UNICODE=64
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
//--- especificar o valor da variável para gerar números aleatórios
_RandomSeed=GetTickCount();
//--- variáveis para posições de pontos de início das strings
ulong pos[];
int size;
//--- redefine o valor de erro
ResetLastError();
//--- abre o arquivo
int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_TXT|InpEncodingType);
if(file_handle!=INVALID_HANDLE)
{
PrintFormat("%s arquivo está disponível para leitura",InpFileName);
//--- receber a posição inicial para cada string no arquivo
GetStringPositions(file_handle,pos);
//--- definir o número de strings no arquivo
size=ArraySize(pos);
if(!size)
{
//--- parar se o arquivo não tem strings
PrintFormat("%s arquivo está vazio!",InpFileName);
FileClose(file_handle);
return;
}
//--- fazer uma seleção aleatória de um número de string
int ind=MathRand()%size;
//--- deslocar posição de ponto de partida da string
FileSeek(file_handle,pos[ind],SEEK_SET);
//--- ler e imprimir a string com o número ind
PrintFormat("Texto string com %d número: \"%s\"",ind,FileReadString(file_handle));
//--- fechar o arquivo
FileClose(file_handle);
PrintFormat("%s arquivo está vazio",InpFileName);
}
else
PrintFormat("Falha para abrir %s arquivo, Código de erro = %d",InpFileName,GetLastError());
}
//+-------------------------------------------------------------------------------+
//| A função define pontos de partida para cada uma das strings no arquivo e |
//| coloca-los em arr array |
//+-------------------------------------------------------------------------------+
void GetStringPositions(const int handle,ulong &arr[])
{
//--- array tamanho padrão
int def_size=127;
//--- alocar memória para o array
ArrayResize(arr,def_size);
//--- contador string
int i=0;
//--- se isto não é o fim do arquivo, então há pelo menos uma string
if(!FileIsEnding(handle))
{
arr[i]=FileTell(handle);
i++;
}
else
return; // o arquivo está vazio, sair
//--- define o deslocamento em bytes, dependendo em codificação
int shift;
if(FileGetInteger(handle,FILE_IS_ANSI))
shift=1;
else
shift=2;
//--- ir através das strings no loop
while(1)
{
//--- ler a string
FileReadString(handle);
//--- verificar o final do arquivo
if(!FileIsEnding(handle))
{
//--- armazenar a próxima posição da string
arr[i]=FileTell(handle)+shift;
i++;
//--- aumentar o tamanho da array, se ela é transbordada
if(i==def_size)
{
def_size+=def_size+1;
ArrayResize(arr,def_size);
}
}
else
break; // final do arquivo, sair
}
//--- definir o tamanho real de array
ArrayResize(arr,i);
}
FileW rite
A função destina-se a gravação de dados em um arquivo CS V, delimitador sendo inserido
automaticamente a menos que seja igual a 0. Depois de escrever dentro do arquivo, o caractere de
final de linha "\r\n" será adicionado.
uint FileWrite(
int file_handle, // manipular arquivo
... // Lista de parâmetros gravados
);
Parâmetros
file_handle
[in] Descritor de arquivo retornado pelo FileOpen().
...
[in] A lista de parâmetros separados por vírgulas, para escrever no arquivo. O número de
parâmetros escritos pode ser de até 63.
Valor do Retorno
Número de bytes escritos.
Observação
Os números serão convertidos dentro de um texto na saída (veja a print() função). Dados do tipo
double são emitidos com a precisão de 16 dígitos depois do ponto decimal, e os dados podem ser
exibidos quer no formato tradicional ou no formato científico - dependendo de qual formato será o
mais compacto. Os dados do tipo float são mostrados com cinco dígitos depois do ponto decimal.
Para emitir números reais com precisão diferente ou em um formato claramente especificado, use
DoubleT oString().
Números do tipo bool são exibidos como " true" ou " false" strings. Números do tipo datetime são
apresentados como "YYYY.MM.DD HH:M I:SS " .
Exemplo:
//+------------------------------------------------------------------+
//| 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"
//--- mostrar a janela de parâmetros de entrada quando do lançamento do script
#property script_show_inputs
//--- parâmetros para a recepção de dados a partir do terminal
input string InpSymbolName="EURUSD"; // par de moedas
input ENUM_TIMEFRAMES InpSymbolPeriod=PERIOD_H1; // período de tempo
input int InpFastEMAPeriod=12; // período rápido EMA
input int InpSlowEMAPeriod=26; // período lento EMA
macd_size=ArraySize(macd_buff);
//--- analisar os dados e salva os sinais do indicador para arrays
ArrayResize(sign_buff,macd_size-1);
ArrayResize(time_buff,macd_size-1);
for(int i=1;i<macd_size;i++)
{
//--- sinal comprar
if(macd_buff[i-1]<0 && macd_buff[i]>=0)
{
sign_buff[sign_size]=true;
time_buff[sign_size]=date_buff[i];
sign_size++;
}
//--- sinal vender
if(macd_buff[i-1]>0 && macd_buff[i]<=0)
{
sign_buff[sign_size]=false;
time_buff[sign_size]=date_buff[i];
sign_size++;
}
}
//--- abrir o arquivo para escrever os valores do indicador (se o arquivo estiver ausente, ele será
ResetLastError();
int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_WRITE|FILE_CSV);
if(file_handle!=INVALID_HANDLE)
{
PrintFormat("%s arquivo está disponível para ser escrito",InpFileName);
PrintFormat("Caminho do arquivo: %s\\Files\\",TerminalInfoString(TERMINAL_DATA_PATH));
//--- primeiro, escreva o número de sinais
FileWrite(file_handle,sign_size);
//--- escrever o tempo e os valores de sinais para o arquivo
for(int i=0;i<sign_size;i++)
FileWrite(file_handle,time_buff[i],sign_buff[i]);
//--- fechar o arquivo
FileClose(file_handle);
PrintFormat("Os dados são escritos, %s arquivo esta fechado",InpFileName);
}
else
PrintFormat("Falha para abrir %s arquivo, Código de erro = %d",InpFileName,GetLastError());
}
Também Veja
Comment, Print, String Format
FileW riteArray
A função escreve arrays de qualquer tipo, exceto para string de um arquivo bin (pode strings ou arrays
dinâmicas).
uint FileWriteArray(
int file_handle, // Manipular arquivo
const void& array1[], // Array
int start=0, // Iniciar índice array
int count=WHOLE_ARRAY // Número de elementos
);
Parâmetros
file_handle
[in] Descritor de arquivo retornado pelo FileOpen().
array[]
[out] Array para gravação.
start=0
[in] Início do índice array (número do primeiro elemento gravado).
count=WHOLE_ARRAY
[in] Número de itens para gravar(WH OLE_ARR AY significa que as gravações de todos os itens
começam com o número inicial até o final da array).
Valor do Retorno
Número de itens gravados.
Observação
String array pode ser gravada em arquivo TXT . Neste caso, strings são automaticamente terminadas
pela linha final de caracteres "\r\n" . Dependendo sobre o arquivo tipo ANS I ou UNICODE, strings são
ambas convertidas para ansi-codificação ou não.
Exemplo:
//+------------------------------------------------------------------+
//| 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"
//--- parâmetros de entrada
input string InpFileName="data.bin";
input string InpDirectoryName="SomeFolder";
//+------------------------------------------------------------------+
//| Estrutura para armazenamento de dados de preços |
//+------------------------------------------------------------------+
struct prices
{
datetime date; // data
double bid; // bid preço
double ask; // ask preço
};
//--- variáveis globais
int count=0;
int size=20;
string path=InpDirectoryName+"//"+InpFileName;
prices arr[];
//+------------------------------------------------------------------+
//| Função de inicialização do Expert |
//+------------------------------------------------------------------+
int OnInit()
{
//--- alocar memória para o array
ArrayResize(arr,size);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de Desinicialização do Expert |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- escrever a contagem restante de strings se count < n
WriteData(count);
}
//+------------------------------------------------------------------+
//| Função tick (ponto) de um Expert |
//+------------------------------------------------------------------+
void OnTick()
{
//--- salvar dados para array
arr[count].date=TimeCurrent();
arr[count].bid=SymbolInfoDouble(Symbol(),SYMBOL_BID);
arr[count].ask=SymbolInfoDouble(Symbol(),SYMBOL_ASK);
//--- mostra dados correntes
Print("Date = ",arr[count].date," Bid = ",arr[count].bid," Ask = ",arr[count].ask);
//--- aumentar o contador
count++;
//--- se array é arquivada, gravar dados no arquivo e zerá-lo
if(count==size)
{
WriteData(size);
count=0;
}
}
//+------------------------------------------------------------------+
//| Escrever n elementos array para arquivo |
//+------------------------------------------------------------------+
void WriteData(const int n)
{
//--- abre o arquivo
ResetLastError();
int handle=FileOpen(path,FILE_READ|FILE_WRITE|FILE_BIN);
if(handle!=INVALID_HANDLE)
{
//--- escrever os dados array para o final do arquivo
FileSeek(handle,0,SEEK_END);
FileWriteArray(handle,arr,0,n);
//--- fechar o arquivo
FileClose(handle);
}
else
Print("Falha para abrir o arquivo, erro ",GetLastError());
}
Também Veja
Variáveis, FileSeek
FileW riteDouble
A função escreve o valor de um parâmetro duplo para um arquivo bin, a partir da posição atual do
ponteiro de arquivo.
uint FileWriteDouble(
int file_handle, // Manipular arquivo
double value // Valor para escrever
);
Parâmetros
file_handle
[in] Descritor de arquivo retornado pelo FileOpen().
value
[in] O valor do tipo double.
Valor do Retorno
Se for bem sucedido, a função retorna o número de bytes escritos (neste caso sizeof(double)=8). O
ponteiro do arquivo é deslocado pelo mesmo número de bytes.
Exemplo:
//+------------------------------------------------------------------+
//| 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"
//--- mostrar a janela de parâmetros de entrada quando do lançamento do script
#property script_show_inputs
//--- parâmetros para a recepção de dados a partir do terminal
input string InpSymbolName="EURJPY"; // par de moedas
input ENUM_TIMEFRAMES InpSymbolPeriod=PERIOD_M15; // período de tempo
input int InpMAPeriod=10; // período suavizado
input int InpMAShift=0; // deslocacamente de indicador
input ENUM_MA_METHOD InpMAMethod=MODE_SMA; // tipo de suavização
input ENUM_APPLIED_PRICE InpAppliedPrice=PRICE_CLOSE; // tipo de preço
input datetime InpDateStart=D'2013.01.01 00:00'; // data de início da cópia dos dados
//--- parâmetros para escrever dados no arquivo
input string InpFileName="MA.csv"; // file name
input string InpDirectoryName="Data"; // nome do diretório
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
datetime date_finish=TimeCurrent();
double ma_buff[];
datetime time_buff[];
int size;
//--- receber a manipulador do indicador MA
ResetLastError();
int ma_handle=iMA(InpSymbolName,InpSymbolPeriod,InpMAPeriod,InpMAShift,InpMAMethod,InpAppliedPri
if(ma_handle==INVALID_HANDLE)
{
//--- falha para receber a manipulação do indicador
PrintFormat("Erro quando recebe a manipulação do indicador. Código de erro = %d",GetLastError
return;
}
//--- estando no loop até que o indicador calcula todos os seus valores
while(BarsCalculated(ma_handle)==-1)
Sleep(20); // pausa para permitir que o indicador calcule os respectivos valores
PrintFormat("Valores dos indicadores começando a partir de %s será escrita no arquivo",TimeToStr
//--- copiar os valores dos indicadores
ResetLastError();
if(CopyBuffer(ma_handle,0,InpDateStart,date_finish,ma_buff)==-1)
{
PrintFormat("Falha para copiar valores do indicador. Código de erro = %d",GetLastError());
return;
}
//--- copiar o tempo da apropriada chegada das barras
ResetLastError();
if(CopyTime(InpSymbolName,InpSymbolPeriod,InpDateStart,date_finish,time_buff)==-1)
{
PrintFormat("Falha para copiar valores de tempo. Código de erro = %d",GetLastError());
return;
}
//--- receber o tamanho do buffer
size=ArraySize(ma_buff);
//--- libera a memória ocupada pelo indicador
IndicatorRelease(ma_handle);
//--- abrir o arquivo para escrever os valores do indicador (se o arquivo estiver ausente, ele será
ResetLastError();
int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_WRITE|FILE_BIN);
if(file_handle!=INVALID_HANDLE)
{
PrintFormat("%s arquivo está disponível para ser escrito",InpFileName);
PrintFormat("Caminho do arquivo: %s\\Files\\",TerminalInfoString(TERMINAL_DATA_PATH));
//--- em primeiro lugar, escrever o tamanho da amostra de dados
FileWriteDouble(file_handle,(double)size);
//--- escrever o tempo do indicador e valor para o arquivo
for(int i=0;i<size;i++)
{
FileWriteDouble(file_handle,(double)time_buff[i]);
FileWriteDouble(file_handle,ma_buff[i]);
}
//--- fechar o arquivo
FileClose(file_handle);
PrintFormat("Os dados são escritos, %s arquivo esta fechado",InpFileName);
}
else
PrintFormat("Falha para abrir %s arquivo, Código de erro = %d",InpFileName,GetLastError());
}
Também Veja
T ipos reais (double, float)
FileW riteFloat
A função escreve o valor do parâmetro float para um arquivo bin, a partir da atual posição do ponteiro
de arquivo.
uint FileWriteFloat(
int file_handle, // Manipular arquivo
float value // Valor para ser escrito
);
Parâmetros
file_handle
[in] Descritor de arquivo retornado pelo FileOpen().
value
[in] O valor do tipo float.
Valor do Retorno
Se for bem sucedido, a função retorna o número de bytes escritos (neste caso sizeof(float)=4). O
ponteiro do arquivo é deslocado pelo mesmo número de bytes.
Exemplo:
//+------------------------------------------------------------------+
//| 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"
//--- mostrar a janela de parâmetros de entrada quando do lançamento do script
#property script_show_inputs
//--- parâmetros para a recepção de dados a partir do terminal
input string InpSymbolName="EURUSD"; // par de moedas
input ENUM_TIMEFRAMES InpSymbolPeriod=PERIOD_M15; // período de tempo
input datetime InpDateStart=D'2013.01.01 00:00'; // data de início da cópia dos dados
//--- parâmetros para escrever dados no arquivo
input string InpFileName="Close.bin"; // nome do arquivo
input string InpDirectoryName="Data"; // nome do diretório
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
datetime date_finish=TimeCurrent();
double close_buff[];
datetime time_buff[];
int size;
Também Veja
T ipos reais (double, float), FileW riteDouble
FileW riteInteger
A função escreve o valor do parâmetro int para um arquivo bin, a partir da posição atual do ponteiro
de arquivo.
uint FileWriteInteger(
int file_handle, // Manipular Arquivo
int value, // Valor para ser escrito
int size=INT_VALUE // Tamanho em bytes
);
Parâmetros
file_handle
[in] Descritor de arquivo retornado pelo FileOpen().
value
[in] Valor inteiro.
size=INT_VALUE
[in] Número de bytes (até 4 inclusive), que deve ser escrito. As constantes correspondentes são
fornecidos : CH AR_VAL UE=1, S H ORT_VAL UE=2 e INT_VAL UE=4, então a função pode escrever o
valor inteiro do tipo char, uchar, short, ushort, int, ou uint.
Valor do Retorno
Se for bem sucedido, a função retorna o número de bytes escritos. O ponteiro do arquivo é
deslocado pelo mesmo número de bytes.
Exemplo:
//+------------------------------------------------------------------+
//| 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"
//--- mostrar a janela de parâmetros de entrada quando do lançamento do script
#property script_show_inputs
//--- parâmetros para a recepção de dados a partir do terminal
input string InpSymbolName="EURUSD"; // par de moedas
input ENUM_TIMEFRAMES InpSymbolPeriod=PERIOD_H1; // período de tempo
input datetime InpDateStart=D'2013.01.01 00:00'; // data de início da cópia dos dados
//--- parâmetros para escrever dados no arquivo
input string InpFileName="Trend.bin"; // nome do arquivo
input string InpDirectoryName="Data"; // nome do diretório
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
datetime date_finish=TimeCurrent();
double close_buff[];
datetime time_buff[];
int size;
//--- redefine o valor de erro
ResetLastError();
//--- copiar o preço de fechamento de cada barra
if(CopyClose(InpSymbolName,InpSymbolPeriod,InpDateStart,date_finish,close_buff)==-1)
{
PrintFormat("Falha ao copiar os valores dos preços de fechamento. Código de erro = %d",GetLas
return;
}
//--- copiar o tempo para cada barra
if(CopyTime(InpSymbolName,InpSymbolPeriod,InpDateStart,date_finish,time_buff)==-1)
{
PrintFormat("Falha para copiar valores de tempo. Código de erro = %d",GetLastError());
return;
}
//--- receber o tamanho do buffer
size=ArraySize(close_buff);
//--- abrir o arquivo para escrever os valores (se o arquivo estiver ausente, ele será criado autom
ResetLastError();
int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_WRITE|FILE_BIN);
if(file_handle!=INVALID_HANDLE)
{
PrintFormat("%s arquivo está disponível para ser escrito",InpFileName);
PrintFormat("Caminho do arquivo: %s\\Files\\",TerminalInfoString(TERMINAL_DATA_PATH));
//---
int up_down=0; // tendência flag
int arr_size; // tamanho de array arr
uchar arr[]; // array tipo uchar
//--- escrever valores de tempo para o arquivo
for(int i=0;i<size-1;i++)
{
//--- comparar preços de fechamento das atuais e próximas barras
if(close_buff[i]<=close_buff[i+1])
{
if(up_down!=1)
{
//--- escrever valor de data para o arquivo usando FileWriteInteger
StringToCharArray(TimeToString(time_buff[i]),arr);
arr_size=ArraySize(arr);
//--- primeiro, escreva o número de símbolos na array
FileWriteInteger(file_handle,arr_size,INT_VALUE);
//--- escrever os símbolos
for(int j=0;j<arr_size;j++)
FileWriteInteger(file_handle,arr[j],CHAR_VALUE);
//--- mudar a flag de tendência
up_down=1;
}
}
else
{
if(up_down!=-1)
{
//--- escrever valor de data para o arquivo usando FileWriteInteger
StringToCharArray(TimeToString(time_buff[i]),arr);
arr_size=ArraySize(arr);
//--- primeiro, escreva o número de símbolos na array
FileWriteInteger(file_handle,arr_size,INT_VALUE);
//--- escrever os símbolos
for(int j=0;j<arr_size;j++)
FileWriteInteger(file_handle,arr[j],CHAR_VALUE);
//--- mudar a flag de tendência
up_down=-1;
}
}
}
//--- fechar o arquivo
FileClose(file_handle);
PrintFormat("Os dados são escritos, %s arquivo esta fechado",InpFileName);
}
else
PrintFormat("Falha para abrir %s arquivo, Código de erro = %d",InpFileName,GetLastError());
}
Também Veja
IntegerT oString, String T oInteger, T ipos Inteiros
FileW riteLong
A função escreve o valor do parâmetro de tipo long para um arquivo bin, a partir da posição atual do
ponteiro de arquivo.
uint FileWriteLong(
int file_handle, // Manipular arquivo
long value // Valor para ser escrito
);
Parâmetros
file_handle
[in] Descritor de arquivo retornado pelo FileOpen().
value
[in] Valor do tipo long.
Valor do Retorno
Se for bem sucedido, a função retorna o número de bytes escritos (neste caso sizeof(long)=8). O
ponteiro do arquivo é deslocado pelo mesmo número de bytes.
Exemplo:
//+------------------------------------------------------------------+
//| 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"
//--- mostrar a janela de parâmetros de entrada quando do lançamento do script
#property script_show_inputs
//--- parâmetros para a recepção de dados a partir do terminal
input string InpSymbolName="EURUSD"; // par de moedas
input ENUM_TIMEFRAMES InpSymbolPeriod=PERIOD_H1; // time frame
input datetime InpDateStart=D'2013.01.01 00:00'; // data de início da cópia dos dados
//--- parâmetros para escrever dados no arquivo
input string InpFileName="Volume.bin"; // nome do arquivo
input string InpDirectoryName="Data"; // nome do diretório
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
datetime date_finish=TimeCurrent();
long volume_buff[];
datetime time_buff[];
int size;
Também Veja
T ipos inteiros, FileW riteInteger
FileW riteString
A função escreve o valor de um parâmetro do tipo string em um arquivo BIN, CS V ou TXT começando a
partir da posição atual do ponteiro de arquivo. Quando escrever para um arquivo CS V ou TXT: se
existe um símbolo na string '\n' (L F) sem caractere anterior '\r' (CR ), então antes de '\n' desaparecer '\r'
é adicionado.
uint FileWriteString(
int file_handle, // Manipular arquivo
const string text_string, // string para escrever
int length=-1 // número de símbolos
);
Parâmetros
file_handle
[in] Descritor de arquivo retornado pelo FileOpen().
text_string
[in] Seqüência.
length=-1
[in] O número de caracteres que você quer escrever. Esta opção é necess ária para escrever uma
string em um arquivo BIN. Se o tamanho não for especificado, então a string inteira, sem o trailer
0 (zero) é escrita. Se você especificar um tamanho menor do que o comprimento da string, então
uma parte da string sem o trailer 0 (zero) é escrita. Se você especificar um tamanho maior do que
o comprimento da string, a string é preenchido por um número apropriado de zeros. Para arquivos
do tipo CS V e TXT , este parâmetro é ignorado e a string é escrita inteiramente.
Valor do Retorno
Se for bem sucedido, a função retorna o número de bytes escritos. O ponteiro do arquivo é
deslocado pelo mesmo número de bytes.
Observação
Note que quando se escreve para um arquivo aberto pela bandeira FILE_UNICODE (ou sem uma
bandeira FILE_ANS I), então o número de bytes escrito será duas vezes tão grande como o número de
cadeia de string escritas. Quando gravar para um arquivo aberto com a bandeira FILE_ANS I, o
número de bytes escritos irá coincidir com o número de caracteres de string escritas.
Exemplo:
//+------------------------------------------------------------------+
//| 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"
//--- mostrar a janela de parâmetros de entrada quando do lançamento do script
#property script_show_inputs
rsi_size=ArraySize(rsi_buff);
//--- abrir o arquivo para escrever os valores do indicador (se o arquivo estiver ausente, ele será
ResetLastError();
int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_WRITE|FILE_CSV|FILE_AN
if(file_handle!=INVALID_HANDLE)
{
PrintFormat("%s arquivo está disponível para ser escrito",InpFileName);
PrintFormat("Caminho do arquivo: %s\\Files\\",TerminalInfoString(TERMINAL_DATA_PATH));
//--- preparar variáveis adicionais
string str="";
bool is_formed=false;
//--- escrever datas de formação das áreas de sobre-compra e sobre-venda
for(int i=0;i<rsi_size;i++)
{
//--- verifique os valores dos indicadores
if(rsi_buff[i]>=70 || rsi_buff[i]<=30)
{
//--- se o valor é o primeiro nesta área
if(!is_formed)
{
//--- adicionar o valor e a 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];
//--- mover para a próxima iteração do loop
continue;
}
//--- verificar a flag
if(is_formed)
{
//--- a string é formada, escrevê-lo para o arquivo
FileWriteString(file_handle,str+"\r\n");
is_formed=false;
}
}
//--- fechar o arquivo
FileClose(file_handle);
PrintFormat("Os dados são escritos, %s arquivo esta fechado",InpFileName);
}
else
PrintFormat("Falha para abrir %s arquivo, Código de erro = %d",InpFileName,GetLastError());
}
Também Veja
T ipo string, String Format
FileW riteStruct
A função escreve em arquivo bin um conteúdo de uma estrutura passada como um parâmetro,
começando a partir da posição atual do ponteiro de arquivo.
uint FileWriteStruct(
int file_handle, // Manipular arquivo
const void& struct_object, // link para um objeto
int size=-1 // tamanho a ser escrito em bytes
);
Parâmetros
file_handle
[in] Descritor de arquivo retornado pelo FileOpen().
struct_object
[in] R eferência ao objeto desta estrutura. A estrutura não deve conter strings, arrays dinâmicas,
funções virtuais, objetos de classes, bem como ponteiros para objetos e funções.
size=-1
[in] Número de bytes que você quer gravar. Se tamanho não é especificado ou o especificado
número de bytes é maior do que o tamanho da estrutura, a estrutura inteira é escrita.
Valor do Retorno
Se for bem sucedido, a função retorna o número de bytes escritos. O ponteiro do arquivo é
deslocado pelo mesmo número de bytes.
Exemplo:
//+------------------------------------------------------------------+
//| 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"
//--- mostrar a janela de parâmetros de entrada quando do lançamento do script
#property script_show_inputs
//--- parâmetros para a recepção de dados a partir do terminal
input string InpSymbolName="EURUSD"; // par de moedas
input ENUM_TIMEFRAMES InpSymbolPeriod=PERIOD_H1; // time frame
input datetime InpDateStart=D'2013.01.01 00:00'; // data de início da cópia dos dados
//--- parâmetros para escrever dados no arquivo
input string InpFileName="EURUSD.txt"; // nome do arquivo
input string InpDirectoryName="Data"; // nome do diretório
//+------------------------------------------------------------------+
//| Estrutura para armazenar dados candlestick |
//+------------------------------------------------------------------+
struct candlesticks
{
double open; // preço de abertura
double close; // preço de fechamento
double high; // preço de máximo
double low; // preço de mínimo
datetime date; // data
};
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
datetime date_finish=TimeCurrent();
int size;
datetime time_buff[];
double open_buff[];
double close_buff[];
double high_buff[];
double low_buff[];
candlesticks cand_buff[];
//--- redefine o valor de erro
ResetLastError();
//--- receber o tempo da chegada das barras a partir do intervalo
if(CopyTime(InpSymbolName,InpSymbolPeriod,InpDateStart,date_finish,time_buff)==-1)
{
PrintFormat("Falha para copiar valores de tempo. Código de erro = %d",GetLastError());
return;
}
//--- receber os preços de máximo das barras a partir do intervalo
if(CopyHigh(InpSymbolName,InpSymbolPeriod,InpDateStart,date_finish,high_buff)==-1)
{
PrintFormat("Falha ao copiar os valores dos preços de máximo. Código de erro = %d",GetLastErr
return;
}
//--- receber os preços de mínimo das barras a partir do intervalo
if(CopyLow(InpSymbolName,InpSymbolPeriod,InpDateStart,date_finish,low_buff)==-1)
{
PrintFormat("Falha ao copiar os valores dos preços de mínimo. Código de erro = %d",GetLastErr
return;
}
//--- receber os preços de abertura das barras a partir do intervalo
if(CopyOpen(InpSymbolName,InpSymbolPeriod,InpDateStart,date_finish,open_buff)==-1)
{
PrintFormat("Falha ao copiar os valores dos preços de abertura. Código de erro = %d",GetLastE
return;
}
//--- receber os preços de fechamento das barras a partir do intervalo
if(CopyClose(InpSymbolName,InpSymbolPeriod,InpDateStart,date_finish,close_buff)==-1)
{
//--- abrir o arquivo para escrever a estrutura array para o arquivo (se o arquivo estiver ausente,
ResetLastError();
int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_WRITE|FILE_BIN|FILE_CO
if(file_handle!=INVALID_HANDLE)
{
PrintFormat("%s arquivo está aberto para escrita",InpFileName);
PrintFormat("File path: %s\\Files\\",TerminalInfoString(TERMINAL_COMMONDATA_PATH));
//--- preparar o contador do número de bytes
uint counter=0;
//--- escrever valores array no loop
for(int i=0;i<size;i++)
counter+=FileWriteStruct(file_handle,cand_buff[i]);
PrintFormat("%d bytes de informação está escrito para %s arquivo",InpFileName,counter);
PrintFormat("Número total de bytes: %d * %d * %d = %d, %s",size,5,8,size*5*8,size*5*8==counte
//--- fechar o arquivo
FileClose(file_handle);
PrintFormat("Os dados são escritos, %s arquivo esta fechado",InpFileName);
}
else
PrintFormat("Falha para abrir %s arquivo, Código de erro = %d",InpFileName,GetLastError());
}
Também Veja
Estruturas e classes
FileLoad
Ele lê todo o conteúdo do arquivo binário especificado numa variedade transferida de tipos numéricos
ou estruturas simples. A função permite ler rapidamente os dados de um tipo conhecido na matriz
apropriada.
long FileLoad(
const string file_name, // nome do arquivo
void& buffer[], // matriz de tipos numéricos ou estruturas simples
int common_flag=0 // sinalizador de arquivo, por padrão o arquivo é localizado na
);
Parâmetros
file_name
[in] Nome do arquivo a partir do qual serão lidos os dados.
buffer
[out] Matriz de tipos numéricos ou estruturas simples.
common_flag=0
[in] Sinalizador de arquivo que indica o modo de trabalho. Se este parâmetro não for
especificado, o arquivo é procurado na subpasta MQL5\Files (ou
<diretório_do_agente_de_teste>\MQL5\Files em caso de teste).
Valor de retorno
Número de elementos lidos ou -1 em caso de falha.
Observação
A função FileLoad() lê, a partir do arquivo, o número de bytes múltiplo do tamanho da matriz. Por
exemplo, suponha que o tamanho do arquivo é 10 bytes e a leitura de dados é realizada numa matriz
do tipo double (sizeof(double)=8). Neste caso, você vai ler apenas 8 bytes, os restantes 2 bytes no
final do arquivo serão simplesmente descartados e a função FileLoad() retornará 1 (lido 1
elemento).
Exemplo:
//+------------------------------------------------------------------+
//| 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
//--- input parameters
input int bars_to_save=10; // número de barras
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
string filename=_Symbol+"_rates.bin";
MqlRates rates[];
//---
int copied=CopyRates(_Symbol,_Period,0,bars_to_save,rates);
if(copied!=-1)
{
PrintFormat(" CopyRates(%s) copied %d bars",_Symbol,copied);
//--- escrevemos as cotações no arquivo
if(!FileSave(filename,rates,FILE_COMMON))
PrintFormat("FileSave() failed, error=%d",GetLastError());
}
else
PrintFormat("Failed CopyRates(%s), error=",_Symbol,GetLastError());
//--- agora lemos estas cotações de volta para o arquivo
ArrayFree(rates);
long count=FileLoad(filename,rates,FILE_COMMON);
if(count!=-1)
{
Print("Time\tOpen\tHigh\tLow\tClose\tTick Voulme\tSpread\tReal Volume");
for(int i=0;i<count;i++)
{
PrintFormat("%s\t%G\t%G\t%G\t%G\t%I64u\t%d\t%I64u",
TimeToString(rates[i].time,TIME_DATE|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);
}
}
}
Veja também
Estruturas e classes, FileR eadArray, FileR eadStruct, FileSave
FileSave
Armazena no arquivo binário todos os elementos da matriz transferida como parâmetro. A função
permite armazenar rapidamente -numa cadeia de caracteres - matrizes de tipos numéricos ou
estruturas simples.
bool FileSave(
const string file_name, // nome do arquivo
void& buffer[], // matriz de tipos numéricos ou estruturas simples
int common_flag=0 // sinalizador de arquivo, por padrão os arquivos são localizad
);
Parâmetros
file_name
[in] Nome do arquivo no qual será armazenada a matriz de dados.
buffer
[in] Matriz de tipos numéricos ou estruturas simples.
common_flag=0
[in] Sinalizador de arquivo que indica o modo de trabalho. Se este parâmetro não for
especificado, o arquivo será armazenado na subpasta MQL5\Files (ou
<diretório_do_agente_de_teste>\MQL5\Files em caso de teste).
Valor de retorno
Em caso de falha, a função retorna false.
Exemplo:
//+------------------------------------------------------------------+
//| 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
//--- input parameters
input int ticks_to_save=1000; // número de ticks
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
string filename=_Symbol+"_ticks.bin";
MqlTick ticks[];
//---
int copied=CopyTicks(_Symbol,ticks,COPY_TICKS_ALL,0,ticks_to_save);
if(copied!=-1)
{
PrintFormat(" CopyTicks(%s) copied %d ticks",_Symbol,copied);
//--- se o histórico de ticks estiver sincronizada, o código de erro será igual a zero
if(!GetLastError()==0)
PrintFormat("%s: Ticks are not synchronized, error=%d",_Symbol,copied,_LastError);
//--- armazenamos os ticks no arquivo
if(!FileSave(filename,ticks,FILE_COMMON))
PrintFormat("FileSave() failed, error=%d",GetLastError());
}
else
PrintFormat("Failed CopyTicks(%s), Error=",_Symbol,GetLastError());
//--- agora lemos estes ticks de volta para o arquivo
ArrayFree(ticks);
long count=FileLoad(filename,ticks,FILE_COMMON);
if(count!=-1)
{
Print("Time\tBid\tAsk\tLast\tVolume\tms\tflags");
for(int i=0;i<count;i++)
{
PrintFormat("%s.%03I64u:\t%G\t%G\t%G\t%I64u\t0x%04x",
TimeToString(ticks[i].time,TIME_DATE|TIME_SECONDS),ticks[i].time_msc%1000,
ticks[i].bid,ticks[i].ask,ticks[i].last,ticks[i].volume,ticks[i].flags);
}
}
}
Veja também
Estruturas e classes, FileW riteArray, FileW riteStruct, FileLoad, FileW rite
FolderCreate
A função cria uma pasta no diretório Arquivos (dependendo do valor de common_flag).
bool FolderCreate(
string folder_name, // String com o nome da nova pasta
int common_flag=0 // escopo
);
Parâmetros
folder_name
[in] O nome do diretório que deseja criar. Contém o caminho relativo para a pasta.
common_flag=0
[in] Bandeira determinando a localização do diretório. Se common_flag =FILE_COMMON, então o
diretório está na pasta compartilhada para todos os terminais do cliente \T erminal\Common\Files.
Caso contrário, o diretório está em uma pasta local (MQL5\Files ou MQL5\T ester\Files na caso de
testes).
Valor do Retorno
R etorna true se bem-sucedida, caso contrário - false.
Observação
Por razões de segurança, o trabalho com arquivos é estritamente controlada na língua MQL5.
Arquivos com que as operações de arquivo são conduzidas usando os meios MQL5, não podem estar
fora da caixa de proteção do arquivo.
Exemplo:
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
//--- descrição
#property description "O script mostra um exemplo de utilização da FolderCreate()."
#property description "Parâmetro externo define a pasta para criação de pastas."
#property description "Após a execução do script, será criada a estrutura das pastas"
{
//--- nela, criamos uma pasta filha Child_Folder_B1
string folder_B1="Child_Folder_B1";
string path=root_folder+"\\"+folder_B1; // criamos o nome da pasta com base na estru
if(CreateFolder(path,common_folder))
{
//--- nesta pasta, criamos mais 3 filhas
string folder_C11="Child_Folder_C11";
string child_path=root_folder+"\\"+folder_C11;// criamos o nome da pasta com base na estru
CreateFolder(child_path,common_folder);
//--- segunda pasta filha
string folder_C12="Child_Folder_C12";
child_path=root_folder+"\\"+folder_C12;
CreateFolder(child_path,common_folder);
Veja Também
FileOpen(), FolderClean(), FileCopy()
FolderDelete
A função remove o diretório especificado. Se a pasta não estiver vazia, então ele não pode ser
removida.
bool FolderDelete(
string folder_name, // String com o nome da pasta para deletar
int common_flag=0 // escopo
);
Parâmetros
folder_name
[in] O nome do diretório que você deseja excluir. Contém o caminho completo para a pasta.
common_flag=0
[in] Bandeira determinando a localização do diretório. Se common_flag =FILE_COMMON, então o
diretório está na pasta compartilhada para todos os terminais do cliente \T erminal\Common\Files.
Caso contrário, o diretório está em uma pasta local (MQL5\Files ou MQL5\T ester\Files no caso de
testes).
Valor do Retorno
R etorna true se bem sucedido, caso contrário false.
Observação
Por razões de segurança, o trabalho com arquivos é estritamente controlada na língua MQL5.
Arquivos com que as operações de arquivo são conduzidas usando os meios MQL5, não podem estar
fora da caixa de proteção do arquivo.
Se o diretório contiver pelo menos um arquivo e / ou subdiretório, então este diretório não pode ser
excluído, ele deve ser limpo primeiro. FolderClean() é usado para limpar a pasta de todos os seus
arquivos ou sub-pastas.
Exemplo:
//+------------------------------------------------------------------+
//| 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"
//--- Descrição
#property description "O roteiro mostra um exemplo de uso FolderDelete()."
#property description "Primeiro duas pastas são criados, um deles está vazia, a segunda contém um a
#property description "Quando se tenta excluir uma pasta não-vazia, será retornado um erro e um avi
ResetLastError();
//--- Deletar a pasta que contém um arquivo
if(FolderDelete(secondFolder))
PrintFormat("Pasta %s foi deletada com sucesso", secondFolder);
else
//--- A seguinte mensagem deve aparecer uma vez que a pasta contém um arquivo
PrintFormat("Falha para deletar pasta %s. Código de erro=%d", secondFolder, GetLastError()
}
else
Print("Exclusão cancelada");
//---
}
Também Veja
FileOpen(), FolderClean(), FileMove()
FolderClean
A função exclui todos os arquivos em uma pasta especificada.
bool FolderClean(
string folder_name, // String com o nome da pasta eliminada
int common_flag=0 // escopo
);
Parâmetros
folder_name
[in] O nome do diretório onde você deseja excluir todos os arquivos. Contém o caminho completo
para a pasta.
common_flag=0
[in] Bandeira determinando a localização do diretório. Se common_flag = FILE_COMMON, então o
diretório está na pasta compartilhada para todos os terminais de clientes
\T erminal\Common\Files. Caso contrário, o diretório está numa pasta local (MQL5\Files ou
MQL5\T ester\Files no caso dos testes).
Valor do Retorno
R etorna true se bem sucedido, caso contrário false.
Observação
Por razões de segurança, o trabalho com arquivos é estritamente controlada na língua MQL5.
Arquivos com que as operações de arquivo são conduzidas usando os meios MQL5, não podem estar
fora da caixa de proteção do arquivo.
Esta função deve ser usada com cuidado, uma vez que todos os arquivos e todos os subdiretórios
são excluídos irremediavelmente.
Exemplo:
//+------------------------------------------------------------------+
//| 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"
//--- Descrição
#property description "O script mostra um exemplo de uso FolderClean()."
#property description "Primeiro, os arquivos são criados na pasta especificada utilizando a função
#property description "Então, antes que os arquivos sejam apagados, um aviso é mostrado usando Mess
else
PrintFormat("Exclusão cancelada");
//---
}
//+------------------------------------------------------------------+
//| Retornar o número de arquivos na pasta especificada |
//+------------------------------------------------------------------+
int FilesInFolder(string path,int flag)
{
int count=0;
long handle;
string filename;
//---
handle=FileFindFirst(path,filename,flag);
//--- Se pelo menos um arquivo encontrado, procurar por mais arquivos
if(handle!=INVALID_HANDLE)
{
//--- Mostrar o nome do arquivo
PrintFormat("Arquivo %s encontrado",filename);
//--- Aumentar o contador de arquivos/pastas encontrados
count++;
//--- Iniciar a pesquisa em todos arquivos/pastas
while(FileFindNext(handle,filename))
{
PrintFormat("Arquivo %s encontrado",filename);
count++;
}
//--- Não se esqueça de fechar o manipulador de pesquisa após a conclusão
FileFindClose(handle);
}
else // Falha ao obter o manipulador
{
PrintFormat("Pesquisa nos arquivos na pasta %s falhou",path);
}
//--- Retorna o resultado
return count;
}
Também Veja
FileFindFirst, FileFindNext, FileFindClose
Indicadores Customizados
Este é o grupo de funções utilizadas na criação dos indicadores personalizados. Estas funções não
podem ser usadas para escrever Expert Advisors e Scripts.
Função Ação
SetIndex Buffer Vincula-se o buffer de indicador especificado
com dinâmica unidimensional array do tipo
double
T odos os cálculos necess ários de um indicador personalizado devem ser colocados na função
predeterminada OnCalculate(). Se você usar uma forma abreviada da função chamada OnCalculate(),
como
int OnCalculate (const int rates_total, const int prev_calculated, const int begin, const double& p
então a variável rates_total contém o valor do número total de elementos da ordem de price[],
passados como um parâmetro de entrada para calcular os valores do indicador.
Se a informação sobre o tamanho da entrada da ordem de preço fosse disponibilizado, então isso
levaria à necessidade de fazer cálculos para 1000 valores de cada buffer de indicador. Na primeira
chamada do OnCalculate(), o valor prev _calculated = 0. Se a ordem de price[] foi alterado de alguma
forma, então neste caso prev _calculated também é igual a 0 (zero).
O parâmetro begin mostra o número de valores iniciais da ordem de preço, que não contêm dados
para o cálculo. Por exemplo, se o valor de Accelerator Oscillator (para os quais os primeiros 37 valores
não são calculados) foram utilizados como um parâmetro de entrada, então begin = 37. Por exemplo,
vamos considerar um simples indicador:
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1
//---- plot Label1
#property indicator_label1 "Etiqueta 1"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- buffers do indicador
double Label1Buffer[];
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado |
//+------------------------------------------------------------------+
void OnInit()
{
//--- mapeamento de buffers do indicador
SetIndexBuffer(0,Label1Buffer,INDICATOR_DATA);
//---
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
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);
//--- valor retorno de prev_calculated para a próxima chamada
return(rates_total);
}
Arrastá-lo a partir da janela do "Navegador" para a janela do indicador Accelerator Oscillator e nós
indicamos que os cálculos devem ser feitos com base nos valores do indicador anterior:
Como um resultado, a primeira chamada do valor OnCalculate() de prev _calculated será igual a zero, e
em outras chamadas será igual ao valor rates _total (até que o número de barras no gráfico de preço
aumenta).
O valor do parâmetro begin será exatamente igual ao número das barras iniciais, para os quais os
valores do indicador Accelerator não são calculados de acordo com a lógica do indicador. Se nós
olharmos para o código fonte do indicador personalizado Accelerator.mq5, nós veremos as linha
seguintes na função OnInit():
1. definir o número de valores iniciais de um indicador, o qual não deverá ser usado para os cálculos
de outro indicador personalizado;
2. obter informações sobre o número dos primeiros valores a serem ignorados quando você chamar
um outro indicador personalizado , sem entrar na lógica de seus cálculos.
O conjunto total dos indicadores podem serem derivados a partir de v árias bases de estilos de
desenhos, conhecidas como plotagem. Plotagem denota uma forma de visualização de dados, que o
indicador calcula, armazena e providencia o pedido. Existem sete tipos básicos plotagem:
1. Uma linha
2. Uma seção (segmento)
3. H istograma
4. Seta (símbolo)
5. Uma área pintada (canal preenchido)
6. Bars
7. Castiçal (candlestick s) japonês
Cada plotagem requer um para cinco arrays do tipo double, em que os valores dos indicadores são
armazenados. Para efeitos de comodidade, estes arrays são associados com os buffers do indicador. O
número de buffers em um indicador deve ser declarado com antecedência usando diretivas de
compilador, por exemplo:
Como cada tipo de plotagem básica pode ter variação de cor ou detalhes de construção, o número real
de tipos de plotagem em MQL5 é de 18:
buffer correspondente
(geralmente tem
muitos valores vazios)
cores, a qualquer
momento
DR AW_COLOR_CANDL O estilo 4 1
ES DR AW_CANDLES com
opções de cores
individuais dos
castiçais (candlestick s)
e mudança dinâmica
das cores
Um buffer de indicador deve ser dinâmico e não requer especificação de tamanho – o tamanho do
array usado como buffer de indicador, é definido pelo subsistema do terminal com execução
automática.
Após o array estar ligado ao buffer de indicador, a direção de indexação é definida por padrão num
arrays comum, mas pode usar a função ArraySetAsSeries() para alterar o modo de acesso aos
elementos array. Por padrão, o buffer de indicador é usado para armazenar dados usados para
plotagem INDICAT OR_DAT A).
Algumas plotagens permitem definir uma cor para cada barra. Para armazenar a informação sobre cor,
buffers de cores são usados (INDICAT OR_COLOR_INDEX). A cor é um tipo integer color, mas todos os
buffers de indicadores serão do tipo double. Valores de cor e buffers auxiliares
(INDICAT OR_CALCULATIONS) não podem ser obtidos usando CopyBuffer().
A plotagem dos castiçais (candlestick s), o indicador usará apenas o primeiro dos quatro buffers,
porque a plotagem do " candlestick" foi anunciado sobre o primeiro número.
Alterar o exemplo, e adicionar plotagem de uma linha simples - DR AW_L INE. Agora, suponha que a
linha é numerada como 1, e os castiçais (candlestick s) são o número 2. O número de buffers e o
número plotagem aumentou.
A ordem das plotagem mudou, e agora a linha vem em primeiro lugar, seguido dos castiçais
(candlestick s) Japoneses. Portanto, a ordem dos buffers é apropriado - primeiro anunciamos um
buffer para a linha com o índice zero, e então quatro buffers para os castiçais (candlestick s).
· DR AW_L INE
· DR AW_SECTI ON
· DR AW_HI S T OGR AM
· DR AW_HI S T OGR AM 2
· DR AW_ARR OW
· DR AW_ZIGZAG
· DR AW_FI LL ING
· DR AW_BAR S
· DR AW_CANDLES
No segundo grupo, os nomes de estilo contêm a palavra COLOR, vamos chamá-los de vers ões de
cores :
· DR AW_COLOR_L INE
· DR AW_COLOR_SECTI ON
· DR AW_COLOR_HI S T OGR AM
· DR AW_COLOR_HI S T OGR AM 2
· DR AW_COLOR_ARR OW
· DR AW_COLOR_ZIGZAG
· DR AW_COLOR_BAR S
· DR AW_COLOR_CANDLES
T odas as vers ões de cores de estilos diferentes a partir das básicas permitem especificar uma cor
para cada parte da plotagem. A parte mínima de plotagem é uma barra, então podemos dizer que as
vers ões de cores permitem definir a cor de cada bar.
As exceções são os estilos DR AW_NONE e DR AW_FILL ING, eles não tem vers ões de cores.
Para definir a plotagem da cor em cada barra, um buffer adicional para armazenar o índice de cor foi
adicionada à versão de cor. Estes índices indicam o número de uma cor numa array especial, a qual
contém um conjunto predefinido de cores. O tamanho do array das cores é 64. Isto significa que cada
versão de cor de um estilo de pintura permite uma plotagem de 64 cores diferentes.
O conjunto e o número de cores na array especial de cores será definido através de uma diretiva de
compilação #property indicator_color, onde pode especificar todas as cores necess árias separadas por
vírgulas. Por exemplo, como uma entrada de um indicador:
//--- Definir 8 cores para colorir os candlesticks (eles são armazenados na array especial)
#property indicator_color1 clrRed,clrBlue,clrGreen,clrYellow,clrMagenta,clrCyan,clrLime,clrOrange
Ele afirma que para plotar 1, 8 cores são definidas, que serão colocados em um array especial. Além
disso o programa não especifica a cor da plotagem, mas apenas o seu índice. Se quisermos definir a
cor vermelha para o número de barras K, o valor da cor do índice a partir de array deve ser definido no
buffer de cor do indicador. A cor vermelha é especificada pela primeira vez na diretiva, que
corresponde ao número de índice 0.
O conjunto de cores não é colocado de uma vez por todas, pode ser alterado de forma dinâmica
usando PlotIndexSetInteger(). Exemplo:
Nestes casos, não existe qualquer maneira para calcular os valores do indicador para as primeiras N
barras, ou estes valores não se destinam a ser apresentados no gráfico e são apenas subsidiadas para
calcular novos valores. Para evitar a plotagem do indicador nas primeiras N barras do histórico, defina
o valor N para a propriedade PLOT_DR AW_BEGIN para a plotagem correspondente:
PlotIndexSetInteger(number_of_plot,PLOT_DRAW_BEGIN,N);
Onde:
· number_of_plot – um valor a partir de zero para indicator_plots -1 (numeração dos lotes inicia com
zero).
· N - o número da primeira barra no histórico, no qual o indicador não deve ser exibido sobre o
gráfico.
DRAW_NONE
O estilo DR AW_NONE é projetado para uso em casos onde é necess ário calcular os valores de um
buffer e mostrá-los na Janela de Dados, mas a plotagem no gráfico não é necess ária. Para configurar
com precisão use a expressão IndicatorSetInteger(INDICAT OR_DIGIT S,num_chars) na função OnInit():
int OnInit()
{
//--- mapeamento de buffers do indicador
SetIndexBuffer(0,InvisibleBuffer,INDICATOR_DATA);
//--- Define a precisão dos valores a serem exibidos na Janela de Dados
IndicatorSetInteger(INDICATOR_DIGITS,0);
//---
return(INIT_SUCCEEDED);
}
Um exemplo do indicador que mostra o número da barra na janela de dados, sobre a qual o mouse
passa sobre ela. A numeração corresponde as séries temporais (timeseries), significando que a atual
barra inacabada tem índice zero e a mais antiga barra tem o maior índice.
Note que apesar do fato de ser definida a plotagem para a cor vermelha #1, o indicador não desenha
nada no gráfico.
//+------------------------------------------------------------------+
//| DRAW_NONE.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
else
{
//--- Se uma nova barra apareceu, sua abertura de tempo difere da última barra
if(lastbar!=SeriesInfoInteger(_Symbol,_Period,SERIES_LASTBAR_DATE))
{
//--- Renumerar as barras mais uma vez
CalcValues(rates_total,close);
//--- Atualizar o tempo de abertura da barra atual com a última barra
lastbar=(datetime)SeriesInfoInteger(_Symbol,_Period,SERIES_LASTBAR_DATE);
}
}
//--- valor retorno de prev_calculated para a próxima chamada
return(rates_total);
}
//+------------------------------------------------------------------+
//| Número das barras como numa timeseries |
//+------------------------------------------------------------------+
void CalcValues(int total,double const &array[])
{
//--- Definir a indexação do buffer do indicador como numa timeseries
ArraySetAsSeries(InvisibleBuffer,true);
//--- Definir cada barra com sua numeração
for(int i=0;i<total;i++) InvisibleBuffer[i]=i;
}
DRAW_LINE
DR AW_L INE desenha uma linha de cor especifica pelos valores do buffer do indicador. A largura, estilo
e cor da linha pode ser definido utilizando as diretivas de compilação e dinamicamente usando a
função PlotIndexSetInteger(). Mudanças dinâmicas das propriedades de plotagem permitem " avivar" os
indicadores, de modo que suas mudanças de aparência dependem da situação corrente.
Um exemplo do indicador que desenha a linha usando o fechamento de preço das barras. A linha de
cor, a largura e o estilo mudam aleatoriamente a cada N=5 tick s.
Note que inicialmente para plot1 com DR AW_L INE, as propriedades são definidas usando a diretiva de
compilador #property, e então na função OnCalculate() estas três propriedades são definidas
aleatoriamente. O parâmetro N é definido nos parâmetros externos do indicador para a possibilidade
de configuração manual (o guia Parâmetros na janela Propriedades do indicador).
//+------------------------------------------------------------------+
//| 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
//--- Propriedades de linha são definidas usando as diretivas de compilação
#property indicator_label1 "Line" // Nome de uma plotagem para a janela de dados
#property indicator_type1 DRAW_LINE // Tipo de plotagem é uma linha
#property indicator_color1 clrRed // Cor da linha
#property indicator_style1 STYLE_SOLID // Estilo da linha
#property indicator_width1 1 // Largura da linha
//--- parâmetros de entrada
input int N=5; // Número de ticks para mudar
//--- Um buffer do indicador para plotar
double LineBuffer[];
//--- Um array para armazenar as cores
color colors[]={clrRed,clrBlue,clrGreen};
//--- Um array para armazenar os estilos de linha
ENUM_LINE_STYLE styles[]={STYLE_SOLID,STYLE_DASH,STYLE_DOT,STYLE_DASHDOT,STYLE_DASHDOTDOT};
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado |
//+------------------------------------------------------------------+
int OnInit()
{
//--- Ligando um array e um buffer de indicador
SetIndexBuffer(0,LineBuffer,INDICATOR_DATA);
//--- Inicializando o gerador de números pseudo-aleatórios
MathSrand(GetTickCount());
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
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;
//--- Calcule ticks para mudar o estilo, cor e largura da linha
ticks++;
//--- Se um número crítico de ticks tem sido acumulado
if(ticks>=N)
{
DRAW_SECTION
DR AW_SECTION desenha seções da cor específica pelos valores do buffer do indicador. A largura, cor e
estilo da linha podem ser especificadas como para o estilo DR AW_L INE - usando as diretivas de
compilação ou dinamicamente usando a função PlotIndexSetInteger(). Mudanças dinâmicas das
propriedades de plotagem permitem " avivar" os indicadores, de modo que suas aparências sejam
alteradas dependendo da situação corrente.
Seções são desenhadas a partir de um valor não vazio para outro valor não vazio do buffer de
indicador, valores vazios são ignorados. Para especificar qual o valor que deve ser considerado como
" vazio" , defina esse valor na propriedade PLOT_EMPTY_VAL UE: Por exemplo, se o indicador deve ser
desenhado como uma seqüência de seções sobre valores diferentes de zero, então você precisa definir
o valor zero como um vazio:
Sempre preencha explicitamente nos valores dos buffers do indicador, defina um valor vazio num
buffer para os elementos que não devem ser plotados.
Um exemplo do indicador que desenha seções entre os preços de Alta (high) e de Baixa (low). A cor, a
largura, e o estilo de todas seções mudam aleatoriamente a cada N tick s.
Note que para inicializar plot1 com DR AW_SECTION, as propriedades são definidas usando a diretiva
do compilador #property, e então na função OnCalculate(), estas três propriedades são definidas
aleatoriamente. O parâmetro N é definido nos parâmetros externos do indicador para a possibilidade
de configuração manual (o guia Parâmetros na janela Propriedades do indicador).
//+------------------------------------------------------------------+
//| DRAW_SECTION.mq5 |
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1
//--- plotar Seção
#property indicator_label1 "Seção"
#property indicator_type1 DRAW_SECTION
#property indicator_color1 clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- parâmetros de entrada
input int bars=5; // O comprimento das seções nas barras
input int N=5; // O número de ticks para mudar o estilo das seções
//--- Um buffer do indicador para plotar
double SectionBuffer[];
//--- Uma variável auxiliar para calcular extremidades das seções
int divider;
//--- Um array para armazenar as cores
color colors[]={clrRed,clrBlue,clrGreen};
//--- Um array para armazenar os estilos de linha
ENUM_LINE_STYLE styles[]={STYLE_SOLID,STYLE_DASH,STYLE_DOT,STYLE_DASHDOT,STYLE_DASHDOTDOT};
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado |
//+------------------------------------------------------------------+
int OnInit()
{
//--- Ligando um array e um buffer de indicador
SetIndexBuffer(0,SectionBuffer,INDICATOR_DATA);
//--- O valor 0 (vazio) não vai participar no desenho
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//--- Verifica o parâmetro do indicador
if(bars<=0)
{
PrintFormat("Valor invalido do parâmetro da barra=%d",barras);
return(INIT_PARAMETERS_INCORRECT);
}
else divider=2*bars;
//---+
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
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;
//--- Calcule ticks para mudar o estilo, cor e largura da linha
ticks++;
//--- Se um número crítico de ticks tem sido acumulado
if(ticks>=N)
{
//--- Alterar as propriedades da linha
ChangeLineAppearance();
//--- Redefinir o contador de ticks para zero
ticks=0;
}
//--- O número de barra a partir da qual o cálculo dos valores do indicador inicia
int start=0;
//--- Se o indicador foi calculado antes, então definir o início na barra anterior
if(prev_calculated>0) start=prev_calculated-1;
//--- Aqui estão todos os cálculos dos valores do indicador
for(int i=start;i<rates_total;i++)
{
//--- Obter um resto da divisão do número de barra por 2*Barras
int rest=i%divider;
//--- Se o número de barra é divisível por 2*Barras
if(rest==0)
{
//--- Definir o final da seção na alta de preço desta barra
SectionBuffer[i]=high[i];
}
//---Se o resto da divisão é igual para barras,
else
{
//--- Definir o final da seção na alta de preço desta barra
if(rest==bars) SectionBuffer[i]=low[i];
//--- Se nada aconteceu, ignore a barra - definir 0
else SectionBuffer[i]=0;
}
}
//--- Retorna o valor de prev_calculated para a próxima chamada da função
return(rates_total);
}
//+------------------------------------------------------------------+
//| Alterar a aparência das seções no indicador |
//+------------------------------------------------------------------+
void ChangeLineAppearance()
{
//--- Uma string para a formação de informações sobre as propriedades de linha
string comm="";
//--- Um bloco de mudança da cor da linha
int number=MathRand(); // Obter um número aleatório
//--- O divisor é igual ao tamanho do array colors[]
int size=ArraySize(colors);
//--- Obter o índice para selecionar uma nova cor como o restante da divisão inteira
int color_index=number%size;
//--- Definir a cor com a propriedade PLOT_LINE_COLOR
PlotIndexSetInteger(0,PLOT_LINE_COLOR,colors[color_index]);
//--- Escrever a cor da linha
comm=comm+"\r\n"+(string)colors[color_index];
DRAW_HISTOGRAM
O estilo DR AW_HIS T OGR AM desenha um histograma como uma seqüência de colunas de uma
especifica cor do zero para um especifico valor. Os valores são extraídos do buffer do indicador. A
largura, cor e estilo da coluna pode ser especificado como para o estilo DR AW_L INE - usando diretivas
de compilação ou dinamicamente usando a função PlotIndexSetInteger(). Mudanças dinâmicas das
propriedades de plotagem permitem alterar o visual do histograma com base na situação atual.
Uma vez que uma coluna a partir do nível zero é desenhada sobre cada barra, DR AW_HIS T OGR AM
deve ser melhor utilizada numa janela do gráfico em separado. Na maioria das vezes este tipo de de
plotagem é usada para criar indicadores do tipo de oscilador, por exemplo, Bears Power ou OsMA. Para
os valores vazios que não são visíveis, o valor zero deve ser especificado.
Um exemplo do indicador que desenha uma senóide de uma cor específica com base na função
MathSin(). A cor, a largura e o estilo de todas colunas do histograma mudam aleatoriamente a cada N
tick s. O parâmetro de barras determina o período da senóide, isto é, após um número especifico de
barras a senóide vai repetir o ciclo.
Note que inicialmente para plot1 com DR AW_HIS T OGR AM, as propriedades são definidas usando a
diretiva de compilador #property, e então na função OnCalculate() estas três propriedades são
definidas aleatoriamente. O parâmetro N é definido nos parâmetros externos do indicador para a
possibilidade de configuração manual (o guia Parâmetros na janela Propriedades do indicador).
//+------------------------------------------------------------------+
//| DRAW_HISTOGRAM.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1
//--- plotar Histograma
#property indicator_label1 "Histograma"
#property indicator_type1 DRAW_HISTOGRAM
#property indicator_color1 clrBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- parâmetros de entrada
input int bars=30; // O período de uma senóide em barras
input int N=5; // O número de ticks para alterar o histograma
//--- buffers do indicador
double HistogramBuffer[];
//--- Um fator para obter o ângulo 2Pi em radianos, quando multiplicado pelo parâmetro das barras
double multiplier;
//--- Um array para armazenar as cores
color colors[]={clrRed,clrBlue,clrGreen};
//--- Um array para armazenar os estilos de linha
ENUM_LINE_STYLE styles[]={STYLE_SOLID,STYLE_DASH,STYLE_DOT,STYLE_DASHDOT,STYLE_DASHDOTDOT};
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado |
//+------------------------------------------------------------------+
int OnInit()
{
//--- mapeamento de buffers do indicador
SetIndexBuffer(0,HistogramBuffer,INDICATOR_DATA);
//--- Calcular a multiplicação
if(bars>1)multiplier=2.*M_PI/bars;
else
{
PrintFormat("Defina o valor das barras=%d maior do que 1",bars);
//--- Finalização antecipada do indicador
return(INIT_PARAMETERS_INCORRECT);
}
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
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;
//--- Calcule ticks para mudar o estilo, cor e largura da linha
ticks++;
//--- Se um número crítico de ticks tem sido acumulado
if(ticks>=N)
{
//--- Alterar as propriedades da linha
ChangeLineAppearance();
//--- Redefinir o contador de ticks para zero
ticks=0;
}
DRAW_HISTOGRAM2
O estilo DR AW_HIS T OGR AM 2 desenha uma histograma de uma cor especifica – segmentos verticais
usando os valores de dois buffers do indicator. A largura, cor e estilo dos segmentos podem ser
especificados para o estilo DR AW_L INE - usando diretivas de compilação ou dinamicamente usando a
função PlotIndexSetInteger(). Mudanças dinâmicas das propriedades de plotagem permitem alterar o
visual do histograma com base na situação atual.
O estilo DR AW_HIS T OGR AM 2 pode ser usado numa sub-janela separada e na sua janela principal. Para
valores vazios nada é desenhado, todos os valores nos buffers do indicador precisam ser definidos
explicitamente. Buffers não são inicializados com o valor zero.
Um exemplo de indicador que plota um segmento vertical da cor especifica e largura entre a Abertura
(open) e o Fechamento (close) de preços de cada barra. A cor, a largura e o estilo de todas as colunas
do histograma mudam aleatoriamente a cada N tick s. durante a inicialização do indicador, na função
OnInit(), o número do dia da semana em que não será desenhado o histograma - invisible_day - é
definido aleatoriamente. Para este fim um valor vazio é definido PLOT_EMPTY_VAL UE=0:
Note que inicialmente para plot1 com DR AW_HIS T OGR AM 2, as propriedades são definidas usando a
diretiva de compilador #property, e então na função OnCalculate() estas três propriedades são
definidas aleatoriamente. O parâmetro N é definido nos parâmetros externos do indicador para a
possibilidade de configuração manual (o guia Parâmetros na janela Propriedades do indicador).
//+------------------------------------------------------------------+
//| 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
//--- plotar 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
//--- parâmetros de entrada
input int N=5; // O número de ticks para alterar o histograma
//--- buffers do indicador
double Histogram_2Buffer1[];
double Histogram_2Buffer2[];
//--- O dia da semana, em que o indicador não é plotado
int invisible_day;
//--- Um array para armazenar as cores
color colors[]={clrRed,clrBlue,clrGreen};
//--- Um array para armazenar os estilos de linha
ENUM_LINE_STYLE styles[]={STYLE_SOLID,STYLE_DASH,STYLE_DOT,STYLE_DASHDOT,STYLE_DASHDOTDOT};
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado |
//+------------------------------------------------------------------+
int OnInit()
{
//--- mapeamento de buffers do indicador
SetIndexBuffer(0,Histogram_2Buffer1,INDICATOR_DATA);
SetIndexBuffer(1,Histogram_2Buffer2,INDICATOR_DATA);
//--- Definir um valor vazio
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//--- Obtém aleatoriamente um número a partir do 0 até 5
invisible_day=MathRand()%6;
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
void ChangeLineAppearance()
{
//--- Uma string para a formação de informações sobre as propriedades de linha
string comm="";
//--- Um bloco de mudança da cor da linha
int number=MathRand(); // Obter um número aleatório
//--- O divisor é igual ao tamanho do array colors[]
int size=ArraySize(colors);
//--- Obter o índice para selecionar uma nova cor como o restante da divisão inteira
int color_index=number%size;
//--- Definir a cor com a propriedade PLOT_LINE_COLOR
PlotIndexSetInteger(0,PLOT_LINE_COLOR,colors[color_index]);
//--- Escrever a cor da linha
comm=comm+"\r\n"+(string)colors[color_index];
DRAW_ARROW
O estilo DR AW_ARR OW desenha setas de cor específica (símbolos do conjunto W ingdings) baseado no
valor do buffer do indicador. A largura e a cor dos símbolos pode ser especificado semelhante ao
modelo DR AW_L INE - usando diretivas de compilador ou dinamicamente usando a função
PlotIndexSetInteger(). Mudanças dinâmicas das propriedades de plotagem permitem alterar o visual de
um indicador baseado na situação atual.
//--- Definir o código símbolo a partir das fontes Wingdings para desenhar em PLOT_ARROW
PlotIndexSetInteger(0,PLOT_ARROW,code);
Cada seta é na verdade um símbolo que tem a altura e o ponto de ancoragem e pode abranger algumas
informações importantes num gráfico (por exemplo, o preço de fechamento da barra). Assim,
podemos adicionalmente especificar o deslocamento vertical em pixels, o qual não depende da escala
do gráfico. As setas serão deslocadas para baixo pelo número especificado de pixels, embora os
valores do indicador permanecerão os mesmos :
Um valor negativo de PLOT_ARR OW_S HIFT significa a mudança de setas para cima, valores positivos
deslocam a seta para baixo.
O estilo DR AW_ARR OW pode ser usado numa sub-janela separada de um gráfico e em sua janela
principal. Valores vazios não são desenhados e não aparecem na "Janela de Dados " , todos os valores
nos buffers do indicador devem ser definidos explicitamente. Buffers não são inicializados com o valor
zero.
Um exemplo de indicador que desenha as setas em cada uma das barras com o preço mais alto do que
o preço final da barra anterior. A cor, a largura, deslocamento e símbolo de código de todas setas são
alterados aleatoriamente a cada N tick s.
No exemplo, para plot1 com o estilo DR AW_ARR OW , as propriedades, a cor e o tamanho são
especificados usando a diretiva de compilador #property, e depois na função OnCalculate() as
propriedades são definidas aleatoriamente. O parâmetro N é definido nos parâmetros externos do
indicador para a possibilidade de configuração manual (o guia Parâmetros na janela Propriedades do
indicador).
//+------------------------------------------------------------------+
//| 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
//--- Plotagem de Setas
#property indicator_label1 "Setas"
#property indicator_type1 DRAW_ARROW
#property indicator_color1 clrGreen
#property indicator_width1 1
//--- parâmetros de entrada
int start=1;
if(prev_calculated>0) start=prev_calculated-1;
//--- Calculando loop
for(int i=1;i<rates_total;i++)
{
//--- Se o preço atual fechado é mais alto do que o anterior, desenhar uma seta
if(close[i]>close[i-1])
ArrowsBuffer[i]=close[i];
//--- Otherwise specify the zero value
else
ArrowsBuffer[i]=0;
}
//--- valor retorno de prev_calculated para a próxima chamada
return(rates_total);
}
//+------------------------------------------------------------------+
//| Alterar a aparência dos símbolos no indicador |
//+------------------------------------------------------------------+
void ChangeLineAppearance()
{
//--- Uma string para formar as informações sobre as propriedades do indicador
string comm="";
//--- Um bloco para alterar a cor da seta
int number=MathRand(); // Obter um número aleatório
//--- O divisor é igual ao tamanho do array colors[]
int size=ArraySize(colors);
//--- Obter o índice para selecionar uma nova cor como o restante da divisão inteira
int color_index=number%size;
//--- Definir a cor com a propriedade PLOT_LINE_COLOR
PlotIndexSetInteger(0,PLOT_LINE_COLOR,colors[color_index]);
//--- Escrever a cor da linha
comm=comm+"\r\n"+(string)colors[color_index];
comm="\r\n"+"PLOT_ARROW="+IntegerToString(code+code_add)+comm;
DRAW_ZIGZAG
O estilo DR AW_ZIGZAG desenha segmentos da cor especifica baseada nos valor de dois buffers do
indicador. Este estilo é muito similar ao DR AW_SECTION, mas ao contrário deste último, permite
desenhar segmentos verticais dentro de uma barra, se os valores de ambos os buffers do indicador
são definidos para este barra. Os segmentos são plotados a partir de um valor no primeiro buffer para
um valor no segundo buffer do indicador. Nenhum dos buffers pode conter somente valores vazios,
uma vez que neste caso nada é plotado.
A largura, cor e estilo da linha podem ser especificadas como para o estilo DR AW_SECTION - usando as
diretivas de compilação ou dinamicamente usando a função PlotIndexSetInteger(). Mudanças
dinâmicas das propriedades de plotagem permitem " avivar" os indicadores, de modo que suas
aparências sejam alteradas dependendo da situação corrente.
Seções são desenhadas a partir de um valor não vazio de um buffer para um valor não vazio de outro
buffer do indicador. Para especificar o valor que deve ser considerado como " vazio" , defina esse valor
na propriedade PLOT_EMPTY_VAL UE:
Sempre preencher explicitamente os valores dos buffers do indicador, definir um valor vazio num
buffer para ignorar barras.
Um exemplo de indicador de que plota uma serra com base nos altas e baixas dos preços. A cor, a
largura eo estilo das linhas zigzag alteram aleatoriamente a cada N tick s.
Note que para inicializar plot1 com DR AW_ZIGZAG, as propriedades são definidas usando a diretiva de
compilar #property, e então na função OnCalculate() estas propriedades são definidas aleatoriamente.
//+------------------------------------------------------------------+
//| 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
//--- plotar ZigZag
#property indicator_label1 "ZigZag"
#property indicator_type1 DRAW_ZIGZAG
#property indicator_color1 clrBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- parâmetros de entrada
input int N=5; // Número de ticks para alterar
//--- buffers do indicador
double ZigZagBuffer1[];
double ZigZagBuffer2[];
//--- O dia da semana, em que o indicador não é plotado
int invisible_day;
//--- Um array para armazenar as cores
color colors[]={clrRed,clrBlue,clrGreen};
//--- Um array para armazenar os estilos de linha
ENUM_LINE_STYLE styles[]={STYLE_SOLID,STYLE_DASH,STYLE_DOT,STYLE_DASHDOT,STYLE_DASHDOTDOT};
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado |
//+------------------------------------------------------------------+
int OnInit()
{
//--- Arrays de ligação e buffers do indicador
SetIndexBuffer(0,ZigZagBuffer1,INDICATOR_DATA);
SetIndexBuffer(1,ZigZagBuffer2,INDICATOR_DATA);
//--- Obter um valor aleatório de 0 para 6, para este dia o indicador não é plotado
invisible_day=MathRand()%6;
//--- O valor 0 (vazio) não vai participar no desenho
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//--- O valor 0 (vazio) não vai participar no desenho
PlotIndexSetString(0,PLOT_LABEL,"ZigZag1;ZigZag2");
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
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;
//--- Calcule ticks para mudar o estilo, cor e largura da linha
ticks++;
//--- Se um número suficiente de ticks foi acumulado
if(ticks>=N)
{
//--- Alterar as propriedades da linha
ChangeLineAppearance();
//--- Redefinir o contador de ticks para zero
ticks=0;
}
//--- A estrutura de tempo é necessário para obter o dia da semana de cada barra
MqlDateTime dt;
ZigZagBuffer2[i]=0;
}
//--- Se o dia da semana é OK, preencha os buffers
else
{
//--- Se o número de barra é o mesmo
if(i%2==0)
{
//--- Escrever High (alta) no primeiro buffer a Low (baixa) no segundo
ZigZagBuffer1[i]=high[i];
ZigZagBuffer2[i]=low[i];
}
//--- O número da barra é impar
else
{
//--- Preenchimento da barra na ordem inversa
ZigZagBuffer1[i]=low[i];
ZigZagBuffer2[i]=high[i];
}
}
}
//--- valor retorno de prev_calculated para a próxima chamada
return(rates_total);
}
//+------------------------------------------------------------------+
//| Alterar a aparência dos segmentos zigzag |
//+------------------------------------------------------------------+
void ChangeLineAppearance()
{
//--- Uma string para a formação de informações sobre as propriedades de ZigZag
string comm="";
//--- Um bloco para mudar a cor do ziguezague
int number=MathRand(); // Obter um número aleatório
//--- O divisor é igual ao tamanho do array colors[]
int size=ArraySize(colors);
//--- Obter o índice para selecionar uma nova cor como o restante da divisão inteira
int color_index=number%size;
//--- Definir a cor com a propriedade PLOT_LINE_COLOR
PlotIndexSetInteger(0,PLOT_LINE_COLOR,colors[color_index]);
//--- Escrever a cor da linha
comm=comm+"\r\n"+(string)colors[color_index];
comm=comm+"\r\nWidth="+IntegerToString(width);
DRAW_FILLING
O estilo DR AW_FILL ING plota uma área colorida entre valores de dois buffers do indicador. De fato,
este modelo desenha duas linhas e preenche o espaço entre elas, com uma das duas cores específicas.
Ele é usado para a criação de indicadores que desenham canais. Nenhum dos buffers podem conter
apenas valores vazios, uma vez que, neste caso, nada é plotado.
· a primeira cor é usada para as áreas onde os valores do primeiro buffer são maiores do que os
valores do segundo buffer do indicador;
· a segunda cor é usada para as áreas onde os valores de do segundo buffer do são maiores do que os
valores no primeiro buffer indicador.
A cor de preenchimento pode ser definida usando as diretivas do compilador ou dinamicamente usando
a função PlotIndexSetInteger(). Mudanças dinâmicas das propriedades de plotagem permitem " avivar"
os indicadores, de modo que suas mudanças de aparência dependem da situação corrente.
O indicador é calculado para todas as barras, para a qual os valores dos dois buffers do indicador não
são iguais a 0 ou o valor vazio. Para especificar o valor que deve ser considerado como " vazio" , defina
esse valor na propriedade PLOT_EMPTY_VAL UE:
Desenhar sobre as barras que não participam no cálculo do indicador depende dos valores nos buffers
do indicador:
· Barras, para os quais os valores de ambos os buffers do indicador são iguais a 0, não participam no
desenho do indicador. Isto significa que a área com valores iguais a zero não é preenchida.
· Barras, para as quais os valores dos buffers do indicador são iguais ao " valor vazio" , participam no
desenho do indicador. A área com valores vazios será preenchida de modo que conecte as áreas com
valores significativos.
Deve ser notado que se o " valor vazio" é igual a zero, as barras que não participam no cálculo do
indicador também são preenchidas.
Um exemplo do indicador que desenha um canal entre duas MAs com diferentes períodos médios em
uma janela separada. A mudança das cores no cruzamento das médias móveis mostra visualmente a
mudança das tendências ascendentes e descendentes. As cores alteram aleatoriamente a cada N tick s.
O parâmetro N é definido nos parâmetro externos do indicador para a possibilidade de configuração
manual (na guia Parâmetros na janela Propriedades do indicador).
Note que inicialmente para plot1 com DR AW_FILL ING as propriedades são definidas usando a diretiva
de compilador #property, e então na função OnCalculate() novas cores são definidas aleatoriamente.
//+------------------------------------------------------------------+
//| DRAW_FILLING.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots 1
//--- plotar Interseção
#property indicator_label1 "Interseção"
#property indicator_type1 DRAW_FILLING
#property indicator_color1 clrRed,clrBlue
#property indicator_width1 1
//--- parâmetros de entrada
input int Fast=13; // Período rápido da MA
input int Slow=21; // Período lento da MA
input int shift=1; // Deslocamento das MAs para frente (positivo)
input int N=5; // Número de ticks para alterar
//--- buffers do Indicador
double IntersectionBuffer1[];
double IntersectionBuffer2[];
int fast_handle;
int slow_handle;
//--- Um array para armazenar as cores
color colors[]={clrRed,clrBlue,clrGreen,clrAquamarine,clrBlanchedAlmond,clrBrown,clrCoral,clrDarkSl
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado |
//+------------------------------------------------------------------+
int OnInit()
{
//--- mapeamento de buffers do indicador
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);
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
//--- Faz o primeiro cálculo do indicador, ou os dados foram alterados e requerem um recálculo comp
if(prev_calculated==0)
{
//--- Copia todos os valores dos indicadores para os buffers apropriados
int copied1=CopyBuffer(fast_handle,0,0,rates_total,IntersectionBuffer1);
int copied2=CopyBuffer(slow_handle,0,0,rates_total,IntersectionBuffer2);
}
else // Preenche apenas os dados que são atualizados
{
//--- Obtém a diferença entre as barras atuais e as que iniciaram anteriormente ao OnCalculat
int to_copy=rates_total-prev_calculated;
//--- Se não existe qualquer diferença, ainda cópia um valor - na barra zero
if(to_copy==0) to_copy=1;
//--- copia valores to_copy para o fim dos buffers do indicador
int copied1=CopyBuffer(fast_handle,0,0,to_copy,IntersectionBuffer1);
int copied2=CopyBuffer(slow_handle,0,0,to_copy,IntersectionBuffer2);
}
//--- valor retorno de prev_calculated para a próxima chamada
return(rates_total);
}
//+------------------------------------------------------------------+
//| Altera as cores do preenchimento do canal |
//+------------------------------------------------------------------+
void ChangeLineAppearance()
{
//--- Uma string para a formação de informações sobre as propriedades de linha
string comm="";
//--- Um bloco para alterar a cor da linha
//--- Obter o índice para selecionar uma nova cor como o restante da divisão inteira
int color_index1=number%size;
//--- Define a primeira cor como a propriedade PLOT_LINE_COLOR
PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,colors[color_index1]);
//--- Escreve a primeira cor
comm=comm+"\r\nColor1 "+(string)colors[color_index1];
//--- Obter o índice para selecionar uma nova cor como o restante da divisão inteira
number=MathRand(); // Obtém um número aleatório
int color_index2=number%size;
//--- Define a segunda cor como a propriedade PLOT_LINE_COLOR
PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,colors[color_index2]);
//--- Escreve a segunda cor
comm=comm+"\r\nColor2 "+(string)colors[color_index2];
//--- Mostrar a informação no gráfico usando um comentário
Comment(comm);
}
DRAW_BARS
O estilo DR AW_BAR S desenha barras nos valores de quatro buffers do indicador, que contêm a
Abertura (open), Alta (high), Baixa (low) e Fechamento (close) dos preços. É usado para a criação de
indicadores personalizados como barras, incluindo aqueles numa sub-janela separada de um gráfico e
sobre outros instrumentos financeiros.
A cor das barras pode ser definida usando as diretivas de compilador ou dinamicamente utilizando a
função PlotIndexSetInteger(). Mudanças dinâmicas das propriedades de plotagem permitem " avivar" os
indicadores, de modo que suas mudanças de aparência dependem da situação corrente.
O indicador é desenhado apenas para as barras, para o qual os valores não vazios de todos quatro
buffers do indicador são definidos. Para especificar o valor que deve ser considerado como " vazio" ,
defina este valor na propriedade PLOT_EMPTY_VAL UE:
Sempre preencher explicitamente os valores dos buffers do indicador, definir um valor vazio num
buffer para ignorar barras.
O número de buffers necess ários para plotagem de DR AW_BAR S é 4. T odos os buffers para a plotagem
devem ir um após o outro na ordem dada: Open (abertura do preço), H igh (alta do preço), Low (baixa
do preço) e Close (fechamento do preço). Nenhum dos buffers podem conter apenas valores vazios,
uma vez que, neste caso, nada é plotado.
Um exemplo do indicador que desenha barras sobre um instrumento financeiro selecionado numa
janela separada. A cor das barras muda aleatoriamente a cada N tick s. O parâmetro N é definido nos
parâmetro externos do indicador para a possibilidade de configuração manual (na guia Parâmetros na
janela Propriedades do indicador).
Por favor, note que para plot1 com o estilo DR AW_BAR S, a cor é definida usando a diretiva de
compilador #property, e então, na função OnCalculate() a cor é definida aleatoriamente a partir de
uma lista preparada anteriormente.
//+------------------------------------------------------------------+
//| 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
//--- plotar Barras
#property indicator_label1 "Barras"
#property indicator_type1 DRAW_BARS
#property indicator_color1 clrGreen
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- parâmetros de entrada
input int N=5; // O número de ticks para alterar o tipo
input int bars=500; // O número de barras para mostrar
input bool messages=false; // Mostrar mensagens no log "Expert Advisors"
//--- buffers do Indicador
double BarsBuffer1[];
double BarsBuffer2[];
double BarsBuffer3[];
double BarsBuffer4[];
//--- Nome do símbolo
string symbol;
//--- Um array para armazenar as cores
color colors[]={clrRed,clrBlue,clrGreen,clrPurple,clrBrown,clrIndianRed};
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado |
//+------------------------------------------------------------------+
int OnInit()
{
//--- Se as barras são muito pequenas - concluir o trabalho antes do tempo
if(bars<50)
{
Comment("Por favor, especifique um número maior de barras! A operação do indicador foi termin
return(INIT_PARAMETERS_INCORRECT);
}
//--- mapeamento de buffers do indicador
SetIndexBuffer(0,BarsBuffer1,INDICATOR_DATA);
SetIndexBuffer(1,BarsBuffer2,INDICATOR_DATA);
SetIndexBuffer(2,BarsBuffer3,INDICATOR_DATA);
SetIndexBuffer(3,BarsBuffer4,INDICATOR_DATA);
//--- O nome do símbolo, para o qual as barras são desenhadas
symbol=_Symbol;
//--- Definir a exibição do símbolo
PlotIndexSetString(0,PLOT_LABEL,symbol+" Open;"+symbol+" High;"+symbol+" Low;"+symbol+" Close");
IndicatorSetString(INDICATOR_SHORTNAME,"DRAW_BARS("+symbol+")");
//--- Um valor vazio
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
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;
//--- Calcule ticks para mudar o estilo, cor e largura da linha
ticks++;
//--- Se um número suficiente de ticks foi acumulado
if(ticks>=N)
{
//--- Selecione um novo símbolo a partir da janela de observação do Mercado
symbol=GetRandomSymbolName();
//--- Alterar as propriedades da linha
ChangeLineAppearance();
int tries=0;
//--- Faça 5 tentativas de preencher os buffers com os preços a partir símbolo
while(!CopyFromSymbolToBuffers(symbol,rates_total) && tries<5)
{
//--- Um contador de chamadas da função CopyFromSymbolToBuffers()
tries++;
}
ArrayInitialize(BarsBuffer4,0.0);
//--- Copiar os preços para os buffers
for(int i=0;i<copied;i++)
{
//--- Calcular o índice apropriado para os buffers
int buffer_index=total-copied+i;
//--- Escreva os preços para os 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);
}
//+------------------------------------------------------------------+
//| Aleatoriamente retorna um símbolo de Observação do Mercado |
//+------------------------------------------------------------------+
string GetRandomSymbolName()
{
//--- O número de símbolos mostrada na janela de observação do Mercado
int symbols=SymbolsTotal(true);
//--- A posição de um símbolo na lista - um número aleatório de 0 para símbolos
int number=MathRand()%symbols;
//--- Retornar o nome de um símbolo na posição especificada
return SymbolName(number,true);
}
//+------------------------------------------------------------------+
//| Altera a aparência das barras |
//+------------------------------------------------------------------+
void ChangeLineAppearance()
{
//--- Uma string para a formação de informações sobre as propriedades da barra
string comm="";
//--- Um bloco para alterar a cor das barras
int number=MathRand(); // Obter um número aleatório
//--- O divisor é igual ao tamanho do array colors[]
int size=ArraySize(colors);
//--- Obter o índice para selecionar uma nova cor como o restante da divisão inteira
int color_index=number%size;
//--- Definir a cor com a propriedade PLOT_LINE_COLOR
PlotIndexSetInteger(0,PLOT_LINE_COLOR,colors[color_index]);
//--- Escrever a cor da linha
comm=comm+"\r\n"+(string)colors[color_index];
PlotIndexSetInteger(0,PLOT_LINE_WIDTH,width);
//--- Escrever a largura da linha
comm=comm+"\r\nWidth="+IntegerToString(width);
DRAW_CANDLES
O estilo DR AW_CANDLES desenha candlestick s sobre os valores dos quatro buffers do indicador, que
contêm Open (abertura), H igh (alta), Low (baixa) e Close (fechamento) de preços. É usado para a
criação de indicadores personalizados como uma seqüência de candlestick s, incluindo os inseridos
numa sub-janela separada de um gráfico e noutros instrumentos financeiros.
A cor dos candlestick s pode ser definida usando as diretivas de compilador ou dinamicamente usando
a função PlotIndexSetInteger(). Mudanças dinâmicas das propriedades de plotagem permitem " avivar"
os indicadores, de modo que suas mudanças de aparência dependem da situação corrente.
O indicador é desenhado apenas para as barras, para o qual os valores não vazios de todos quatro
buffers do indicador são definidos. Para especificar o valor que deve ser considerado como " vazio" ,
defina este valor na propriedade PLOT_EMPTY_VAL UE:
Sempre preencher explicitamente os valores dos buffers do indicador, definir um valor vazio num
buffer para ignorar barras.
O número de buffers necess ários para plotagem de DR AW_CANDLES é 4. T odos os buffers para a
plotagem devem ir um após o outro na ordem dada: Open (abertura do preço), H igh (alta do preço),
Low (baixa do preço) e Close (fechamento do preço). Nenhum dos buffers podem conter apenas
valores vazios, uma vez que, neste caso, nada é plotado.
Para o estilo DR AW_CANDLES, é possível definir de uma a três cores, dependendo de isso é alterada a
aparência das velas. Se for definida apenas uma cor, todas as velas no gráfico serão pintadas
completamente com essa cor.
Si nós especificarmos duas cores separadas por uma vírgula, os contornos das velas serão desenhados
com a primeira cor e o corpo com a segunda.
Para exibir de maneira diferente as velas crescentes e decrescentes, é indispens ável definir,
separando por vírgulas, três cores. Neste caso, o contorno da vela será traçado usando a primeira cor,
enquanto a cor da velas de alta e baixa serão definidas pela segunda e terceira cor.
Assim, usando o estilo DR AW_CANDLES, é possível criar variantes personalizadas das velas. T ambém
é possível alterar dinamicamente todas as cores -no processo de trabalho do indicador- mediante a
função PlotIndexSetInteger(índice_de_construção_DR AW_CANDLES, PLOT_L INE_COLOR ,
número_de_modificador, cor), aqui o número_de_modificador pode ter os seguintes valores :
Por favor, note que para plot1, a cor é definida usando a diretiva de compilador #property, e então,
na função OnCalculate() a cor é definida aleatoriamente a partir de uma lista preparada
anteriormente.
//+------------------------------------------------------------------+
//| DRAW_CANDLES.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_plots 1
//--- plotar Barras
#property indicator_label1 "DRAW_CANDLES1"
#property indicator_type1 DRAW_CANDLES
#property indicator_color1 clrGreen
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
}
//+------------------------------------------------------------------+
//| Preenche o candlestick especificado |
//+------------------------------------------------------------------+
bool CopyFromSymbolToBuffers(string name,
int total,
int plot_index,
double &buff1[],
double &buff2[],
double &buff3[],
double &buff4[]
)
{
//--- No array de rates[], vamos copiar Open (abertura), High (alta), Low (baixa) e Close (fechamen
MqlRates rates[];
//--- O contador de tentativas
int attempts=0;
//--- Quanto foi copiado
int copied=0;
//--- Fazer 25 tentativas para obter uma série temporal(timeseries) sobre o símbolo desejado
while(attempts<25 && (copied=CopyRates(name,_Period,0,bars,rates))<0)
{
Sleep(100);
attempts++;
if(messages) PrintFormat("%s Copiar taxas(%s) tentativas=%d",__FUNCTION__,nome,tentativas);
}
//--- Se falhou em copiar um número suficiente de barras
if(copied!=bars)
{
//--- Formar uma mensagem string
string comm=StringFormat("Para o símbolo %s, conseguiu receber somente %d barras de %d solici
name,
copied,
bars
);
//--- Mostrar uma mensagem num comentário na janela do gráfico principal
Comment(comm);
//--- Mostrar a mensagem
if(messages) Print(comm);
return(false);
}
else
{
//--- Definir a exibição do símbolo
PlotIndexSetString(plot_index,PLOT_LABEL,name+" Open;"+name+" High;"+name+" Low;"+name+" Clos
}
//--- Inicializar buffers com valores vazios
ArrayInitialize(buff1,0.0);
ArrayInitialize(buff2,0.0);
ArrayInitialize(buff3,0.0);
ArrayInitialize(buff4,0.0);
//--- Sobre cada tick é copiado preços para os buffers
for(int i=0;i<copied;i++)
{
//--- Calcular o índice apropriado para os buffers
int buffer_index=total-copied+i;
//--- Escreva os preços para os 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);
}
//+------------------------------------------------------------------+
//| Aleatoriamente retorna um símbolo de Observação do Mercado |
//+------------------------------------------------------------------+
string GetRandomSymbolName()
{
//--- O número de símbolos mostrada na janela de observação do Mercado
int symbols=SymbolsTotal(true);
//--- A posição de um símbolo na lista - um número aleatório de 0 para símbolos
int number=MathRand()%symbols;
//--- Retornar o nome de um símbolo na posição especificada
return SymbolName(number,true);
}
//+------------------------------------------------------------------+
//| Altera a aparência das barras |
//+------------------------------------------------------------------+
void ChangeLineAppearance()
{
//--- Uma string para a formação de informações sobre as propriedades da barra
string comm="";
//--- Um bloco para alterar a cor das barras
int number=MathRand(); // Obter um número aleatório
//--- O divisor é igual ao tamanho do array colors[]
int size=ArraySize(colors);
//--- Obter o índice para selecionar uma nova cor como o restante da divisão inteira
int color_index=number%size;
//--- Definir a cor com a propriedade PLOT_LINE_COLOR
PlotIndexSetInteger(0,PLOT_LINE_COLOR,colors[color_index]);
//--- Escrever a cor
comm=comm+"\r\n"+(string)colors[color_index];
//--- Escreve o nome do símbolo
comm="\r\n"+symbol+comm;
//--- Mostrar a informação no gráfico usando um comentário
Comment(comm);
}
DRAW_COLOR_LINE
O valor DR AW_COLOR_L INE é uma variante colorida do estilo DR AW_L INE; ele também desenha uma
linha usando os valores do buffer do indicador. Mas esse estilo, como todos os estilos de cores com a
palavra COLOR em seu título tem um buffer indicador adicional e especial que armazena o índice de
cores (número) a partir de um conjunto especial array de cores. Assim, a cor de cada segmento de
linha pode ser definida através da especificação do índice de cores para desenhar a linha naquela
barra.
A largura, o estilo e as cores das linhas podem ser definidas usando as diretivas de compilador e
dinamicamente usando a função PlotIndexSetInteger(). Mudanças dinâmicas das propriedades de
plotagem permitem " avivar" os indicadores, de modo que suas mudanças de aparência dependem da
situação corrente.
· um buffer para armazenar os valores do indicador utilizado para desenhar uma linha;
Cores serão especificadas pela diretiva de compilador #property indicator_color1 separada por uma
vírgula. O número de cores não pode exceder a 64.
//--- Define 5 cores para colorir cada barra (elas são armazenadas no array especial)
#property indicator_color1 clrRed,clrBlue,clrGreen,clrOrange,clrDeepPink // (Podem ser especificad
Um exemplo do indicador que desenha a linha usando o fechamento de preço das barras. A largura da
linha e estilo são alterados aleatoriamente a cada N=5 tick s.
As cores dos segmentos de linhas também são alteradas aleatoriamente na função personalizada
ChangeColors().
//+------------------------------------------------------------------+
//--- Para cada índice de cor definir uma nova cor aleatoriamente
for(int plot_color_ind=0;plot_color_ind<plot_colors;plot_color_ind++)
{
//--- Obter um valor aleatório
int number=MathRand();
//--- Obter um índice no array col[] como um resto da divisão inteira
int i=number%size;
//--- Definir a cor para cada índice com a propriedade PLOT_LINE_COLOR
PlotIndexSetInteger(0, // O número do estilo gráfico
PLOT_LINE_COLOR, // Identificador da propriedade
plot_color_ind, // O índice da cor, onde se escreve a cor
cols[i]); // Uma nova cor
//--- Escrever as cores
comm=comm+StringFormat("LineColorIndex[%d]=%s \r\n",plot_color_ind,ColorToString(cols[i],true
ChartSetString(0,CHART_COMMENT,comm);
}
//---
}
O exemplo mostra a característica das vers ões " cor" de indicadores - para mudar a cor de um
segmento de linha, você não precisa alterar os valores no buffer ColorLineColors [] (que contém os
índices de cores). T udo que você precisa fazer é definir novas cores em um array especial. Isto
permite-lhe alterar rapidamente a cor de uma vez para toda a plotagem, mudando apenas um pequeno
array de cores utilizando a função PlotIndexSetInteger().
Note que para inicializar plot1 com DR AW_COLOR_L INE as propriedades são definidas usando a
diretiva de compilador #property, e então na função OnCalculate() existem três propriedades que são
definidas aleatoriamente.
O N e Length (o comprimento dos segmentos de corres nas barras) dos parâmetros são definidos nos
parâmetros externos do indicador para a possibilidade de configuração manual (a guia Parâmetros na
janela Propriedades do indicador).
//+------------------------------------------------------------------+
//| 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
//--- plotar ColorLine
#property indicator_label1 "ColorLine"
#property indicator_type1 DRAW_COLOR_LINE
//--- Define 5 cores para colorir cada barra (elas são armazenadas no array especial)
#property indicator_color1 clrRed,clrBlue,clrGreen,clrOrange,clrDeepPink // (Podem ser especificad
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- parâmetros de entrada
input int N=5; //Número de ticks para alterar
input int Length=20; // A largura de cada parte de cor nas barras
int line_colors=5; // O número para definir as cores é 5 - ver #property indicator_color
//--- Um buffer para plotagem
double ColorLineBuffer[];
//--- Um buffer para armazenar a cor da linha sobre cada barra
double ColorLineColors[];
//--- Para cada índice de cor definir uma nova cor aleatoriamente
for(int plot_color_ind=0;plot_color_ind<plot_colors;plot_color_ind++)
{
DRAW_COLOR_SECTION
O estilo DR AW_COLOR_SECTION é uma versão de cor de DR AW_SECTION, mas ao contrário deste
último, permite seções de desenho de cores diferentes. O estilo DR AW_COLOR_SECTION, como todos
os estilos de cor com a palavra COLOR em seu título tem um buffer de indicador adicional e especial
que armazena o índice de cores (número) a partir de um conjunto especial array de cores. Assim, a cor
de cada uma das seções pode ser definido através da especificação do índice de cores do índice da
barra que corresponde a seção final.
A largura, cor e estilo das seções podem ser especificados como para o estilo DR AW_SECTION - usando
as as diretivas do compilador ou dinamicamente usando a função PlotIndexSetInteger(). Mudanças
dinâmicas das propriedades de plotagem permitem " avivar" os indicadores, de modo que suas
aparências sejam alteradas dependendo da situação corrente.
Seções são desenhadas a partir de um valor não vazio para outro valor não vazio do buffer de
indicador, valores vazios são ignorados. Para especificar qual o valor que deve ser considerado como
" vazio" , defina esse valor na propriedade PLOT_EMPTY_VAL UE: Por exemplo, se o indicador deve ser
desenhado como uma seqüência de seções sobre valores diferentes de zero, então você precisa definir
o valor zero como um vazio:
Sempre preencha explicitamente nos valores dos buffers do indicador, defina um valor vazio num
buffer para os elementos que não devem ser plotados.
· um buffer para armazenar os valores do indicador utilizado para desenhar uma linha;
· um buffer para armazenar o índice de cor, que é usada para desenhar a seção (faz sentido definir
apenas valores não vazios).
Cores serão especificadas pela diretiva de compilador #property indicator_color1 separada por uma
vírgula. O número de cores não pode exceder a 64.
Um exemplo do indicador que desenha seções coloridas a cada 5 barras longas, usando os valores da
alta do preço. A cor, a largura e o estilo das seções alteram aleatoriamente a cada N tick s.
Note que para inicializar plot1 com DR AW_COLOR_SECTION, 8 cores são definidas usando a diretiva
de compilador #property. Então na função OnCalculate(), cores são definidas aleatoriamente a partir
do array de cores colors [].
//+------------------------------------------------------------------+
//| 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
//--- plotar ColorSection
#property indicator_label1 "ColorSection"
#property indicator_type1 DRAW_COLOR_SECTION
//--- Definir 8 cores para colorir seções (eles são armazenados numa array especial)
#property indicator_color1 clrRed,clrGold,clrMediumBlue,clrLime,clrMagenta,clrBrown,clrTan,clrMedi
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- parâmetros de entrada
input int N=5; // Número de ticks para alterar
input int bars_in_section=5; // O comprimento das seções nas barras
//--- Uma variável auxiliar para calcular extremidades das seções
int divider;
int color_sections;
//--- Um buffer para plotagem
double ColorSectionBuffer[];
//--- Um buffer para armazenar a cor da linha sobre cada barra
double ColorSectionColors[];
//--- Um array para armazenar as cores que contém 14 elementos
color colors[]=
{
clrRed,clrBlue,clrGreen,clrChocolate,clrMagenta,clrDodgerBlue,clrGoldenrod,
clrIndigo,clrLightBlue,clrAliceBlue,clrMoccasin,clrWhiteSmoke,clrCyan,clrMediumPurple
};
//--- Um array para armazenar os estilos de linha
ENUM_LINE_STYLE styles[]={STYLE_SOLID,STYLE_DASH,STYLE_DOT,STYLE_DASHDOT,STYLE_DASHDOTDOT};
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado |
//+------------------------------------------------------------------+
int OnInit()
{
//--- mapeamento de buffers do indicador
SetIndexBuffer(0,ColorSectionBuffer,INDICATOR_DATA);
SetIndexBuffer(1,ColorSectionColors,INDICATOR_COLOR_INDEX);
//--- O valor 0 (vazio) não vai participar no desenho
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//---- O número de cores para colorir as secções
int color_sections=8; // veja um comentário para #property indicator_color1
//--- Verifica o parâmetro do indicador
if(bars_in_section<=0)
{
PrintFormat("Comprimento seção inválido=%d",bars_in_section);
return(INIT_PARAMETERS_INCORRECT);
}
else divider=color_sections*bars_in_section;
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
//--- O número de barra a partir da qual o cálculo dos valores do indicador inicia
int start=0;
//--- Se o indicador foi calculado antes, então definir o início na barra anterior
if(prev_calculated>0) start=prev_calculated-1;
//--- Aqui estão todos os cálculos dos valores do indicador
for(int i=start;i<rates_total;i++)
{
//--- Se o número de barras é divisível pela section_length, isso significa que esta é a extr
if(i%bars_in_section==0)
{
//--- Definir o final da seção na alta de preço desta barra
ColorSectionBuffer[i]=high[i];
//--- O resto da divisão do número de barra pela scetion_length*number_of_colors
int rest=i%divider;
//Obter o número da cor = a partir de 0 para number_of_colors-1
int color_indext=rest/bars_in_section;
ColorSectionColors[i]=color_indext;
}
//---Se o resto da divisão é igual para barras,
else
{
//--- Se nada aconteceu, ignore a barra - definir 0
else ColorSectionBuffer[i]=0;
}
}
//--- Retorna o valor de prev_calculated para a próxima chamada da função
return(rates_total);
}
//+------------------------------------------------------------------+
//--- Para cada índice de cor definir uma nova cor aleatoriamente
for(int plot_color_ind=0;plot_color_ind<plot_colors;plot_color_ind++)
{
//--- Obter um valor aleatório
int number=MathRand();
//--- Obter um índice no array col[] como um resto da divisão inteira
int i=number%size;
//--- Definir a cor para cada índice com a propriedade PLOT_LINE_COLOR
PlotIndexSetInteger(0, // O número do estilo gráfico
PLOT_LINE_COLOR, // Identificador da propriedade
plot_color_ind, // O índice da cor, onde se escreve a cor
cols[i]); // Uma nova cor
//--- Escrever as cores
comm=comm+StringFormat("SectionColorIndex[%d]=%s \r\n",plot_color_ind,ColorToString(cols[i],t
ChartSetString(0,CHART_COMMENT,comm);
}
//---
}
//+------------------------------------------------------------------+
//| Altera a aparência de uma linha visualizada no indicador |
//+------------------------------------------------------------------+
void ChangeLineAppearance()
{
//--- Uma string para a formação de informações sobre as propriedades de linha
string comm="";
//--- Um bloco para alterar a largura da linha
int number=MathRand();
//--- Obter a largura do restante da divisão inteira
int width=number%5; // A largura é definida de 0 a 4
//--- Definir a cor com a propriedade PLOT_LINE_WIDTH
PlotIndexSetInteger(0,PLOT_LINE_WIDTH,width);
//--- Escrever a largura da linha
comm=comm+" Width="+IntegerToString(width);
DRAW_COLOR_HISTOGRAM
O estilo DR AW_COLOR_HIS T OGR AM desenha um histograma como uma seqüência de colunas coloridas
a partir de zero pra um valor específico. Os valores são extraídos do buffer do indicador. Cada coluna
pode ter a sua própria cor a partir de um conjunto pré-definido de cores.
A largura, cor e estilo do histograma podem ser especificados como para o estilo DR AW_HIS T OGR AM -
usando as diretivas de compilador ou dinamicamente usando a função PlotIndexSetInteger(). Mudanças
dinâmicas das propriedades de plotagem permitem alterar o visual do histograma com base na
situação atual.
Uma vez que uma coluna a partir do nível zero é desenhado em cada barra,
DR AW_COLOR_HIS T OGR AM será melhor utilizado numa janela de gráfico em separado. Na maioria das
vezes este tipo de plotagem é usada para criar indicadores do tipo osciladores, por exemplo, Awesome
Oscillator ou Mark et Facilitation Index. Para os valores vazios que não são visíveis, o valor zero deve
ser especificado.
· um buffer para armazenar um valor que não seja zero do segmento vertical em cada barra, a
segunda extremidade do segmento estará sempre na linha zero do indicador;
· um buffer para armazenar o índice de cor, que é usada para desenhar a seção (faz sentido definir
apenas valores não vazios).
Cores podem ser determinadas usando a diretiva de compilador #property indicator_color1 separadas
por uma vírgula. O número de cores não pode exceder a 64.
Um exemplo do indicador que desenha uma senóide de uma cor específica com base na função
MathSin(). A cor, a largura e o estilo de todas colunas do histograma mudam aleatoriamente a cada N
tick s. O parâmetro de barras determina o período da senóide, isto é, após um número especifico de
barras a senóide vai repetir o ciclo.
Por favor note que para plot1 com o estilo DR AW_COLOR_HIS T OGR AM, 5 cores são definidas usando a
diretiva de compilador #property, e então na função OnCalculate(), as cores são selecionadas
aleatoriamente a partir de quatorze cores armazenada no array de colors []. O parâmetro N é definido
nos parâmetros externos do indicador para a possibilidade de configuração manual (o guia Parâmetros
na janela Propriedades do indicador).
//+------------------------------------------------------------------+
//| 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
//--- parâmetros de entrada
input int bars=30; // O período de uma senóide em barras
input int N=5; // O número de ticks para alterar o histograma
//--- plotar Color_Histogram
#property indicator_label1 "Color_Histogram"
#property indicator_type1 DRAW_COLOR_HISTOGRAM
//--- Definir 8 cores para colorir seções (eles são armazenados numa array especial)
#property indicator_color1 clrRed,clrGreen,clrBlue,clrYellow,clrMagenta,clrCyan,clrMediumSeaGreen,
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- Um buffer de valores
double Color_HistogramBuffer[];
//--- Um buffer de índices de cor
double Color_HistogramColors[];
//--- Um fator para obter o ângulo 2Pi em radianos, quando multiplicado pelo parâmetro das barras
double multiplier;
int color_sections;
//--- Um array para armazenar as cores que contém 14 elementos
color colors[]=
{
clrRed,clrBlue,clrGreen,clrChocolate,clrMagenta,clrDodgerBlue,clrGoldenrod,
clrIndigo,clrLightBlue,clrAliceBlue,clrMoccasin,clrWhiteSmoke,clrCyan,clrMediumPurple
};
//--- Um array para armazenar os estilos de linha
ENUM_LINE_STYLE styles[]={STYLE_SOLID,STYLE_DASH,STYLE_DOT,STYLE_DASHDOT,STYLE_DASHDOTDOT};
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado |
//+------------------------------------------------------------------+
int OnInit()
{
//--- mapeamento de buffers do indicador
SetIndexBuffer(0,Color_HistogramBuffer,INDICATOR_DATA);
SetIndexBuffer(1,Color_HistogramColors,INDICATOR_COLOR_INDEX);
//---- O número de cores para a colorir a senóide
color_sections=8; // Veja comentário para #property indicator_color1
//--- Calcular a multiplicação
if(bars>1)multiplier=2.*M_PI/bars;
else
{
PrintFormat("Defina o valor das barras=%d maior do que 1",bars);
//--- Finalização antecipada do indicador
return(INIT_PARAMETERS_INCORRECT);
}
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
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;
//--- Calcule ticks para mudar o estilo, cor e largura da linha
ticks++;
//--- Se um número crítico de ticks tem sido acumulado
if(ticks>=N)
{
//--- Alterar as propriedades da linha
ChangeLineAppearance();
//--- Alterar cores usadas para o histograma
ChangeColors(colors,color_sections);
//--- Redefinir o contador de ticks para zero
ticks=0;
}
//--- Para cada índice de cor definir uma nova cor aleatoriamente
for(int plot_color_ind=0;plot_color_ind<plot_colors;plot_color_ind++)
{
//--- Obter um valor aleatório
int number=MathRand();
//--- Obter um índice no array col[] como um resto da divisão inteira
int i=number%size;
//--- Definir a cor para cada índice com a propriedade PLOT_LINE_COLOR
PlotIndexSetInteger(0, // O número do estilo gráfico
PLOT_LINE_COLOR, // Identificador da propriedade
plot_color_ind, // O índice da cor, onde se escreve a cor
cols[i]); // Uma nova cor
//--- Escrever as cores
comm=comm+StringFormat("HistogramColorIndex[%d]=%s \r\n",plot_color_ind,ColorToString(cols[i]
ChartSetString(0,CHART_COMMENT,comm);
}
//---
}
//+------------------------------------------------------------------+
//| Altera a aparência de uma linha visualizada no indicador |
//+------------------------------------------------------------------+
void ChangeLineAppearance()
{
//--- Uma string para a formação de informações sobre as propriedades de linha
string comm="";
//--- Um bloco para alterar a largura da linha
int number=MathRand();
//--- Obter a largura do restante da divisão inteira
int width=number%5; // A largura é definida de 0 a 4
//--- Definir a cor com a propriedade PLOT_LINE_WIDTH
PlotIndexSetInteger(0,PLOT_LINE_WIDTH,width);
//--- Escrever a largura da linha
comm=comm+" Width="+IntegerToString(width);
DRAW_COLOR_HISTOGRAM2
O estilo DR AW_COLOR_HIS T OGR AM 2 desenha uma histograma de uma cor específica – segmentos
verticais usando os valores de buffers do indicador. Mas diferentemente ao de uma cor
DR AW_HIS T OGR AM 2, este estilo pode ter a sua própria cor a partir de um conjunto pré-definido em
cada coluna do histograma. Os valores de todos os segmentos são retirados do buffer do indicador.
A largura, o estilo e a cor do histograma pode ser especificado como para o estilo DR AW_HIS T OGR AM 2
– usando as diretivas de compilador ou usando dinamicamente a função PlotIndexSetInteger().
Mudanças dinâmicas das propriedades de plotagem permitem alterar o visual do histograma com base
na situação atual.
O estilo DR AW_COLOR_HIS T OGR AM 2 pode ser usado em uma sub-janela separada de um gráfico e em
sua janela principal. Para valores vazios nada é desenhado, todos os valores nos buffers do indicador
precisam ser definidos explicitamente. Buffers não são inicializados com valores vazios.
· dois buffers para armazenar a extremidade superior e inferior do segmento vertical em cada barra;
· um buffer para armazenar o índice de cor, o qual é usado para desenhar o segmento (faz sentido
definir apenas valores não vazios).
Um exemplo de indicador que desenha um histograma de uma cor especifica entre os preços de alta e
baixa. Para cada dia da semana, as linhas de histograma ter uma cor diferente. A cor do dia, a largura
e o estilo do histograma é alterado aleatoriamente a cada N tick s.
Por favor note que para plot1 com o estilo DR AW_COLOR_HIS T OGR AM 2, 5 cores são definidas usando
a diretiva de compilador #property, e então na função OnCalculate() as cores são selecionadas
aleatoriamente a partir de 14 cores armazenadas no 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
//--- plotar ColorHistogram_2
#property indicator_label1 "ColorHistogram_2"
#property indicator_type1 DRAW_COLOR_HISTOGRAM2
//--- Definir 5 cores para colorir o histograma com base nos dias de semana (elas são armazenadas n
#property indicator_color1 clrRed,clrBlue,clrGreen,clrYellow,clrMagenta
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
SetIndexBuffer(2,ColorHistogram_2Colors,INDICATOR_COLOR_INDEX);
//--- Definir um valor vazio
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//---- O número de cores para a colorir a senóide
color_sections=8; // Veja um comentário #property indicator_color1
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
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;
//--- Calcule ticks para mudar o estilo, cor e largura da linha
ticks++;
//--- Se um número crítico de ticks tem sido acumulado
if(ticks>=N)
{
//--- Alterar as propriedades da linha
ChangeLineAppearance();
//--- Mude as cores usadas para desenhar o histograma
ChangeColors(colors,color_sections);
//--- Redefinir o contador de ticks para zero
ticks=0;
}
//--- Para cada índice de cor definir uma nova cor aleatoriamente
for(int plot_color_ind=0;plot_color_ind<plot_colors;plot_color_ind++)
{
//--- Obter um valor aleatório
int number=MathRand();
//--- Obter um índice no array col[] como um resto da divisão inteira
int i=number%size;
//--- Definir a cor para cada índice com a propriedade PLOT_LINE_COLOR
PlotIndexSetInteger(0, // O número do estilo gráfico
PLOT_LINE_COLOR, // Identificador da propriedade
plot_color_ind, // O índice da cor, onde se escreve a cor
cols[i]); // Uma nova cor
//--- Escrever as cores
comm=comm+StringFormat("HistogramColorIndex[%d]=%s \r\n",plot_color_ind,ColorToString(cols[i]
ChartSetString(0,CHART_COMMENT,comm);
}
//---
}
//+------------------------------------------------------------------+
//| Altera a aparência de uma linha visualizada no indicador |
//+------------------------------------------------------------------+
void ChangeLineAppearance()
{
//--- Uma string para a formação de informações sobre as propriedades de linha
string comm="";
//--- Um bloco para alterar a largura da linha
int number=MathRand();
//--- Obter a largura do restante da divisão inteira
int width=number%5; // A largura é definida de 0 a 4
//--- Definir a cor com a propriedade PLOT_LINE_WIDTH
PlotIndexSetInteger(0,PLOT_LINE_WIDTH,width);
//--- Escrever a largura da linha
comm=comm+" Width="+IntegerToString(width);
DRAW_COLOR_ARROW
O estilo DR AW_COLOR_ARR OW desenha setas coloridas (símbolos do conjunto W ingdings) baseado no
valor do buffer do indicador. Em contraste com DR AW_ARR OW , neste estilo, é possível definir uma
cor partir de um conjunto predefinido de cores especificada pela propriedade indicator_color1 para
cada símbolo.
A largura e a cor dos símbolos podem ser especificadas com o estilo DR AW_ARR OW – usando diretivas
de compilador ou dinamicamente usando a função PlotIndexSetInteger(). Mudanças dinâmicas das
propriedades de plotagem permitem modificar a aparência de um indicador com base na situação
atual.
//--- Definir o código símbolo a partir das fontes Wingdings para desenhar em PLOT_ARROW
PlotIndexSetInteger(0,PLOT_ARROW,code);
Cada seta é na verdade um símbolo que tem a altura e o ponto de ancoragem e pode abranger algumas
informações importantes num gráfico (por exemplo, o preço de fechamento da barra). Assim,
podemos adicionalmente especificar o deslocamento vertical em pixels, o qual não depende da escala
do gráfico. As setas serão deslocadas para baixo pelo número especificado de pixels, embora os
valores do indicador permanecerão os mesmos :
Um valor negativo de PLOT_ARR OW_S HIFT significa a mudança de setas para cima, valores positivos
deslocam a seta para baixo.
O estilo DR AW_COLOR_ARR OW pode ser usado em separado na sub-janela do gráfico e em sua janela
principal. Valores vazios não são desenhados e não aparecem na "Janela de Dados " , todos os valores
nos buffers do indicador devem ser definidos explicitamente. Buffers não são inicializados com o valor
zero.
· Um buffer para armazenar o valor do preço que é utilizado para desenhar o símbolo (além de um
deslocamento em pixels, determinado na propriedade PLOT_ARR OW_S HIFT );
· Um buffer para guardar o índice de cor que é utilizado para desenhar uma seta(faz sentido
configurar apenas valores não vazios).
Um exemplo de indicador que desenha as setas em cada uma das barras com o preço mais alto do que
o preço final da barra anterior. A largura, deslocamento e símbolo de código de todas setas são
alterados aleatoriamente a cada N tick s. A cor do símbolo depende do número da barra na qual está
desenhada.
Neste exemplo, para plot1 com o estilo DR AW_COLOR_ARR OW , as propriedades, cor e tamanho são
especificadas usando a diretiva de compilador #property, e então, na função OnCalculate() as
propriedades são definidas aleatoriamente. O parâmetro N é definido nos parâmetros externos do
indicador para a possibilidade de configuração manual (o guia Parâmetros na janela Propriedades do
indicador).
Por favor, note que inicialmente oito cores são usadas na diretiva de compilador #property, e então,
na função OnCalculate(), a cor é definida aleatoriamente a partir das 14 cores que são armazenadas
no array colors [].
//+------------------------------------------------------------------+
//| 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
//--- plotar ColorArrow
#property indicator_label1 "ColorArrow"
//--- Para cada índice de cor definir uma nova cor aleatoriamente
for(int plot_color_ind=0;plot_color_ind<plot_colors;plot_color_ind++)
{
//--- Obter um valor aleatório
int number=MathRand();
//--- Obter um índice no array col[] como um resto da divisão inteira
int i=number%size;
//--- Definir a cor para cada índice com a propriedade PLOT_LINE_COLOR
PlotIndexSetInteger(0, // O número do estilo gráfico
PLOT_LINE_COLOR, // Identificador da propriedade
plot_color_ind, // O índice da cor, onde se escreve a cor
cols[i]); // Uma nova cor
//--- Escrever as cores
comm=comm+StringFormat("ArrowColorIndex[%d]=%s \r\n",plot_color_ind,ColorToString(cols[i],tru
ChartSetString(0,CHART_COMMENT,comm);
}
//---
}
//+------------------------------------------------------------------+
//| Altera a aparência de uma linha visualizada no indicador |
//+------------------------------------------------------------------+
void ChangeLineAppearance()
{
//--- Uma string para a formação de informações sobre as propriedades de linha
string comm="";
//--- Um bloco para alterar a largura da linha
int number=MathRand();
//--- Obter a largura do restante da divisão inteira
int width=number%5; // A largura é definida de 0 a 4
//--- Definir a cor com a propriedade PLOT_LINE_WIDTH
PlotIndexSetInteger(0,PLOT_LINE_WIDTH,width);
//--- Escrever a largura da linha
comm=comm+" Width="+IntegerToString(width);
DRAW_COLOR_ZIGZAG
O estilo DR AW_COLOR_ZIGZAG desenha segmentos cores diferentes, usando os valores de dois
buffers do indicador. Este estilo é uma versão colorida de DR AW_ZIGZAG, ou seja, permite a
especificar para cada segmento uma cor individual a partir do conjunto pré-definido de cores. Os
segmentos são plotados a partir de um valor no primeiro buffer para um valor no segundo buffer do
indicador. Nenhum dos buffers pode conter somente valores vazios, uma vez que neste caso nada é
plotado.
A largura, cor e estilo das linhas podem ser especificadas como para o estilo DR AW_ZIGZAG - usando
as diretivas de compilação ou dinamicamente usando a função PlotIndexSetInteger(). Mudanças
dinâmicas das propriedades de plotagem permitem " avivar" os indicadores, de modo que suas
aparências sejam alteradas dependendo da situação corrente.
Seções são desenhadas a partir de um valor não vazio de um buffer para um valor não vazio de outro
buffer do indicador. Para especificar o valor que deve ser considerado como " vazio" , defina esse valor
na propriedade PLOT_EMPTY_VAL UE:
Sempre preencha explicitamente nos valores dos buffers de indicador, defina um valor vazio num
buffer para saltar barras.
· dois buffers para armazenar os valores das extremidades das seções em zigue-zague;
· um buffer para armazenar o índice de cor, que é usada para desenhar a seção (faz sentido definir
apenas valores não vazios).
Um exemplo de indicador de que plota uma serra com base nos altas e baixas dos preços. A cor, a
largura e o estilo das linhas em ziguezague alteram aleatoriamente a cada N tick s.
Por favor note que para plot1 com o estilo DR AW_COLOR_ZIGZAG, 8 cores são definidas usando a
diretiva de compilação #property, e então na função OnCalculate() a cor é selecionada aleatoriamente
a partir de 14 cores armazenadas no 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
//--- plotar Color_Zigzag
#property indicator_label1 "Color_Zigzag"
#property indicator_type1 DRAW_COLOR_ZIGZAG
//--- Definir 8 cores para colorir seções (eles são armazenados numa array especial)
#property indicator_color1 clrRed,clrBlue,clrGreen,clrYellow,clrMagenta,clrCyan,clrLime,clrOrange
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- parâmetros de entrada
input int N=5; // Número de ticks para alterar
int color_sections;
//--- Buffers dos valores das extremidades do segmento
double Color_ZigzagBuffer1[];
double Color_ZigzagBuffer2[];
//--- Buffers do índice de cores das extremidades dos segmento
double Color_ZigzagColors[];
//--- Um array para armazenar as cores que contém 14 elementos
color colors[]=
{
clrRed,clrBlue,clrGreen,clrChocolate,clrMagenta,clrDodgerBlue,clrGoldenrod,
clrIndigo,clrLightBlue,clrAliceBlue,clrMoccasin,clrWhiteSmoke,clrCyan,clrMediumPurple
};
//--- Um array para armazenar os estilos de linha
ENUM_LINE_STYLE styles[]={STYLE_SOLID,STYLE_DASH,STYLE_DOT,STYLE_DASHDOT,STYLE_DASHDOTDOT};
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado |
//+------------------------------------------------------------------+
int OnInit()
{
//--- mapeamento de buffers do indicador
SetIndexBuffer(0,Color_ZigzagBuffer1,INDICATOR_DATA);
SetIndexBuffer(1,Color_ZigzagBuffer2,INDICATOR_DATA);
SetIndexBuffer(2,Color_ZigzagColors,INDICATOR_COLOR_INDEX);
//----Número de corres para colorir o zigzag
color_sections=8; // veja um comentário para a #property indicator_color1
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
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;
//--- Calcule ticks para mudar o estilo, cor e largura da linha
ticks++;
//--- Se um número suficiente de ticks foi acumulado
if(ticks>=N)
{
//--- Alterar as propriedades da linha
ChangeLineAppearance();
//--- Alterar cores utilizadas para plotar as seções
ChangeColors(colors,color_sections);
//--- Redefinir o contador de ticks para zero
ticks=0;
}
//--- A estrutura de tempo é necessário para obter o dia da semana de cada barra
MqlDateTime dt;
{
//--- Escreva o tempo de abertura da barra na estrutura
TimeToStruct(time[i],dt);
//--- Para cada índice de cor definir uma nova cor aleatoriamente
for(int plot_color_ind=0;plot_color_ind<plot_colors;plot_color_ind++)
{
//--- Obter um valor aleatório
int number=MathRand();
//--- Obter um índice no array col[] como um resto da divisão inteira
int i=number%size;
//--- Definir a cor para cada índice com a propriedade PLOT_LINE_COLOR
PlotIndexSetInteger(0, // O número do estilo gráfico
PLOT_LINE_COLOR, // Identificador da propriedade
plot_color_ind, // O índice da cor, onde se escreve a cor
cols[i]); // Uma nova cor
//--- Escrever as cores
comm=comm+StringFormat("ZigzagColorIndex[%d]=%s \r\n",plot_color_ind,ColorToString(cols[i],tr
ChartSetString(0,CHART_COMMENT,comm);
}
//---
}
//+------------------------------------------------------------------+
//| Alterar a aparência dos segmentos zigzag |
//+------------------------------------------------------------------+
void ChangeLineAppearance()
{
//--- Uma string para a formação da informação sobre as propriedades de Color_ZigZag
string comm="";
//--- Um bloco para alterar a largura da linha
int number=MathRand();
//--- Obter a largura do restante da divisão inteira
int width=number%5; // A largura é definida de 0 a 4
//--- Definir a cor com a propriedade PLOT_LINE_WIDTH
PlotIndexSetInteger(0,PLOT_LINE_WIDTH,width);
//--- Escrever a largura da linha
comm=comm+"\r\nWidth="+IntegerToString(width);
DRAW_COLOR_BARS
O estilo DR AW_COLOR_BAR S desenha barra sobre valores de quatro buffers de indicador, que contém
Open (abertura), H igh (alta), Low (baixa) e Close (fechamento) de preços. Este estilo é uma versão
avançada do DR AW_BAR S e permite a especificação para cada barra de uma cor individual do conjunto
predefinido de cores. É usado para a criação de indicadores personalizados como barras, incluindo
aqueles numa sub-janela separada de um gráfico e sobre outros instrumentos financeiros.
A cor das barras pode ser definida usando as diretivas de compilador ou dinamicamente utilizando a
função PlotIndexSetInteger(). Mudanças dinâmicas das propriedades de plotagem permitem " avivar" os
indicadores, de modo que suas mudanças de aparência dependem da situação corrente.
O indicador é desenhado apenas para as barras, para o qual os valores não vazios de todos quatro
buffers do indicador são definidos. Para especificar o valor que deve ser considerado como " vazio" ,
defina este valor na propriedade PLOT_EMPTY_VAL UE:
Sempre preencher explicitamente os valores dos buffers do indicador, definir um valor vazio num
buffer para ignorar barras.
· um buffer para armazenar o índice das cores, que é usado para desenhar uma barra(faz sentido
defini-lo apenas para as barras que serão desenhadas).
T odos os buffers para a plotagem devem ir um após o outro na ordem determinada: Open, H igh, Low,
Close e o buffer de cor. Nenhum dos buffers de preços podem conter valores nulos, uma vez que neste
caso nada é plotado.
Um exemplo do indicador que desenha barras sobre um instrumento financeiro selecionado numa
janela separada. A cor das barras muda aleatoriamente a cada N tick s. O parâmetro N é definido nos
parâmetro externos do indicador para a possibilidade de configuração manual (na guia Parâmetros na
janela Propriedades do indicador).
Por favor note que para plot1 com o estilo DR AW_COLOR_BAR S, 8 cores são definidas usando a
diretiva de compilador #property, e então na função OnCalculate() a cor é selecionada aleatoriamente
a partir de 14 cores armazenadas no array de colors [].
//+------------------------------------------------------------------+
//| 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
//--- plotar ColorBars
#property indicator_label1 "ColorBars"
#property indicator_type1 DRAW_COLOR_BARS
//--- Define 8 cores para colorir barras (elas são armazenadas num array especial)
#property indicator_color1 clrRed,clrBlue,clrGreen,clrYellow,clrMagenta,clrCyan,clrLime,clrOrange
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- parâmetros de entrada
input int N=5; // O número de ticks para alterar o tipo
ticks++;
//--- Se um número suficiente de ticks foi acumulado
if(ticks>=N)
{
//--- Selecione um novo símbolo a partir da janela de observação do Mercado
symbol=GetRandomSymbolName();
//--- Alterar as propriedades da linha
ChangeLineAppearance();
//--- Mude as cores usadas para desenhar os candlesticks
ChangeColors(colors,bars_colors);
int tries=0;
//--- Faça 5 tentativas de preencher os buffers com os preços a partir símbolo
while(!CopyFromSymbolToBuffers(symbol,rates_total,bars_colors) && tries<5)
{
//--- Um contador de chamadas da função CopyFromSymbolToBuffers()
tries++;
}
//--- Redefinir o contador de ticks para zero
ticks=0;
}
//--- valor retorno de prev_calculated para a próxima chamada
return(rates_total);
}
//+------------------------------------------------------------------+
//| Preencher os buffers do indicador com preços |
//+------------------------------------------------------------------+
bool CopyFromSymbolToBuffers(string name,int total,int bar_colors)
{
//--- No array de rates[], vamos copiar Open (abertura), High (alta), Low (baixa) e Close (fechamen
MqlRates rates[];
//--- O contador de tentativas
int attempts=0;
//--- Quanto foi copiado
int copied=0;
//--- Fazer 25 tentativas para obter uma série temporal(timeseries) sobre o símbolo desejado
while(attempts<25 && (copied=CopyRates(name,_Period,0,bars,rates))<0)
{
Sleep(100);
attempts++;
if(messages) PrintFormat("%s Copiar taxas(%s) tentativas=%d",__FUNCTION__,nome,tentativas);
}
//--- Se falhou em copiar um número suficiente de barras
if(copied!=bars)
{
//--- Formar uma mensagem string
string comm=StringFormat("Para o símbolo %s, conseguiu receber somente %d barras de %d solici
name,
copied,
bars
);
//--- Mostrar uma mensagem num comentário na janela do gráfico principal
Comment(comm);
//--- Mostrar a mensagem
if(messages) Print(comm);
return(false);
}
else
{
//--- Definir a exibição do símbolo
PlotIndexSetString(0,PLOT_LABEL,name+" Open;"+name+" High;"+name+" Low;"+name+" Close");
IndicatorSetString(INDICATOR_SHORTNAME,"DRAW_COLOR_BARS("+name+")");
}
//--- Inicializar buffers com valores vazios
ArrayInitialize(ColorBarsBuffer1,0.0);
ArrayInitialize(ColorBarsBuffer2,0.0);
ArrayInitialize(ColorBarsBuffer3,0.0);
ArrayInitialize(ColorBarsBuffer4,0.0);
//--- Para cada índice de cor definir uma nova cor aleatoriamente
for(int plot_color_ind=0;plot_color_ind<plot_colors;plot_color_ind++)
{
//--- Obter um valor aleatório
int number=MathRand();
//--- Obter um índice no array col[] como um resto da divisão inteira
int i=number%size;
//--- Definir a cor para cada índice com a propriedade PLOT_LINE_COLOR
PlotIndexSetInteger(0, // O número do estilo gráfico
PLOT_LINE_COLOR, // Identificador da propriedade
plot_color_ind, // O índice da cor, onde se escreve a cor
cols[i]); // Uma nova cor
//--- Escrever as cores
comm=comm+StringFormat("BarColorIndex[%d]=%s \r\n",plot_color_ind,ColorToString(cols[i],true)
ChartSetString(0,CHART_COMMENT,comm);
}
//---
}
//+------------------------------------------------------------------+
//| Altera a aparência das barras |
//+------------------------------------------------------------------+
void ChangeLineAppearance()
{
//--- Uma string para a formação de informações sobre as propriedades da barra
string comm="";
DRAW_COLOR_CANDLES
O estilo DR AW_COLOR_CANDLES style, como o DR AW_CANDLES, desenha candlestick s usando valores
de quatro buffers de indicador o qual contém Open (abertura), H igh (alta), Low (baixa) e Close
(fechamento) de preços. Além disso, ele permite a especificação de uma cor para cada um candlestick
de um determinado conjunto. Para esta finalidade, o estilo tem um buffer de cor especial que
armazena os índices de cor para cada barra. É usado para a criação de indicadores personalizados
como uma seqüência de candlestick s, incluindo os inseridos numa sub-janela separada de um gráfico e
noutros instrumentos financeiros.
O indicador é desenhado apenas para as barras, para o qual os valores não vazios de quatro buffers de
preços do indicador são definidos. Para especificar o valor que deve ser considerado como " vazio" ,
defina esse valor na propriedade PLOT_EMPTY_VAL UE:
Sempre preencher explicitamente os valores dos buffers do indicador, definir um valor vazio num
buffer para ignorar barras.
· um buffer para armazenar o índice de cor, que é usada para desenhar um candlestick (faz sentido
defini-lo apenas para os candlestick s que serão desenhados).
T odos os buffers para a plotagem devem ir um após o outro na ordem determinada: Open, H igh, Low,
Close e o buffer de cor. Nenhum dos buffers de preços pode conter apenas valores vazios, uma vez
que, neste caso, nada é plotado.
Por favor, note que para plot1, a cor é definida usando a diretiva de compilador #property, e então,
na função OnCalculate() a cor é definida aleatoriamente a partir de uma lista preparada
anteriormente.
//+------------------------------------------------------------------+
//| 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
//--- Plotar ColorCandles
#property indicator_label1 "ColorCandles"
#property indicator_type1 DRAW_COLOR_CANDLES
//--- Definir 8 cores para colorir os candlesticks (eles são armazenados na array especial)
#property indicator_color1 clrRed,clrBlue,clrGreen,clrYellow,clrMagenta,clrCyan,clrLime,clrOrange
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
int tries=0;
//--- Faça 5 tentativas de preencher os buffers de Plot1 com os preços a partir da símbolo
while(!CopyFromSymbolToBuffers(symbol,rates_total,0,
ColorCandlesBuffer1,ColorCandlesBuffer2,ColorCandlesBuffer3,
ColorCandlesBuffer4,ColorCandlesColors,candles_colors)
&& tries<5)
{
//--- Um contador de chamadas da função CopyFromSymbolToBuffers()
tries++;
}
//--- Redefinir o contador de ticks para zero
ticks=0;
}
//--- valor retorno de prev_calculated para a próxima chamada
return(rates_total);
}
//+------------------------------------------------------------------+
//| Preenche o candlestick especificado |
//+------------------------------------------------------------------+
bool CopyFromSymbolToBuffers(string name,
int total,
int plot_index,
double &buff1[],
double &buff2[],
double &buff3[],
double &buff4[],
double &col_buffer[],
int cndl_colors
)
{
//--- No array de rates[], vamos copiar Open (abertura), High (alta), Low (baixa) e Close (fechamen
MqlRates rates[];
//--- O contador de tentativas
int attempts=0;
//--- Quanto foi copiado
int copied=0;
//--- Fazer 25 tentativas para obter uma série temporal(timeseries) sobre o símbolo desejado
while(attempts<25 && (copied=CopyRates(name,_Period,0,bars,rates))<0)
{
Sleep(100);
attempts++;
if(messages) PrintFormat("%s Copiar taxas(%s) tentativas=%d",__FUNCTION__,nome,tentativas);
}
//--- Se falhou em copiar um número suficiente de barras
if(copied!=bars)
{
//--- Formar uma mensagem string
string comm=StringFormat("Para o símbolo %s, conseguiu receber somente %d barras de %d solici
name,
copied,
bars
);
//--- Mostrar uma mensagem num comentário na janela do gráfico principal
Comment(comm);
//--- Mostrar a mensagem
if(messages) Print(comm);
return(false);
}
else
{
//--- Definir a exibição do símbolo
PlotIndexSetString(plot_index,PLOT_LABEL,name+" Open;"+name+" High;"+name+" Low;"+name+" Clos
IndicatorSetString(INDICATOR_SHORTNAME,"DRAW_COLOR_CANDLES("+symbol+")");
}
//--- Inicializar buffers com valores vazios
ArrayInitialize(buff1,0.0);
ArrayInitialize(buff2,0.0);
ArrayInitialize(buff3,0.0);
ArrayInitialize(buff4,0.0);
//--- Sobre cada tick é copiado preços para os buffers
for(int i=0;i<copied;i++)
{
//--- Para cada índice de cor definir uma nova cor aleatoriamente
for(int plot_color_ind=0;plot_color_ind<plot_colors;plot_color_ind++)
{
//--- Obter um valor aleatório
int number=MathRand();
//--- Obter um índice no array col[] como um resto da divisão inteira
int i=number%size;
//--- Definir a cor para cada índice com a propriedade PLOT_LINE_COLOR
PlotIndexSetInteger(0, // O número do estilo gráfico
PLOT_LINE_COLOR, // Identificador da propriedade
plot_color_ind, // O índice da cor, onde se escreve a cor
cols[i]); // Uma nova cor
//--- Escrever as cores
comm=comm+StringFormat("CandleColorIndex[%d]=%s \r\n",plot_color_ind,ColorToString(cols[i],tr
ChartSetString(0,CHART_COMMENT,comm);
}
//---
}
//+------------------------------------------------------------------+
//| Mudar a aparência dos candlesticks |
//+------------------------------------------------------------------+
void ChangeLineAppearance()
{
//--- Uma string para a formação de informações sobre as propriedades do candlestick
string comm="";
//--- Escreve o nome do símbolo
comm="\r\n"+symbol+comm;
//--- Mostrar a informação no gráfico usando um comentário
Comment(comm);
}
T ambém existem outras propriedades que podem ser definidas tanto através das diretivas pré
processador como das funções destinadas à criação do indicador personalizado. Estas propriedades e
funções correspondentes são descritas na seguinte tabela.
Deve notar-se que a numeração dos níveis e plotagens em termos de pré processador inicia-se com
um, enquanto a numeração das mesmas propriedades usando funções inicia-se com zero, ou seja, o
valor indicado deve ser pelo menos um do que o indicado para #property.
Diretiva Description
indicator_chart_window Indicador é visualizado na janela principal
SetIndexBuffer
A função vincula um buffer específico de indicador com um array unidimensional dinâmico do tipo
double.
bool SetIndexBuffer(
int index, // índice de buffer
double buffer[], // array
ENUM_INDEXBUFFER_TYPE data_type // O que será o armazenado
);
Parâmetros
index
[in] Número do buffer do indicador. A numeração inicia com 0. O número deve ser inferior ao valor
declarado em #property indicator_buffers.
buffer[]
[in] Um array declarado no programa de indicador personalizado.
data_type
[in] T ipo de dados armazenados no array do indicador. Por padrão ele é INDICAT OR_DAT A (valores
de cálculos do indicador). Ele também pode ter o valor de INDICAT OR_COLOR_INDEX; neste caso,
este buffer é usado para armazenar índices de cor para o buffer do indicador anterior. Você pode
especificar até cores na linha #property indicator_colorN. O valor INDICAT OR_CALCULATIONS
significa que o buffer é usado nos cálculos intermediário do indicador, e não se destina ao
desenho.
Valor do Retorno
Com sucesso, retorna true, do contrário - false.
Observação
Após a vinculação, o array buffer[] dinâmico será indexado como os arrays comuns, mesmo que a
indexação de timeseries seja obrigatoriamente pré-instalado para o array. Se você quiser alterar a
ordem de acesso aos elementos do array do indicador, use a função ArraySetAsSeries() após a
vinculação do array usando a função SetIndexBuffer(). Por favor, note que você não pode alterar
o tamanho dos arrays dinâmicos definidos como buffers do indicador pela função SetIndex Buffer().
Para buffers do indicador, todas as operações de alteração de tamanho são realizadas pela execução
do sub-sistema do terminal.
Exemplo:
//+------------------------------------------------------------------+
//| 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
//---- plotar MA
#property indicator_label1 "MA"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- parâmetros de entrada
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 do indicador
double MABuffer[];
int ma_handle;
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado |
//+------------------------------------------------------------------+
int OnInit()
{
//--- mapeamento de buffers do indicador
if(AsSeries) ArraySetAsSeries(MABuffer,true);
Print("Buffer do indicador é timeseries = ",ArrayGetAsSeries(MABuffer));
SetIndexBuffer(0,MABuffer,INDICATOR_DATA);
Print("Buffer do indicador após SetIndexBuffer() é timeseries = ",
ArrayGetAsSeries(MABuffer));
IndicatorSetString(INDICATOR_SHORTNAME,"MA("+period+")"+AsSeries);
//---
ma_handle=iMA(Symbol(),0,period,shift,smootMode,price);
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
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[],
Também Veja
Propriedades dos indicadores personalizados, Acesso para indicadores e timeseries
IndicatorSetDouble
A função define o valor da propriedade do indicador correspondente. Propriedade do indicador deve
ser do tipo double. Existem duas variantes da função.
Parâmetros
prop_id
[in] Identificador da propriedade do indicador. O valor pode ser um dos valores do enumerador
ENUM _CUS T OM IND_PR OPERTY_DOUBLE.
prop_modifier
[in] Modificador da propriedade específica. Somente as propriedades de nível requerem um
modificador. A numeração dos níveis a partir do 0. Isso significa que a fim de definir a
propriedade para o segundo nível, você precisa determinar 1 (menor que 1 quando usar a diretiva
de compilação).
prop_value
[in] Valor de propriedade.
Valor do Retorno
Em caso de execução bem sucedida, retorna true, do contrário - false.
Observação
Numeração das propriedades (modificadores) começa a partir de 1 (um) quando usa a diretiva de
#property, enquanto que a função usa numeração a partir de (zero). No caso do número de nível ser
definido incorretamente, o visor do indicador pode ser diferente do pretendido.
Por exemplo, o primeiro valor para o indicador de nível de sub-janela separada pode ser ajustado de
duas maneiras :
· property indicator_level1 50 - o valor 1 é utilizado para especificar o número de nível,
· I ndicatorSetDouble(INDI CAT OR_LEVEL VAL UE, 0 , 50) - 0 é usado para especificar o primeiro nível.
Exemplo: indicador inverte para baixo os valores máximo e mínimo da janela do indicador e os
valores de níveis em que as linhas horizontais são colocadas.
#property indicator_separate_window
//--- define o valor máximo e mínimo para a janela do indicador
#property indicator_minimum 0
#property indicator_maximum 100
//--- visualiza três níveis horizontais na janela separada
#property indicator_level1 25
#property indicator_level2 50
#property indicator_level3 75
//--- definir a espessura dos níveis horizontais
#property indicator_levelwidth 1
//--- definir o estilo dos níveis horizontais
#property indicator_levelstyle STYLE_DOT
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado |
//+------------------------------------------------------------------+
int OnInit()
{
//--- definir as descrições dos níveis horizontais
IndicatorSetString(INDICATOR_LEVELTEXT,0,"Primeiro Nível (índice 0)");
IndicatorSetString(INDICATOR_LEVELTEXT,1,"Segundo Nível (índice 1)");
IndicatorSetString(INDICATOR_LEVELTEXT,2,"Terceiro Nível (índice 2)");
//--- define o mome abreviado para o indicador
IndicatorSetString(INDICATOR_SHORTNAME,"IndicatorSetDouble() Demo");
//--- definir a cor para cada nível
IndicatorSetInteger(INDICATOR_LEVELCOLOR,0,clrBlue);
IndicatorSetInteger(INDICATOR_LEVELCOLOR,1,clrGreen);
IndicatorSetInteger(INDICATOR_LEVELCOLOR,2,clrRed);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
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;
//--- calcular ticks
tick_counter++;
//--- inverter os níveis a cada 10 tick
if(tick_counter%10==0)
{
//--- inverter sinal para os valores de nível
level1=-level1;
level2=-level2;
level3=-level3;
//--- inverter sinal para os valores máximos e mínimos
max-=shift;
min-=shift;
//--- inverter o valor de deslocamento
shift=-shift;
//--- definir novo valor para nível
IndicatorSetDouble(INDICATOR_LEVELVALUE,0,level1);
IndicatorSetDouble(INDICATOR_LEVELVALUE,1,level2);
IndicatorSetDouble(INDICATOR_LEVELVALUE,2,level3);
//--- definir novos valores máximo e mínimo na janela do indicador
Print("Set up max = ",max,", min = ",min);
IndicatorSetDouble(INDICATOR_MAXIMUM,max);
IndicatorSetDouble(INDICATOR_MINIMUM,min);
}
//--- valor retorno de prev_calculated para a próxima chamada
return(rates_total);
}
Também Veja
IndicatorSetInteger
A função define o valor da propriedade do indicador correspondente. Propriedade do indicador deve
ser do tipo int ou color. Existem duas variantes da função.
Parâmetros
prop_id
[in] Identificador da propriedade do indicador. O valor pode ser um dos valores do enumerador
ENUM _CUS T OM IND_PR OPERTY_INT EGER .
prop_modifier
[in] Modificador da propriedade específica. Somente as propriedades de nível requerem um
modificador.
prop_value
[in] Valor de propriedade.
Valor do Retorno
Em caso de execução bem sucedida, retorna true, do contrário - false.
Observação
Numeração das propriedades (modificadores) começa a partir de 1 (um) quando usa a diretiva de
#property, enquanto que a função usa numeração a partir de (zero). No caso do número de nível ser
definido incorretamente, o visor do indicador pode ser diferente do pretendido.
Por exemplo, para definir a espessura da primeira linha horizontal usar o índice zero:
· I ndicatorSetI nteger(INDI CAT OR_LEVEL WIDTH , 0 , 5) - índice 0 é usado para definir a espessura do
primeiro nível.
Exemplo: indicador que define a cor, estilo e espessura do indicador de linhas horizontais.
#property indicator_separate_window
#property indicator_minimum 0
#property indicator_maximum 100
//--- visualiza três níveis horizontais na janela separada
#property indicator_level1 20
#property indicator_level2 50
#property indicator_level3 80
//--- definir a espessura dos níveis horizontais
#property indicator_levelwidth 5
//--- definir a cor dos níveis horizontais
#property indicator_levelcolor clrAliceBlue
//--- definir o estilo dos níveis horizontais
#property indicator_levelstyle STYLE_DOT
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado |
//+------------------------------------------------------------------+
int OnInit()
{
//--- definir as descrições dos níveis horizontais
IndicatorSetString(INDICATOR_LEVELTEXT,0,"Primeiro Nível (índice 0)");
IndicatorSetString(INDICATOR_LEVELTEXT,1,"Segundo Nível (índice 1)");
IndicatorSetString(INDICATOR_LEVELTEXT,2,"Terceiro Nível (índice 2)");
//--- define o mome abreviado para o indicador
IndicatorSetString(INDICATOR_SHORTNAME,"IndicatorSetInteger() Demo");
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
if(tick_number%t_trigger==0)
index=2; // se tick_number divide por t_trigger sem o restante
//--- se a cor está definida, estabeleça-a
if(index!=-1)
IndicatorSetInteger(INDICATOR_LEVELCOLOR,level,colors[index]);
//---
}
//+------------------------------------------------------------------+
//| Define estilo de linha horizontal na janela do indicador separado|
//+------------------------------------------------------------------+
void ChangeLevelStyle(int level, // número de linha horizontal
int tick_number// número para obter o resto da divisão
)
{
//--- array para armazenar estilos
static ENUM_LINE_STYLE styles[5]=
{STYLE_SOLID,STYLE_DASH,STYLE_DOT,STYLE_DASHDOT,STYLE_DASHDOTDOT};
//--- índice de estilo a partir do array styles[]
int index=-1;
//--- calcular o número a partir do array styles[] para definir a linha horizontal
if(tick_number%50==0)
index=5; // se tick_number divide por 50 sem o restante, então o estilo é STYLE_DASHDOTDOT
if(tick_number%40==0)
index=4; // ... style is 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 o estilo está definido, estabeleça-o
if(index!=-1)
IndicatorSetInteger(INDICATOR_LEVELSTYLE,level,styles[index]);
}
Também Veja
Propriedades de Indicador Personalizado, Propriedades (#property) de programa, Estilos de Desenho
IndicatorSetString
A função define o valor da propriedade do indicador correspondente. Propriedade do indicador deve
ser do tipo string. Existem duas variantes da função.
Parâmetros
prop_id
[in] Identificador da propriedade do indicador. O valor pode ser um dos valores do enumerador
ENUM _CUS T OM IND_PR OPERTY_S TRING.
prop_modifier
[in] Modificador da propriedade específica. Somente as propriedades de nível requerem um
modificador.
prop_value
[in] Valor de propriedade.
Valor do Retorno
Em caso de execução bem sucedida, retorna true, do contrário - false.
Observação
Numeração das propriedades (modificadores) começa a partir de 1 (um) quando usa a diretiva de
#property, enquanto que a função usa numeração a partir de (zero). No caso do número de nível ser
definido incorretamente, o visor do indicador pode ser diferente do pretendido.
Por exemplo, na ordem para definir a descrição da primeira linha horizontal usar o índice zero:
· I ndicatorSetString(INDI CAT OR_LEVEL T EXT , 0 , " Primeiro Nível" ) - índice 0 é usado para definir a
descrição de texto do primeiro nível.
Exemplo: indicador que define etiquetas de texto para as linhas horizontais do indicador.
#property indicator_separate_window
#property indicator_minimum 0
#property indicator_maximum 100
//--- visualiza três níveis horizontais na janela separada
#property indicator_level1 30
#property indicator_level2 50
#property indicator_level3 70
//--- definir a cor dos níveis horizontais
#property indicator_levelcolor clrRed
//--- definir o estilo dos níveis horizontais
#property indicator_levelstyle STYLE_SOLID
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado |
//+------------------------------------------------------------------+
int OnInit()
{
//--- definir as descrições dos níveis horizontais
IndicatorSetString(INDICATOR_LEVELTEXT,0,"Primeiro Nível (índice 0)");
IndicatorSetString(INDICATOR_LEVELTEXT,1,"Segundo Nível (índice 1)");
IndicatorSetString(INDICATOR_LEVELTEXT,2,"Terceiro Nível (índice 2)");
//--- define o mome abreviado para o indicador
IndicatorSetString(INDICATOR_SHORTNAME,"IndicatorSetString() Demo");
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
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[])
{
//---
Também Veja
Propriedades de Indicador Personalizado, Propriedades (#property) de Programa
PlotIndexSetDouble
A função define o valor da propriedade correspondente da linha do indicador correspondente. A
propriedade indicador deve ser do tipo double.
bool PlotIndexSetDouble(
int plot_index, // plotando o índice do estilo
int prop_id, // propriedade identificador
double prop_value // valor para ser definido
);
Parâmetros
plot_index
[in] Índice de plotagem gráfica
prop_id
[in] O valor pode ser um dos valores do enumerador ENUM _PLOT_PR OPERTY_DOUBLE.
prop_value
[in] O valor da propriedade.
Valor do Retorno
Se com sucesso, retorna true, do contrário false.
PlotIndexSetInteger
A função define o valor da propriedade correspondente da linha do indicador correspondente. A
propriedade do indicador deve ser do tipo int, char, bool ou color. Existem 2 variantes da função.
Parâmetros
plot_index
[in] Índice de plotagem gráfica
prop_id
[in] O valor pode ser um dos valores do enumerador ENUM _PLOT_PR OPERTY_INT EGER .
prop_modifier
[in] Modificador da propriedade específica. Propriedades de índice de cor apenas requerem um
modificador.
prop_value
[in] O valor da propriedade.
Valor do Retorno
Se com sucesso, retorna true, do contrário false.
Exemplo: um indicador que desenha uma linha de três cores. O esquema de cores muda a cada 5
tick s.
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots 1
//---- plotar 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 do indicador
double ColorLineBuffer[];
double ColorBuffer[];
int MA_handle;
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado |
//+------------------------------------------------------------------+
void OnInit()
{
//--- mapeamento de buffers do indicador
SetIndexBuffer(0,ColorLineBuffer,INDICATOR_DATA);
SetIndexBuffer(1,ColorBuffer,INDICATOR_COLOR_INDEX);
//--- obter manipulador MA
MA_handle=iMA(Symbol(),0,10,0,MODE_EMA,PRICE_CLOSE);
//---
}
//+------------------------------------------------------------------+
//| Obter índice de cor |
//+------------------------------------------------------------------+
int getIndexOfColor(int i)
{
int j=i%300;
if(j<100) return(0);// primeiro índice
if(j<200) return(1);// segundo índice
return(2); // terceiro índice
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
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;
//--- primeiro cálculo ou número de barras foi alterado
if(prev_calculated==0)
{
//--- copia valores da MA dentro do buffer do indicador ColorLineBuffer
int copied=CopyBuffer(MA_handle,0,0,rates_total,ColorLineBuffer);
if(copied<=0) return(0);// cópia falhou - lançar fora
//--- agora definir a cor da linha para cada barra
for(int i=0;i<rates_total;i++)
ColorBuffer[i]=getIndexOfColor(i);
}
else
{
//--- copia valores da MA dentro do buffer do indicador ColorLineBuffer
int copied=CopyBuffer(MA_handle,0,0,rates_total,ColorLineBuffer);
if(copied<=0) return(0);
PlotIndexSetString
A função define o valor da propriedade correspondente da linha do indicador correspondente. A
propriedade indicador deve ser do tipo string.
bool PlotIndexSetString(
int plot_index, // plotando o índice do estilo
int prop_id, // propriedade identificador
string prop_value // valor para ser definido
);
Parâmetros
plot_index
[in] Índice de representação gráfica
prop_id
[in] O valor pode ser um dos valores do enumerador ENUM _PLOT_PR OPERTY_S TRING.
prop_value
[in] O valor da propriedade.
Valor do Retorno
Se com sucesso, retorna true, do contrário false.
PlotIndexGetInteger
A função define o valor da propriedade correspondente da linha do indicador correspondente. A
propriedade do indicador deve ser do tipo int, color, bool ou char. Existem 2 variantes da função.
Parâmetros
plot_index
[in] Índice de plotagem gráfica
prop_id
[in] O valor pode ser um dos valores do enumerador ENUM _PLOT_PR OPERTY_INT EGER .
prop_modifier
[in] Modificador da propriedade específica. Propriedades de índice de cor apenas requerem um
modificador.
Observação
Função é projetado para extrair as configurações do desenho da linha da indicador apropriada. A
função trabalha em conjunto com a função PlotIndexSetInteger para copiar as propriedades de
desenho de uma linha para outra.
Exemplo: um indicador que colore as velas dependendo do dia da semana. Cores para cada dia são
criados de uma maneira programada.
#property indicator_separate_window
#property indicator_buffers 5
#property indicator_plots 1
//---- plotar ColorCandles
#property indicator_label1 "ColorCandles"
#property indicator_type1 DRAW_COLOR_CANDLES
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- buffers do indicador
double OpenBuffer[];
double HighBuffer[];
double LowBuffer[];
double CloseBuffer[];
double ColorCandlesColors[];
color ColorOfDay[6]={CLR_NONE,clrMediumSlateBlue,
clrDarkGoldenrod,clrForestGreen,clrBlueViolet,clrRed};
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado |
//+------------------------------------------------------------------+
void OnInit()
{
//--- mapeamento de buffers do indicador
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);
//--- definir o número de cores em buffer de cor
PlotIndexSetInteger(0,PLOT_COLOR_INDEXES,6);
//--- definir cores para o buffer de cores
for(int i=1;i<6;i++)
PlotIndexSetInteger(0,PLOT_LINE_COLOR,i,ColorOfDay[i]);
//--- define acuracidade
IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
printf("We have %u colors of days",PlotIndexGetInteger(0,PLOT_COLOR_INDEXES));
//---
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
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];
//--- definir a cor de cada vela
TimeToStruct(time[i],t);
ColorCandlesColors[i]=t.day_of_week;
//---
i++;
}
//--- valor retorno de prev_calculated para a próxima chamada
return(rates_total);
}
//+------------------------------------------------------------------+
Funções de Objeto
Este é o grupo de funções destinadas ao trabalho com objetos gráficos relativos a qualquer gráfico
especifico.
As funções que definem as propriedades de objetos gráficos, assim como as operações ObjectCreate()
e ObjectMove() para criar e mover objetos ao longo do gráfico são realmente usados para enviar
comandos para o gráfico. Se essas funções são executadas com êxito, o comando é incluído na fila
comum dos eventos gráficos. As alterações visuais nas propriedades de objetos gráficos são
implementadas ao manipular a fila dos eventos de gráfico.
Assim, não espere uma atualização visual imediata de objetos gráficos após chamar essas funções.
Geralmente, os objetos gráficos no gráfico são atualizados automaticamente pelo terminal após os
eventos de alteração - uma nova chegada de cotação, redimensionando a janela do gráfico, etc. Use a
função ChartR edraw() para forçar a atualização dos objetos gráficos.
Função Ação
ObjectCreate Cria um objecto de tipo específico para um
gráfico específico
T odos os objetos gráficos devem ter um único nome dentro de um gráfico, incluindo suas sub-janelas.
Mudança de nome de um objeto gráfico gera dois eventos : evento de exclusão de um objeto com o
antigo nome, e evento de criação de um objeto com um novo nome.
Após um objeto ser criado ou uma propriedade de objeto ser modificada, é recomendado chamar a
função ChartR edraw(), a qual comanda o terminal do cliente, forçando o desenho de um gráfico (e
todos os objetos visíveis dentro dele).
ObjectCreate
A função cria um objeto com o nome especifico, o tipo e as coordenadas iniciais na sub-janela de
gráfico especifico. Durante a criação até 30 coordenadas podem ser especificadas.
bool ObjectCreate(
long chart_id, // identificador gráfico
string name, // nome objeto
ENUM_OBJECT type, // tipo objeto
sub_window nwin, // índice janela
datetime time1, // tempo do primeiro ponto de ancoragem
double price1, // preço do primeiro ponto de ancoragem
...
datetime timeN=0, // tempo de N ponto de ancoragem
double priceN=0, // preço de N ponto de ancoragem
...
datetime time30=0, // tempo do trigésimo ponto de ancoragem
double price30=0 // preço do trigésimo ponto de ancoragem
);
Parâmetros
chart_id
[in] Identificador do gráfico. Significa o gráfico atual.
nome
[in] Nome do objeto. O nome deve ser único dentro de um gráfico, incluindo suas sub-janelas.
type
[in] T ipo do e objeto. O valor pode ser um dos valores do enumerador ENUM _OBJECT .
sub_window
[in] Número de sub-janela do gráfico. 0 (zero) significa a principal janela do gráfico. A sub-janela
especifica deve existir, caso contrário, a função retorna false.
time1
[in] A coordenada do tempo da primeira ancoragem.
price1
[in] A coordenada do preço do primeiro ponto de ancoragem.
timeN=0
[in] T empo de N ponto de ancoragem.
priceN=0
[in] A coordenada do preço de N ponto de ancoragem.
time30=0
[in] A coordenada de tempo de N ponto de ancoragem.
price30=0
[in] A coordenada do preço do trigésimo ponto de ancoragem.
Valor do Retorno
R etorna true, se a colocação do comando na fila do gráfico especificado for bem-sucedida, caso
contrário, false. Se o objeto já foi criado, é feita uma tentativa de alterar sua posição.
Observação
Ao chamar ObjectCreate(), sempre é usada uma chamada assíncrona, portanto a função retorna
apenas o resultado da colocação do comando na fila do gráfico. Neste caso, true indica apenas que o
comando está na fila com sucesso; e em si o resultado de sua execução não é conhecido.
A numeração das sub-janelas do gráfico (se houver sub-janelas com indicadores no gráfico) começa
com 1. A janela principal do gráfico sempre tem índice 0.
O maior número de pontos de ancoragem (até 30) é implementado para uso futuro. Ao mesmo
tempo, o limite de 30 possíveis pontos de ancoragem para os objetos gráficos é determinado pela
limitação do número de parâmetros (não mais do que 64), que pode ser usado quando chama uma
função.
Quando um objeto é renomeado, dois eventos são formados simultaneamente. Estes eventos podem
ser manipulados em um Expert Advisor ou o indicador pela função OnChartEvent():
· um evento de exclusão de um objeto com o nome antigo;
· um evento de criação de um objeto com um novo nome.
Há um certo número de pontos de ancoragem que devem ser especificados durante a criação de
cada tipo de objeto:
OBJ_TR ENDBYANGLE Linha de T endência por Ângulo Dois pontos para Ancoragem.
OBJ_S TDDEVCH ANNEL Canal de Desvio Padrão Dois pontos para Ancoragem.
OBJ_R EGR ESS ION Canal de R egressão Linear Dois pontos para Ancoragem.
OBJ_ELL IOTW AVE5 Onda Motriz de Elliott Dois pontos para Ancoragem.
OBJ_ELL IOTW AVE3 Onde de Correção de Elliott T rês pontos para Ancoragem.
OBJ_R ECT ANGLE_LABEL O objeto "R ótulo de R etângulo" Posição será definida usando
para criação e design de as propriedades
interface gráfico customizada. OBJPR OP_XDIS T ANCE e
OBJPR OP_YDIS T ANCE.
ObjectName
A função retorna o nome do objeto correspondente no gráfico determinado, na sub-janela específica,
de tipo específico.
string ObjectName(
long chart_id, // identificador gráfico
int pos, // número da lista de objetos
int sub_window=-1, // índice janela
int type=-1 // tipo objeto
);
Parâmetros
chart_id
[in] Identificador do gráfico. Significa o gráfico atual.
pos
[in] Número ordinal do objeto de acordo com o filtro específico pelo número e tipo de sub-janela.
sub_window=-1
[in] Número de sub-janela do gráfico. 0 significa janela do gráfico principal, -1 significa todas
sub-janelas do gráfico, incluindo a janela principal.
type=-1
[in] T ipo de objeto. O valor pode ser um dos valores do enumerador ENUM _OBJECT . -1 significa
todos os tipos.
Valor do Retorno
Nome do objeto é retornado em caso de sucesso.
Observação
A função utiliza uma chamada síncrona, isso significa que a função espera a execução de todos os
comandos que foram colocados na fila do gráfico antes de sua chamada, e por isso este recurso
pode consumir muito tempo. Deve ter isso em mente, se você estiver trabalhando com um grande
número de objetos no gráfico.
Quando um objeto é renomeado, dois eventos são formados simultaneamente. Estes eventos podem
ser manipulados em um Expert Advisor ou o indicador pela função OnChartEvent():
· um evento de exclusão de um objeto com o nome antigo;
· um evento de criação de um objeto com um novo nome.
ObjectDelete
A função remove o objeto com nome específico a partir de um gráfico especificado.
bool ObjectDelete(
long chart_id, // identificador gráfico
string name // nome objeto
);
Parâmetros
chart_id
[in] Identificador do gráfico. Significa o gráfico atual.
nome
[in] Nome do objeto para ser deletado.
Valor do Retorno
R etorna true, se a colocação do comando na fila do gráfico especificado for bem-sucedida, caso
contrário, false.
Observação
Ao chamar ObjectDelete(), sempre é usada uma chamada assíncrona, portanto a função retorna
apenas o resultado da colocação do comando na fila do gráfico. Neste caso, true indica apenas que o
comando está na fila com sucesso; e em si o resultado de sua execução não é conhecido.
Quando um objeto é renomeado, dois eventos são formados simultaneamente. Estes eventos podem
ser manipulados em um Expert Advisor ou o indicador pela função OnChartEvent():
· um evento de exclusão de um objeto com o nome antigo;
· um evento de criação de um objeto com um novo nome.
ObjectsDeleteAll
R emove todos os objetos a partir de um gráfico específico, específica sub-janela do gráfico, do tipo
especificado.
int ObjectsDeleteAll(
long chart_id, // identificador gráfico
int sub_window=-1, // índice janela
int type=-1 // tipo objeto
);
Parâmetros
chart_id
[in] Identificador do gráfico. Significa o gráfico atual.
prefix
[in] Prefixo no nome dos objetos. T odos os objetos cujos nomes começam com este conjunto de
caracteres serão removidos do gráfico. Você pode especificar prefixo como 'name' ou 'name*' -
ambas as variantes funcionarão da mesma forma. Se uma string vazia for especificada como o
prefixo, os objetos com todos os nomes possíveis serão removidos.
sub_window=-1
[in] Número de sub-janelas do gráfico. 0 significa janela do gráfico principal, -1 significa todas
sub-janelas do gráfico, incluindo a janela principal.
type=-1
[in] T ipo de objeto. O valor pode ser um dos valores do enumerador ENUM _OBJECT . -1 significa
todos os tipos.
Valor do Retorno
R etorna o número de objetos excluídos. Para ler mais sobre o erro, chamar GetLastError().
Observação
A função utiliza uma chamada síncrona, isso significa que a função espera a execução de todos os
comandos que foram colocados na fila do gráfico antes de sua chamada, e por isso este recurso
pode consumir muito tempo. Deve ter isso em mente, se você estiver trabalhando com um grande
número de objetos no gráfico.
ObjectFind
A função pesquisa por um objeto com o nome específico no gráfico com o ID especifico.
int ObjectFind(
long chart_id, // identificador gráfico
string name // nome objeto
);
Parâmetros
chart_id
[in] Identificador do gráfico. Significa o gráfico atual.
nome
[in] O nome do objeto pesquisado.
Valor do Retorno
Se for bem sucedido, a função retorna o número da sub-janela (0 significa a janela principal do
gráfico), no qual o objeto foi encontrado. Se o objeto não for encontrado, a função retorna um
número negativo. Para ler mais sobre o erro, chamar GetLastError().
Observação
A função utiliza uma chamada síncrona, isso significa que a função espera a execução de todos os
comandos que foram colocados na fila do gráfico antes de sua chamada, e por isso este recurso
pode consumir muito tempo. Deve ter isso em mente, se você estiver trabalhando com um grande
número de objetos no gráfico.
Quando um objeto é renomeado, dois eventos são formados simultaneamente. Estes eventos podem
ser manipulados em um Expert Advisor ou o indicador pela função OnChartEvent():
· um evento de exclusão de um objeto com o nome antigo;
· um evento de criação de um objeto com um novo nome.
ObjectGetTimeByValue
A função retorna o valor de tempo para o valor do preço específico de um objeto específico.
datetime ObjectGetTimeByValue(
long chart_id, // identificador gráfico
string name, // nome objeto
double value, // Preço
int line_id // Número linha
);
Parâmetros
chart_id
[in] Identificador do gráfico. Significa o gráfico atual.
nome
[in] Nome do objeto.
value
[in] Valor do preço.
line_id
[in] Identificador de linha.
Valor do Retorno
O valor de tempo para o valor de determinado preço de um objeto específico.
Observação
A função utiliza uma chamada síncrona, isso significa que a função espera a execução de todos os
comandos que foram colocados na fila do gráfico antes de sua chamada, e por isso este recurso
pode consumir muito tempo. Deve ter isso em mente, se você estiver trabalhando com um grande
número de objetos no gráfico.
Um objeto pode ter v ários valores em uma coordenada de preço, portanto é necess ário especificar o
número da linha. Esta função aplica-se apenas aos seguintes objetos :
· Linha de T endência (OBJ_TR END)
· Linha de tendência pelo ângulo (OBJ_TR ENDBYANGLE)
· Linha de Gann(OBJ_GANNL INE)
· Canal eqüidistante (OBJ_CH ANNEL) - 2 linhas
· Canal de regressão Linear (OBJ_R EGR ESS I ON) - 3 linhas
· Canal de desvio padrão (OBJ_S TDDEVCH ANNEL) - 3 linhas
· Linha com setas (OBJ_ARR OW ED_L INE)
Veja Também
T ipos de Objeto
ObjectGetValueByTime
A função retorna o valor do preço para o valor de tempo indicado de um objeto específico.
double ObjectGetValueByTime(
long chart_id, // identificador gráfico
string name, // nome objeto
datetime time, // Tempo
int line_id // Número Linha
);
Parâmetros
chart_id
[in] Identificador do gráfico. Significa o gráfico atual.
nome
[in] Nome do objeto.
time
[in] Valor de tempo.
line_id
[in] ID de Linha.
Valor do Retorno
O valor do preço para o valor de tempo indicado de um objeto específico.
Observação
A função utiliza uma chamada síncrona, isso significa que a função espera a execução de todos os
comandos que foram colocados na fila do gráfico antes de sua chamada, e por isso este recurso
pode consumir muito tempo. Deve ter isso em mente, se você estiver trabalhando com um grande
número de objetos no gráfico.
Um objeto pode ter v ários valores em uma coordenada de preço, portanto é necess ário especificar o
número da linha. Esta função aplica-se apenas aos seguintes objetos :
· Linha de T endência (OBJ_TR END)
· Linha de tendência pelo ângulo (OBJ_TR ENDBYANGLE)
· Linha de Gann(OBJ_GANNL INE)
· Canal eqüidistante (OBJ_CH ANNEL) - 2 linhas
· Canal de regressão Linear (OBJ_R EGR ESS I ON) - 3 linhas
· Canal de desvio padrão (OBJ_S TDDEVCH ANNEL) - 3 linhas
· Linha com setas (OBJ_ARR OW ED_L INE)
Veja Também
T ipos de Objeto
ObjectMove
A função altera as coordenadas do ponto de ancoragem do objeto específico.
bool ObjectMove(
long chart_id, // identificador gráfico
string name, // nome objeto
int point_index, // número ponto ancoragem
datetime time, // Tempo
double price // Preço
);
Parâmetros
chart_id
[in] Identificador do gráfico. Significa o gráfico atual.
nome
[in] Nome do objeto.
point_index
[in] Índice do ponto de ancoragem. O número de pontos de ancoragem depende do tipo de objeto.
time
[in] Coordenada de tempo do ponto de ancoragem selecionado.
price
[in] Coordenada de preço do ponto de ancoragem selecionado.
Valor do Retorno
R etorna true, se a colocação do comando na fila do gráfico especificado for bem-sucedida, caso
contrário, false.
Observação
Ao chamar ObjectMove(), sempre é usada uma chamada assíncrona, portanto a função retorna
apenas o resultado da colocação do comando na fila do gráfico. Neste caso, true indica apenas que o
comando está na fila com sucesso; e em si o resultado de sua execução não é conhecido.
Para verificar o resultado da execução, pode-se usar a função que solicita as propriedades do
objeto, por exemplo, do tipo ObjectGetXXX. Mas, ao fazer isto, deve-se ter em mente que estas
funções são colocadas na fila de espera dos comandos do gráfico e são esperados os resultados da
execução (uma vez que são chamadas síncronas), isso quer dizer que não podem consumir muito
tempo. Deve ter isso em mente, se você estiver trabalhando com um grande número de objetos no
gráfico.
ObjectsTotal
A função retorna o número de objetos na tabela determinada, sub-janela especifica, do tipo
especificado.
int ObjectsTotal(
long chart_id, // identificador gráfico
int sub_window=-1, // índice janela
int type=-1 // tipo objeto
);
Parâmetros
chart_id
[in] Identificador do gráfico. Significa o gráfico atual.
sub_window=-1
[in] Número de sub-janela do gráfico. 0 significa janela do gráfico principal, -1 significa todas
sub-janelas do gráfico, incluindo a janela principal.
type=-1
[in] T ipo de objeto. O valor pode ser um dos valores do enumerador ENUM _OBJECT . -1 significa
todos os tipos.
Valor do Retorno
O número de objetos.
Observação
A função utiliza uma chamada síncrona, isso significa que a função espera a execução de todos os
comandos que foram colocados na fila do gráfico antes de sua chamada, e por isso este recurso
pode consumir muito tempo. Deve ter isso em mente, se você estiver trabalhando com um grande
número de objetos no gráfico.
ObjectSetDouble
A função define o valor da propriedade do objeto correspondente. A propriedade objeto deve ser do
tipo double. Existem 2 variantes da função.
Parâmetros
chart_id
[in] Identificador do gráfico. Significa o gráfico atual.
nome
[in] Nome do objeto.
prop_id
[in] ID da propriedade do objeto. O valor pode ser um dos valores do enumerador
ENUM _OBJECT_PR OPERTY_DOUBLE.
prop_modifier
[in] Modificador da propriedade específica. Ela indica o número do nível em ferramentas
Fibonacci e no objeto gráfico T ridente de Andrew. A numeração dos níveis começa a partir do
zero.
prop_value
[in] O valor da propriedade.
Valor do Retorno
A função retorna true somente se o comando para alterar as propriedades de um objeto gráfico foi
enviado a um gráfico com sucesso. Do contrário ele retorna false. Para ler mais sobre o erro,
chamar GetLastError().
Observação
A função utiliza uma chamada assíncrona, isso significa que a função espera a execução do comando
que foi colocado com sucesso na fila do gráfico especificado e retorna o controle imediatamente.
Para verificar o resultado da execução, pode-se usar a função que solicita a propriedade
especificada do objeto. Mas, ao fazer isto, deve-se ter em mente que estas funções são colocadas
na fila de espera dos comandos de outro gráfico e são esperados os resultados da execução, isso
quer dizer que não podem consumir muito tempo. Deve ter isso em mente, se você estiver
trabalhando com um grande número de objetos no gráfico.
time2=time[50];
Veja Também
T ipos de Objetos, Propriedades de objeto
ObjectSetInteger
A função define o valor da propriedade do objeto correspondente. A propriedade do objeto deve ser do
tipo datetime, int, color, bool ou char. Existem 2 variantes da função.
Parâmetros
chart_id
[in] Identificador do gráfico. Significa o gráfico atual.
nome
[in] Nome do objeto.
prop_id
[in] ID da propriedade do objeto. O valor pode ser um dos valores do enumerador
ENUM _OBJECT_PR OPERTY_INT EGER .
prop_modifier
[in] Modificador da propriedade específica. Indica o número do nível em ferramentas Fibonacci e
no objeto gráfico do tipo T ridente de Andrew. A numeração dos níveis começa a partir do zero.
prop_value
[in] O valor da propriedade.
Valor do Retorno
A função retorna true somente se o comando para alterar as propriedades de um objeto gráfico foi
enviado a um gráfico com sucesso. Do contrário ele retorna false. Para ler mais sobre o erro,
chamar GetLastError().
Observação
A função utiliza uma chamada assíncrona, isso significa que a função espera a execução do comando
que foi colocado com sucesso na fila do gráfico especificado e retorna o controle imediatamente.
Para verificar o resultado da execução, pode-se usar a função que solicita a propriedade
especificada do objeto. Mas, ao fazer isto, deve-se ter em mente que estas funções são colocadas
na fila de espera dos comandos de outro gráfico e são esperados os resultados da execução, isso
quer dizer que não podem consumir muito tempo. Deve ter isso em mente, se você estiver
trabalhando com um grande número de objetos no gráfico.
//+------------------------------------------------------------------+
//| Tabela de Cores da Web|
//| Copyright 2011, MetaQuotes Software Corp |
//| https://www.metaquotes.net |
//+------------------------------------------------------------------+
#define X_SIZE 140 // largura de uma edição de objeto
#define Y_SIZE 33 // altura de uma edição de objeto
//+------------------------------------------------------------------+
//| Array de cores da Web |
//+------------------------------------------------------------------+
color ExtClr[140]=
{
clrAliceBlue,clrAntiqueWhite,clrAqua,clrAquamarine,clrAzure,clrBeige,clrBisque,clrBlack,clrBlanc
clrBlue,clrBlueViolet,clrBrown,clrBurlyWood,clrCadetBlue,clrChartreuse,clrChocolate,clrCoral,clr
clrCornsilk,clrCrimson,clrCyan,clrDarkBlue,clrDarkCyan,clrDarkGoldenrod,clrDarkGray,clrDarkGreen
clrDarkMagenta,clrDarkOliveGreen,clrDarkOrange,clrDarkOrchid,clrDarkRed,clrDarkSalmon,clrDarkSea
clrDarkSlateBlue,clrDarkSlateGray,clrDarkTurquoise,clrDarkViolet,clrDeepPink,clrDeepSkyBlue,clrD
clrDodgerBlue,clrFireBrick,clrFloralWhite,clrForestGreen,clrFuchsia,clrGainsboro,clrGhostWhite,c
clrGoldenrod,clrGray,clrGreen,clrGreenYellow,clrHoneydew,clrHotPink,clrIndianRed,clrIndigo,clrIv
clrLavender,clrLavenderBlush,clrLawnGreen,clrLemonChiffon,clrLightBlue,clrLightCoral,clrLightCya
clrLightGoldenrod,clrLightGreen,clrLightGray,clrLightPink,clrLightSalmon,clrLightSeaGreen,clrLig
clrLightSlateGray,clrLightSteelBlue,clrLightYellow,clrLime,clrLimeGreen,clrLinen,clrMagenta,clrM
clrMediumAquamarine,clrMediumBlue,clrMediumOrchid,clrMediumPurple,clrMediumSeaGreen,clrMediumSla
clrMediumSpringGreen,clrMediumTurquoise,clrMediumVioletRed,clrMidnightBlue,clrMintCream,clrMisty
clrNavajoWhite,clrNavy,clrOldLace,clrOlive,clrOliveDrab,clrOrange,clrOrangeRed,clrOrchid,clrPale
clrPaleGreen,clrPaleTurquoise,clrPaleVioletRed,clrPapayaWhip,clrPeachPuff,clrPeru,clrPink,clrPlu
clrPurple,clrRed,clrRosyBrown,clrRoyalBlue,clrSaddleBrown,clrSalmon,clrSandyBrown,clrSeaGreen,cl
clrSienna,clrSilver,clrSkyBlue,clrSlateBlue,clrSlateGray,clrSnow,clrSpringGreen,clrSteelBlue,clr
clrThistle,clrTomato,clrTurquoise,clrViolet,clrWheat,clrWhite,clrWhiteSmoke,clrYellow,clrYellowG
};
//+------------------------------------------------------------------+
//| Criando e inicializando uma edição de objeto |
//+------------------------------------------------------------------+
void CreateColorBox(int x,int y,color c)
{
//--- gerar um nome para uma nova edição de objeto
string name="ColorBox_"+(string)x+"_"+(string)y;
//--- criar uma nova edição de objeto
if(!ObjectCreate(0,name,OBJ_EDIT,0,0,0))
{
Print("Não é possível criar: '",name,"'");
return;
}
//--- definir coordenadas, largura e altura
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);
//--- definir a cor do texto
if(clrBlack==c) ObjectSetInteger(0,name,OBJPROP_COLOR,clrWhite);
else ObjectSetInteger(0,name,OBJPROP_COLOR,clrBlack);
//--- definir a cor de fundo
ObjectSetInteger(0,name,OBJPROP_BGCOLOR,c);
//--- definir o texto
ObjectSetString(0,name,OBJPROP_TEXT,(string)c);
}
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
//--- criar tabela de cores 7x20 para edição de objetos
for(uint i=0;i<140;i++)
CreateColorBox(i%7,i/7,ExtClr[i]);
}
Veja Também
T ipos de Objetos, Propriedades de objeto
ObjectSetString
A função define o valor da propriedade do objeto correspondente. A propriedade do objeto deve ser do
tipo string. Existem 2 variantes da função.
Parâmetros
chart_id
[in] Identificador do gráfico. Significa o gráfico atual.
nome
[in] Nome do objeto.
prop_id
[in] ID da propriedade do objeto. O valor pode ser um dos valores do enumerador
ENUM _OBJECT_PR OPERTY_S TRING.
prop_modifier
[in] Modificador da propriedade específica. Indica o número do nível em ferramentas Fibonacci e
no objeto gráfico do tipo T ridente de Andrew. A numeração dos níveis começa a partir do zero.
prop_value
[in] O valor da propriedade.
Valor do Retorno
A função retorna true somente se o comando para alterar as propriedades de um objeto gráfico foi
enviado a um gráfico com sucesso. Do contrário ele retorna false. Para ler mais sobre o erro,
chamar GetLastError().
Observação
A função utiliza uma chamada assíncrona, isso significa que a função espera a execução do comando
que foi colocado com sucesso na fila do gráfico especificado e retorna o controle imediatamente.
Para verificar o resultado da execução, pode-se usar a função que solicita a propriedade
especificada do objeto. Mas, ao fazer isto, deve-se ter em mente que estas funções são colocadas
na fila de espera dos comandos de outro gráfico e são esperados os resultados da execução, isso
quer dizer que não podem consumir muito tempo. Deve ter isso em mente, se você estiver
trabalhando com um grande número de objetos no gráfico.
Quando um objeto é renomeado, dois eventos são formados simultaneamente. Estes eventos podem
ser manipulados em um Expert Advisor ou o indicador pela função OnChartEvent():
· um evento de exclusão de um objeto com o nome antigo;
· um evento de criação de um objeto com um novo nome.
ObjectGetDouble
A função retorna o valor da propriedade do objeto correspondente. A propriedade objeto deve ser do
tipo double. Existem 2 variantes da função.
Parâmetros
chart_id
[in] Identificador do gráfico. Significa o gráfico atual.
nome
[in] Nome do objeto.
prop_id
[in] ID da propriedade do objeto. O valor pode ser um dos valores do enumerador
ENUM _OBJECT_PR OPERTY_DOUBLE.
prop_modifier
[in] Modificador da propriedade específica. Para a primeira variante, o modificador tem valor
padrão igual a 0. A maioria das propriedades não requerem um modificador. Indica o número do
nível em ferramentas Fibonacci e no objeto gráfico do tipo T ridente de Andrew. A numeração dos
níveis começa a partir do zero.
double_var
[out] Variável do tipo double que recebeu o valor do propriedade solicitada.
Valor do Retorno
Valor do tipo double para a primeira variante chamada.
Para a segunda variante, se essa propriedade é mantida e o valor foi colocado na variável
double_var, a função retorna true, caso contrário, retorna false. Para ler mais sobre o erro, chamar
GetLastError().
Observação
A função utiliza uma chamada síncrona, isso significa que a função espera a execução de todos os
comandos que foram colocados na fila do gráfico antes de sua chamada, e por isso este recurso
pode consumir muito tempo. Deve ter isso em mente, se você estiver trabalhando com um grande
número de objetos no gráfico.
ObjectGetInteger
A função retorna o valor da propriedade do objeto correspondente. A propriedade do objeto deve ser
do tipo datetime, int, color, bool ou char. Existem 2 variantes da função.
Parâmetros
chart_id
[in] Identificador do gráfico. Significa o gráfico atual.
nome
[in] Nome do objeto.
prop_id
[in] ID da propriedade do objeto. O valor pode ser um dos valores do enumerador
ENUM _OBJECT_PR OPERTY_INT EGER .
prop_modifier
[in] Modificador da propriedade específica. Para a primeira variante, o modificador tem valor
padrão igual a 0. A maioria das propriedades não requerem um modificador. Indica o número do
nível em ferramentas Fibonacci e no objeto gráfico do tipo T ridente de Andrew. A numeração dos
níveis começa a partir do zero.
long_var
[out] Variável do tipo long que recebe o valor da propriedade requisitada.
Valor do Retorno
O valor long para a primeira chamada da variante.
A função retorna true para a segunda variante, se essa propriedade for mantida e o valor foi
colocado na variável long _var, caso contrário, retorna false. Para ler mais sobre o erro, chamar
GetLastError().
Observação
A função utiliza uma chamada síncrona, isso significa que a função espera a execução de todos os
comandos que foram colocados na fila do gráfico antes de sua chamada, e por isso este recurso
pode consumir muito tempo. Deve ter isso em mente, se você estiver trabalhando com um grande
número de objetos no gráfico.
ObjectGetString
A função retorna o valor da propriedade do objeto correspondente. A propriedade do objeto deve ser
do tipo string. Existem 2 variantes da função.
Parâmetros
chart_id
[in] Identificador do gráfico. Significa o gráfico atual.
nome
[in] Nome do objeto.
prop_id
[in] ID da propriedade do objeto. O valor pode ser um dos valores do enumerador
ENUM _OBJECT_PR OPERTY_S TRING.
prop_modifier
[in] Modificador da propriedade específica. Para a primeira variante, o modificador tem valor
padrão igual a 0. A maioria das propriedades não requerem um modificador. Indica o número do
nível em ferramentas Fibonacci e no objeto gráfico do tipo T ridente de Andrew. A numeração dos
níveis começa a partir do zero.
string_var
[out] Variável do tipo string que recebe o valor das propriedades requisitadas.
Valor do Retorno
Valor string para a primeira versão da chamada.
R etorna true para a segunda versão da chamada, se essa propriedade for mantida e o valor foi
colocado na variável string _var, caso contrário, retorna false. Para ler mais sobre o erro, chamar
GetLastError().
Observação
A função utiliza uma chamada síncrona, isso significa que a função espera a execução de todos os
comandos que foram colocados na fila do gráfico antes de sua chamada, e por isso este recurso
pode consumir muito tempo. Deve ter isso em mente, se você estiver trabalhando com um grande
número de objetos no gráfico.
Quando um objeto é renomeado, dois eventos são formados simultaneamente. Estes eventos podem
ser manipulados em um Expert Advisor ou o indicador pela função OnChartEvent():
· um evento de exclusão de um objeto com o nome antigo;
· um evento de criação de um objeto com um novo nome.
TextSetFont
A função define a fonte para exibir o texto usando métodos de desenho e retorna o resultado dessa
operação. Fonte Arial com o tamanho -120 (12 pt) é usado por padrão.
bool TextSetFont(
const string name, // nome da fonte ou caminho para o arquivo da fonte no disco
int size, // tamanho da fonte
uint flags, // combinação de sinalizadores
int orientation=0 // ângulo de inclinação do texto
);
Parâmetros
name
[in] Nome da fonte no sistema ou o nome do recurso contendo a fonte ou o caminho ao arquivo da
fonte no disco.
size
[in] O tamanho da fonte, que pode ser definida usando valores positivos e negativos. No caso de
valores negativos, o valor é definido em décimos de um ponto e o tamanho do texto depende das
configurações do sistema operacional (" escala padrão" ou " grande escala" ). No caso de valores
negativos, o valor é definido em décimos de um ponto e o tamanho do texto depende das
configurações do sistema operacional (" escala padrão" ou " grande escala" ). Veja a Nota abaixo
para mais informações sobre as diferenças entre os modos.
flags
[in] Combinação de sinalizadores descrevendo o estilo da fonte.
orientation
[in] Inclinação horizontal do texto em relação ao eixo X, a unidade de medida é 0,1 grau. Isso
significa que orientação=450 está para inclinação igual a 45 graus.
Valor de retorno
R etorna verdadeiro se a fonte atual é instalado com êxito, caso contrário é falso. Possibilidade de
erros de códigos :
· ERR_INVAL ID_PAR AMET ER (4003) - name apresenta NULL ou"" (string vazia),
· ERR_INT ERNAL _ERR OR (4001) - erro de sistema operacional (por exemplo, uma tentativa de criar
uma fonte inexistente).
Observação
Se "::" é usado em nome da fonte, a fonte é baixada do recurso EX5. Se name nome da fonte é
especificado com uma extensão, a fonte é baixada do arquivo, se o caminho começa com "\" ou "/" ,
o arquivo é procurado em relação ao diretório MQL5. Caso contrário, ele é procurado em relação ao
caminho do arquivo EX5 que chamou a função T extSetFont().
O tamanho da fonte é definido usando valores positivos ou negativos. Esse fato define a
dependência do tamanho do texto a partir das configurações do sistema operacional (escala de
tamanho).
· Se o tamanho é especificado por um número positivo, este tamanho é transformado em unidades
de medidas físicas de um dispositivo (pixels) quando se muda de uma fonte lógica para uma
física, e este tamanho corresponde à altura dos símbolos glifos escolhidos entre as fontes
disponíveis. Este caso não é recomendado quando os textos exibidos pela função T extOut() e os
exibidos pelo OBJ_LABEL (" Etiquetas " ), onde objetos gráfico estão a ser utilizados em conjunto no
gráfico.
· Se o tamanho é determinado por um número negativo, este número deve ser definido em décimos
de um ponto lógico (-350 é igual a 35 pontos lógicos) dividido em 10. Um valor obtido é então
transformado em unidades de medidas físicas de um dispositivo (pixels) e corresponde ao valor
absoluto da altura de um símbolo escolhido a partir das fontes disponíveis. Multiplicar o do
tamanho de fonte determinada nas propriedades do objeto por -10 para tornar o tamanho de um
texto na tela semelhante ao de um objeto OBJ_LABEL.
Os sinalizadores podem ser usados com a combinação de sinalizadores de estilo com um dos
sinalizadores especificando a largura da fonte. Nome dos sinalizadores são mostrados abaixo.
Flag Description
FONT_IT AL IC Itálico
FW_DONT CAR E
FW_THIN
FW_EXTR AL IGHT
FW_UL TR AL IGHT
FW_L IGHT
FW_NOR MAL
FW_R EGULAR
FW_MEDIUM
FW_SEM IBOL D
FW_DEM IBOL D
FW_BOL D
FW_EXTR ABOL D
FW_UL TR ABOL D
FW_H EAVY
FW_BLACK
Também Veja
TextOut
A função exibe um texto num array personalizado (buffer) e retorna o resultado dessa operação. O
array é projetado para criar o recurso gráfico.
bool TextOut(
const string text, // texto exibido
int x, // coordenada X
int y, // coordenada Y
uint anchor, // tipo de âncora
uint &data[], // buffer de saída
uint width, // largura de buffer em pixels
uint height, // altura de buffer em pixels
uint color, // cor do texto
ENUM_COLOR_FORMAT color_format // formato de cor para a saída
);
Parâmetros
text
[in] T exto exibido que será escrito para o buffer. Somente o texto de uma linha é exibido.
x
[in] Coordenada X do ponto de ancoragem do texto exibido.
y
[in] Coordenada Y do ponto de ancoragem do texto exibido.
anchor
[in] O valor de saída dos 9 métodos pré-definidos de localização do ponto de ancoragem do texto
exibido. O valor é definido por uma combinação de dois sinalizadores - sinalizadores de
alinhamento de texto horizontal e vertical. Nomes dos sinalizadores estão listados na Nota abaixo.
data[]
[in] Buffer, na qual o texto é exibido. O buffer é usado para criar o recurso gráfico.
width
[in] Largura do buffer em pixels.
height
[in] Altura do buffer em pixels.
color
[in] Cor do texto.
color_format
[in] Formato de cor é definida pelo valor do enumerador ENUM _COLOR_FOR MAT .
Valor de retorno
R etorna true se bem sucedido, caso contrário false.
Observação
Exemplo:
//--- largura e altura da tela (usado para o desenho)
#define IMG_WIDTH 200
#define IMG_HEIGHT 200
//--- exibir a janela de parâmetro antes de lançar o script
#property script_show_inputs
//--- permite definir o formato de cor
input ENUM_COLOR_FORMAT clr_format=COLOR_FORMAT_XRGB_NOALPHA;
//--- array de desenho (buffer)
uint ExtImg[IMG_WIDTH*IMG_HEIGHT];
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar) |
//+------------------------------------------------------------------+
void OnStart()
{
//--- criar o objeto OBJ_BITMAP_LABEL para desenhar
ObjectCreate(0,"RELÓGIO",OBJ_BITMAP_LABEL,0,0,0);
//--- especificar o nome do recurso gráfico para escrever no objeto RELÓGIO
ObjectSetString(0,"RELÓGIO",OBJPROP_BMPFILE,"::IMG");
int x,y; // variáveis para o cálculo das coordenadas atuais da string de texto dos p
//--- girar ponteiros do relógio em um loop infinito, até que o script seja interrompido
while(!IsStopped())
{
//--- limpar o buffer do array do desenho do relógio
ArrayFill(ExtImg,0,IMG_WIDTH*IMG_HEIGHT,0);
//--- definir a fonte para desenhar dígitos para o rosto do relógio
TextSetFont("Arial",-200,FW_EXTRABOLD,0);
//--- desenhar a face do relógio
for(int i=1;i<=12;i++)
{
//--- receber o tamanho da hora atual sobre a face do relógio
TextGetSize(string(i),w,h);
//--- calcular as coordenadas da hora atual sobre a face do relógio
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);
//--- saída da hora na face do relógio através do buffer ExtImg[]
TextOut(string(i),x,y,TA_LEFT|TA_TOP,ExtImg,IMG_WIDTH,IMG_HEIGHT,0xFFFFFFFF,clr_format);
}
//--- agora, especificar a fonte para desenhar o ponteiro dos minutos
TextSetFont("Arial",-200,FW_EXTRABOLD,-int(nm%3600));
//--- receber o tamanho do ponteiro dos minutos
TextGetSize("----->",w,h);
//--- calcular as coordenadas do ponteiro dos minutos sobre a face do relógio
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);
//--- saída do ponteiro dos minutos na face do relógio através do buffer ExtImg[]
TextOut("----->",x,y,TA_LEFT|TA_TOP,ExtImg,IMG_WIDTH,IMG_HEIGHT,0xFFFFFFFF,clr_format);
Também Veja
R ecursos, R esourceCreate(), R esourceSave(), T extGetSize(), T extSetFont()
TextGetSize
A função retorna a largura da linha e altura nas configurações das fonte atuais.
bool TextGetSize(
const string text, // string de texto
uint& width, // largura do buffer em pixels
uint& height // altura de buffer em pixels
);
Parâmetros
text
[in] String, para o qual deve ser obtido o comprimento e a largura.
width
[out] Parâmetro de entrada para o recebimento da largura.
height
[out] Parâmetro de entrada para o recebimento da altura.
Valor de retorno
R etorna true se bem sucedido, caso contrário false. Possibilidade de erros de códigos :
· ERR_INT ERNAL _ERR OR (4001) - erro do sistema operacional.
Também Veja
R ecursos, R esourceCreate(), R esourceSave(), T extSetFont(), T extOut()
Essas funções retornam o manipulador da cópia apropriada do indicador. Além disso, usando este
manipulador, você pode receber os dados calculados pelo indicador correspondente. Os dados do buffer
correspondentes (indicadores técnicos contêm dados calculados nos seus buffers internos, que podem
variar de 1 a 5, dependendo do indicador) podem ser copiados para um programa de MQL5 utilizando a
função CopyBuffer().
Você não pode consultar os dados do indicador diretamente após ter sido criado, porque o cálculo de
valores dos indicadores requer algum tempo, por isso é melhor criar o indicador manipulando em
OnInit(). A Função iCustom() cria o indicador personalizado correspondente, e retorna seu manipulador
no caso de ser criado com êxito. Indicadores personalizadas podem conter até 512 buffers de
indicador, o conteúdo do qual pode também ser obtida através da função CopyBuffer(), usando o
manipulador obtido.
Existe um método universal para a criação qualquer indicador técnico usando a função
IndicatorCreate(). Esta função aceita os seguintes dados como parâmetros de entrada:
· Nome do símbolo;
· timeframe;
A memória do computador pode ser liberada a partir de um indicador que não é mais utilizado, usando
a função IndicatorR elease(),onde o manipulador de indicador é transmitido.
Nota. Chamada repetida da função do indicador com os mesmos parâmetros dentro de um MQL5-
programa não resulta num aumento múltiplo do contador de referência, o contador será aumentado
apenas uma vez por 1. No entanto, é recomendado obter os manipuladores de indicadores em função
OnInit() ou no construtor da classe, e ainda utilizar estes manipuladores em outras funções. O
contador de referência diminui quando um MQL5-programa é desinicializado.
T odas as funções de indicador tem pelo menos dois parâmetros - o símbolo e o período. O NULL Valor
do símbolo significa o símbolo corrente, o valor 0 (zero) do período significa o prazo corrente.
iAD Accumulation/Distribution
iAlligator Alligator
iDeMark er DeMark er
iEnvelopes Envelopes
iFractals Fractals
iMomentum Momentum
iVolumes Volumes
iAC
A função cria o Accelerator Oscillator num cachê global do terminal do cliente e retorna seu
manipulador. T em apenas um buffer.
int iAC(
string symbol, // símbolo nome
ENUM_TIMEFRAMES period // período
);
Parâmetros
symbol
[in] O nome do símbolo de segurança, os dados que devem ser usados para calcular o indicador. O
valor NULL significa o símbolo atual.
period
[in] O valor do período pode ser um dos valores do enumerador ENUM _TIMEFR AMES, 0 (zero)
significa o prazo corrente.
Valor de retorno
R etorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVAL ID_H ANDLE. A memória do computador pode ser liberada a partir de um indicador que não é
mais utilizado, usando a função IndicatorR elease(), onde o manipulador de indicador é transmitido.
Exemplo:
//+------------------------------------------------------------------+
//| 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 "O indicador demonstra como obter dados"
#property description "de buffers do indicador para o indicador técnico iAC."
#property description "Um símbolo e o prazo utilizado para o cálculo do indicador,"
#property description "são definidos pelos parâmetros de símbolo e período."
#property description "O método de criação do manipulador é definido através do parâmetro "type" (t
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots 1
//--- plotagem do 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
//+------------------------------------------------------------------+
//| Enumerador dos métodos de criação do manipulador |
//+------------------------------------------------------------------+
enum Creation
{
Call_iAC, // usar iAC
Call_IndicatorCreate // usar IndicatorCreate
};
//--- parâmetros de entrada
input Creation type=Call_iAC; // tipo da função
input string symbol=" "; // símbolo
input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // timeframe
//--- buffers do indicador
double iACBuffer[];
double iACColors[];
//--- variável para armazenamento do manipulador do indicador iAC
int handle;
//--- variável para armazenamento
string name=symbol;
//--- nome do indicador num gráfico
string short_name;
//--- nós manteremos o número de valores no indicador Accelerator Oscillator
int bars_calculated=0;
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado |
//+------------------------------------------------------------------+
int OnInit()
{
//--- atribuição de arrays para buffers do indicador
SetIndexBuffer(0,iACBuffer,INDICATOR_DATA);
SetIndexBuffer(1,iACColors,INDICATOR_COLOR_INDEX);
//--- determinar o símbolo do indicador, é desenhado para
name=symbol;
//--- excluir os espaços à direita e à esquerda
StringTrimRight(name);
StringTrimLeft(name);
//--- se resulta em comprimento zero da string do 'name'
if(StringLen(name)==0)
{
//--- tomar o símbolo do gráfico, o indicador está anexado para
name=_Symbol;
}
//--- criar manipulador do indicador
if(type==Call_iAC)
handle=iAC(name,period);
else
handle=IndicatorCreate(name,period,IND_AC);
//--- se o manipulador não é criado
if(handle==INVALID_HANDLE)
{
//--- mensagem sobre a falha e a saída do código de erro
PrintFormat("Falha ao criar o manipulador do indicador iAC para o símbolo %s/%s, código de er
name,
EnumToString(period),
GetLastError());
//--- o indicador é interrompido precocemente
return(INIT_FAILED);
}
//--- mostrar o símbolo/prazo do indicador Accelerator Oscillator, é calculado para
short_name=StringFormat("iAC(%s/%s)",name,EnumToString(period));
IndicatorSetString(INDICATOR_SHORTNAME,short_name);
//--- inicialização normal do indicador
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
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[])
{
//--- número de valores copiados a partir do indicador iAC
int values_to_copy;
//--- determinar o número de valores calculados no indicador
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat("BarsCalculated() retornando %d, código de erro %d",calculated,GetLastError());
return(0);
}
//--- se for o primeiro arranque do cálculo do indicador, ou se o número de valores em que o indica
//--- ou se é necessário cálculo do indicador para duas ou mais barras (isso significa que algo mud
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//--- Se o array iACBuffer é maior do que o número de valores no indicador iAC para símbolo/p
//--- caso contrário, copiamos menor do que o tamanho dos buffers do indicador
if(calculated>rates_total) values_to_copy=rates_total;
else values_to_copy=calculated;
}
else
{
//--- isso significa que não é a primeira vez do cálculo do indicador, é desde a última chama
//--- para o cálculo não mais do que uma barra é adicionada
values_to_copy=(rates_total-prev_calculated)+1;
}
//--- preencher os arrays iACBuffer e iACColors com valores a partir do indicador Accelerator Oscil
//--- se FillArraysFromBuffer retorna falso, isto significa que a informação ainda não está pronta,
if(!FillArraysFromBuffer(iACBuffer,iACColors,handle,values_to_copy)) return(0);
//--- formar a mensagem
string comm=StringFormat("%s ==> Valor atualizado no indicador %s: %d",
TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS),
short_name,
values_to_copy);
//--- exibir a mensagem de serviço no gráfico
Comment(comm);
//--- memorizar o número de valores no indicador Accelerator Oscillator
bars_calculated=calculated;
//--- retorna o valor prev_calculated para a próxima chamada
return(rates_total);
}
//+------------------------------------------------------------------+
//| Preenchendo buffers do indicador a partir do indicador iAC |
//+------------------------------------------------------------------+
bool FillArraysFromBuffer(double &values[], // valores do buffer do indicator Accelerator Os
double &color_indexes[], // buffer de cor(para armazenar o índice das cor
int ind_handle, // manipulador do indicador iAC
int amount // número dos valores copiados
)
{
//--- redefinir o código de erro
ResetLastError();
//--- preencher uma parte do array iACBuffer com valores a partir do buffer do indicador que tem o
if(CopyBuffer(ind_handle,0,0,amount,values)<0)
{
//--- Se a cópia falhar, informe o código de erro
PrintFormat("Falha ao copiar dados a partir do indicador iAC, código de erro %d",GetLastError
//--- parar com resultado zero - significa que indicador é considerado como não calculado
return(false);
}
//--- agora copiar o índice de cores
if(CopyBuffer(ind_handle,1,0,amount,color_indexes)<0)
{
//--- Se a cópia falhar, informe o código de erro
PrintFormat("Falha ao copiar valores de cor a partir do indicador iAC, código de erro %d",Get
//--- parar com resultado zero - significa que indicador é considerado como não calculado
return(false);
}
//--- está tudo bem
return(true);
}
//+------------------------------------------------------------------+
//| Função de desinicialização do indicador |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(handle!=INVALID_HANDLE)
IndicatorRelease(handle);
//--- limpar o gráfico após excluir o indicador
Comment("");
}
iAD
A função retorna o manipulador do indicador Accumulation/Distribution. T em apenas um buffer.
int iAD(
string symbol, // símbolo nome
ENUM_TIMEFRAMES period, // período
ENUM_APPLIED_VOLUME applied_volume // tipo de volume para o cálculo
);
Parâmetros
symbol
[in] O nome do símbolo de segurança, os dados que devem ser usados para calcular o indicador. O
valor NULL significa o símbolo atual.
period
[in] O valor do período pode ser um dos valores do enumerador ENUM _TIMEFR AMES, 0 (zero)
significa o prazo corrente.
applied_volume
[in] O volume utilizado. Can be any of ENUM _APPL IED_VOL UME values.
Valor de retorno
R etorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVAL ID_H ANDLE. A memória do computador pode ser liberada a partir de um indicador que não é
mais utilizado, usando a função IndicatorR elease(), onde o manipulador de indicador é transmitido.
Exemplo:
//+------------------------------------------------------------------+
//| 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 "O indicador demonstra como obter dados"
#property description "dos buffers do indicador para o indicador técnico iAD."
#property description "Um símbolo e o prazo utilizado para o cálculo do indicador,"
#property description "são definidos pelos parâmetros de símbolo e período."
#property description "O método de criação do manipulador é definido através do parâmetro "type" (t
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1
//--- plotar 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 o manipulador não é criado
if(handle==INVALID_HANDLE)
{
//--- mensagem sobre a falha e a saída do código de erro
PrintFormat("Falha ao criar o manipulador do indicador iAD para o símbolo %s/%s, código de er
name,
EnumToString(period),
GetLastError());
//--- o indicador é interrompido precocemente
return(INIT_FAILED);
}
//--- mostrar o símbolo/prazo, o indicador de Accumulation/Distribution é calculado para
short_name=StringFormat("iAD(%s/%s)",name,EnumToString(period));
IndicatorSetString(INDICATOR_SHORTNAME,short_name);
//--- inicialização normal do indicador
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
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[])
{
//--- número de valores copiados a partir do indicador iAD
int values_to_copy;
//--- determinar o número de valores calculados no indicador
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat("BarsCalculated() retornando %d, código de erro %d",calculated,GetLastError());
return(0);
}
//--- se for o primeiro arranque do cálculo do indicador, ou se o número de valores em que o indica
//--- ou se é necessário cálculo do indicador para duas ou mais barras (isso significa que algo mud
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//--- se o array iADBuffer é maior do que o número de valores no indicador iAD para símbolo/p
//--- caso contrário, copiamos menor do que o tamanho dos buffers do indicador
if(calculated>rates_total) values_to_copy=rates_total;
else values_to_copy=calculated;
}
else
{
//--- isso significa que não é a primeira vez do cálculo do indicador, é desde a última chama
//--- para o cálculo não mais do que uma barra é adicionada
values_to_copy=(rates_total-prev_calculated)+1;
}
//--- preencher o array iADBuffer com valores do indicador Accumulation/Distribution
//--- se FillArraysFromBuffer retorna falso, isto significa que a informação ainda não está pronta,
if(!FillArrayFromBuffer(iADBuffer,handle,values_to_copy)) return(0);
//--- formar a mensagem
string comm=StringFormat("%s ==> Valor atualizado no indicador %s: %d",
TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS),
short_name,
values_to_copy);
//--- exibir a mensagem de serviço no gráfico
Comment(comm);
//--- memorizar o número de valores no indicador Accumulation/Distribution
bars_calculated=calculated;
//--- retorna o valor prev_calculated para a próxima chamada
return(rates_total);
}
//+------------------------------------------------------------------+
//| Preenchendo buffers do indicador a partir do indicador iAD |
//+------------------------------------------------------------------+
bool FillArrayFromBuffer(double &values[], // valores do buffer do indicator da linha Accumulatio
int ind_handle, // manipulador do indicador iAD
int amount // número dos valores copiados
)
{
//--- redefinir o código de erro
ResetLastError();
//--- preencher uma parte do array iADBuffer com valores a partir do buffer do indicador que tem o
if(CopyBuffer(ind_handle,0,0,amount,values)<0)
{
//--- Se a cópia falhar, informe o código de erro
PrintFormat("Falha ao copiar dados a partir do indicador iAD, código de erro %d",GetLastError
//--- parar com resultado zero - significa que indicador é considerado como não calculado
return(false);
}
//--- está tudo bem
return(true);
}
//+------------------------------------------------------------------+
//| Função de desinicialização do indicador |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(handle!=INVALID_HANDLE)
IndicatorRelease(handle);
//--- limpar o gráfico após excluir o indicador
Comment("");
}
iADX
A função retorna o manipulador do indicador Average Directional Movement Index.
int iADX(
string symbol, // símbolo nome
ENUM_TIMEFRAMES period, // período
int adx_period // período médio
);
Parâmetros
symbol
[in] O nome do símbolo de segurança, os dados que devem ser usados para calcular o indicador. O
valor NULL significa o símbolo atual.
period
[in] O valor do período pode ser um dos valores ENUM _TIMEFR AMES, 0 (zero) significa o prazo
corrente.
adx_period
[in] Período para calcular o índice.
Valor de retorno
R etorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVAL ID_H ANDLE. A memória do computador pode ser liberada a partir de um indicador que não é
mais utilizado, usando a função IndicatorR elease(), onde o manipulador de indicador é transmitido.
Observação
Os números do buffer são os seguintes : 0 - MAIN_L INE, 1 - PL US DI_L INE, 2 - M INUS DI_L INE.
Exemplo:
//+------------------------------------------------------------------+
//| 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 "O indicador demonstra como obter dados"
#property description "dos buffers do indicador para o indicador técnico iADX."
#property description "Um símbolo e o prazo utilizado para o cálculo do indicador,"
#property description "são definidos pelos parâmetros de símbolo e período."
#property description "O método de criação do manipulador é definido através do parâmetro "type" (t
#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);
//--- determinar o símbolo do indicador, é desenhado para
name=symbol;
//--- excluir os espaços à direita e à esquerda
StringTrimRight(name);
StringTrimLeft(name);
//--- se resulta em comprimento zero da string do 'name'
if(StringLen(name)==0)
{
//--- tomar o símbolo do gráfico, o indicador está anexado para
name=_Symbol;
}
//--- criar manipulador do indicador
if(type==Call_iADX)
handle=iADX(name,period,adx_period);
else
{
//--- preencher a estrutura com os parâmetros do indicador
MqlParam pars[1];
pars[0].type=TYPE_INT;
pars[0].integer_value=adx_period;
handle=IndicatorCreate(name,period,IND_ADX,1,pars);
}
//--- se o manipulador não é criado
if(handle==INVALID_HANDLE)
{
//--- mensagem sobre a falha e a saída do código de erro
PrintFormat("Falha ao criar o manipulador do indicador iADX para o símbolo %s/%s, código de e
name,
EnumToString(period),
GetLastError());
//--- o indicador é interrompido precocemente
return(INIT_FAILED);
}
//--- mostrar o símbolo/prazo, o indicador de Average Directional Movement Index é calculado para
short_name=StringFormat("iADX(%s/%s period=%d)",name,EnumToString(period),adx_period);
IndicatorSetString(INDICATOR_SHORTNAME,short_name);
//--- inicialização normal do indicador
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
//--- preencher uma parte do array DI_plusBuffer com valores a partir do buffer do indicador que te
if(CopyBuffer(ind_handle,1,0,amount,DIplus_values)<0)
{
//--- Se a cópia falhar, informe o código de erro
PrintFormat("Falha ao copiar dados a partir do indicador iADX, código de erro %d",GetLastErro
//--- parar com resultado zero - significa que indicador é considerado como não calculado
return(false);
}
//--- preencher uma parte do array DI_plusBuffer com valores a partir do buffer do indicador que te
if(CopyBuffer(ind_handle,2,0,amount,DIminus_values)<0)
{
//--- Se a cópia falhar, informe o código de erro
PrintFormat("Falha ao copiar dados a partir do indicador iADX, código de erro %d",GetLastErro
//--- parar com resultado zero - significa que indicador é considerado como não calculado
return(false);
}
//--- está tudo bem
return(true);
}
//+------------------------------------------------------------------+
//| Função de desinicialização do indicador |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(handle!=INVALID_HANDLE)
IndicatorRelease(handle);
//--- limpar o gráfico após excluir o indicador
Comment("");
}
iADXW ilder
A função retorna o manipulador de Average Directional Movement Index por W elles W ilder.
int iADXWilder(
string symbol, // símbolo nome
ENUM_TIMEFRAMES period, // período
int adx_period // período médio
);
Parâmetros
symbol
[in] O nome do símbolo de segurança, os dados que devem ser usados para calcular o indicador. O
valor NULL significa o símbolo atual.
period
[in] O valor do período pode ser um dos valores ENUM _TIMEFR AMES, 0 (zero) significa o prazo
corrente.
adx_period
[in] Período para calcular o índice.
Valor de retorno
R etorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVAL ID_H ANDLE. A memória do computador pode ser liberada a partir de um indicador que não é
mais utilizado, usando a função IndicatorR elease(), onde o manipulador de indicador é transmitido.
Observação
Os números do buffer são os seguintes : 0 - MAIN_L INE, 1 - PL US DI_L INE, 2 - M INUS DI_L INE.
Exemplo:
//+------------------------------------------------------------------+
//| 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 "O indicador demonstra como obter dados"
#property description "dos buffers do indicador para o indicador técnico iADXWilder."
#property description "Um símbolo e o prazo utilizado para o cálculo do indicador,"
#property description "são definidos pelos parâmetros de símbolo e período."
#property description "O método de criação do manipulador é definido através do parâmetro "type" (t
#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);
//--- determinar o símbolo do indicador, é desenhado para
name=symbol;
//--- excluir os espaços à direita e à esquerda
StringTrimRight(name);
StringTrimLeft(name);
//--- se resulta em comprimento zero da string do 'name'
if(StringLen(name)==0)
{
//--- tomar o símbolo do gráfico, o indicador está anexado para
name=_Symbol;
}
//--- criar manipulador do indicador
if(type==Call_iADXWilder)
handle=iADXWilder(name,period,adx_period);
else
{
//--- preencher a estrutura com os parâmetros do indicador
MqlParam pars[1];
pars[0].type=TYPE_INT;
pars[0].integer_value=adx_period;
handle=IndicatorCreate(name,period,IND_ADXW,1,pars);
}
//--- se o manipulador não é criado
if(handle==INVALID_HANDLE)
{
//--- mensagem sobre a falha e a saída do código de erro
PrintFormat("Falha ao criar o manipulador do indicador iADXWilder para o símbolo %s/%s, códig
name,
EnumToString(period),
GetLastError());
//--- o indicador é interrompido precocemente
return(INIT_FAILED);
}
//--- mostrar o símbolo/prazo, o indicador de Average Directional Movement Index por Welles Wilder
short_name=StringFormat("iADXWilder(%s/%s period=%d)",name,EnumToString(period),adx_period);
IndicatorSetString(INDICATOR_SHORTNAME,short_name);
//--- inicialização normal do indicador
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
//--- preencher uma parte do array DI_plusBuffer com valores a partir do buffer do indicador que te
if(CopyBuffer(ind_handle,1,0,amount,DIplus_values)<0)
{
//--- Se a cópia falhar, informe o código de erro
PrintFormat("Failed to copy data from the iADXWilder indicator, error code %d",GetLastError()
//--- parar com resultado zero - significa que indicador é considerado como não calculado
return(false);
}
//--- preencher uma parte do array DI_plusBuffer com valores a partir do buffer do indicador que te
if(CopyBuffer(ind_handle,2,0,amount,DIminus_values)<0)
{
//--- Se a cópia falhar, informe o código de erro
PrintFormat("Failed to copy data from the iADXWilder indicator, error code %d",GetLastError()
//--- parar com resultado zero - significa que indicador é considerado como não calculado
return(false);
}
//--- está tudo bem
return(true);
}
//+------------------------------------------------------------------+
//| Função de desinicialização do indicador |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(handle!=INVALID_HANDLE)
IndicatorRelease(handle);
//--- limpar o gráfico após excluir o indicador
Comment("");
}
iAlligator
A função retorna o manipulador do indicador Alligator.
int iAlligator(
string symbol, // símbolo nome
ENUM_TIMEFRAMES period, // período
int jaw_period, // período para cálculo da mandíbula
int jaw_shift, // deslocamento horizontal da mandíbula
int teeth_period, // período para cálculo dos dentes
int teeth_shift, // deslocamento horizontal dos dentes
int lips_period, // período para o cálculo da boca
int lips_shift, // deslocamento horizontal da boca
ENUM_MA_METHOD ma_method, // tipo de suavização
ENUM_APPLIED_PRICE applied_price // tipo de preço ou manipulador
);
Parâmetros
symbol
[in] O nome do símbolo de segurança, os dados que devem ser usados para calcular o indicador. O
valor NULL significa o símbolo atual.
period
[in] O valor do período pode ser um dos valores ENUM _TIMEFR AMES, 0 (zero) significa o prazo
corrente.
jaw_period
[in] Período médio para a linha azul (mandíbula do Alligator)
jaw_shift
[in] O deslocamento da linha azul em relação à tabela de preços.
teeth_period
[in] Período médio para a linha vermelha (dentes do Alligator).
teeth_shift
[in] O deslocamento da linha vermelha em relação para a tabela de preços.
lips_period
[in] Período médio para a linha verde (boca de Alligator).
lips_shift
[in] O deslocamento da linha verde em relação à tabela de preços.
ma_method
[in] O método da média. Pode ser qualquer um dos valores do ENUM _MA_METH OD.
applied_price
[in] O preço usado. Pode ser qualquer das constantes de preços ENUM _APPL IED_PRICE ou um
manipulador de outro indicador.
Valor de retorno
R etorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVAL ID_H ANDLE. A memória do computador pode ser liberada a partir de um indicador que não é
mais utilizado, usando a função IndicatorR elease(), onde o manipulador de indicador é transmitido.
Observação
Os números do buffer são os seguintes : 0 - GAT ORJAW_L INE, 1 - GAT ORT EETH_L INE, 2 -
GAT OR L IPS _L INE.
Exemplo:
//+------------------------------------------------------------------+
//| 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 "O indicador demonstra como obter dados"
#property description "dos buffers do indicador para o indicador técnico iAlligator."
#property description "Um símbolo e o prazo utilizado para o cálculo do indicador,"
#property description "são definidos pelos parâmetros de símbolo e período."
#property description "O método de criação do manipulador é definido através do parâmetro "type" (t
#property description "Todos os outros parâmetros são similares aos do padrão Alligator."
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_plots 3
//--- plot Jaws
#property indicator_label1 "Jaws"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- plot Teeth
#property indicator_label2 "Teeth"
#property indicator_type2 DRAW_LINE
#property indicator_color2 clrRed
#property indicator_style2 STYLE_SOLID
#property indicator_width2 1
//--- plot 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);
//--- inicialização normal do indicador
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
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[])
{
//--- número de valores copiados a partir do indicador iAlligator
int values_to_copy;
//--- determinar o número de valores calculados no indicador
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat("BarsCalculated() retornando %d, código de erro %d",calculated,GetLastError());
return(0);
}
//--- se for o primeiro arranque do cálculo do indicador, ou se o número de valores que mudou o ind
//--- ou se é necessário cálculo do indicador para duas ou mais barras (isso significa que algo mud
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//--- Se o array JawsBuffer é maior do que o número dos valores do indicador iAlligator para
//--- caso contrário, copiamos menor do que o tamanho dos buffers do indicador
if(calculated>rates_total) values_to_copy=rates_total;
else values_to_copy=calculated;
}
else
{
//--- isso significa que não é a primeira vez do cálculo do indicador, é desde a última chama
//--- para o cálculo não mais do que uma barra é adicionada
values_to_copy=(rates_total-prev_calculated)+1;
}
//--- preencher os arrays com os valores do indicador de Alligator
//--- se FillArraysFromBuffer retorna falso, isto significa que a informação ainda não está pronta,
if(!FillArraysFromBuffers(JawsBuffer,jaw_shift,TeethBuffer,teeth_shift,LipsBuffer,lips_shift,han
//--- formar a mensagem
string comm=StringFormat("%s ==> Valor atualizado no indicador %s: %d",
TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS),
short_name,
values_to_copy);
//--- exibir a mensagem de serviço no gráfico
Comment(comm);
//--- memorizar o número de valores dentro do indicador Alligator
bars_calculated=calculated;
//--- retorna o valor prev_calculated para a próxima chamada
return(rates_total);
}
//+------------------------------------------------------------------+
//| Preencher buffers do indicador a partir do indicador iAlligator |
//+------------------------------------------------------------------+
bool FillArraysFromBuffers(double &jaws_buffer[], // buffer do indicador para a linha da mandíbula
int j_shift, // deslocamento da linha da mandíbula
double &teeth_buffer[], // buffer do indicador para a linha de dentes
int t_shift, // deslocamento da linha dos dentes
double &lips_buffer[], // buffer do indicador para a linha da boca
int l_shift, // deslocamento da linha da boca
int ind_handle, // manipulador do indicator iAlligator
int amount // número de valores copiados
)
{
//--- redefinir o código de erro
ResetLastError();
//--- preencher uma parte do array JawsBuffer com valores a partir do buffer do indicador que tem í
if(CopyBuffer(ind_handle,0,-j_shift,amount,jaws_buffer)<0)
{
//--- Se a cópia falhar, informe o código de erro
PrintFormat("Falha para copiar dados a partir do indicador iAlligator, código de erro %d",Get
//--- parar com resultado zero - significa que indicador é considerado como não calculado
return(false);
}
//--- preencher uma parte do array TeethBuffer com valores a partir do buffer do indicador que tem
if(CopyBuffer(ind_handle,1,-t_shift,amount,teeth_buffer)<0)
{
//--- Se a cópia falhar, informe o código de erro
PrintFormat("Falha para copiar dados a partir do indicador iAlligator, código de erro %d",Get
//--- parar com resultado zero - significa que indicador é considerado como não calculado
return(false);
}
//--- preencher uma parte do array LipsBuffer com valores a partir do buffer do indicador que tem o
if(CopyBuffer(ind_handle,2,-l_shift,amount,lips_buffer)<0)
{
//--- Se a cópia falhar, informe o código de erro
PrintFormat("Falha para copiar dados a partir do indicador iAlligator, código de erro %d",Get
//--- parar com resultado zero - significa que indicador é considerado como não calculado
return(false);
}
//--- está tudo bem
return(true);
}
//+------------------------------------------------------------------+
//| Função de desinicialização do indicador |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(handle!=INVALID_HANDLE)
IndicatorRelease(handle);
//--- limpar o gráfico após excluir o indicador
Comment("");
}
iAMA
A função retorna o manipulador do indicador Adaptive Moving Average. T em apenas um buffer.
int iAMA(
string symbol, // símbolo nome
ENUM_TIMEFRAMES period, // período
int ama_period, // período médio para AMA
int fast_ma_period, // período rápido MA
int slow_ma_period, // período lento MA
int ama_shift, // deslocamento horizontal do indicador
ENUM_APPLIED_PRICE applied_price // tipo do preço ou manipular
);
Parâmetros
symbol
[in] O nome do símbolo de segurança, os dados que devem ser usados para calcular o indicador. O
valor NULL significa o símbolo atual.
period
[in] O valor do período pode ser um dos valores ENUM _TIMEFR AMES, 0 (zero) significa o prazo
corrente.
ama_period
[in] O período de cálculo, em que o coeficiente de eficiência é calculado.
fast_ma_period
[in] Período rápido para o cálculo do coeficiente de suavização de um mercado de rápido.
slow_ma_period
[in] Período lento para o cálculo do coeficiente de suavização na aus ência de tendência.
ama_shift
[in] Deslocamento do indicador relativo ao gráfico de preços.
applied_price
[in] O preço usado. Pode ser qualquer das constantes de preços ENUM _APPL IED_PRICE ou um
manipulador de outro indicador.
Valor de retorno
R etorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVAL ID_H ANDLE. A memória do computador pode ser liberada a partir de um indicador que não é
mais utilizado, usando a função IndicatorR elease(), onde o manipulador de indicador é transmitido.
Exemplo:
//+------------------------------------------------------------------+
//| Demo_iAMA.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| ;https://www.mql5.com |
//+------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1
//--- plotar iAMA
#property indicator_label1 "iAMA"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//+------------------------------------------------------------------+
//| Enumerador dos métodos de criação do manipulador |
//+------------------------------------------------------------------+
enum Creation
{
Call_iAMA, // use iAMA
Call_IndicatorCreate // usar IndicatorCreate
};
//--- parâmetros de entrada
input Creation type=Call_iAMA; // tipo de função
input string symbol=" "; // símbolo
input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // timeframe
input int ama_period=15; // período para cálculo
input int fast_ma_period=2; // período da MA rápida
input int slow_ma_period=30; // período da MA lenta
input int ama_shift=0; // deslocamento horizontal
input ENUM_APPLIED_PRICE applied_price; // tipo de preço
//--- buffer do indicador
double iAMABuffer[];
//--- variável para armazenar o manipulador do indicador iAMA
int handle;
//--- variável para armazenamento
string name=symbol;
//--- nome do indicador num gráfico
string short_name;
//--- manteremos o número de valores no indicador Adaptive Moving Average
int bars_calculated=0;
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado |
//+------------------------------------------------------------------+
int OnInit()
{
//--- mapeamento de buffers do indicador
SetIndexBuffer(0,iAMABuffer,INDICATOR_DATA);
//--- definir deslocamento
PlotIndexSetInteger(0,PLOT_SHIFT,ama_shift);
//--- determinar o símbolo do indicador, é desenhado para
name=symbol;
//--- excluir os espaços à direita e à esquerda
StringTrimRight(name);
StringTrimLeft(name);
//--- se resulta em comprimento zero da string do 'name'
if(StringLen(name)==0)
{
//--- tomar o símbolo do gráfico, o indicador está anexado para
name=_Symbol;
}
//--- criar manipulador do indicador
if(type==Call_iAMA)
handle=iAMA(name,period,ama_period,fast_ma_period,slow_ma_period,ama_shift,applied_price);
else
{
//--- preencher a estrutura com os parâmetros do indicador
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 de preço
pars[4].type=TYPE_INT;
pars[4].integer_value=applied_price;
handle=IndicatorCreate(name,period,IND_AMA,5,pars);
}
//--- se o manipulador não é criado
if(handle==INVALID_HANDLE)
{
//--- mensagem sobre a falha e a saída do código de erro
PrintFormat("Falha ao criar o indicador iAMA para o símbolo %s/%s, código de erro %d",
name,
EnumToString(period),
GetLastError());
//--- o indicador é interrompido precocemente
return(INIT_FAILED);
}
//--- mostrar o símbolo/prazo, o indicador Adaptive Moving Average é calculado para
short_name=StringFormat("iAMA(%s/%s,%d,%d,%d,d)",name,EnumToString(period),ama_period,fast_ma_pe
IndicatorSetString(INDICATOR_SHORTNAME,short_name);
//--- inicialização normal do indicador
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
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[])
{
//--- número de valores copiados a partir do indicador iAMA
int values_to_copy;
//--- determinar o número de valores calculados no indicador
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat("BarsCalculated() retornando %d, código de erro %d",calculated,GetLastError());
return(0);
}
//--- se é o primeiro arranque do cálculo do indicador ou se o número de valores do indicador iAMA
//--- ou se é necessário cálculo do indicador para duas ou mais barras (isso significa que algo mud
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//--- se o array iAMABuffer é maior do que o número de valores do indicador iAMA para símbolo
//--- caso contrário, copiamos menor do que o tamanho dos buffers do indicador
if(calculated>rates_total) values_to_copy=rates_total;
else values_to_copy=calculated;
}
else
{
//--- isso significa que não é a primeira vez do cálculo do indicador, é desde a última chama
//--- para o cálculo não mais do que uma barra é adicionada
values_to_copy=(rates_total-prev_calculated)+1;
}
//--- preencher os arrays com os valores do indicador Adaptive Moving Average
//--- se FillArraysFromBuffer retorna falso, isto significa que a informação ainda não está pronta,
if(!FillArrayFromBuffer(iAMABuffer,ama_shift,handle,values_to_copy)) return(0);
//--- formar a mensagem
string comm=StringFormat("%s ==> Valor atualizado no indicador %s: %d",
TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS),
short_name,
values_to_copy);
//--- exibir a mensagem de serviço no gráfico
Comment(comm);
//--- memorizar o número de valores no indicador Adaptive Moving Average
bars_calculated=calculated;
//--- retorna o valor prev_calculated para a próxima chamada
return(rates_total);
}
//+------------------------------------------------------------------+
//| Preencher o buffer do indicador a partir do indicador iAMA |
//+------------------------------------------------------------------+
bool FillArrayFromBuffer(double &ama_buffer[], // buffer do indicador da linha AMA
int a_shift, // deslocamento da linha AMA
int ind_handle, // manipulador do indicador iAMA
int amount // número de valores copiados
)
{
//--- redefinir o código de erro
ResetLastError();
//--- Preencher a partir do array iAMABuffer com os valores do buffer do indicador que tem índice 0
if(CopyBuffer(ind_handle,0,-a_shift,amount,ama_buffer)<0)
{
//--- Se a cópia falhar, informe o código de erro
PrintFormat("Falha ao copiar dados a partir do indicador iAMA, código de erro %d",GetLastErro
//--- parar com resultado zero - significa que indicador é considerado como não calculado
return(false);
}
//--- está tudo bem
return(true);
}
//+------------------------------------------------------------------+
//| Função de desinicialização do indicador |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(handle!=INVALID_HANDLE)
IndicatorRelease(handle);
//--- limpar o gráfico após excluir o indicador
Comment("");
}
iAO
A função retorna o manipulador do indicador Awesome Oscillator. T em apenas um buffer.
int iAO(
string symbol, // símbolo nome
ENUM_TIMEFRAMES period // período
);
Parâmetros
symbol
[in] O nome do símbolo de segurança, os dados que devem ser usados para calcular o indicador. O
valor NULL significa o símbolo atual.
period
[in] O valor do período pode ser um dos valores ENUM _TIMEFR AMES, 0 (zero) significa o prazo
corrente.
Valor de retorno
R etorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVAL ID_H ANDLE. A memória do computador pode ser liberada a partir de um indicador que não é
mais utilizado, usando a função IndicatorR elease(), onde o manipulador de indicador é transmitido.
Exemplo:
//+------------------------------------------------------------------+
//| 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 "O indicador demonstra como obter dados"
#property description "de buffers do indicador para o indicador técnico iAO."
#property description "Um símbolo e o prazo utilizado para o cálculo do indicador,"
#property description "são definidos pelos parâmetros de símbolo e período."
#property description "O método de criação do manipulador é definido através do parâmetro "type" (t
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots 1
//--- plotar 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
A função retorna o manipulador do indicador Average T rue R ange. T em apenas um buffer.
int iATR(
string symbol, // símbolo nome
ENUM_TIMEFRAMES period, // período
int ma_period // período médio
);
Parâmetros
symbol
[in] O nome do símbolo de segurança, os dados que devem ser usados para calcular o indicador. O
valor NULL significa o símbolo atual.
period
[in] O valor do período pode ser um dos valores ENUM _TIMEFR AMES, 0 (zero) significa o prazo
corrente.
ma_period
[in] O valor do período médio para cálculo do indicador.
Valor de retorno
R etorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVAL ID_H ANDLE. A memória do computador pode ser liberada a partir de um indicador que não é
mais utilizado, usando a função IndicatorR elease(), onde o manipulador de indicador é transmitido.
Exemplo:
//+------------------------------------------------------------------+
//| 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 "O indicador demonstra como obter dados"
#property description "de buffers do indicador para o indicador técnico."
#property description "Um símbolo e o prazo utilizado para o cálculo do indicador,"
#property description "são definidos pelos parâmetros de símbolo e período."
#property description "O método de criação do manipulador é definido através do parâmetro "type" (t
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1
//--- plotar 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 o manipulador não é criado
if(handle==INVALID_HANDLE)
{
//--- mensagem sobre a falha e a saída do código de erro
PrintFormat("Falha ao criar o manipulador do indicador iATR para o símbolo %s/%s, código de e
name,
EnumToString(period),
GetLastError());
//--- o indicador é interrompido precocemente
return(INIT_FAILED);
}
//--- mostra que o símbolo/prazo do indicador True Range é calculado para
short_name=StringFormat("iATR(%s/%s, period=%d)",name,EnumToString(period),atr_period);
IndicatorSetString(INDICATOR_SHORTNAME,short_name);
//--- inicialização normal do indicador
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
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[])
{
//--- número de valores copiados a partir do indicador iATR
int values_to_copy;
//--- determinar o número de valores calculados no indicador
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat("BarsCalculated() retornando %d, código de erro %d",calculated,GetLastError());
return(0);
}
//--- se é o princípio de cálculo do indicador ou se é o número de valores modificados do indicador
//--- ou se é necessário cálculo do indicador para duas ou mais barras (isso significa que algo mud
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//--- se o array iATRBuffer é maior do que o número de valores no indicador iATR para símbolo
//--- caso contrário, copiamos menor do que o tamanho dos buffers do indicador
if(calculated>rates_total) values_to_copy=rates_total;
else values_to_copy=calculated;
}
else
{
//--- isso significa que não é a primeira vez do cálculo do indicador, é desde a última chama
//--- para o cálculo não mais do que uma barra é adicionada
values_to_copy=(rates_total-prev_calculated)+1;
}
//--- preencher o array iATRBuffer com valores do indicador Average True Range
//--- se FillArrayFromBuffer retorna falso, significa que a informação não está pronta ainda, sair
if(!FillArrayFromBuffer(iATRBuffer,handle,values_to_copy)) return(0);
//--- formar a mensagem
string comm=StringFormat("%s ==> Valor atualizado no indicador %s: %d",
TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS),
short_name,
values_to_copy);
//--- exibir a mensagem de serviço no gráfico
Comment(comm);
//--- memorizar o número de valores no indicador Accelerator Oscillator
bars_calculated=calculated;
//--- retorna o valor prev_calculated para a próxima chamada
return(rates_total);
}
//+------------------------------------------------------------------+
//| Preenchendo os buffers do indicator a partir do indicador iATR |
//+------------------------------------------------------------------+
bool FillArrayFromBuffer(double &values[], // buffer do indicador para valores ATR values
int ind_handle, // manipulador do indicador iATR
int amount // número de valores copiados
)
{
//--- redefinir o código de erro
ResetLastError();
//--- preencher parte do array iATRBuffer com valores a partir do buffer do indicador que tem índic
if(CopyBuffer(ind_handle,0,0,amount,values)<0)
{
//--- Se a cópia falhar, informe o código de erro
PrintFormat("Falha ao copiar a partir do indicador iATR , código de erro %d",GetLastError());
//--- parar com resultado zero - significa que indicador é considerado como não calculado
return(false);
}
//--- está tudo bem
return(true);
}
//+------------------------------------------------------------------+
//| Função de desinicialização do indicador |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(handle!=INVALID_HANDLE)
IndicatorRelease(handle);
//--- limpar o gráfico após excluir o indicador
Comment("");
}
iBearsPower
A função retorna o manipulador do indicador Bears Power. T em apenas um buffer.
int iBearsPower(
string symbol, // símbolo nome
ENUM_TIMEFRAMES period, // período
int ma_period, // período médio
);
Parâmetros
symbol
[in] O nome do símbolo de segurança, os dados que devem ser usados para calcular o indicador. O
valor NULL significa o símbolo atual.
period
[in] O valor do período pode ser um dos valores ENUM _TIMEFR AMES, 0 (zero) significa o prazo
corrente.
ma_period
[in] O valor do período médio para cálculo do indicador.
Valor de retorno
R etorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVAL ID_H ANDLE. A memória do computador pode ser liberada a partir de um indicador que não é
mais utilizado, usando a função IndicatorR elease(), onde o manipulador de indicador é transmitido.
Exemplo:
//+------------------------------------------------------------------+
//| 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 "O indicador demonstra como obter dados"
#property description "de buffers do indicador para o indicador técnico iBearsPower."
#property description "Um símbolo e o prazo utilizado para o cálculo do indicador,"
#property description "são definidos pelos parâmetros de símbolo e período."
#property description "O método de criação do manipulador é definido através do parâmetro "type" (t
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1
//--- plotar iBearsPower
#property indicator_label1 "iBearsPower"
#property indicator_type1 DRAW_HISTOGRAM
#property indicator_color1 clrSilver
MqlParam pars[1];
//--- período da média móvel
pars[0].type=TYPE_INT;
pars[0].integer_value=ma_period;
handle=IndicatorCreate(name,period,IND_BEARS,1,pars);
}
//--- se o manipulador não é criado
if(handle==INVALID_HANDLE)
{
//--- mensagem sobre a falha e a saída do código de erro
PrintFormat("Falha ao criar o manipulador do indicador iBearsPower para o símbolo %s/%s, códi
name,
EnumToString(period),
GetLastError());
//--- o indicador é interrompido precocemente
return(INIT_FAILED);
}
//--- mostrar que o símbolo/período do indicador Bears Power é calculado para
short_name=StringFormat("iBearsPower(%s/%s, period=%d)",name,EnumToString(period),ma_period);
IndicatorSetString(INDICATOR_SHORTNAME,short_name);
//--- inicialização normal do indicador
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
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[])
{
//--- número de valores copiados a partir do indicador iBearsPower
int values_to_copy;
//--- determinar o número de valores calculados no indicador
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat("BarsCalculated() retornando %d, código de erro %d",calculated,GetLastError());
return(0);
}
//--- se for o princípio do cálculo do indicador, ou se o número de valores é modificado no indicad
//--- ou se é necessário cálculo do indicador para duas ou mais barras (isso significa que algo mud
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//--- se o array iBearsPowerBuffer é maior do que o número de valores no indicador iBearsPowe
//--- caso contrário, copiamos menor do que o tamanho dos buffers do indicador
if(calculated>rates_total) values_to_copy=rates_total;
else values_to_copy=calculated;
}
else
{
//--- isso significa que não é a primeira vez do cálculo do indicador, é desde a última chama
//--- para o cálculo não mais do que uma barra é adicionada
values_to_copy=(rates_total-prev_calculated)+1;
}
//--- preencher o array iBearsPowerBuffer com os valores do indicador Bears Power
//--- se FillArrayFromBuffer retorna falso, significa que a informação não está pronta ainda, sair
if(!FillArrayFromBuffer(iBearsPowerBuffer,handle,values_to_copy)) return(0);
//--- formar a mensagem
string comm=StringFormat("%s ==> Valor atualizado no indicador %s: %d",
TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS),
short_name,
values_to_copy);
//--- exibir a mensagem de serviço no gráfico
Comment(comm);
//--- memorizar o número de valores no indicador Bears Power
bars_calculated=calculated;
//--- retorna o valor prev_calculated para a próxima chamada
return(rates_total);
}
//+------------------------------------------------------------------+
//| Preencher buffers do indicador a partir do indicador iBearsPower |
//+------------------------------------------------------------------+
bool FillArrayFromBuffer(double &values[], // buffer do indicador para valores do indicador Bears
int ind_handle, // manipulador do indicator iBearsPower
int amount // número de valores copiados
)
{
//--- redefinir o código de erro
ResetLastError();
//--- preencher uma parte do array iBearsPowerBuffer com valores do indicador buffer do indicador q
if(CopyBuffer(ind_handle,0,0,amount,values)<0)
{
//--- Se a cópia falhar, informe o código de erro
PrintFormat("Falha ao copiar dados do indicador iBearsPower, código de erro %d",GetLastError(
//--- parar com resultado zero - significa que indicador é considerado como não calculado
return(false);
}
//--- está tudo bem
return(true);
}
//+------------------------------------------------------------------+
iBands
A função retorna o manipulador do indicador Bollinger Bands ®.
int iBands(
string symbol, // símbolo nome
ENUM_TIMEFRAMES period, // período
int bands_period, // período para o cálculo da média da linha
int bands_shift, // deslocamento horizontal do indicador
double deviation, // número de desvios padrão
ENUM_APPLIED_PRICE applied_price // tipo de preço ou manipulador
);
Parâmetros
symbol
[in] O nome do símbolo de segurança, os dados que devem ser usados para calcular o indicador. O
valor NULL significa o símbolo atual.
period
[in] O valor do período pode ser um dos valores ENUM _TIMEFR AMES, 0 (zero) significa o prazo
corrente.
bands_period
[in] O período médio da linha principal do indicador.
bands_shift
[in] O deslocamento do indicador em relação ao gráfico de preço.
deviation
[in] Desvio a partir da linha principal.
applied_price
[in] O preço usado. Pode ser qualquer das constantes de preços ENUM _APPL IED_PRICE ou um
manipulador de outro indicador.
Valor de retorno
R etorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVAL ID_H ANDLE. A memória do computador pode ser liberada a partir de um indicador que não é
mais utilizado, usando a função IndicatorR elease(), onde o manipulador de indicador é transmitido.
Observação
Os números de buffer são os seguintes : 0 - BASE_L INE, 1 - UPPER_BAND, 2 - LOW ER_BAND
Exemplo:
//+------------------------------------------------------------------+
//| Demo_iBands.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| ;https://www.mql5.com |
//+------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_plots 3
//--- plotar linha superior
#property indicator_label1 "Upper"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrMediumSeaGreen
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- plotar linha inferior
#property indicator_label2 "Lower"
#property indicator_type2 DRAW_LINE
#property indicator_color2 clrMediumSeaGreen
#property indicator_style2 STYLE_SOLID
#property indicator_width2 1
//--- plotar linha média
#property indicator_label3 "Middle"
#property indicator_type3 DRAW_LINE
#property indicator_color3 clrMediumSeaGreen
#property indicator_style3 STYLE_SOLID
#property indicator_width3 1
//+------------------------------------------------------------------+
//| Enumerador dos métodos de criação do manipulador |
//+------------------------------------------------------------------+
enum Creation
{
Call_iBands, // usar iBands
Call_IndicatorCreate // usar IndicatorCreate
};
//--- parâmetros de entrada
input Creation type=Call_iBands; // tipo da função
input int bands_period=20; // período da média móvel
input int bands_shift=0; // deslocamento
input double deviation=2.0; // número de desvios padrão
input ENUM_APPLIED_PRICE applied_price=PRICE_CLOSE; // tipo de preço
input string symbol=" "; // símbolo
input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // timeframe
//--- buffers do indicador
double UpperBuffer[];
double LowerBuffer[];
double MiddleBuffer[];
//--- variável para armazenar o manipulador do indicador iBands
int handle;
//--- variável para armazenamento
string name=symbol;
//--- nome do indicador num gráfico
string short_name;
//--- manteremos o número de valores no indicador Bollinger Bands
int bars_calculated=0;
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado |
//+------------------------------------------------------------------+
int OnInit()
{
//--- atribuição de arrays para buffers do indicador
SetIndexBuffer(0,UpperBuffer,INDICATOR_DATA);
SetIndexBuffer(1,LowerBuffer,INDICATOR_DATA);
SetIndexBuffer(2,MiddleBuffer,INDICATOR_DATA);
//--- definir o deslocamento de cada linha
PlotIndexSetInteger(0,PLOT_SHIFT,bands_shift);
PlotIndexSetInteger(1,PLOT_SHIFT,bands_shift);
PlotIndexSetInteger(2,PLOT_SHIFT,bands_shift);
//--- determinar o símbolo do indicador, é desenhado para
name=symbol;
//--- excluir os espaços à direita e à esquerda
StringTrimRight(name);
StringTrimLeft(name);
//--- se resulta em comprimento zero da string do 'name'
if(StringLen(name)==0)
{
//--- tomar o símbolo do gráfico, o indicador está anexado para
name=_Symbol;
}
//--- criar manipulador do indicador
if(type==Call_iBands)
handle=iBands(name,period,bands_period,bands_shift,deviation,applied_price);
else
{
//--- preencher a estrutura com os parâmetros do indicador
MqlParam pars[4];
//--- período da média móvel
pars[0].type=TYPE_INT;
pars[0].integer_value=bands_period;
//--- deslocamento
pars[1].type=TYPE_INT;
pars[1].integer_value=bands_shift;
//--- número do desvio padrão
pars[2].type=TYPE_DOUBLE;
pars[2].double_value=deviation;
{
//--- se o tamanho buffers do indicador é maior do que o número de valores no indicador iBand
//--- caso contrário, copiamos menor do que o tamanho dos buffers do indicador
if(calculated>rates_total) values_to_copy=rates_total;
else values_to_copy=calculated;
}
else
{
//--- isso significa que não é a primeira vez do cálculo do indicador, é desde a última chama
//--- para o cálculo não mais do que uma barra é adicionada
values_to_copy=(rates_total-prev_calculated)+1;
}
//--- preencher o array com valores do indicador Bollinger Bands
//--- se FillArraysFromBuffer retorna falso, isto significa que a informação ainda não está pronta,
if(!FillArraysFromBuffers(MiddleBuffer,UpperBuffer,LowerBuffer,bands_shift,handle,values_to_copy
//--- formar a mensagem
string comm=StringFormat("%s ==> Valor atualizado no indicador %s: %d",
TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS),
short_name,
values_to_copy);
//--- exibir a mensagem de serviço no gráfico
Comment(comm);
//--- memorizar o número de valores no indicador Bollinger Bands
bars_calculated=calculated;
//--- retorna o valor prev_calculated para a próxima chamada
return(rates_total);
}
//+------------------------------------------------------------------+
//| Preencher buffers do indicador a partir do indicador iBands |
//+------------------------------------------------------------------+
bool FillArraysFromBuffers(double &base_values[], // buffer do indicador da linha média do Boll
double &upper_values[], // buffer do indicador da borda superior
double &lower_values[], // buffer do indicador da borda inferior
int shift, // deslocamento
int ind_handle, // manipulador do indicador iBands
int amount // número dos valores copiados
)
{
//--- redefinir o código de erro
ResetLastError();
//--- preencher uma parte do array MiddleBuffer com valores do buffer do indicador que tem índice 0
if(CopyBuffer(ind_handle,0,-shift,amount,base_values)<0)
{
//--- Se a cópia falhar, informe o código de erro
PrintFormat("Falha ao copiar dados do indicador iBands, código de erro %d",GetLastError());
//--- parar com resultado zero - significa que indicador é considerado como não calculado
return(false);
}
//--- preencher uma parte do array UpperBuffer com valores do buffer do indicador que tem índice 1
if(CopyBuffer(ind_handle,1,-shift,amount,upper_values)<0)
{
//--- Se a cópia falhar, informe o código de erro
PrintFormat("Falha ao copiar dados do indicador iBands, código de erro %d",GetLastError());
//--- parar com resultado zero - significa que indicador é considerado como não calculado
return(false);
}
//--- preencher uma parte do array LowerBuffer com valores do buffer do indicador que tem o índice
if(CopyBuffer(ind_handle,2,-shift,amount,lower_values)<0)
{
//--- Se a cópia falhar, informe o código de erro
PrintFormat("Falha ao copiar dados do indicador iBands, código de erro %d",GetLastError());
//--- parar com resultado zero - significa que indicador é considerado como não calculado
return(false);
}
//--- está tudo bem
return(true);
}
//+------------------------------------------------------------------+
//| Função de desinicialização do indicador |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(handle!=INVALID_HANDLE)
IndicatorRelease(handle);
//--- limpar o gráfico após excluir o indicador
Comment("");
}
iBullsPower
A função retorna o manipulador do indicador Bulls Power. T em apenas um buffer.
int iBullsPower(
string symbol, // símbolo nome
ENUM_TIMEFRAMES period, // período
int ma_period, // período médio
);
Parâmetros
symbol
[in] O nome do símbolo de segurança, os dados que devem ser usados para calcular o indicador. O
valor NULL significa o símbolo atual.
period
[in] O valor do período pode ser um dos valores ENUM _TIMEFR AMES, 0 (zero) significa o prazo
corrente.
ma_period
[in] O período médio para cálculo do indicador.
Valor de retorno
R etorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVAL ID_H ANDLE. A memória do computador pode ser liberada a partir de um indicador que não é
mais utilizado, usando a função IndicatorR elease(), onde o manipulador de indicador é transmitido.
Exemplo:
//+------------------------------------------------------------------+
//| 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 "O indicador demonstra como obter dados"
#property description "de buffers do indicador para o indicador técnico iBullsPower."
#property description "Um símbolo e o prazo utilizado para o cálculo do indicador,"
#property description "são definidos pelos parâmetros de símbolo e período."
#property description "O método de criação do manipulador é definido através do parâmetro "type" (t
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1
//--- plotar iBullsPower
#property indicator_label1 "iBullsPower"
#property indicator_type1 DRAW_HISTOGRAM
#property indicator_color1 clrSilver
MqlParam pars[1];
//--- período da média móvel
pars[0].type=TYPE_INT;
pars[0].integer_value=ma_period;
handle=IndicatorCreate(name,period,IND_BULLS,1,pars);
}
//--- se o manipulador não é criado
if(handle==INVALID_HANDLE)
{
//--- mensagem sobre a falha e a saída do código de erro
PrintFormat("Falha ao criar o manipulador do indicador iBullsPower para o símbolo %s/%s, códi
name,
EnumToString(period),
GetLastError());
//--- o indicador é interrompido precocemente
return(INIT_FAILED);
}
//--- mostrar que o símbolo/período do indicador Bulls Power é calculado para
short_name=StringFormat("iBullsPower(%s/%s, period=%d)",name,EnumToString(period),ma_period);
IndicatorSetString(INDICATOR_SHORTNAME,short_name);
//--- inicialização normal do indicador
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
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[])
{
//--- número de valores copiados a partir do indicador iBullsPower
int values_to_copy;
//--- determinar o número de valores calculados no indicador
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat("BarsCalculated() retornando %d, código de erro %d",calculated,GetLastError());
return(0);
}
//--- se for o princípio do cálculo do indicador, ou se o número de valores é modificado no indicad
//--- ou se é necessário cálculo do indicador para duas ou mais barras (isso significa que algo mud
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//--- se o array iBullsPowerBuffer é maior do que o número de valores no indicador iBullsPowe
//--- caso contrário, copiamos menor do que o tamanho dos buffers do indicador
if(calculated>rates_total) values_to_copy=rates_total;
else values_to_copy=calculated;
}
else
{
//--- isso significa que não é a primeira vez do cálculo do indicador, é desde a última chama
//--- para o cálculo não mais do que uma barra é adicionada
values_to_copy=(rates_total-prev_calculated)+1;
}
//--- preencher o array iBullsPowerBuffer com os valores do indicador Bulls Power
//--- se FillArrayFromBuffer retorna falso, significa que a informação não está pronta ainda, sair
if(!FillArrayFromBuffer(iBullsPowerBuffer,handle,values_to_copy)) return(0);
//--- formar a mensagem
string comm=StringFormat("%s ==> Valor atualizado no indicador %s: %d",
TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS),
short_name,
values_to_copy);
//--- exibir a mensagem de serviço no gráfico
Comment(comm);
//--- memorizar o número de valores no indicador Bulls Power
bars_calculated=calculated;
//--- retorna o valor prev_calculated para a próxima chamada
return(rates_total);
}
//+------------------------------------------------------------------+
//| Preencher buffers do indicador a partir do indicador iBullsPower |
//+------------------------------------------------------------------+
bool FillArrayFromBuffer(double &values[], // buffer do indicador para valores do indicador Bulls
int ind_handle, // manipulador do indicator iBullsPower
int amount // número de valores copiados
)
{
//--- redefinir o código de erro
ResetLastError();
//--- preencher uma parte do array iBullsPowerBuffer com valores do indicador buffer do indicador q
if(CopyBuffer(ind_handle,0,0,amount,values)<0)
{
//--- Se a cópia falhar, informe o código de erro
PrintFormat("Falha ao copiar dados do indicador iBullsPower, código de erro %d",GetLastError(
//--- parar com resultado zero - significa que indicador é considerado como não calculado
return(false);
}
//--- está tudo bem
return(true);
}
//+------------------------------------------------------------------+
iCCI
A função retorna o manipulador do indicador Commodity Channel Index. T em apenas um buffer.
int iCCI(
string symbol, // símbolo nome
ENUM_TIMEFRAMES period, // período
int ma_period, // período médio
ENUM_APPLIED_PRICE applied_price // tipo de preço ou de manipulador
);
Parâmetros
symbol
[in] O nome do símbolo de segurança, os dados que devem ser usados para calcular o indicador. O
valor NULL significa o símbolo atual.
period
[in] O valor do período pode ser um dos valores ENUM _TIMEFR AMES, 0 (zero) significa o prazo
corrente.
ma_period
[in] O período médio para o cálculo de indicadores.
applied_price
[in] O preço usado. Pode ser qualquer das constantes de preços ENUM _APPL IED_PRICE ou um
manipulador de outro indicador.
Valor de retorno
R etorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVAL ID_H ANDLE. A memória do computador pode ser liberada a partir de um indicador que não é
mais utilizado, usando a função IndicatorR elease(), onde o manipulador de indicador é transmitido.
Exemplo:
//+------------------------------------------------------------------+
//| 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 "O indicador demonstra como obter dados"
#property description "de buffers do indicador para o indicador técnico iCCI."
#property description "Um símbolo e o prazo utilizado para o cálculo do indicador,"
#property description "são definidos pelos parâmetros de símbolo e período."
#property description "O método de criação do manipulador é definido através do parâmetro "type" (t
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1
//--- plotar iCCI
#property indicator_label1 "iCCI"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrLightSeaGreen
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- níveis horizontais na janela de indicador
#property indicator_level1 -100.0
#property indicator_level2 100.0
//+------------------------------------------------------------------+
//| Enumerador dos métodos de criação do manipulador |
//+------------------------------------------------------------------+
enum Creation
{
Call_iCCI, // usar iCCI
Call_IndicatorCreate // usar IndicatorCreate
};
//--- parâmetros de entrada
input Creation type=Call_iCCI; // tipo da função
input int ma_period=14; // período da média móvel
input ENUM_APPLIED_PRICE applied_price=PRICE_TYPICAL; // tipo de preço
input string symbol=" "; // símbolo
input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // timeframe
//--- buffer do indicador
double iCCIBuffer[];
//--- variável para armazenar o manipulador do indicator iCCI
int handle;
//--- variável para armazenamento
string name=symbol;
//--- nome do indicador num gráfico
string short_name;
//--- manteremos o número de valores no indicador Commodity Channel Index
int bars_calculated=0;
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado |
//+------------------------------------------------------------------+
int OnInit()
{
//--- atribuição de array para buffer do indicador
SetIndexBuffer(0,iCCIBuffer,INDICATOR_DATA);
//--- determinar o símbolo do indicador, é desenhado para
name=symbol;
//--- excluir os espaços à direita e à esquerda
StringTrimRight(name);
StringTrimLeft(name);
//--- se resulta em comprimento zero da string do 'name'
if(StringLen(name)==0)
{
{
//--- número de valores copiados a partir do indicador iCCI
int values_to_copy;
//--- determinar o número de valores calculados no indicador
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat("BarsCalculated() retornando %d, código de erro %d",calculated,GetLastError());
return(0);
}
//--- se for o princípio do cálculo do indicador, ou se o número de valores é modificado no indicad
//--- ou se é necessário cálculo do indicador para duas ou mais barras (isso significa que algo mud
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//--- se o array iCCIBuffer é maior do que o número de valores no indicador iCCI para o símbo
//--- caso contrário, copiamos menor do que o tamanho dos buffers do indicador
if(calculated>rates_total) values_to_copy=rates_total;
else values_to_copy=calculated;
}
else
{
//--- isso significa que não é a primeira vez do cálculo do indicador, é desde a última chama
//--- para o cálculo não mais do que uma barra é adicionada
values_to_copy=(rates_total-prev_calculated)+1;
}
//--- preencher o array iCCIBuffer com valores do indicador Commodity Channel Index
//--- se FillArrayFromBuffer retorna falso, significa que a informação não está pronta ainda, sair
if(!FillArrayFromBuffer(iCCIBuffer,handle,values_to_copy)) return(0);
//--- formar a mensagem
string comm=StringFormat("%s ==> Valor atualizado no indicador %s: %d",
TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS),
short_name,
values_to_copy);
//--- exibir a mensagem de serviço no gráfico
Comment(comm);
//--- memorizar o número de valores no indicador Commodity Channel Index
bars_calculated=calculated;
//--- retorna o valor prev_calculated para a próxima chamada
return(rates_total);
}
//+------------------------------------------------------------------+
//| Preencher buffers do indicador a partir do indicador iCCI |
//+------------------------------------------------------------------+
bool FillArrayFromBuffer(double &values[], // buffer do indicador de valores do Commodity Channel
int ind_handle, // manipulador do indicador iCCI
int amount // número de valores copiados
)
{
//--- redefinir o código de erro
ResetLastError();
//--- preencher uma parte do array iCCIBuffer com valores do buffer do indicador que tem índice 0 (
if(CopyBuffer(ind_handle,0,0,amount,values)<0)
{
//--- Se a cópia falhar, informe o código de erro
PrintFormat("Falha ao copiar dados do indicador iCCI, código de erro %d",GetLastError());
//--- parar com resultado zero - significa que indicador é considerado como não calculado
return(false);
}
//--- está tudo bem
return(true);
}
//+------------------------------------------------------------------+
//| Função de desinicialização do indicador |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(handle!=INVALID_HANDLE)
IndicatorRelease(handle);
//--- limpar o gráfico após excluir o indicador
Comment("");
}
iChaikin
A função retorna o manipulador do indicador Chaik in Oscillator. T em apenas um buffer.
int iChaikin(
string symbol, // símbolo nome
ENUM_TIMEFRAMES period, // período
int fast_ma_period, // período rápido
int slow_ma_period, // período lento
ENUM_MA_METHOD ma_method, // tipo suavizado
ENUM_APPLIED_VOLUME applied_volume // tipo de volume
);
Parâmetros
symbol
[in] O nome do símbolo de segurança, os dados que devem ser usados para calcular o indicador. O
valor NULL significa o símbolo atual.
period
[in] O valor do período pode ser um dos valores ENUM _TIMEFR AMES, 0 (zero) significa o prazo
corrente.
fast_ma_period
[in] Período médio rápido para cálculos.
slow_ma_period
[in] Período médio lento para cálculos.
ma_method
[in] T ipo suavizado. Pode ser uma das médias constantes de ENUM _MA_METH OD.
applied_volume
[in] O volume usado. Pode ser uma das constantes do ENUM _APPL IED_VOL UME.
Valor de retorno
R etorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVAL ID_H ANDLE. A memória do computador pode ser liberada a partir de um indicador que não é
mais utilizado, usando a função IndicatorR elease(), onde o manipulador de indicador é transmitido.
Exemplo:
//+------------------------------------------------------------------+
//| 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 "O indicador demonstra como obter dados"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1
//--- plotar iChaikin
#property indicator_label1 "iChaikin"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrLightSeaGreen
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//+------------------------------------------------------------------+
//| Enumerador dos métodos de criação do manipulador |
//+------------------------------------------------------------------+
enum Creation
{
Call_iChaikin, // usar iChaikin
Call_IndicatorCreate // usar IndicatorCreate
};
//--- parâmetros de entrada
input Creation type=Call_iChaikin; // tipo da função
input int fast_ma_period=3; // período rápido da média móvel
input int slow_ma_period=10; // período lento da média móvel
input ENUM_MA_METHOD ma_method=MODE_EMA; // tipo de suavização
input ENUM_APPLIED_VOLUME applied_volume=VOLUME_TICK; // tipo de volume
input string symbol=" "; // símbolo
input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // timeframe
//--- buffer do indicador
double iChaikinBuffer[];
//--- variável para armazenar o manipulador do indicator iChaikin
int handle;
//--- variável para armazenamento
string name=symbol;
//--- nome do indicador num gráfico
string short_name;
//--- manteremos o número de valores no indicador Chaikin Oscillator
int bars_calculated=0;
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado |
//+------------------------------------------------------------------+
int OnInit()
{
//--- atribuição de array para buffer do indicador
SetIndexBuffer(0,iChaikinBuffer,INDICATOR_DATA);
//--- determinar o símbolo do indicador, é desenhado para
name=symbol;
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
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[])
{
//--- número de valores copiados a partir do indicador iChaikin
int values_to_copy;
//--- determinar o número de valores calculados no indicador
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat("BarsCalculated() retornando %d, código de erro %d",calculated,GetLastError());
return(0);
}
//--- se for o princípio do cálculo do indicador, ou se o número de valores é modificado no indicad
//--- ou se é necessário cálculo do indicador para duas ou mais barras (isso significa que algo mud
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//--- se o array iCCIBuffer é maior do que o número de valores no indicador iChaikin para o s
//--- caso contrário, copiamos menor do que o tamanho dos buffers do indicador
if(calculated>rates_total) values_to_copy=rates_total;
else values_to_copy=calculated;
}
else
{
//--- isso significa que não é a primeira vez do cálculo do indicador, é desde a última chama
//--- para o cálculo não mais do que uma barra é adicionada
values_to_copy=(rates_total-prev_calculated)+1;
}
//--- preencher o array iChaikinBuffer com valores do indicador Chaikin Oscillator
//--- se FillArrayFromBuffer retorna falso, significa que a informação não está pronta ainda, sair
if(!FillArrayFromBuffer(iChaikinBuffer,handle,values_to_copy)) return(0);
//--- formar a mensagem
string comm=StringFormat("%s ==> Valor atualizado no indicador %s: %d",
TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS),
short_name,
values_to_copy);
//--- exibir a mensagem de serviço no gráfico
Comment(comm);
//--- memorizar o número de valores no indicador Chaikin Oscillator
bars_calculated=calculated;
//--- retorna o valor prev_calculated para a próxima chamada
return(rates_total);
}
//+------------------------------------------------------------------+
//| Preencher buffers do indicador a partir do indicador iChaikin |
//+------------------------------------------------------------------+
bool FillArrayFromBuffer(double &values[], // buffer do indicator para valores do Chaikin Oscillat
int ind_handle, // manipulador do indicador iChaikin
int amount // número de valores copiados
)
{
//--- redefinir o código de erro
ResetLastError();
//--- preencher uma parte do array iChaikinBuffer com valores do buffer do indicador que tem índice
if(CopyBuffer(ind_handle,0,0,amount,values)<0)
{
//--- Se a cópia falhar, informe o código de erro
PrintFormat("Falha ao copiar dados do indicador iChaikin, código de erro %d",GetLastError());
//--- parar com resultado zero - significa que indicador é considerado como não calculado
return(false);
}
//--- está tudo bem
return(true);
}
//+------------------------------------------------------------------+
//| Função de desinicialização do indicador |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(handle!=INVALID_HANDLE)
IndicatorRelease(handle);
//--- limpar o gráfico após excluir o indicador
Comment("");
}
iCustom
A função retorna o manipulador de um indicador personalizado especifico.
int iCustom(
string symbol, // símbolo nome
ENUM_TIMEFRAMES period, // período
string name // folder/nome_do_indicador_personalizado
... // lista de parâmetros de entrada do indicador
);
Parâmetros
symbol
[in] O nome do símbolo de segurança, os dados que devem ser usados para calcular o indicador. O
valor NULL significa o símbolo atual.
period
[in] O valor do período pode ser um dos valores ENUM _TIMEFR AMES, 0 (zero) significa o prazo
corrente.
name
[in] O nome do indicador personalizado, com o caminho relativo ao diretório raiz de indicadores
(MQL5\Indicators \). Se um indicador está localizado em um subdiretório, por exemplo, em
MQL5/Indicadores /Exemplos, o seu nome deve ser especificado como: " Examples\
\nome_do_indicador" (é necess ário utilizar uma barra dupla, em vez de uma única barra como um
separador).
...
[in] entrada-parâmetros de um indicador personalizado, separados por vírgulas. T ipo e ordem dos
parâmetros devem coincidir. Se não há parâmetros específicos, então valores padrões serão
usados.
Valor de retorno
R etorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVAL ID_H ANDLE. A memória do computador pode ser liberada a partir de um indicador que não é
mais utilizado, usando a função IndicatorR elease(), onde o manipulador de indicador é transmitido.
Observação
Um indicador personalizado deve ser compilado (com extensão EX5) e localizado no diretório
MQL5/Indicadores do terminal do cliente ou seu subdiretório.
Indicadores que requerem teste são definidos automaticamente a partir da chamada da função
iCustom(), se o correspondente parâmetro for definido através de um string constante. Para todos
os outros casos (uso da função IndicatorCreate() ou uso de uma string não-constante no parâmetro
de define o nome do indicador) a propriedade #property tester_indicator é requerida:
#property tester_indicator "indicator_name.ex5"
Também Veja
Propriedades de Programa, Séries T emporais e Acesso a Indicadores,IndicatorCreate(),
IndicatorR elease()
Exemplo:
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1
//---- Plotar Etiqueta1
#property indicator_label1 "Etiqueta1"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- parâmetros de entrada
input int MA_Period=21;
input int MA_Shift=0;
input ENUM_MA_METHOD MA_Method=MODE_SMA;
//--- buffers do indicador
double Label1Buffer[];
//--- Manipulador do indicador personalizado Moving Average.mq5
int MA_handle;
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado |
//+------------------------------------------------------------------+
int OnInit()
{
//--- mapeamento de buffers do indicador
SetIndexBuffer(0,Label1Buffer,INDICATOR_DATA);
ResetLastError();
MA_handle=iCustom(NULL,0,"Examples\\Custom Moving Average",
MA_Period,
MA_Shift,
MA_Method,
PRICE_CLOSE // usando o fechamento de preços
);
Print("MA_handle = ",MA_handle," error = ",GetLastError());
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
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[])
{
//--- Copiar os valores do indicador Custom Moving Average para o nosso buffer do indicador
int copy=CopyBuffer(MA_handle,0,0,rates_total,Label1Buffer);
Print("copy = ",copy," rates_total = ",rates_total);
//--- Se a nossa tentativa falhou - Reportar isto
if(copy<=0)
Print("Uma tentativa de obter os valores se houve falha do Custom Moving Average");
//--- valor retorno de prev_calculated para a próxima chamada
return(rates_total);
}
//+------------------------------------------------------------------+
iDEMA
A função retorna o manipulador do indicador Double Exponential Moving Average. T em apenas um
buffer.
int iDEMA(
string symbol, // símbolo nome
ENUM_TIMEFRAMES period, // período
int ma_period, // período médio
int ma_shift, // deslocamento horizontal
ENUM_APPLIED_PRICE applied_price // tipo de preço ou manipulador
);
Parâmetros
symbol
[in] O nome do símbolo de segurança, os dados que devem ser usados para calcular o indicador. O
valor NULL significa o símbolo atual.
period
[in] O valor do período pode ser um dos valores ENUM _TIMEFR AMES, 0 (zero) significa o prazo
corrente.
ma_period
[in] Período médio (barras contadas) para os cálculos.
ma_shift
[in] Deslocamento do indicador relativo ao gráfico de preços.
applied_price
[in] O preço usado. Pode ser qualquer das constantes de preços ENUM _APPL IED_PRICE ou um
manipulador de outro indicador.
Valor de retorno
R etorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVAL ID_H ANDLE. A memória do computador pode ser liberada a partir de um indicador que não é
mais utilizado, usando a função IndicatorR elease(), onde o manipulador de indicador é transmitido.
Exemplo:
//+------------------------------------------------------------------+
//| 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 "O indicador demonstra como obter dados"
#property description "de buffers do indicador para o indicador técnico iDEMA."
#property description "Um símbolo e o prazo utilizado para o cálculo do indicador,"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1
//--- plotar iDEMA
#property indicator_label1 "iDEMA"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//+------------------------------------------------------------------+
//| Enumerador dos métodos de criação do manipulador |
//+------------------------------------------------------------------+
enum Creation
{
Call_iDEMA, // usar iDEMA
Call_IndicatorCreate // usar IndicatorCreate
};
//--- parâmetros de entrada
input Creation type=Call_iDEMA; // tipo de função
input int ma_period=14; // período de média móvel
input int ma_shift=0; // deslocamento
input ENUM_APPLIED_PRICE applied_price=PRICE_CLOSE; // tipo de preço
input string symbol=" "; // símbolo
input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // timeframe
//--- buffer do indicador
double iDEMABuffer[];
//--- variável para armazenar o manipulador do indicator iDEMA
int handle;
//--- variável para armazenamento
string name=symbol;
//--- nome do indicador num gráfico
string short_name;
//--- manteremos o número de valores no indicador Double Exponential Moving Average
int bars_calculated=0;
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado |
//+------------------------------------------------------------------+
int OnInit()
{
//--- atribuição de array para buffer do indicador
SetIndexBuffer(0,iDEMABuffer,INDICATOR_DATA);
//--- definir deslocamento
PlotIndexSetInteger(0,PLOT_SHIFT,ma_shift);
//--- determinar o símbolo do indicador, é desenhado para
name=symbol;
//--- excluir os espaços à direita e à esquerda
StringTrimRight(name);
StringTrimLeft(name);
//--- se resulta em comprimento zero da string do 'name'
if(StringLen(name)==0)
{
//--- tomar o símbolo do gráfico, o indicador está anexado para
name=_Symbol;
}
//--- criar manipulador do indicador
if(type==Call_iDEMA)
handle=iDEMA(name,period,ma_period,ma_shift,applied_price);
else
{
//--- preencher a estrutura com os parâmetros do indicador
MqlParam pars[3];
//--- período de média móvel
pars[0].type=TYPE_INT;
pars[0].integer_value=ma_period;
//--- deslocamento
pars[1].type=TYPE_INT;
pars[1].integer_value=ma_shift;
//--- tipo de preço
pars[2].type=TYPE_INT;
pars[2].integer_value=applied_price;
handle=IndicatorCreate(name,period,IND_DEMA,3,pars);
}
//--- se o manipulador não é criado
if(handle==INVALID_HANDLE)
{
//--- mensagem sobre a falha e a saída do código de erro
PrintFormat("Falha ao criar o manipulador do indicador iDEMA para o símbolo %s/%s, código de
name,
EnumToString(period),
GetLastError());
//--- o indicador é interrompido precocemente
return(INIT_FAILED);
}
//--- mostra que o símbolo/prazo do indicador Double Exponential Moving Average é calculado para
short_name=StringFormat("iDEMA(%s/%s, %d, %d, %s)",name,EnumToString(period),
ma_period,ma_shift,EnumToString(applied_price));
IndicatorSetString(INDICATOR_SHORTNAME,short_name);
//--- inicialização normal do indicador
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
iDeMarker
A função retorna o manipulador do indicador Double DeMark er. T em apenas um buffer.
int iDeMarker(
string symbol, // símbolo nome
ENUM_TIMEFRAMES period, // período
int ma_period // período médio
);
Parâmetros
symbol
[in] O nome do símbolo de segurança, os dados que devem ser usados para calcular o indicador. O
valor NULL significa o símbolo atual.
period
[in] O valor do período pode ser um dos valores ENUM _TIMEFR AMES, 0 (zero) significa o prazo
corrente.
ma_period
[in] Período médio (barras contadas) para os cálculos.
Valor de retorno
R etorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVAL ID_H ANDLE. A memória do computador pode ser liberada a partir de um indicador que não é
mais utilizado, usando a função IndicatorR elease(), onde o manipulador de indicador é transmitido.
Exemplo:
//+------------------------------------------------------------------+
//| 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 "O indicador demonstra como obter dados"
#property description "de buffers do indicador para o indicador técnico iDeMarker."
#property description "Um símbolo e o prazo utilizado para o cálculo do indicador,"
#property description "são definidos pelos parâmetros de símbolo e período."
#property description "O método de criação do manipulador é definido através do parâmetro "type" (t
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1
//--- plotar iDeMarker
#property indicator_label1 "iDeMarker"\
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrLightSeaGreen
else
{
//--- preencher a estrutura com os parâmetros do indicador
MqlParam pars[1];
//--- período de média móvel
pars[0].type=TYPE_INT;
pars[0].integer_value=ma_period;
handle=IndicatorCreate(name,period,IND_DEMARKER,1,pars);
}
//--- se o manipulador não é criado
if(handle==INVALID_HANDLE)
{
//--- mensagem sobre a falha e a saída do código de erro
PrintFormat("Falha ao criar o manipulador do indicador iDeMarker para o símbolo %s/%s, código
name,
EnumToString(period),
GetLastError());
//--- o indicador é interrompido precocemente
return(INIT_FAILED);
}
//--- mostra que o símbolo/prazo do indicador DeMarker é calculado para
short_name=StringFormat("iDeMarker(%s/%s, period=%d)",name,EnumToString(period),ma_period);
IndicatorSetString(INDICATOR_SHORTNAME,short_name);
//--- inicialização normal do indicador
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
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[])
{
//--- número de valores copiados a partir do indicador iDeMarker
int values_to_copy;
//--- determinar o número de valores calculados no indicador
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat("BarsCalculated() retornando %d, código de erro %d",calculated,GetLastError());
return(0);
}
return(true);
}
//+------------------------------------------------------------------+
//| Função de desinicialização do indicador |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(handle!=INVALID_HANDLE)
IndicatorRelease(handle);
//--- limpar o gráfico após excluir o indicador
Comment("");
}
iEnvelopes
A função retorna o manipulador do indicador Envelopes.
int iEnvelopes(
string symbol, // símbolo nome
ENUM_TIMEFRAMES period, // período
int ma_period, // período para o cálculo da linha da média móvel
int ma_shift, // deslocamento horizontal do indicador
ENUM_MA_METHOD ma_method, // tipo de suavização
ENUM_APPLIED_PRICE applied_price, // tipo de preço ou de manipulador
double deviation // desvio dos limites da linha mediana (em percentagens)
);
Parâmetros
symbol
[in] O nome do símbolo de segurança, os dados que devem ser usados para calcular o indicador. O
valor NULL significa o símbolo atual.
period
[in] O valor do período pode ser um dos valores ENUM _TIMEFR AMES, 0 (zero) significa o prazo
corrente.
ma_period
[in] Período da média móvel para a linha principal.
ma_shift
[in] O deslocamento do indicador em relação à gráfico de preço.
ma_method
[in] T ipo suavizado. Pode ser um dos valores ENUM _MA_METH OD.
applied_price
[in] O preço usado. Pode ser qualquer das constantes de preços ENUM _APPL IED_PRICE ou um
manipulador de outro indicador.
deviation
[in] O desvio da linha principal (em porcentagem).
Valor de retorno
R etorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVAL ID_H ANDLE. A memória do computador pode ser liberada a partir de um indicador que não é
mais utilizado, usando a função IndicatorR elease(), onde o manipulador de indicador é transmitido.
Observação
Os números de buffer: 0 - UPPER_L INE, 1 - LOW ER_L INE.
Exemplo:
//+------------------------------------------------------------------+
//| 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 "O indicador demonstra como obter dados"
#property description "de buffers do indicador para o indicador técnico."
#property description "Um símbolo e o prazo utilizado para o cálculo do indicador,"
#property description "são definidos pelos parâmetros de símbolo e período."
#property description "O método de criação do manipulador é definido através do parâmetro "type" (t
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots 2
//--- plotar linha superior
#property indicator_label1 "Upper"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- plotar linha inferior
#property indicator_label2 "Lower"
#property indicator_type2 DRAW_LINE
#property indicator_color2 clrRed
#property indicator_style2 STYLE_SOLID
#property indicator_width2 1
//+------------------------------------------------------------------+
//| Enumerador dos métodos de criação do manipulador |
//+------------------------------------------------------------------+
enum Creation
{
Call_iEnvelopes, // usar iEnvelopes
Call_IndicatorCreate // usar IndicatorCreate
};
//--- parâmetros de entrada
input Creation type=Call_iEnvelopes; // tipo de função
input int ma_period=14; // período de média móvel
input int ma_shift=0; // deslocamento
input ENUM_MA_METHOD ma_method=MODE_SMA; // tipo de suavização
input ENUM_APPLIED_PRICE applied_price=PRICE_CLOSE; // tipo de preço
input double deviation=0.1; // desvio das bordas da média móvel
input string symbol=" "; // símbolo
input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // timeframe
//--- buffer do indicador
double UpperBuffer[];
double LowerBuffer[];
//--- variável para armazenar o manipulador do indicator iEnvelopes
int handle;
//--- variável para armazenamento
string name=symbol;
//--- nome do indicador num gráfico
string short_name;
//--- manteremos o número de valores no indicador Envelopes
int bars_calculated=0;
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado |
//+------------------------------------------------------------------+
int OnInit()
{
//--- atribuição de arrays para buffers do indicador
SetIndexBuffer(0,UpperBuffer,INDICATOR_DATA);
SetIndexBuffer(1,LowerBuffer,INDICATOR_DATA);
//--- definir o deslocamento de cada linha
PlotIndexSetInteger(0,PLOT_SHIFT,ma_shift);
PlotIndexSetInteger(1,PLOT_SHIFT,ma_shift);
//--- determinar o símbolo do indicador, é desenhado para
name=symbol;
//--- excluir os espaços à direita e à esquerda
StringTrimRight(name);
StringTrimLeft(name);
//--- se resulta em comprimento zero da string do 'name'
if(StringLen(name)==0)
{
//--- tomar o símbolo do gráfico, o indicador está anexado para
name=_Symbol;
}
//--- criar manipulador do indicador
if(type==Call_iEnvelopes)
handle=iEnvelopes(name,period,ma_period,ma_shift,ma_method,applied_price,deviation);
else
{
//--- preencher a estrutura com os parâmetros do indicador
MqlParam pars[5];
//--- período de média móvel
pars[0].type=TYPE_INT;
pars[0].integer_value=ma_period;
//--- deslocamento
pars[1].type=TYPE_INT;
pars[1].integer_value=ma_shift;
//--- tipo de suavização
pars[2].type=TYPE_INT;
pars[2].integer_value=ma_method;
//--- tipo de preço
pars[3].type=TYPE_INT;
pars[3].integer_value=applied_price;
//--- tipo de preço
pars[4].type=TYPE_DOUBLE;
pars[4].double_value=deviation;
handle=IndicatorCreate(name,period,IND_ENVELOPES,5,pars);
}
//--- se o manipulador não é criado
if(handle==INVALID_HANDLE)
{
//--- mensagem sobre a falha e a saída do código de erro
PrintFormat("Falha ao criar o manipulador do indicador iEnvelopes para o símbolo %s/%s, códig
name,
EnumToString(period),
GetLastError());
//--- o indicador é interrompido precocemente
return(INIT_FAILED);
}
//--- mostra que o símbolo/prazo do indicador Envelopes é calculado para
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);
//--- inicialização normal do indicador
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
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[])
{
//--- número de valores copiados a partir do indicador iEnvelopes
int values_to_copy;
//--- determinar o número de valores calculados no indicador
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat("BarsCalculated() retornando %d, código de erro %d",calculated,GetLastError());
return(0);
}
//--- se for o princípio do cálculo do indicador, ou se o número de valores é modificado no indicad
//--- ou se é necessário cálculo do indicador para duas ou mais barras (isso significa que algo mud
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//--- se o array UpperBuffer é maior do que o número de valores no indicador iEnvelopes para
//--- caso contrário, copiamos menor do que o tamanho dos buffers do indicador
if(calculated>rates_total) values_to_copy=rates_total;
else values_to_copy=calculated;
}
else
{
//--- isso significa que não é a primeira vez do cálculo do indicador, é desde a última chama
//--- para o cálculo não mais do que uma barra é adicionada
values_to_copy=(rates_total-prev_calculated)+1;
}
//--- preencher os arrays UpperBuffer e LowerBuffer com valores do indicador Envelopes
//--- se FillArrayFromBuffer retorna falso, significa que a informação não está pronta ainda, sair
if(!FillArraysFromBuffers(UpperBuffer,LowerBuffer,ma_shift,handle,values_to_copy)) return(0);
//--- formar a mensagem
string comm=StringFormat("%s ==> Valor atualizado no indicador %s: %d",
TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS),
short_name,
values_to_copy);
//--- exibir a mensagem de serviço no gráfico
Comment(comm);
//--- memorizar o número de valores no indicador Envelopes
bars_calculated=calculated;
//--- retorna o valor prev_calculated para a próxima chamada
return(rates_total);
}
//+------------------------------------------------------------------+
//| Preencher buffers do indicador a partir do indicador iEnvelopes |
//+------------------------------------------------------------------+
bool FillArraysFromBuffers(double &upper_values[], // buffer do indicator linha da borda superio
double &lower_values[], // indicador da linha da borda inferior
int shift, // deslocamento
int ind_handle, // manipulador do indicador iEnvelopes
int amount // número dos valores copiados
)
{
//--- redefinir o código de erro
ResetLastError();
//--- preencher uma parte do array UpperBuffer com valores do buffer do indicador que tem índice 0
if(CopyBuffer(ind_handle,0,-shift,amount,upper_values)<0)
{
//--- Se a cópia falhar, informe o código de erro
PrintFormat("Falha ao copiar dados do indicador iEnvelopes, código de erro %d",GetLastError()
//--- parar com resultado zero - significa que indicador é considerado como não calculado
return(false);
}
//--- preencher uma parte do array LowerBuffer com valores do buffer do indicador que tem índice 1
if(CopyBuffer(ind_handle,1,-shift,amount,lower_values)<0)
{
iForce
A função retorna o manipulador do indicador Force Index. T em apenas um buffer.
int iForce(
string symbol, // símbolo nome
ENUM_TIMEFRAMES period, // período
int ma_period, // período médio
ENUM_MA_METHOD ma_method, // tipo suavizado
ENUM_APPLIED_VOLUME applied_volume // tipo de volume para cálculo
);
Parâmetros
symbol
[in] O nome do símbolo de segurança, os dados que devem ser usados para calcular o indicador. O
valor NULL significa o símbolo atual.
period
[in] O valor do período pode ser um dos valores ENUM _TIMEFR AMES, 0 (zero) significa o prazo
corrente.
ma_period
[in] Período médio para cálculo do indicador.
ma_method
[in] T ipo suavizado. Pode ser um dos valores ENUM _MA_METH OD.
applied_volume
[in] O volume usado. Pode ser um dos valores ENUM _APPL IED_VOL UME.
Valor de retorno
R etorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVAL ID_H ANDLE. A memória do computador pode ser liberada a partir de um indicador que não é
mais utilizado, usando a função IndicatorR elease(), onde o manipulador de indicador é transmitido.
Exemplo:
//+------------------------------------------------------------------+
//| 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 "O indicador demonstra como obter dados"
#property description "de buffers do indicador para o indicador técnico iForce."
#property description "Um símbolo e o prazo utilizado para o cálculo do indicador,"
#property description "são definidos pelos parâmetros de símbolo e período."
#property description "O método de criação do manipulador é definido através do parâmetro "type" (t
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1
//--- desenhando iForce
#property indicator_label1 "iForce"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrLightSeaGreen
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//+------------------------------------------------------------------+
//| Enumerador dos métodos de criação do manipulador |
//+------------------------------------------------------------------+
enum Creation
{
Call_iForce, // usar iForce
Call_IndicatorCreate // usar IndicatorCreate
};
//--- parâmetros de entrada
input Creation type=Call_iForce; // tipo de função
input int ma_period=13; // período médio
input ENUM_MA_METHOD ma_method=MODE_SMA; // tipo de suavização
input ENUM_APPLIED_VOLUME applied_volume=VOLUME_TICK; // tipo de volume
input string symbol=" "; // símbolo
input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // timeframe
//--- buffer do indicador
double iForceBuffer[];
//--- variável para armazenar o manipulador do indicator iForce
int handle;
//--- variável para armazenamento
string name=symbol;
//--- nome do indicador num gráfico
string short_name;
//--- manteremos o número de valores no indicador Force
int bars_calculated=0;
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado |
//+------------------------------------------------------------------+
int OnInit()
{
//--- atribuição de array para buffer do indicador
SetIndexBuffer(0,iForceBuffer,INDICATOR_DATA);
//--- determinar o símbolo do indicador, é desenhado para
name=symbol;
//--- excluir os espaços à direita e à esquerda
StringTrimRight(name);
StringTrimLeft(name);
//--- se resulta em comprimento zero da string do 'name'
if(StringLen(name)==0)
{
//--- tomar o símbolo do gráfico, o indicador está anexado para
name=_Symbol;
}
//--- criar manipulador do indicador
if(type==Call_iForce)
handle=iForce(name,period,ma_period,ma_method,applied_volume);
else
{
//--- preencher a estrutura com os parâmetros do indicador
MqlParam pars[3];
//--- período de média móvel
pars[0].type=TYPE_INT;
pars[0].integer_value=ma_period;
//--- tipo de suavização
pars[1].type=TYPE_INT;
pars[1].integer_value=ma_method;
//--- tipo de volume
pars[2].type=TYPE_INT;
pars[2].integer_value=applied_volume;
//--- tipo de preço
handle=IndicatorCreate(name,period,IND_FORCE,3,pars);
}
//--- se o manipulador não é criado
if(handle==INVALID_HANDLE)
{
//--- mensagem sobre a falha e a saída do código de erro
PrintFormat("Falha ao criar o manipulador do indicador iForce para o símbolo %s/%s, código de
name,
EnumToString(period),
GetLastError());
//--- o indicador é interrompido precocemente
return(INIT_FAILED);
}
//--- mostra que o símbolo/prazo do indicador Force é calculado para
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);
//--- inicialização normal do indicador
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
iFractals
A função retorna o manipulador do indicador Fractals.
int iFractals(
string symbol, // símbolo nome
ENUM_TIMEFRAMES period // período
);
Parâmetros
symbol
[in] O nome do símbolo de segurança, os dados que devem ser usados para calcular o indicador. O
valor NULL significa o símbolo atual.
period
[in] O valor do período pode ser um dos valores ENUM _TIMEFR AMES, 0 (zero) significa o prazo
corrente.
Valor de retorno
R etorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVAL ID_H ANDLE. A memória do computador pode ser liberada a partir de um indicador que não é
mais utilizado, usando a função IndicatorR elease(), onde o manipulador de indicador é transmitido.
Observação
Os números de buffer são os seguintes : 0 - UPPER_L INE, 1 - LOW ER_L INE.
Exemplo:
//+------------------------------------------------------------------+
//| 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 "O indicador demonstra como obter dados"
#property description "de buffers do indicador para o indicador técnico iFractals."
#property description "Um símbolo e o prazo utilizado para o cálculo do indicador,"
#property description "são definidos pelos parâmetros de símbolo e período."
#property description "O método de criação do manipulador é definido através do parâmetro "type" (t
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots 2
//--- plotar FractalUp
//--- ou se é necessário cálculo do indicador para duas ou mais barras (isso significa que algo mud
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//--- se o array FractalUpBuffer é maior do que o número de valores no indicador iFractals pa
//--- caso contrário, copiamos menor do que o tamanho dos buffers do indicador
if(calculated>rates_total) values_to_copy=rates_total;
else values_to_copy=calculated;
}
else
{
//--- isso significa que não é a primeira vez do cálculo do indicador, é desde a última chama
//--- para o cálculo não mais do que uma barra é adicionada
values_to_copy=(rates_total-prev_calculated)+1;
}
//--- preencher os arrays FractalUpBuffer e FractalDownBuffer com valores do indicador Fractals
//--- se FillArrayFromBuffer retorna falso, significa que a informação não está pronta ainda, sair
if(!FillArraysFromBuffers(FractalUpBuffer,FractalDownBuffer,handle,values_to_copy)) return(0);
//--- formar a mensagem
string comm=StringFormat("%s ==> Valor atualizado no indicador %s: %d",
TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS),
short_name,
values_to_copy);
//--- exibir a mensagem de serviço no gráfico
Comment(comm);
//--- memorizar o número de valores no indicador Fractals
bars_calculated=calculated;
//--- retorna o valor prev_calculated para a próxima chamada
return(rates_total);
}
//+------------------------------------------------------------------+
//| Preencher buffers do indicador a partir do indicador iFractals |
//+------------------------------------------------------------------+
bool FillArraysFromBuffers(double &up_arrows[], // buffer do indicator para setas acima
double &down_arrows[], // buffer do indicator para setas abaixo
int ind_handle, // manipulador do indicador iFractals
int amount // número de valores copiados
)
{
//--- redefinir o código de erro
ResetLastError();
//--- preencher uma parte do array FractalUpBuffer com valores do buffer do indicador que tem índic
if(CopyBuffer(ind_handle,0,0,amount,up_arrows)<0)
{
//--- Se a cópia falhar, informe o código de erro
PrintFormat("Falha ao copiar dados do indicador iFractals ao array FractalUpBuffer array, cód
GetLastError());
//--- parar com resultado zero - significa que indicador é considerado como não calculado
return(false);
}
//--- preencher uma parte do array FractalDownBuffer com valores do buffer do indicador que tem índ
if(CopyBuffer(ind_handle,1,0,amount,down_arrows)<0)
{
//--- Se a cópia falhar, informe o código de erro
PrintFormat("Falha ao copiar dados do indicador iFractals ao array FractalDownBuffer array, c
GetLastError());
//--- parar com resultado zero - significa que indicador é considerado como não calculado
return(false);
}
//--- está tudo bem
return(true);
}
//+------------------------------------------------------------------+
//| Função de desinicialização do indicador |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(handle!=INVALID_HANDLE)
IndicatorRelease(handle);
//--- limpar o gráfico após excluir o indicador
Comment("");
}
iFrAMA
A função retorna o manipulador do indicador Fractal Adaptive Moving Average. T em apenas um buffer.
int iFrAMA(
string symbol, // símbolo nome
ENUM_TIMEFRAMES period, // período
int ma_period, // período médio
int ma_shift, // deslocamento horizontal no gráfico
ENUM_APPLIED_PRICE applied_price // tipo de preço ou manipulador
);
Parâmetros
symbol
[in] O nome do símbolo de segurança, os dados que devem ser usados para calcular o indicador. O
valor NULL significa o símbolo atual.
period
[in] O valor do período pode ser um dos valores ENUM _TIMEFR AMES, 0 (zero) significa o prazo
corrente.
ma_period
[in] Período (contando as barras) para os cálculos do indicador.
ma_shift
[in] Deslocamento do indicador no gráfico de preço.
applied_price
[in] O preço usado. Pode ser qualquer das constantes de preços ENUM _APPL IED_PRICE ou um
manipulador de outro indicador.
Valor de retorno
R etorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVAL ID_H ANDLE. A memória do computador pode ser liberada a partir de um indicador que não é
mais utilizado, usando a função IndicatorR elease(), onde o manipulador de indicador é transmitido.
Exemplo:
//+------------------------------------------------------------------+
//| 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 "O indicador demonstra como obter dados"
#property description "de buffers do indicador para o indicador técnico iFrAMA."
#property description "Um símbolo e o prazo utilizado para o cálculo do indicador,"
#property description "são definidos pelos parâmetros de símbolo e período."
#property description "O método de criação do manipulador é definido através do parâmetro "type" (t
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1
//--- desenhando iFrAMA
#property indicator_label1 "iFrAMA"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//+------------------------------------------------------------------+
//| Enumerador dos métodos de criação do manipulador |
//+------------------------------------------------------------------+
enum Creation
{
Call_iFrAMA, // usar iFrAMA
Call_IndicatorCreate // usar IndicatorCreate
};
//--- parâmetros de entrada
input Creation type=Call_iFrAMA; // tipo de função
input int ma_period=14; // período da média móvel
input int ma_shift=0; // deslocamento
input ENUM_APPLIED_PRICE applied_price=PRICE_CLOSE; // tipo de preço
input string symbol=" "; // símbolo
input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // timeframe
//--- buffer do indicador
double iFrAMABuffer[];
//--- variável para armazenar o manipulador do indicator iFrAMA
int handle;
//--- variável para armazenamento
string name=symbol;
//--- nome do indicador num gráfico
string short_name;
//--- manteremos o número de valores no indicador Fractal Adaptive Moving Average
int bars_calculated=0;
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado |
//+------------------------------------------------------------------+
int OnInit()
{
//--- atribuição de array para buffer do indicador
SetIndexBuffer(0,iFrAMABuffer,INDICATOR_DATA);
//--- definir deslocamento
PlotIndexSetInteger(0,PLOT_SHIFT,ma_shift);
//--- determinar o símbolo do indicador, é desenhado para
name=symbol;
//--- excluir os espaços à direita e à esquerda
StringTrimRight(name);
StringTrimLeft(name);
//--- se resulta em comprimento zero da string do 'name'
if(StringLen(name)==0)
{
//--- tomar o símbolo do gráfico, o indicador está anexado para
name=_Symbol;
}
//--- criar manipulador do indicador
if(type==Call_iFrAMA)
handle=iFrAMA(name,period,ma_period,ma_shift,applied_price);
else
{
//--- preencher a estrutura com os parâmetros do indicador
MqlParam pars[3];
//--- período de média móvel
pars[0].type=TYPE_INT;
pars[0].integer_value=ma_period;
//--- deslocamento
pars[1].type=TYPE_INT;
pars[1].integer_value=ma_shift;
//--- tipo de preço
pars[2].type=TYPE_INT;
pars[2].integer_value=applied_price;
//--- tipo de preço
handle=IndicatorCreate(name,period,IND_FRAMA,3,pars);
}
//--- se o manipulador não é criado
if(handle==INVALID_HANDLE)
{
//--- mensagem sobre a falha e a saída do código de erro
PrintFormat("Falha ao criar o manipulador do indicador iFrAMA para o símbolo %s/%s, código de
name,
EnumToString(period),
GetLastError());
//--- o indicador é interrompido precocemente
return(INIT_FAILED);
}
//--- mostra que o símbolo/prazo do indicador iFrAMA é calculado para
short_name=StringFormat("iFrAMA(%s/%s, %d, %d, %s)",name,EnumToString(period),
ma_period,ma_shift,EnumToString(applied_price));
IndicatorSetString(INDICATOR_SHORTNAME,short_name);
//--- inicialização normal do indicador
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
iGator
A função retorna o manipulador do indicador Gator. O oscilador mostra a diferença entre as linhas azul
e vermelha do Jacaré (histograma superior) e diferença entre as linhas vermelha e verde (menor
histograma).
int iGator(
string symbol, // símbolo nome
ENUM_TIMEFRAMES period, // período
int jaw_period, // período para cálculo da mandíbula
int jaw_shift, // deslocamento horizontal da mandíbula
int teeth_period, // período para cálculo dos dentes
int teeth_shift, // deslocamento horizontal dos dentes
int lips_period, // período para o cálculo da boca
int lips_shift, // deslocamento horizontal da boca
ENUM_MA_METHOD ma_method, // tipo de suavização
ENUM_APPLIED_PRICE applied_price // tipo de preço ou manipulador
);
Parâmetros
symbol
[in] O nome do símbolo de segurança, os dados que devem ser usados para calcular o indicador. O
valor NULL significa o símbolo atual.
period
[in] O valor do período pode ser um dos valores ENUM _TIMEFR AMES, 0 (zero) significa o prazo
corrente.
jaw_period
[in] Período médio para a linha azul (mandíbula do Alligator).
jaw_shift
[in] O deslocamento da linha azul em relação à tabela de preços. Não está diretamente ligado ao
deslocamento visual do histograma do indicador.
teeth_period
[in] Período médio para a linha vermelha (dentes do Alligator).
teeth_shift
[in] O deslocamento da linha vermelha em relação para a tabela de preços. Não está diretamente
ligado ao deslocamento visual do histograma do indicador.
lips_period
[in] Período médio para a linha verde (boca de Alligator).
lips_shift
[in] O deslocamento da linha verde em relação à tabela de preços. Não está diretamente ligado ao
deslocamento visual do histograma do indicador.
ma_method
[in] T ipo suavizado. Pode ser um dos valores ENUM _MA_METH OD.
applied_price
[in] O preço usado. Pode ser qualquer das constantes de preços ENUM _APPL IED_PRICE ou um
manipulador de outro indicador.
Valor de retorno
R etorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVAL ID_H ANDLE. A memória do computador pode ser liberada a partir de um indicador que não é
mais utilizado, usando a função IndicatorR elease(), onde o manipulador de indicador é transmitido.
Observação
Números de buffer: 0 - UPPER_HIS T OGR AM, 1 - buffer de cor do histograma superior, 2 -
LOW ER_HIS T OGR AM, 3 - buffer de cor do histograma inferior.
Exemplo:
//+------------------------------------------------------------------+
//| 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 "O indicador demonstra como obter dados"
#property description "dos buffers do indicador para o indicador técnico iGator."
#property description "Um símbolo e o prazo utilizado para o cálculo do indicador,"
#property description "são definidos pelos parâmetros de símbolo e período."
#property description "O método de criação do manipulador é definido através do parâmetro "type" (t
#property description "Todos os outros parâmetros são similares aos do padrão Gator Oscillator."
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_plots 2
//--- desenhando 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
//--- desenhando 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
//+------------------------------------------------------------------+
//| Enumerador dos métodos de criação do manipulador |
//+------------------------------------------------------------------+
enum Creation
{
Call_iGator, // usar iGator
Call_IndicatorCreate // usar IndicatorCreate
};
//--- parâmetros de entrada
input Creation type=Call_iGator; // tipo de função
input string symbol=" "; // símbolo
input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // timeframe
input int jaw_period=13; // período da linha da mandíbula
input int jaw_shift=8; // deslocamento da linha da mandíbula
input int teeth_period=8; // período da linha dos dentes
input int teeth_shift=5; // deslocamento da linha dos dentes
input int lips_period=5; // período da linha da boca
input int lips_shift=3; // deslocamento da linha da boca
input ENUM_MA_METHOD MA_method=MODE_SMMA; // método das linhas médias do Alligator
input ENUM_APPLIED_PRICE applied_price=PRICE_MEDIAN;// tipo de preço utilizado para o cálculo do
//--- buffers do indicador
double GatorUpBuffer[];
double GatorUpColors[];
double GatorDownBuffer[];
double GatorDownColors[];
//--- variável para armazenar o manipulador do indicator iGator
int handle;
//--- variável para armazenamento
string name=symbol;
//--- nome do indicador num gráfico
string short_name;
//--- deslocamento dos valores para os histogramas superior e inferior
int shift;
//--- manteremos o número de valores no indicador Gator Oscillator
int bars_calculated=0;
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado |
//+------------------------------------------------------------------+
int OnInit()
{
//--- atribuição de arrays para buffers do indicador
SetIndexBuffer(0,GatorUpBuffer,INDICATOR_DATA);
SetIndexBuffer(1,GatorUpColors,INDICATOR_COLOR_INDEX);
SetIndexBuffer(2,GatorDownBuffer,INDICATOR_DATA);
SetIndexBuffer(3,GatorDownColors,INDICATOR_COLOR_INDEX);
/*
Todas as mudanças nos parâmetros especificados referem-se o indicador Alligator, que é a base par
Isso é porque eles não se movem como o indicador Gator em si, mas eles se movem conforme as linha
Cujo os valores são utilizados para calcular o Gator Oscillator!
*/
//--- vamos calcular o deslocamento para os histogramas superior e inferior, que é igual à diferenç
shift=MathMin(jaw_shift,teeth_shift);
PlotIndexSetInteger(0,PLOT_SHIFT,shift);
//--- apesar do indicador conter dois histogramas, o mesmo deslocamento é usado - esta é a execução
PlotIndexSetInteger(1,PLOT_SHIFT,shift);
name,
EnumToString(period),
GetLastError());
//--- o indicador é interrompido precocemente
return(INIT_FAILED);
}
//--- mostra que o símbolo/prazo do indicador Gator Oscillator é calculado para
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);
//--- inicialização normal do indicador
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
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[])
{
//--- número de valores copiados a partir do indicador iGator
int values_to_copy;
//--- determinar o número de valores calculados no indicador
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat("BarsCalculated() retornando %d, código de erro %d",calculated,GetLastError());
return(0);
}
//--- se for o princípio do cálculo do indicador, ou se o número de valores é modificado no indicad
//--- ou se é necessário cálculo do indicador para duas ou mais barras (isso significa que algo mud
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//--- se o array GatorUpBuffer é maior do que o número de valores no indicador iGator para o
//--- caso contrário, copiamos menor do que o tamanho dos buffers do indicador
if(calculated>rates_total) values_to_copy=rates_total;
else values_to_copy=calculated;
}
else
{
//--- isso significa que não é a primeira vez do cálculo do indicador, é desde a última chama
//--- para o cálculo não mais do que uma barra é adicionada
values_to_copy=(rates_total-prev_calculated)+1;
}
//--- preencher os arrays com valores do indicador Gator Oscillator
//--- se FillArraysFromBuffer retorna falso, isto significa que a informação ainda não está pronta,
if(!FillArraysFromBuffers(GatorUpBuffer,GatorUpColors,GatorDownBuffer,GatorDownColors,
shift,handle,values_to_copy)) return(0);
//--- formar a mensagem
string comm=StringFormat("%s ==> Valor atualizado no indicador %s: %d",
TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS),
short_name,
values_to_copy);
//--- exibir a mensagem de serviço no gráfico
Comment(comm);
//--- memorizar o número de valores no indicador Gator Oscillator
bars_calculated=calculated;
//--- retorna o valor prev_calculated para a próxima chamada
return(rates_total);
}
//+------------------------------------------------------------------+
//| Preencher buffers do indicador a partir do indicador iGator |
//+------------------------------------------------------------------+
bool FillArraysFromBuffers(double &ups_buffer[], // buffer do indicator para o histograma s
double &up_color_buffer[], // buffer do indicator para o índice de pr
double &downs_buffer[], // buffer do indicator para o histograma i
double &downs_color_buffer[], // buffer do indicator para o índice de pr
int u_shift, // deslocamento para o histograma superior
int ind_handle, // manipulador do indicador iGator
int amount // número de valores copiados
)
{
//--- redefinir o código de erro
ResetLastError();
//--- preencher uma parte do array GatorUpBuffer com valores do buffer do indicador que tem índice
if(CopyBuffer(ind_handle,0,-u_shift,amount,ups_buffer)<0)
{
//--- Se a cópia falhar, informe o código de erro
PrintFormat("Falha ao copiar dados do indicador iGator, código de erro %d",GetLastError());
//--- parar com resultado zero - significa que indicador é considerado como não calculado
return(false);
}
//--- preencher uma parte do array GatorUpColors com valores do buffer do indicador que tem índice
if(CopyBuffer(ind_handle,1,-u_shift,amount,up_color_buffer)<0)
{
//--- Se a cópia falhar, informe o código de erro
PrintFormat("Falha ao copiar dados do indicador iGator, código de erro %d",GetLastError());
//--- parar com resultado zero - significa que indicador é considerado como não calculado
return(false);
}
//--- preencher uma parte do array GatorDownBuffer com valores do buffer do indicador que tem índic
if(CopyBuffer(ind_handle,2,-u_shift,amount,downs_buffer)<0)
{
//--- Se a cópia falhar, informe o código de erro
PrintFormat("Falha ao copiar dados do indicador iGator, código de erro %d",GetLastError());
//--- parar com resultado zero - significa que indicador é considerado como não calculado
return(false);
}
//--- preencher uma parte do array GatorDownColors com valores do buffer do indicador que tem índic
if(CopyBuffer(ind_handle,3,-u_shift,amount,downs_color_buffer)<0)
{
//--- Se a cópia falhar, informe o código de erro
PrintFormat("Falha ao copiar dados do indicador iGator, código de erro %d",GetLastError());
//--- parar com resultado zero - significa que indicador é considerado como não calculado
return(false);
}
//--- está tudo bem
return(true);
}
//+------------------------------------------------------------------+
//| Função de desinicialização do indicador |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(handle!=INVALID_HANDLE)
IndicatorRelease(handle);
//--- limpar o gráfico após excluir o indicador
Comment("");
}
iIchimoku
A função retorna o manipulador do indicador Ichimok u Kink o Hyo.
int iIchimoku(
string symbol, // símbolo nome
ENUM_TIMEFRAMES period, // período
int tenkan_sen, // período Tenkan-sen
int kijun_sen, // período Kijun-sen
int senkou_span_b // período Senkou Span B
);
Parâmetros
symbol
[in] O nome do símbolo de segurança, os dados que devem ser usados para calcular o indicador. O
valor NULL significa o símbolo atual.
period
[in] O valor do período pode ser um dos valores ENUM _TIMEFR AMES, 0 (zero) significa o prazo
corrente.
tenkan_sen
[in] Período médio para T enk an Sen.
kijun_sen
[in] Período médio para Kijun Sen.
senkou_span_b
[in] Período médio para Senk ou Span B.
Valor de retorno
R etorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVAL ID_H ANDLE. A memória do computador pode ser liberada a partir de um indicador que não é
mais utilizado, usando a função IndicatorR elease(), onde o manipulador de indicador é transmitido.
Observação
Os números de buffer: 0 - T ENKANSEN_L INE, 1 - KIJUNSEN_L INE, 2 - SENKOUSPANA_L INE, 3 -
SENKOUSPANB_L INE, 4 - CHIKOUSPAN_L INE.
Exemplo:
//+------------------------------------------------------------------+
//| 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 "O indicador demonstra como obter dados"
#property indicator_chart_window
#property indicator_buffers 5
#property indicator_plots 4
//--- plotar 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
//--- plotar 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
//--- plotar Senkou_Span
#property indicator_label3 "Senkou Span A;Senkou Span B" // two fields will be shown in Data Windo
#property indicator_type3 DRAW_FILLING
#property indicator_color3 clrSandyBrown, clrThistle
#property indicator_style3 STYLE_SOLID
#property indicator_width3 1
//--- plotar Chikou_Span
#property indicator_label4 "Chikou_Span"
#property indicator_type4 DRAW_LINE
#property indicator_color4 clrLime
#property indicator_style4 STYLE_SOLID
#property indicator_width4 1
//+------------------------------------------------------------------+
//| Enumerador dos métodos de criação do manipulador |
//+------------------------------------------------------------------+
enum Creation
{
Call_iIchimoku, // usar iIchimoku
Call_IndicatorCreate // usar IndicatorCreate
};
//--- parâmetros de entrada
input Creation type=Call_iIchimoku; // tipo de função
input int tenkan_sen=9; // período Tenkan-sen
input int kijun_sen=26; // período Kijun-sen
input int senkou_span_b=52; // período Senkou Span B
input string symbol=" "; // símbolo
input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // timeframe
//--- buffer do indicador
double Tenkan_sen_Buffer[];
double Kijun_sen_Buffer[];
double Senkou_Span_A_Buffer[];
double Senkou_Span_B_Buffer[];
double Chinkou_Span_Buffer[];
//--- variável para armazenar o manipulador do indicator iIchimoku
int handle;
//--- variável para armazenamento
string name=symbol;
//--- nome do indicador num gráfico
string short_name;
//--- manteremos o número de valores no indicador Ichimoku Kinko Hyo
int bars_calculated=0;
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado |
//+------------------------------------------------------------------+
int OnInit()
{
//--- atribuição de arrays para buffers do indicador
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);
//--- definir o deslocamento para o canal Senkou Span das barras kijun_sen na futura direção
PlotIndexSetInteger(2,PLOT_SHIFT,kijun_sen);
//--- não é necessário definir um deslocamento para a linha Span Chinkou, uma vez que os dados Chin
//--- já estão armazenados com um deslocamento na iIchimoku
//--- determinar o símbolo do indicador, é desenhado para
name=symbol;
//--- excluir os espaços à direita e à esquerda
StringTrimRight(name);
StringTrimLeft(name);
//--- se resulta em comprimento zero da string do 'name'
if(StringLen(name)==0)
{
//--- tomar o símbolo do gráfico, o indicador está anexado para
name=_Symbol;
}
//--- criar manipulador do indicador
if(type==Call_iIchimoku)
handle=iIchimoku(name,period,tenkan_sen,kijun_sen,senkou_span_b);
else
{
//--- preencher a estrutura com os parâmetros do indicador
MqlParam pars[3];
//--- períodos e deslocamentos da linhas do 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;
//--- criando o manipulador
handle=IndicatorCreate(name,period,IND_ICHIMOKU,3,pars);
}
//--- se o manipulador não é criado
if(handle==INVALID_HANDLE)
{
//--- mensagem sobre a falha e a saída do código de erro
PrintFormat("Falha ao criar o manipulador do indicador iIchimoku para o símbolo %s/%s, código
name,
EnumToString(period),
GetLastError());
//--- o indicador é interrompido precocemente
return(INIT_FAILED);
}
//--- mostra que o símbolo/prazo do indicador Ichimoku Kinko Hyo é calculado para
short_name=StringFormat("iIchimoku(%s/%s, %d, %d ,%d)",name,EnumToString(period),
tenkan_sen,kijun_sen,senkou_span_b);
IndicatorSetString(INDICATOR_SHORTNAME,short_name);
//--- inicialização normal do indicador
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
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[])
{
//--- número de valores copiados a partir do indicador iIchimoku
int values_to_copy;
//--- determinar o número de valores calculados no indicador
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat("BarsCalculated() retornando %d, código de erro %d",calculated,GetLastError());
return(0);
}
//--- se for o princípio do cálculo do indicador, ou se o número de valores é modificado no indicad
//--- ou se é necessário cálculo do indicador para duas ou mais barras (isso significa que algo mud
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//--- se o array Tenkan_sen_Buffer é maior do que o número de valores no indicador iIchimoku
//--- caso contrário, copiamos menor do que o tamanho dos buffers do indicador
if(calculated>rates_total) values_to_copy=rates_total;
else values_to_copy=calculated;
}
else
{
//--- isso significa que não é a primeira vez do cálculo do indicador, é desde a última chama
//--- para o cálculo não mais do que uma barra é adicionada
values_to_copy=(rates_total-prev_calculated)+1;
}
//--- preencher os arrays com valores do indicador Ichimoku Kinko Hyo
//--- se FillArraysFromBuffer retorna falso, isto significa que a informação ainda não está pronta,
if(!FillArraysFromBuffers(Tenkan_sen_Buffer,Kijun_sen_Buffer,Senkou_Span_A_Buffer,Senkou_Span_B_
kijun_sen,handle,values_to_copy)) return(0);
//--- formar a mensagem
string comm=StringFormat("%s ==> Valor atualizado no indicador %s: %d",
TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS),
short_name,
values_to_copy);
//--- exibir a mensagem de serviço no gráfico
Comment(comm);
//--- memorizar o número de valores no indicador Ichimoku Kinko Hyo
bars_calculated=calculated;
//--- retorna o valor prev_calculated para a próxima chamada
return(rates_total);
}
//+------------------------------------------------------------------+
//| Preencher buffers do indicador a partir do indicador iIchimoku |
//+------------------------------------------------------------------+
bool FillArraysFromBuffers(double &tenkan_sen_buffer[], // buffer do indicador da linha Tenkan-
double &kijun_sen_buffer[], // buffer do indicator da linha Kijun_s
double &senkou_span_A_buffer[], // buffer do indicator da linha Senkou
double &senkou_span_B_buffer[], // buffer do indicator da linha Senkou
double &chinkou_span_buffer[], // buffer do indicator da linha Chinkou
int senkou_span_shift, // deslocamento das linhas Senkou Span
int ind_handle, // manipulador do iIchimoku
int amount // número de valores copiados
)
{
//--- redefinir o código de erro
ResetLastError();
//--- preencher uma parte do array Tenkan_sen_Buffer com valores do buffer do indicador que tem índ
if(CopyBuffer(ind_handle,0,0,amount,tenkan_sen_buffer)<0)
{
//--- Se a cópia falhar, informe o código de erro
//--- preencher uma parte do array Kijun_sen_Buffer com valores do buffer do indicador que tem índi
if(CopyBuffer(ind_handle,1,0,amount,kijun_sen_buffer)<0)
{
//--- Se a cópia falhar, informe o código de erro
PrintFormat("2.Falha ao copiar dados do indicador iIchimoku, código de erro %d",GetLastError(
//--- parar com resultado zero - significa que indicador é considerado como não calculado
return(false);
}
//--- preencher uma parte do array Chinkou_Span_Buffer com valores do buffer do indicador que tem í
//--- se senkou_span_shift>0, a linha é deslocada na direção futura pelas barras senkou_span_shift
if(CopyBuffer(ind_handle,2,-senkou_span_shift,amount,senkou_span_A_buffer)<0)
{
//--- Se a cópia falhar, informe o código de erro
PrintFormat("3.Falha ao copiar dados do indicador iIchimoku, código de erro %d",GetLastError(
//--- parar com resultado zero - significa que indicador é considerado como não calculado
return(false);
}
//--- preencher uma parte do array com valores do buffer do indicador que tem índice 3 (três)
//--- se senkou_span_shift>0, a linha é deslocada na direção futura pelas barras senkou_span_shift
if(CopyBuffer(ind_handle,3,-senkou_span_shift,amount,senkou_span_B_buffer)<0)
{
//--- Se a cópia falhar, informe o código de erro
PrintFormat("4.Falha ao copiar dados do indicador iIchimoku, código de erro %d",GetLastError(
//--- parar com resultado zero - significa que indicador é considerado como não calculado
return(false);
}
//--- preencher uma parte do array Senkou_Span_B_Buffer com valores do buffer do indicador que tem
//--- ao copiar Chinkou Span, não precisamos considerar a mudança, uma vez que os dados Chinkou Spa
//--- já estão armazenados com um deslocamento na iIchimoku
if(CopyBuffer(ind_handle,4,0,amount,chinkou_span_buffer)<0)
{
//--- Se a cópia falhar, informe o código de erro
PrintFormat("5.Falha ao copiar dados do indicador iIchimoku, código de erro %d",GetLastError(
//--- parar com resultado zero - significa que indicador é considerado como não calculado
return(false);
}
//--- está tudo bem
return(true);
}
//+------------------------------------------------------------------+
//| Função de desinicialização do indicador |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(handle!=INVALID_HANDLE)
IndicatorRelease(handle);
//--- limpar o gráfico após excluir o indicador
Comment("");
}
iBW MFI
A função retorna o manipulador do indicador Mark et Facilitation Index. T em apenas um buffer.
int iBWMFI(
string symbol, // símbolo nome
ENUM_TIMEFRAMES period, // período
ENUM_APPLIED_VOLUME applied_volume // tipo de volume para o cálculo
);
Parâmetros
symbol
[in] O nome do símbolo de segurança, os dados que devem ser usados para calcular o indicador. O
valor NULL significa o símbolo atual.
period
[in] O valor do período pode ser um dos valores ENUM _TIMEFR AMES, 0 (zero) significa o prazo
corrente.
applied_volume
[in] O volume usado. Pode ser uma das constantes do ENUM _APPL IED_VOL UME.
Valor de retorno
R etorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVAL ID_H ANDLE. A memória do computador pode ser liberada a partir de um indicador que não é
mais utilizado, usando a função IndicatorR elease(), onde o manipulador de indicador é transmitido.
Exemplo:
//+------------------------------------------------------------------+
//| 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 "O indicador demonstra como obter dados"
#property description "de buffers do indicador para o indicador técnico iBWMFI."
#property description "Um símbolo e o prazo utilizado para o cálculo do indicador,"
#property description "são definidos pelos parâmetros de símbolo e período."
#property description "O método de criação do manipulador é definido através do parâmetro "type" (t
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots 1
//--- plotar iBWMFI
#property indicator_label1 "iBWMFI"
#property indicator_type1 DRAW_COLOR_HISTOGRAM
#property indicator_color1 clrLime,clrSaddleBrown,clrBlue,clrPink
{
//--- preencher a estrutura com os parâmetros do indicador
MqlParam pars[1];
//--- tipo de volume
pars[0].type=TYPE_INT;
pars[0].integer_value=applied_volume;
handle=IndicatorCreate(name,period,IND_BWMFI,1,pars);
}
//--- se o manipulador não é criado
if(handle==INVALID_HANDLE)
{
//--- mensagem sobre a falha e a saída do código de erro
PrintFormat("Falha ao criar o manipulador do indicador iBWMFI para o símbolo %s/%s, código de
name,
EnumToString(period),
GetLastError());
//--- o indicador é interrompido precocemente
return(INIT_FAILED);
}
//--- mostrar que o símbolo/período do indicador Market Facilitation Index por Bill Williams é calc
short_name=StringFormat("iBWMFI(%s/%s, %s)",name,EnumToString(period),
EnumToString(applied_volume));
IndicatorSetString(INDICATOR_SHORTNAME,short_name);
//--- inicialização normal do indicador
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
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[])
{
//--- número de valores copiado do indicador iBWMFI
int values_to_copy;
//--- determinar o número de valores calculados no indicador
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat("BarsCalculated() retornando %d, código de erro %d",calculated,GetLastError());
return(0);
}
//--- preencher uma parte do array iBWMFIColors com valores do buffer do indicador que tem índice 1
if(CopyBuffer(ind_handle,1,0,amount,colors)<0)
{
//--- Se a cópia falhar, informe o código de erro
PrintFormat("Falha ao copiar dados do indicador iBWMFI, código de erro %d",GetLastError());
//--- parar com resultado zero - significa que indicador é considerado como não calculado
return(false);
}
//--- está tudo bem
return(true);
}
//+------------------------------------------------------------------+
//| Função de desinicialização do indicador |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(handle!=INVALID_HANDLE)
IndicatorRelease(handle);
//--- limpar o gráfico após excluir o indicador
Comment("");
}
iMomentum
A função retorna o manipulador do indicador Momentum. T em apenas um buffer.
int iMomentum(
string symbol, // símbolo nome
ENUM_TIMEFRAMES period, // período
int mom_period, // período médio
ENUM_APPLIED_PRICE applied_price // tipo de preço ou de manipulador
);
Parâmetros
symbol
[in] O nome do símbolo de segurança, os dados que devem ser usados para calcular o indicador. O
valor NULL significa o símbolo atual.
period
[in] O valor do período pode ser um dos valores ENUM _TIMEFR AMES, 0 (zero) significa o prazo
corrente.
mom_period
[in] Período médio(barras contadas) para o cálculo de modificação do preço.
applied_price
[in] O preço usado. Pode ser qualquer das constantes de preços ENUM _APPL IED_PRICE ou um
manipulador de outro indicador.
Valor de retorno
R etorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVAL ID_H ANDLE. A memória do computador pode ser liberada a partir de um indicador que não é
mais utilizado, usando a função IndicatorR elease(), onde o manipulador de indicador é transmitido.
Exemplo:
//+------------------------------------------------------------------+
//| 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 "O indicador demonstra como obter dados"
#property description "de buffers do indicador para o indicador técnico iMomentum."
#property description "Um símbolo e o prazo utilizado para o cálculo do indicador,"
#property description "são definidos pelos parâmetros de símbolo e período."
#property description "O método de criação do manipulador é definido através do parâmetro "type" (t
#property description "Todos os outros parâmetros são similares ao padrão Momentum."
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1
//--- plotar iMomentum
#property indicator_label1 "iMomentum"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrDodgerBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//+------------------------------------------------------------------+
//| Enumerador dos métodos de criação do manipulador |
//+------------------------------------------------------------------+
enum Creation
{
Call_iMomentum, // usar iMomentum
Call_IndicatorCreate // usar IndicatorCreate
};
//--- parâmetros de entrada
input Creation type=Call_iMomentum; // tipo de função
input int mom_period=14; // período do indicador Momentum
input ENUM_APPLIED_PRICE applied_price=PRICE_CLOSE; // tipo de preço
input string symbol=" "; // símbolo
input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // timeframe
//--- buffer do indicador
double iMomentumBuffer[];
//--- variável para armazenar o manipulador do indicator iMomentum
int handle;
//--- variável para armazenamento
string name=symbol;
//--- nome do indicador num gráfico
string short_name;
//--- manteremos o número de valores no indicador Momentum
int bars_calculated=0;
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado |
//+------------------------------------------------------------------+
int OnInit()
{
//--- atribuição de array para buffer do indicador
SetIndexBuffer(0,iMomentumBuffer,INDICATOR_DATA);
//--- determinar o símbolo do indicador, é desenhado para
name=symbol;
//--- excluir os espaços à direita e à esquerda
StringTrimRight(name);
StringTrimLeft(name);
//--- se resulta em comprimento zero da string do 'name'
if(StringLen(name)==0)
{
//--- tomar o símbolo do gráfico, o indicador está anexado para
name=_Symbol;
}
//--- criar manipulador do indicador
if(type==Call_iMomentum)
handle=iMomentum(name,period,mom_period,applied_price);
else
{
//--- preencher a estrutura com os parâmetros do indicador
MqlParam pars[2];
//--- período
pars[0].type=TYPE_INT;
pars[0].integer_value=mom_period;
//--- tipo de preço
pars[1].type=TYPE_INT;
pars[1].integer_value=applied_price;
handle=IndicatorCreate(name,period,IND_MOMENTUM,2,pars);
}
//--- se o manipulador não é criado
if(handle==INVALID_HANDLE)
{
//--- mensagem sobre a falha e a saída do código de erro
PrintFormat("Falha ao criar o manipulador do indicador iMomentum para o símbolo %s/%s, código
name,
EnumToString(period),
GetLastError());
//--- o indicador é interrompido precocemente
return(INIT_FAILED);
}
//--- mostra que o símbolo/prazo do indicador Momentum é calculado para
short_name=StringFormat("iMomentum(%s/%s, %d, %s)",name,EnumToString(period),
mom_period, EnumToString(applied_price));
IndicatorSetString(INDICATOR_SHORTNAME,short_name);
//--- inicialização normal do indicador
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
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[])
{
//--- número de valores copiados a partir do indicador iMomentum
int values_to_copy;
//--- determinar o número de valores calculados no indicador
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat("BarsCalculated() retornando %d, código de erro %d",calculated,GetLastError());
return(0);
}
//--- se for o princípio do cálculo do indicador, ou se o número de valores é modificado no indicad
//--- ou se é necessário cálculo do indicador para duas ou mais barras (isso significa que algo mud
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//--- se o array iMomentumBuffer é maior do que o número de valores no indicador iMomentum pa
//--- caso contrário, copiamos menor do que o tamanho dos buffers do indicador
if(calculated>rates_total) values_to_copy=rates_total;
else values_to_copy=calculated;
}
else
{
//--- isso significa que não é a primeira vez do cálculo do indicador, é desde a última chama
//--- para o cálculo não mais do que uma barra é adicionada
values_to_copy=(rates_total-prev_calculated)+1;
}
//--- preencher o array iMomentumBuffer com valores do indicador Momentum
//--- se FillArrayFromBuffer retorna falso, significa que a informação não está pronta ainda, sair
if(!FillArrayFromBuffer(iMomentumBuffer,handle,values_to_copy)) return(0);
//--- formar a mensagem
string comm=StringFormat("%s ==> Valor atualizado no indicador %s: %d",
TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS),
short_name,
values_to_copy);
//--- exibir a mensagem de serviço no gráfico
Comment(comm);
//--- memorizar o número de valores no indicador Momentum
bars_calculated=calculated;
//--- retorna o valor prev_calculated para a próxima chamada
return(rates_total);
}
//+------------------------------------------------------------------+
//| Preencher buffers do indicador a partir do indicador iMomentum |
//+------------------------------------------------------------------+
bool FillArrayFromBuffer(double &values[], // buffer do indicator para valores do Momentum
int ind_handle, // manipulador do indicador iMomentum
int amount // número de valores copiados
)
{
//--- redefinir o código de erro
ResetLastError();
//--- preencher uma parte do array iMomentumBuffer com valores do buffer do indicador que tem índic
if(CopyBuffer(ind_handle,0,0,amount,values)<0)
{
//--- Se a cópia falhar, informe o código de erro
PrintFormat("Falha ao copiar dados do indicador iMomentum, código de erro %d",GetLastError())
//--- parar com resultado zero - significa que indicador é considerado como não calculado
return(false);
}
//--- está tudo bem
return(true);
}
//+------------------------------------------------------------------+
//| Função de desinicialização do indicador |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(handle!=INVALID_HANDLE)
IndicatorRelease(handle);
//--- limpar o gráfico após excluir o indicador
Comment("");
}
iMFI
A função retorna o manipulador do indicador Money Flow Index.
int iMFI(
string symbol, // símbolo nome
ENUM_TIMEFRAMES period, // período
int ma_period, // período médio
ENUM_APPLIED_VOLUME applied_volume // tipo de volume para o cálculo
);
Parâmetros
symbol
[in] O nome do símbolo de segurança, os dados que devem ser usados para calcular o indicador. O
valor NULL significa o símbolo atual.
period
[in] O valor do período pode ser um dos valores ENUM _TIMEFR AMES, 0 (zero) significa o prazo
corrente.
ma_period
[in] Período médio (barras contadas) para cálculo.
applied_volume
[in] O volume usado. Pode ser um dos valores ENUM _APPL IED_VOL UME.
Valor de retorno
R etorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVAL ID_H ANDLE. A memória do computador pode ser liberada a partir de um indicador que não é
mais utilizado, usando a função IndicatorR elease(), onde o manipulador de indicador é transmitido.
Exemplo:
//+------------------------------------------------------------------+
//| 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 "O indicador demonstra como obter dados"
#property description "de buffers do indicador para o indicador técnico iMFI."
#property description "Um símbolo e o prazo utilizado para o cálculo do indicador,"
#property description "são definidos pelos parâmetros de símbolo e período."
#property description "O método de criação do manipulador é definido através do parâmetro "type" (t
#property description "Todos os outros parâmetros são similares ao padrão Money Flow Index."
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1
//--- plotar iMFI
#property indicator_label1 "iMFI"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrDodgerBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- níveis horizontais na janela de indicador
#property indicator_level1 20
#property indicator_level2 80
//+------------------------------------------------------------------+
//| Enumerador dos métodos de criação do manipulador |
//+------------------------------------------------------------------+
enum Creation
{
Call_iMFI, // usar iMFI
Call_IndicatorCreate // usar IndicatorCreate
};
//--- parâmetros de entrada
input Creation type=Call_iMFI; // tipo de função
input int ma_period=14; // período
input ENUM_APPLIED_VOLUME applied_volume=VOLUME_TICK; // tipo de volume
input string symbol=" "; // símbolo
input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // timeframe
//--- buffer do indicador
double iMFIBuffer[];
//--- variável para armazenar o manipulador do indicator iMFI
int handle;
//--- variável para armazenamento
string name=symbol;
//--- nome do indicador num gráfico
string short_name;
//--- manteremos o número de valores no indicador Money Flow Index
int bars_calculated=0;
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado |
//+------------------------------------------------------------------+
int OnInit()
{
//--- atribuição de array para buffer do indicador
SetIndexBuffer(0,iMFIBuffer,INDICATOR_DATA);
//--- determinar o símbolo do indicador, é desenhado para
name=symbol;
//--- excluir os espaços à direita e à esquerda
StringTrimRight(name);
StringTrimLeft(name);
//--- se resulta em comprimento zero da string do 'name'
if(StringLen(name)==0)
{
{
//--- número de valores copiados a partir do indicador iMFI
int values_to_copy;
//--- determinar o número de valores calculados no indicador
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat("BarsCalculated() retornando %d, código de erro %d",calculated,GetLastError());
return(0);
}
//--- se for o princípio do cálculo do indicador, ou se o número de valores é modificado no indicad
//--- ou se é necessário cálculo do indicador para duas ou mais barras (isso significa que algo mud
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//--- se o array iMFIBuffer é maior do que o número de valores no indicador iMFI para o símbo
//--- caso contrário, copiamos menor do que o tamanho dos buffers do indicador
if(calculated>rates_total) values_to_copy=rates_total;
else values_to_copy=calculated;
}
else
{
//--- isso significa que não é a primeira vez do cálculo do indicador, é desde a última chama
//--- para o cálculo não mais do que uma barra é adicionada
values_to_copy=(rates_total-prev_calculated)+1;
}
//--- preencher o array iMFIBuffer com valores do indicador Money Flow Index
//--- se FillArrayFromBuffer retorna falso, significa que a informação não está pronta ainda, sair
if(!FillArrayFromBuffer(iMFIBuffer,handle,values_to_copy)) return(0);
//--- formar a mensagem
string comm=StringFormat("%s ==> Valor atualizado no indicador %s: %d",
TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS),
short_name,
values_to_copy);
//--- exibir a mensagem de serviço no gráfico
Comment(comm);
//--- memorizar o número de valores no indicador Flow Index
bars_calculated=calculated;
//--- retorna o valor prev_calculated para a próxima chamada
return(rates_total);
}
//+------------------------------------------------------------------+
//| Preencher buffers do indicador a partir do indicador iMFI |
//+------------------------------------------------------------------+
bool FillArrayFromBuffer(double &values[], // buffer do indicator para valores do Money Flow Index
int ind_handle, // manipulador do indicador iMFI
int amount // número de valores copiados
)
{
//--- redefinir o código de erro
ResetLastError();
//--- preencher uma parte do array iMFIBuffer com valores do buffer do indicador que tem índice 0 (
if(CopyBuffer(ind_handle,0,0,amount,values)<0)
{
//--- Se a cópia falhar, informe o código de erro
PrintFormat("Falha ao copiar dados do indicador iMFI, código de erro %d",GetLastError());
//--- parar com resultado zero - significa que indicador é considerado como não calculado
return(false);
}
//--- está tudo bem
return(true);
}
//+------------------------------------------------------------------+
//| Função de desinicialização do indicador |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(handle!=INVALID_HANDLE)
IndicatorRelease(handle);
//--- limpar o gráfico após excluir o indicador
Comment("");
}
iMA
A função retorna o manipulador do indicador Moving Average. T em apenas um buffer.
int iMA(
string symbol, // símbolo nome
ENUM_TIMEFRAMES period, // período
int ma_period, // período médio
int ma_shift, // deslocamento horizontal
ENUM_MA_METHOD ma_method, // tipo suavizado
ENUM_APPLIED_PRICE applied_price // tipo de preço ou de manipulador
);
Parâmetros
symbol
[in] O nome do símbolo de segurança, os dados que devem ser usados para calcular o indicador. O
valor NULL significa o símbolo atual.
period
[in] O valor do período pode ser um dos valores ENUM _TIMEFR AMES, 0 (zero) significa o prazo
corrente.
ma_period
[in] Período médio para cálculo da média móvel.
ma_shift
[in] Deslocamento do indicador relativo ao gráfico de preços.
ma_method
[in] T ipo suavizado. Pode ser um dos valores ENUM _MA_METH OD.
applied_price
[in] O preço usado. Pode ser qualquer das constantes de preços ENUM _APPL IED_PRICE ou um
manipulador de outro indicador.
Valor de retorno
R etorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVAL ID_H ANDLE. A memória do computador pode ser liberada a partir de um indicador que não é
mais utilizado, usando a função IndicatorR elease(), onde o manipulador de indicador é transmitido.
Exemplo:
//+------------------------------------------------------------------+
//| 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
//--- plotar iMA
#property indicator_label1 "iMA"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//+------------------------------------------------------------------+
//| Enumerador dos métodos de criação do manipulador |
//+------------------------------------------------------------------+
enum Creation
{
Call_iMA, // usar iMA
Call_IndicatorCreate // usar IndicatorCreate
};
//--- parâmetros de entrada
input Creation type=Call_iMA; // tipo de função
input int ma_period=10; // período da média móvel
input int ma_shift=0; // deslocamento
input ENUM_MA_METHOD ma_method=MODE_SMA; // tipo de suavização
input ENUM_APPLIED_PRICE applied_price=PRICE_CLOSE; // tipo de preço
input string symbol=" "; // símbolo
input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // timeframe
//--- buffer do indicador
double iMABuffer[];
//--- variável para armazenar o manipulador do indicator iMA
int handle;
//--- variável para armazenamento
string name=symbol;
//--- nome do indicador num gráfico
string short_name;
//--- manteremos o número de valores no indicador Moving Average
int bars_calculated=0;
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado |
//+------------------------------------------------------------------+
int OnInit()
{
//--- atribuição de array para buffer do indicador
SetIndexBuffer(0,iMABuffer,INDICATOR_DATA);
iOsMA
A função retorna o manipulador do indicador M ov ing Av erag e of Os cillator. O os cilador Оs МА mos tra a
diferença entre valores do indicador MACD e sua linha de sinal. Tem apenas um buffer.
int iOsMA(
string symbol, // símbolo nome
ENUM_TIMEFRAMES period, // período
int fast_ema_period, // período Média Móvel Rápida
int slow_ema_period, // período Média Móvel Lenta
int signal_period, // período para diferença entre as médias
ENUM_APPLIED_PRICE applied_price // tipo de preço ou de manipulador
);
Parâmetros
symbol
[in] O nome do símbolo de segurança, os dados que devem ser usados para calcular o indicador. O
valor NULL significa o símbolo atual.
period
[in] O valor do período pode ser um dos valores ENUM _TIMEFR AMES, 0 (zero) significa o prazo
corrente.
fast_ema_period
[in] Período para cálculo da Média Móvel Rápida.
slow_ema_period
[in] Período para cálculo da Média Móvel Lenta.
signal_period
[in] Período para o cálculo da linha de sinal.
applied_price
[in] O preço usado. Pode ser qualquer das constantes de preços ENUM _APPL IED_PRICE ou um
manipulador de outro indicador.
Valor de retorno
R etorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVAL ID_H ANDLE. A memória do computador pode ser liberada a partir de um indicador que não é
mais utilizado, usando a função IndicatorR elease(), onde o manipulador de indicador é transmitido.
Observação
Em alguns sistemas este oscilador é também conhecido como histograma MACD.
Exemplo:
//+------------------------------------------------------------------+
//| 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 "O indicador demonstra como obter dados"
#property description "de buffers do indicador para o indicador técnico iOsMA."
#property description "Um símbolo e o prazo utilizado para o cálculo do indicador,"
#property description "são definidos pelos parâmetros de símbolo e período."
#property description "O método de criação do manipulador é definido através do parâmetro "type" (t
#property description "Todos os outros parâmetros são similares ao padrão Moving Average of Oscilla
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1
//--- plotar iOsMA
#property indicator_label1 "iOsMA"
#property indicator_type1 DRAW_HISTOGRAM
#property indicator_color1 clrSilver
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//+------------------------------------------------------------------+
//| Enumerador dos métodos de criação do manipulador |
//+------------------------------------------------------------------+
enum Creation
{
Call_iOsMA, // usar iOsMA
Call_IndicatorCreate // usar IndicatorCreate
};
//--- parâmetros de entrada
input Creation type=Call_iOsMA; // tipo de função
input int fast_ema_period=12; // período da Média Móvel Rápida
input int slow_ema_period=26; // período da Média Móvel Lenta
input int signal_period=9; // período da diferença entre as médias móvei
input ENUM_APPLIED_PRICE applied_price=PRICE_CLOSE; // tipo de preço
input string symbol=" "; // símbolo
input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // timeframe
//--- buffer do indicador
double iOsMABuffer[];
//--- variável para armazenar o manipulador do indicador iAMA
int handle;
//--- variável para armazenamento
string name=symbol;
//--- nome do indicador num gráfico
string short_name;
//--- manteremos o número de valores no indicador Moving Average
int bars_calculated=0;
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado |
//+------------------------------------------------------------------+
int OnInit()
{
//--- atribuição de array para buffer do indicador
SetIndexBuffer(0,iOsMABuffer,INDICATOR_DATA);
//--- determinar o símbolo do indicador, é desenhado para
name=symbol;
//--- excluir os espaços à direita e à esquerda
StringTrimRight(name);
StringTrimLeft(name);
//--- se resulta em comprimento zero da string do 'name'
if(StringLen(name)==0)
{
//--- tomar o símbolo do gráfico, o indicador está anexado para
name=_Symbol;
}
//--- criar manipulador do indicador
if(type==Call_iOsMA)
handle=iOsMA(name,period,fast_ema_period,slow_ema_period,signal_period,applied_price);
else
{
//--- preencher a estrutura com os parâmetros do indicador
MqlParam pars[4];
//--- período da média móvel rápida
pars[0].type=TYPE_INT;
pars[0].integer_value=fast_ema_period;
//--- período lento da média móvel
pars[1].type=TYPE_INT;
pars[1].integer_value=slow_ema_period;
//--- período médio da diferença entre a média móvel rápida e a lenta
pars[2].type=TYPE_INT;
pars[2].integer_value=signal_period;
//--- tipo de preço
pars[3].type=TYPE_INT;
pars[3].integer_value=applied_price;
handle=IndicatorCreate(name,period,IND_OSMA,4,pars);
}
//--- se o manipulador não é criado
if(handle==INVALID_HANDLE)
{
//--- mensagem sobre a falha e a saída do código de erro
PrintFormat("Falha ao criar o manipulador do indicador iOsMA para o símbolo %s/%s, código de
name,
EnumToString(period),
GetLastError());
//--- o indicador é interrompido precocemente
return(INIT_FAILED);
}
//--- mostra que o símbolo/prazo do indicador Moving Average of Oscillator é calculado para
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);
//--- inicialização normal do indicador
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
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[])
{
//--- número de valores copiados a partir do indicador iOsMA
int values_to_copy;
//--- determinar o número de valores calculados no indicador
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat("BarsCalculated() retornando %d, código de erro %d",calculated,GetLastError());
return(0);
}
//--- se for o princípio do cálculo do indicador, ou se o número de valores é modificado no indicad
//--- ou se é necessário cálculo do indicador para duas ou mais barras (isso significa que algo mud
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//--- se o array iOsMABuffer é maior do que o número de valores no indicador iOsMA para o sím
//--- caso contrário, copiamos menor do que o tamanho dos buffers do indicador
if(calculated>rates_total) values_to_copy=rates_total;
else values_to_copy=calculated;
}
else
{
//--- isso significa que não é a primeira vez do cálculo do indicador, é desde a última chama
//--- para o cálculo não mais do que uma barra é adicionada
values_to_copy=(rates_total-prev_calculated)+1;
}
//--- preencher os arrays com valores do indicador iOsMA
//--- se FillArrayFromBuffer retorna falso, significa que a informação não está pronta ainda, sair
if(!FillArrayFromBuffer(iOsMABuffer,handle,values_to_copy)) return(0);
//--- formar a mensagem
string comm=StringFormat("%s ==> Valor atualizado no indicador %s: %d",
TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS),
short_name,
values_to_copy);
//--- exibir a mensagem de serviço no gráfico
Comment(comm);
//--- memorizar o número de valores no indicador Moving Average of Oscillator
bars_calculated=calculated;
//--- retorna o valor prev_calculated para a próxima chamada
return(rates_total);
}
//+------------------------------------------------------------------+
//| Preencher buffers do indicador a partir do indicador iOsMA |
//+------------------------------------------------------------------+
bool FillArrayFromBuffer(double &ama_buffer[], // buffer do indicator para valores do OsMA
int ind_handle, // manipulador do indicador iOsMA
int amount // número de valores copiados
)
{
//--- redefinir o código de erro
ResetLastError();
//--- preencher uma parte do array iOsMABuffer com valores do buffer do indicador que tem índice 0
if(CopyBuffer(ind_handle,0,0,amount,ama_buffer)<0)
{
//--- Se a cópia falhar, informe o código de erro
PrintFormat("Falha ao copiar dados do indicador iOsMA, código de erro %d",GetLastError());
//--- parar com resultado zero - significa que indicador é considerado como não calculado
return(false);
}
//--- está tudo bem
return(true);
}
//+------------------------------------------------------------------+
//| Função de desinicialização do indicador |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(handle!=INVALID_HANDLE)
IndicatorRelease(handle);
//--- limpar o gráfico após excluir o indicador
Comment("");
}
iMACD
A função retorna o manipulador do indicador Moving Averages Convergence/Divergence. Em sistemas
onde Оs МА é chamado H is tog rama M ACD, es te indicador é apresentado com duas linhas. No terminal
do cliente, o indicador Moving Averages Convergence/Divergence é apresentado como um histograma.
int iMACD(
string symbol, // símbolo nome
ENUM_TIMEFRAMES period, // período
int fast_ema_period, // período para cálculo da média móvel rápida
int slow_ema_period, // período para cálculo da média móvel lenta
int signal_period, // período para diferença entre as médias
ENUM_APPLIED_PRICE applied_price // tipo de preço ou de manipulador
);
Parâmetros
symbol
[in] O nome do símbolo de segurança, os dados que devem ser usados para calcular o indicador. O
valor NULL significa o símbolo atual.
period
[in] O valor do período pode ser um dos valores ENUM _TIMEFR AMES, 0 (zero) significa o prazo
corrente.
fast_ema_period
[in] Período para cálculo da Média Móvel Rápida.
slow_ema_period
[in] Período para cálculo da Média Móvel Lenta.
signal_period
[in] Período para cálculo da linha de Sinal.
applied_price
[in] O preço usado. Pode ser qualquer das constantes de preços ENUM _APPL IED_PRICE ou um
manipulador de outro indicador.
Valor de retorno
R etorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVAL ID_H ANDLE. A memória do computador pode ser liberada a partir de um indicador que não é
mais utilizado, usando a função IndicatorR elease(), onde o manipulador de indicador é transmitido.
Observação
Os números de buffer são os seguintes : 0 - MAIN_L INE, 1 - S IGNAL _L INE.
Exemplo:
//+------------------------------------------------------------------+
//| 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 "O indicador demonstra como obter dados"
#property description "de buffers do indicador para o indicador técnico iMACD."
#property description "Um símbolo e o prazo utilizado para o cálculo do indicador,"
#property description "são definidos pelos parâmetros de símbolo e período."
#property description "O método de criação do manipulador é definido através do parâmetro "type" (t
#property description "Todos os outros parâmetros, assim como no padrão MACD."
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots 2
//--- plotar MACD
#property indicator_label1 "MACD"
#property indicator_type1 DRAW_HISTOGRAM
#property indicator_color1 clrSilver
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- plotar Signal
#property indicator_label2 "Signal"
#property indicator_type2 DRAW_LINE
#property indicator_color2 clrRed
#property indicator_style2 STYLE_DOT
#property indicator_width2 1
//+------------------------------------------------------------------+
//| Enumerador dos métodos de criação do manipulador |
//+------------------------------------------------------------------+
enum Creation
{
Call_iMACD, // usar iMACD
Call_IndicatorCreate // usar IndicatorCreate
};
//--- parâmetros de entrada
input Creation type=Call_iMACD; // tipo de função
input int fast_ema_period=12; // período da Média Móvel Rápida
input int slow_ema_period=26; // período da Média Móvel Lenta
input int signal_period=9; // período da diferença entre as médias móvei
input ENUM_APPLIED_PRICE applied_price=PRICE_CLOSE; // tipo de preço
input string symbol=" "; // símbolo
input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // timeframe
//--- buffers do indicador
double MACDBuffer[];
double SignalBuffer[];
//--- variável para armazenar o manipulador do indicator iMACD
int handle;
//--- variável para armazenamento
string name=symbol;
//--- nome do indicador num gráfico
string short_name;
//--- manteremos o número de valores no indicador Moving Averages Convergence/Divergence
int bars_calculated=0;
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado |
//+------------------------------------------------------------------+
int OnInit()
{
//--- atribuição de arrays para buffers do indicador
SetIndexBuffer(0,MACDBuffer,INDICATOR_DATA);
SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);
//--- determinar o símbolo do indicador, é desenhado para
name=symbol;
//--- excluir os espaços à direita e à esquerda
StringTrimRight(name);
StringTrimLeft(name);
//--- se resulta em comprimento zero da string do 'name'
if(StringLen(name)==0)
{
//--- tomar o símbolo do gráfico, o indicador está anexado para
name=_Symbol;
}
//--- criar manipulador do indicador
if(type==Call_iMACD)
handle=iMACD(name,period,fast_ema_period,slow_ema_period,signal_period,applied_price);
else
{
//--- preencher a estrutura com os parâmetros do indicador
MqlParam pars[4];
//--- período da média móvel rápida
pars[0].type=TYPE_INT;
pars[0].integer_value=fast_ema_period;
//--- período lento da média móvel
pars[1].type=TYPE_INT;
pars[1].integer_value=slow_ema_period;
//--- período médio da diferença entre a média móvel rápida e a lenta
pars[2].type=TYPE_INT;
pars[2].integer_value=signal_period;
//--- tipo de preço
pars[3].type=TYPE_INT;
pars[3].integer_value=applied_price;
handle=IndicatorCreate(name,period,IND_MACD,4,pars);
}
//--- se o manipulador não é criado
if(handle==INVALID_HANDLE)
{
//--- mensagem sobre a falha e a saída do código de erro
//--- preencher uma parte do array SignalBuffer com valores do buffer do indicador que tem índice 1
if(CopyBuffer(ind_handle,1,0,amount,signal_buffer)<0)
{
//--- Se a cópia falhar, informe o código de erro
PrintFormat("Falha ao copiar dados do indicador iMACD, código de erro %d",GetLastError());
//--- parar com resultado zero - significa que indicador é considerado como não calculado
return(false);
}
//--- está tudo bem
return(true);
}
//+------------------------------------------------------------------+
//| Função de desinicialização do indicador |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(handle!=INVALID_HANDLE)
IndicatorRelease(handle);
//--- limpar o gráfico após excluir o indicador
Comment("");
}
iOBV
A função retorna o manipulador do indicador On Balance Volume. T em apenas um buffer.
int iOBV(
string symbol, // símbolo nome
ENUM_TIMEFRAMES period, // período
ENUM_APPLIED_VOLUME applied_volume // tipo de volume para cálculo
);
Parâmetros
symbol
[in] O nome do símbolo de segurança, os dados que devem ser usados para calcular o indicador. O
valor NULL significa o símbolo atual.
period
[in] O valor do período pode ser um dos valores ENUM _TIMEFR AMES, 0 (zero) significa o prazo
corrente.
applied_volume
[in] O volume usado. Pode ser um dos valores ENUM _APPL IED_VOL UME.
Valor de retorno
R etorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVAL ID_H ANDLE. A memória do computador pode ser liberada a partir de um indicador que não é
mais utilizado, usando a função IndicatorR elease(), onde o manipulador de indicador é transmitido.
Exemplo:
//+------------------------------------------------------------------+
//| 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 "O indicador demonstra como obter dados"
#property description "de buffers do indicador para o indicador técnico iOBV."
#property description "Um símbolo e o prazo utilizado para o cálculo do indicador,"
#property description "são definidos pelos parâmetros de símbolo e período."
#property description "O método de criação do manipulador é definido através do parâmetro "type" (t
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1
//--- plotar iOBV
#property indicator_label1 "iOBV"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrLightSeaGreen
MqlParam pars[1];
//--- tipo de volume
pars[0].type=TYPE_INT;
pars[0].integer_value=applied_volume;
handle=IndicatorCreate(name,period,IND_OBV,1,pars);
}
//--- se o manipulador não é criado
if(handle==INVALID_HANDLE)
{
//--- mensagem sobre a falha e a saída do código de erro
PrintFormat("Falha ao criar o manipulador do indicador para o símbolo %s/%s, código de erro %
name,
EnumToString(period),
GetLastError());
//--- o indicador é interrompido precocemente
return(INIT_FAILED);
}
//--- mostra que o símbolo/prazo do indicador On Balance Volume é calculado para
short_name=StringFormat("iOBV(%s/%s, %s)",name,EnumToString(period),
EnumToString(applied_volume));
IndicatorSetString(INDICATOR_SHORTNAME,short_name);
//--- inicialização normal do indicador
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
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[])
{
//--- número de valores copiados a partir do indicador iOBV
int values_to_copy;
//--- determinar o número de valores calculados no indicador
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat("BarsCalculated() retornando %d, código de erro %d",calculated,GetLastError());
return(0);
}
//--- se for o princípio do cálculo do indicador, ou se o número de valores é modificado no indicad
//--- ou se é necessário cálculo do indicador para duas ou mais barras (isso significa que algo mud
//+------------------------------------------------------------------+
//| Função de desinicialização do indicador |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(handle!=INVALID_HANDLE)
IndicatorRelease(handle);
//--- limpar o gráfico após excluir o indicador
Comment("");
}
iSAR
A função retorna o manipulador do indicador Parabolic Stop and R everse s ystem. T em apenas um
buffer.
int iSAR(
string symbol, // símbolo nome
ENUM_TIMEFRAMES period, // período
double step, // incrementar passo
double maximum // máximo nível de parada
);
Parâmetros
symbol
[in] O nome do símbolo de segurança, os dados que devem ser usados para calcular o indicador. O
valor NULL significa o símbolo atual.
period
[in] O valor do período pode ser um dos valores ENUM _TIMEFR AMES, 0 (zero) significa o prazo
corrente.
step
[in] O nível de parada incrementado, usualmente 0.02.
maximum
[in] O máximo nível de parada, usualmente 0.2.
Valor de retorno
R etorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVAL ID_H ANDLE. A memória do computador pode ser liberada a partir de um indicador que não é
mais utilizado, usando a função IndicatorR elease(), onde o manipulador de indicador é transmitido.
Exemplo:
//+------------------------------------------------------------------+
//| 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 "O indicador demonstra como obter dados"
#property description "de buffers do indicador para o indicador técnico iSAR."
#property description "Um símbolo e o prazo utilizado para o cálculo do indicador,"
#property description "são definidos pelos parâmetros de símbolo e período."
#property description "O método de criação do manipulador é definido através do parâmetro "type" (t
#property description "Todos os outros parâmetros são similares ao padrão Parabolic Stop and Revers
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1
//--- desenhando iSAR
#property indicator_label1 "iSAR"
#property indicator_type1 DRAW_ARROW
#property indicator_color1 clrBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//+------------------------------------------------------------------+
//| Enumerador dos métodos de criação do manipulador |
//+------------------------------------------------------------------+
enum Creation
{
Call_iSAR, // usar iSAR
Call_IndicatorCreate // usar IndicatorCreate
};
//--- parâmetros de entrada
input Creation type=Call_iSAR; // tipo de função
input double step=0.02; // passo - o fator de aceleração para arra
input double maximum=0.2; // máximo valor do passo
input string symbol=" "; // símbolo
input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // timeframe
//--- buffers do indicador
double iSARBuffer[];
//--- variável para armazenar o manipulador do indicator iSAR
int handle;
//--- variável para armazenamento
string name=symbol;
//--- nome do indicador num gráfico
string short_name;
//--- manteremos o número de valores no indicador Parabolic SAR
int bars_calculated=0;
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado |
//+------------------------------------------------------------------+
int OnInit()
{
//--- atribuição de array para buffer do indicador
SetIndexBuffer(0,iSARBuffer,INDICATOR_DATA);
//--- definir um código de símbolo do conjunto de caracteres Wingdings para a propriedade PLOT_ARRO
PlotIndexSetInteger(0,PLOT_ARROW,159);
//--- determinar o símbolo do indicador, é desenhado para
name=symbol;
//--- excluir os espaços à direita e à esquerda
StringTrimRight(name);
StringTrimLeft(name);
//--- se resulta em comprimento zero da string do 'name'
if(StringLen(name)==0)
{
{
//--- número de valores copiados a partir do indicador iSAR
int values_to_copy;
//--- determinar o número de valores calculados no indicador
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat("BarsCalculated() retornando %d, código de erro %d",calculated,GetLastError());
return(0);
}
//--- se for o princípio do cálculo do indicador, ou se o número de valores é modificado no indicad
//--- ou se é necessário cálculo do indicador para duas ou mais barras (isso significa que algo mud
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//--- se o array iSARBuffer é maior do que o número de valores no indicador iSAR para o símbo
//--- caso contrário, copiamos menor do que o tamanho dos buffers do indicador
if(calculated>rates_total) values_to_copy=rates_total;
else values_to_copy=calculated;
}
else
{
//--- isso significa que não é a primeira vez do cálculo do indicador, é desde a última chama
//--- para o cálculo não mais do que uma barra é adicionada
values_to_copy=(rates_total-prev_calculated)+1;
}
//--- preencher os arrays com valores do indicador iSAR
//--- se FillArrayFromBuffer retorna falso, significa que a informação não está pronta ainda, sair
if(!FillArrayFromBuffer(iSARBuffer,handle,values_to_copy)) return(0);
//--- formar a mensagem
string comm=StringFormat("%s ==> Valor atualizado no indicador %s: %d",
TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS),
short_name,
values_to_copy);
//--- exibir a mensagem de serviço no gráfico
Comment(comm);
//--- memorizar o número de valores no indicador SAR
bars_calculated=calculated;
//--- retorna o valor prev_calculated para a próxima chamada
return(rates_total);
}
//+------------------------------------------------------------------+
//| Preencher buffers do indicador a partir do indicador iSAR |
//+------------------------------------------------------------------+
bool FillArrayFromBuffer(double &sar_buffer[], // buffer do indicator para valores do Parabolic SA
int ind_handle, // manipulador do indicador iSAR
int amount // número de valores copiados
)
{
//--- redefinir o código de erro
ResetLastError();
//--- preencher uma parte do array iSARBuffer com valores do buffer do indicador que tem índice 0 (
if(CopyBuffer(ind_handle,0,0,amount,sar_buffer)<0)
{
//--- Se a cópia falhar, informe o código de erro
PrintFormat("Falha ao copiar dados do indicador iSAR, código de erro %d",GetLastError());
//--- parar com resultado zero - significa que indicador é considerado como não calculado
return(false);
}
//--- está tudo bem
return(true);
}
//+------------------------------------------------------------------+
//| Função de desinicialização do indicador |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(handle!=INVALID_HANDLE)
IndicatorRelease(handle);
//--- limpar o gráfico após excluir o indicador
Comment("");
}
iRSI
A função retorna o manipulador do indicador R elative Strength Index. T em apenas um buffer.
int iRSI(
string symbol, // símbolo nome
ENUM_TIMEFRAMES period, // período
int ma_period, // período médio
ENUM_APPLIED_PRICE applied_price // tipo de preço ou manipulador
);
Parâmetros
symbol
[in] O nome do símbolo de segurança, os dados que devem ser usados para calcular o indicador. O
valor NULL significa o símbolo atual.
period
[in] O valor do período pode ser um dos valores ENUM _TIMEFR AMES, 0 (zero) significa o prazo
corrente.
ma_period
[in] Período médio para cálculo do R S I.
applied_price
[in] O preço usado. Pode ser qualquer das constantes de preços ENUM _APPL IED_PRICE ou um
manipulador de outro indicador.
Valor de retorno
R etorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVAL ID_H ANDLE. A memória do computador pode ser liberada a partir de um indicador que não é
mais utilizado, usando a função IndicatorR elease(), onde o manipulador de indicador é transmitido.
Exemplo:
//+------------------------------------------------------------------+
//| 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 "O indicador demonstra como obter dados"
#property description "de buffers do indicador para o indicador técnico iRSI."
#property description "Um símbolo e o prazo utilizado para o cálculo do indicador,"
#property description "são definidos pelos parâmetros de símbolo e período."
#property description "O método de criação do manipulador é definido através do parâmetro "type" (t
#property description "Todos os outros parâmetros são similares ao padrão Relative Strength Index."
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1
//--- desenhando iRSI
#property indicator_label1 "iRSI"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrDodgerBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- limites para mostrar os valores na janela do indicador
#property indicator_maximum 100
#property indicator_minimum 0
//--- níveis horizontais na janela de indicador
#property indicator_level1 70.0
#property indicator_level2 30.0
//+------------------------------------------------------------------+
//| Enumerador dos métodos de criação do manipulador |
//+------------------------------------------------------------------+
enum Creation
{
Call_iRSI, // usar iRSI
Call_IndicatorCreate // usar IndicatorCreate
};
//--- parâmetros de entrada
input Creation type=Call_iRSI; // tipo de função
input int ma_period=14; // período da média móvel
input ENUM_APPLIED_PRICE applied_price=PRICE_CLOSE; // tipo de preço
input string symbol=" "; // símbolo
input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // timeframe
//--- buffer do indicador
double iRSIBuffer[];
//--- variável para armazenar o manipulador do indicator iRSI
int handle;
//--- variável para armazenamento
string name=symbol;
//--- nome do indicador num gráfico
string short_name;
//--- manteremos o número de valores no indicador Relative Strength Index
int bars_calculated=0;
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado |
//+------------------------------------------------------------------+
int OnInit()
{
//--- atribuição de array para buffer do indicador
SetIndexBuffer(0,iRSIBuffer,INDICATOR_DATA);
//--- determinar o símbolo do indicador, é desenhado para
name=symbol;
//--- excluir os espaços à direita e à esquerda
StringTrimRight(name);
StringTrimLeft(name);
//--- se resulta em comprimento zero da string do 'name'
if(StringLen(name)==0)
{
//--- tomar o símbolo do gráfico, o indicador está anexado para
name=_Symbol;
}
//--- criar manipulador do indicador
if(type==Call_iRSI)
handle=iRSI(name,period,ma_period,applied_price);
else
{
//--- preencher a estrutura com os parâmetros do indicador
MqlParam pars[2];
//--- período de média móvel
pars[0].type=TYPE_INT;
pars[0].integer_value=ma_period;
//--- limite do valor do passo que pode ser usado para os cálculos
pars[1].type=TYPE_INT;
pars[1].integer_value=applied_price;
handle=IndicatorCreate(name,period,IND_RSI,2,pars);
}
//--- se o manipulador não é criado
if(handle==INVALID_HANDLE)
{
//--- mensagem sobre a falha e a saída do código de erro
PrintFormat("Falha ao criar o manipulador do indicador iRSI para o símbolo %s/%s, código de e
name,
EnumToString(period),
GetLastError());
//--- o indicador é interrompido precocemente
return(INIT_FAILED);
}
//--- mostra que o símbolo/prazo do indicador Relative Strength Index é calculado para
short_name=StringFormat("iRSI(%s/%s, %d, %d)",name,EnumToString(period),
ma_period,applied_price);
IndicatorSetString(INDICATOR_SHORTNAME,short_name);
//--- inicialização normal do indicador
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
iRVI
A função retorna o manipulador do indicador R elative Vigor Index.
int iRVI(
string symbol, // símbolo nome
ENUM_TIMEFRAMES period, // período
int ma_period // período médio
);
Parâmetros
symbol
[in] O nome do símbolo de segurança, os dados que devem ser usados para calcular o indicador. O
valor NULL significa o símbolo atual.
period
[in] O valor do período pode ser um dos valores ENUM _TIMEFR AMES, 0 (zero) significa o prazo
corrente.
ma_period
[in] Período médio para cálculo do indicador RVI.
Valor de retorno
R etorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVAL ID_H ANDLE. A memória do computador pode ser liberada a partir de um indicador que não é
mais utilizado, usando a função IndicatorR elease(), onde o manipulador de indicador é transmitido.
Observação
Os números de buffer são os seguintes : 0 - MAIN_L INE, 1 - S IGNAL _L INE.
Exemplo:
//+------------------------------------------------------------------+
//| 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 "O indicador demonstra como obter dados"
#property description "de buffers do indicador para o indicador técnico iRVI."
#property description "Um símbolo e o prazo utilizado para o cálculo do indicador,"
#property description "são definidos pelos parâmetros de símbolo e período."
#property description "O método de criação do manipulador é definido através do parâmetro "type" (t
#property description "Todos os outros parâmetros são similares ao padrão Relative Vigor Index."
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots 2
//--- plotar RVI
#property indicator_label1 "RVI"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrGreen
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- plotar Signal
#property indicator_label2 "Signal"
#property indicator_type2 DRAW_LINE
#property indicator_color2 clrRed
#property indicator_style2 STYLE_SOLID
#property indicator_width2 1
//+------------------------------------------------------------------+
//| Enumerador dos métodos de criação do manipulador |
//+------------------------------------------------------------------+
enum Creation
{
Call_iRVI, // usar iRVI
Call_IndicatorCreate // usar IndicatorCreate
};
//--- parâmetros de entrada
input Creation type=Call_iRVI; // tipo de função
input int ma_period=10; // período para cálculos
input string symbol=" "; // símbolo
input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // timeframe
//--- buffers do indicador
double RVIBuffer[];
double SignalBuffer[];
//--- variável para armazenar o manipulador do indicator iRVI
int handle;
//--- variável para armazenamento
string name=symbol;
//--- nome do indicador num gráfico
string short_name;
//--- manteremos o número de valores no indicador Relative Vigor Index
int bars_calculated=0;
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado |
//+------------------------------------------------------------------+
int OnInit()
{
//--- atribuição de arrays para buffers do indicador
SetIndexBuffer(0,RVIBuffer,INDICATOR_DATA);
SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);
//--- determinar o símbolo do indicador, é desenhado para
name=symbol;
//--- excluir os espaços à direita e à esquerda
StringTrimRight(name);
StringTrimLeft(name);
//--- se resulta em comprimento zero da string do 'name'
if(StringLen(name)==0)
{
//--- tomar o símbolo do gráfico, o indicador está anexado para
name=_Symbol;
}
//--- criar manipulador do indicador
if(type==Call_iRVI)
handle=iRVI(name,period,ma_period);
else
{
//--- preencher a estrutura com os parâmetros do indicador
MqlParam pars[1];
//--- período para cálculos
pars[0].type=TYPE_INT;
pars[0].integer_value=ma_period;
handle=IndicatorCreate(name,period,IND_RVI,1,pars);
}
//--- se o manipulador não é criado
if(handle==INVALID_HANDLE)
{
//--- mensagem sobre a falha e a saída do código de erro
PrintFormat("Falha ao criar o manipulador do indicador iRVI para o símbolo %s/%s, código de e
name,
EnumToString(period),
GetLastError());
//--- o indicador é interrompido precocemente
return(INIT_FAILED);
}
//--- mostra que o símbolo/prazo do indicador Relative Vigor Index é calculado para
short_name=StringFormat("iRVI(%s/%s, %d, %d)",name,EnumToString(period),ma_period);
IndicatorSetString(INDICATOR_SHORTNAME,short_name);
//--- inicialização normal do indicador
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
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[])
{
//--- número de valores copiados a partir do indicador iRVI
int values_to_copy;
//--- determinar o número de valores calculados no indicador
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat("BarsCalculated() retornando %d, código de erro %d",calculated,GetLastError());
return(0);
}
//--- se for o princípio do cálculo do indicador, ou se o número de valores é modificado no indicad
//--- ou se é necessário cálculo do indicador para duas ou mais barras (isso significa que algo mud
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//--- se o array RVIBuffer é maior do que o número de valores no indicador iRVI para o símbol
//--- caso contrário, copiamos menor do que o tamanho dos buffers do indicador
if(calculated>rates_total) values_to_copy=rates_total;
else values_to_copy=calculated;
}
else
{
//--- isso significa que não é a primeira vez do cálculo do indicador, é desde a última chama
//--- para o cálculo não mais do que uma barra é adicionada
values_to_copy=(rates_total-prev_calculated)+1;
}
//--- preencher o array com valores do indicador iRVI
//--- se FillArrayFromBuffer retorna falso, significa que a informação não está pronta ainda, sair
if(!FillArrayFromBuffer(RVIBuffer,SignalBuffer,handle,values_to_copy)) return(0);
//--- formar a mensagem
string comm=StringFormat("%s ==> Valor atualizado no indicador %s: %d",
TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS),
short_name,
values_to_copy);
//--- exibir a mensagem de serviço no gráfico
Comment(comm);
//--- memorizar o número de valores no indicador Relative Vigor Index
bars_calculated=calculated;
//--- retorna o valor prev_calculated para a próxima chamada
return(rates_total);
}
//+------------------------------------------------------------------+
//| Preencher buffers do indicador a partir do indicador iRVI |
//+------------------------------------------------------------------+
bool FillArrayFromBuffer(double &rvi_buffer[], // buffer do indicator para valores do Relative
double &signal_buffer[], // buffer do indicator da linha de sinal
int ind_handle, // manipulador do indicador iRVI
int amount // número de valores copiados
)
{
iStdDev
A função retorna o manipulador do indicador Standard Deviation. T em apenas um buffer.
int iStdDev(
string symbol, // símbolo nome
ENUM_TIMEFRAMES period, // período
int ma_period, // período médio
int ma_shift, // deslocamento horizontal
ENUM_MA_METHOD ma_method, // tipo suavizado
ENUM_APPLIED_PRICE applied_price // tipo de preço ou manipulador
);
Parâmetros
symbol
[in] O nome do símbolo de segurança, os dados que devem ser usados para calcular o indicador. O
valor NULL significa o símbolo atual.
period
[in] O valor do período pode ser um dos valores ENUM _TIMEFR AMES, 0 (zero) significa o prazo
corrente.
ma_period
[in] Período médio para cálculos do indicador.
ma_shift
[in] Deslocamento do indicador relativo ao gráfico de preços.
ma_method
[in] T ipo de média. Pode ser qualquer um dos valores do ENUM _MA_METH OD.
applied_price
[in] O preço usado. Pode ser qualquer das constantes de preços ENUM _APPL IED_PRICE ou um
manipulador de outro indicador.
Valor de retorno
R etorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVAL ID_H ANDLE. A memória do computador pode ser liberada a partir de um indicador que não é
mais utilizado, usando a função IndicatorR elease(), onde o manipulador de indicador é transmitido.
Exemplo:
//+------------------------------------------------------------------+
//| 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
//--- plotar iStdDev
#property indicator_label1 "iStdDev"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrMediumSeaGreen
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//+------------------------------------------------------------------+
//| Enumerador dos métodos de criação do manipulador |
//+------------------------------------------------------------------+
enum Creation
{
Call_iStdDev, // usar iStdDev
Call_IndicatorCreate // usar IndicatorCreate
};
//--- parâmetros de entrada
input Creation type=Call_iStdDev; // tipo de função
input int ma_period=20; // período médio
input int ma_shift=0; // deslocamento
input ENUM_MA_METHOD ma_method=MODE_SMA; // tipo de suavização
input ENUM_APPLIED_PRICE applied_price=PRICE_CLOSE; // tipo de preço
input string symbol=" "; // símbolo
input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // timeframe
//--- buffer do indicador
double iStdDevBuffer[];
//--- variável para armazenar o manipulador do indicator iStdDev
int handle;
//--- variável para armazenamento
string name=symbol;
//--- nome do indicador num gráfico
string short_name;
//--- manteremos o número de valores no indicador Standard Deviation
int bars_calculated=0;
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado |
//+------------------------------------------------------------------+
int OnInit()
{
//--- atribuição de array para buffer do indicador
SetIndexBuffer(0,iStdDevBuffer,INDICATOR_DATA);
iStochastic
A função retorna o manipulador do indicador Stochastic Oscillator.
int iStochastic(
string symbol, // símbolo nome
ENUM_TIMEFRAMES period, // período
int Kperiod, // K-period (número de barras para cálculos)
int Dperiod, // D-period (período da primeira suavização)
int slowing, // final da suavização
ENUM_MA_METHOD ma_method, // tipo de suavização
ENUM_STO_PRICE price_field // método de cálculo estocástico
);
Parâmetros
symbol
[in] O nome do símbolo de segurança, os dados que devem ser usados para calcular o indicador. O
valor NULL significa o símbolo atual.
period
[in] O valor do período pode ser um dos valores ENUM _TIMEFR AMES, 0 (zero) significa o prazo
corrente.
Kperiod
[in] Período médio (barras contadas) para o cálculo da linha K%.
Dperiod
[in] Período médio (barras contadas) para o cálculo da linha %D.
slowing
[in] Valor da desaceleração.
ma_method
[in] T ipo de média. Pode ser qualquer um dos valores do ENUM _MA_METH OD.
price_field
[in] Parâmetros de seleção de preço para cálculos. Pode ser um dos valoresENUM _S T O_PRICE.
Valor de retorno
R etorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVAL ID_H ANDLE. A memória do computador pode ser liberada a partir de um indicador que não é
mais utilizado, usando a função IndicatorR elease(), onde o manipulador de indicador é transmitido.
Observação
O número de buffer: 0 - MAIN_L INE, 1 - S IGNAL _L INE.
Exemplo:
//+------------------------------------------------------------------+
//| Demo_iStochastic.mq5 |
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots 2
//--- plotar Stochastic
#property indicator_label1 "Stochastic"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrLightSeaGreen
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- plotar Signal
#property indicator_label2 "Signal"
#property indicator_type2 DRAW_LINE
#property indicator_color2 clrRed
#property indicator_style2 STYLE_SOLID
#property indicator_width2 1
//--- definir o limite dos valores do indicador
#property indicator_minimum 0
#property indicator_maximum 100
//--- níveis horizontais na janela de indicador
#property indicator_level1 -100.0
#property indicator_level2 100.0
//+------------------------------------------------------------------+
//| Enumerador dos métodos de criação do manipulador |
//+------------------------------------------------------------------+
enum Creation
{
Call_iStochastic, // usar iStochastic
Call_IndicatorCreate // usar IndicatorCreate
};
//--- parâmetros de entrada
input Creation type=Call_iStochastic; // tipo de função
input int Kperiod=5; // o período K ( o número de barras para cálc
input int Dperiod=3; // o período D (o período da suavização primá
input int slowing=3; // período final da suavização
input ENUM_MA_METHOD ma_method=MODE_SMA; // tipo de suavização
input ENUM_STO_PRICE price_field=STO_LOWHIGH; // método de cálculo do Estocástico
pars[3].type=TYPE_INT;
pars[3].integer_value=ma_method;
//--- método de cálculo do Estocástico
pars[4].type=TYPE_INT;
pars[4].integer_value=price_field;
handle=IndicatorCreate(name,period,IND_STOCHASTIC,5,pars);
}
//--- se o manipulador não é criado
if(handle==INVALID_HANDLE)
{
//--- mensagem sobre a falha e a saída do código de erro
PrintFormat("Falha ao criar o manipulador do indicador para o símbolo %s/%s, código de erro %
name,
EnumToString(period),
GetLastError());
//--- o indicador é interrompido precocemente
return(INIT_FAILED);
}
//--- mostra que o símbolo/prazo do indicador Stochastic Oscillator é calculado para
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);
//--- inicialização normal do indicador
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
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[])
{
//--- número de valores copiados a partir do indicador iStochastic
int values_to_copy;
//--- determinar o número de valores calculados no indicador
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat("BarsCalculated() retornando %d, código de erro %d",calculated,GetLastError());
return(0);
}
//--- se for o princípio do cálculo do indicador, ou se o número de valores é modificado no indicad
//--- ou se é necessário cálculo do indicador para duas ou mais barras (isso significa que algo mud
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//--- se o array StochasticBuffer é maior do que o número de valores no indicador iStochastic
//--- caso contrário, copiamos menor do que o tamanho dos buffers do indicador
if(calculated>rates_total) values_to_copy=rates_total;
else values_to_copy=calculated;
}
else
{
//--- isso significa que não é a primeira vez do cálculo do indicador, é desde a última chama
//--- para o cálculo não mais do que uma barra é adicionada
values_to_copy=(rates_total-prev_calculated)+1;
}
//--- preencher os arrays com valores do indicador iStochastic
//--- se FillArraysFromBuffer retorna falso, isto significa que a informação ainda não está pronta,
if(!FillArraysFromBuffers(StochasticBuffer,SignalBuffer,handle,values_to_copy)) return(0);
//--- formar a mensagem
string comm=StringFormat("%s ==> Valor atualizado no indicador %s: %d",
TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS),
short_name,
values_to_copy);
//--- exibir a mensagem de serviço no gráfico
Comment(comm);
//--- memorizar o número de valores no indicador Stochastic Oscillator
bars_calculated=calculated;
//--- retorna o valor prev_calculated para a próxima chamada
return(rates_total);
}
//+------------------------------------------------------------------+
//| Preencher buffers do indicador a partir do indicador iStochastic |
//+------------------------------------------------------------------+
bool FillArraysFromBuffers(double &main_buffer[], // buffer do indicador dos valores do Stochast
double &signal_buffer[], // buffer do indicator da linha de sinal
int ind_handle, // manipulador do indicador iStochastic
int amount // número de valores copiados
)
{
//--- redefinir o código de erro
ResetLastError();
//--- preencher uma parte do array StochasticBuffer com valores do buffer do indicador que tem índi
if(CopyBuffer(ind_handle,MAIN_LINE,0,amount,main_buffer)<0)
{
//--- Se a cópia falhar, informe o código de erro
PrintFormat("Falha ao copiar dados do indicador iStochastic, código de erro %d",GetLastError(
//--- parar com resultado zero - significa que indicador é considerado como não calculado
return(false);
}
//--- preencher uma parte do array SignalBuffer com valores do buffer do indicador que tem índice 1
if(CopyBuffer(ind_handle,SIGNAL_LINE,0,amount,signal_buffer)<0)
{
//--- Se a cópia falhar, informe o código de erro
PrintFormat("Falha ao copiar dados do indicador iStochastic, código de erro %d",GetLastError(
//--- parar com resultado zero - significa que indicador é considerado como não calculado
return(false);
}
//--- está tudo bem
return(true);
}
//+------------------------------------------------------------------+
//| Função de desinicialização do indicador |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(handle!=INVALID_HANDLE)
IndicatorRelease(handle);
//--- limpar o gráfico após excluir o indicador
Comment("");
}
iTEMA
A função retorna o manipulador do indicador T riple Exponential Moving Average. T em apenas um
buffer.
int iTEMA(
string symbol, // símbolo nome
ENUM_TIMEFRAMES period, // período
int ma_period, // período médio
int ma_shift, // deslocamento horizontal indicador
ENUM_APPLIED_PRICE applied_price // tipo de preço ou manipulador
);
Parâmetros
symbol
[in] O nome do símbolo de segurança, os dados que devem ser usados para calcular o indicador. O
valor NULL significa o símbolo atual.
period
[in] O valor do período pode ser um dos valores ENUM _TIMEFR AMES, 0 (zero) significa o prazo
corrente.
ma_period
[in] Período médio (barras contadas) para cálculo.
ma_shift
[in] Deslocamento do indicador relativo à tabela de preços.
applied_price
[in] O preço usado. Pode ser qualquer das constantes de preços ENUM _APPL IED_PRICE ou um
manipulador de outro indicador.
Valor de retorno
R etorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVAL ID_H ANDLE. A memória do computador pode ser liberada a partir de um indicador que não é
mais utilizado, usando a função IndicatorR elease(), onde o manipulador de indicador é transmitido.
Exemplo:
//+------------------------------------------------------------------+
//| 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 "O indicador demonstra como obter dados"
#property description "de buffers do indicador para o indicador técnico iTEMA."
#property description "Um símbolo e o prazo utilizado para o cálculo do indicador,"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1
//--- plotar iTEMA
#property indicator_label1 "iTEMA"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//+------------------------------------------------------------------+
//| Enumerador dos métodos de criação do manipulador |
//+------------------------------------------------------------------+
enum Creation
{
Call_iTEMA, // usar iTEMA
Call_IndicatorCreate // usar IndicatorCreate
};
//--- parâmetros de entrada
input Creation type=Call_iTEMA; // tipo de função
input int ma_period=14; // período médio
input int ma_shift=0; // deslocamento
input ENUM_APPLIED_PRICE applied_price=PRICE_CLOSE; // tipo de preço
input string symbol=" "; // símbolo
input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // timeframe
//--- buffer do indicador
double iTEMABuffer[];
//--- variável para armazenar o manipulador do indicator Triple Exponential Moving Average
int handle;
//--- variável para armazenamento
string name=symbol;
//--- nome do indicador num gráfico
string short_name;
//--- manteremos o número de valores no indicador Triple Exponential Moving Average
int bars_calculated=0;
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado |
//+------------------------------------------------------------------+
int OnInit()
{
//--- atribuição de array para buffer do indicador
SetIndexBuffer(0,iTEMABuffer,INDICATOR_DATA);
//--- definir deslocamento
PlotIndexSetInteger(0,PLOT_SHIFT,ma_shift);
//--- determinar o símbolo do indicador, é desenhado para
name=symbol;
//+------------------------------------------------------------------+
//| Preencher buffers do indicador a partir do indicador iTEMA |
//+------------------------------------------------------------------+
bool FillArrayFromBuffer(double &tema_buffer[], // buffer do indicator para valores do Triple Expon
int t_shift, // deslocamento da linha
int ind_handle, // manipulador do indicador iTEMA
int amount // número de valores copiados
)
{
//--- redefinir o código de erro
ResetLastError();
//--- preencher uma parte do array iTEMABuffer com valores do buffer do indicador que tem índice 0
if(CopyBuffer(ind_handle,0,-t_shift,amount,tema_buffer)<0)
{
//--- Se a cópia falhar, informe o código de erro
PrintFormat("Falha ao copiar dados do indicador iTEMA, código de erro %d",GetLastError());
//--- parar com resultado zero - significa que indicador é considerado como não calculado
return(false);
}
//--- está tudo bem
return(true);
}
//+------------------------------------------------------------------+
//| Função de desinicialização do indicador |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(handle!=INVALID_HANDLE)
IndicatorRelease(handle);
//--- limpar o gráfico após excluir o indicador
Comment("");
}
iTriX
A função retorna o manipulador do indicador T riple Exponential Moving Averages Oscillator. T em
apenas um buffer.
int iTriX(
string symbol, // símbolo nome
ENUM_TIMEFRAMES period, // período
int ma_period, // período médio
ENUM_APPLIED_PRICE applied_price // tipo de preço ou manipulador
);
Parâmetros
symbol
[in] O nome do símbolo de segurança, os dados que devem ser usados para calcular o indicador. O
valor NULL significa o símbolo atual.
period
[in] O valor do período pode ser um dos valores ENUM _TIMEFR AMES, 0 (zero) significa o prazo
corrente.
ma_period
[in] Período médio (barras contadas) para cálculos.
applied_price
[in] O preço usado. Pode ser qualquer das constantes de preços ENUM _APPL IED_PRICE ou um
manipulador de outro indicador.
Valor de retorno
R etorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVAL ID_H ANDLE. A memória do computador pode ser liberada a partir de um indicador que não é
mais utilizado, usando a função IndicatorR elease(), onde o manipulador de indicador é transmitido.
Exemplo:
//+------------------------------------------------------------------+
//| 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 "O indicador demonstra como obter dados"
#property description "de buffers do indicador para o indicador técnico iTriX."
#property description "Um símbolo e o prazo utilizado para o cálculo do indicador,"
#property description "são definidos pelos parâmetros de símbolo e período."
#property description "O método de criação do manipulador é definido através do parâmetro "type" (t
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1
//--- plotar iTriX
#property indicator_label1 "iTriX"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//+------------------------------------------------------------------+
//| Enumerador dos métodos de criação do manipulador |
//+------------------------------------------------------------------+
enum Creation
{
Call_iTriX, // usar iTriX
Call_IndicatorCreate // usar IndicatorCreate
};
//--- parâmetros de entrada
input Creation type=Call_iTriX; // tipo de função
input int ma_period=14; // período
input ENUM_APPLIED_PRICE applied_price=PRICE_CLOSE; // tipo de preço
input string symbol=" "; // símbolo
input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // timeframe
//--- buffer do indicador
double iTriXBuffer[];
//--- variável para armazenar o manipulador do indicator iTriX
int handle;
//--- variável para armazenamento
string name=symbol;
//--- nome do indicador num gráfico
string short_name;
//--- manteremos o número de valores no indicador Triple Exponential Moving Averages Oscillator
int bars_calculated=0;
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado |
//+------------------------------------------------------------------+
int OnInit()
{
//--- atribuição de array para buffer do indicador
SetIndexBuffer(0,iTriXBuffer,INDICATOR_DATA);
//--- determinar o símbolo do indicador, é desenhado para
name=symbol;
//--- excluir os espaços à direita e à esquerda
StringTrimRight(name);
StringTrimLeft(name);
//--- se resulta em comprimento zero da string do 'name'
if(StringLen(name)==0)
{
//--- tomar o símbolo do gráfico, o indicador está anexado para
name=_Symbol;
}
//--- criar manipulador do indicador
if(type==Call_iTriX)
handle=iTriX(name,period,ma_period,applied_price);
else
{
//--- preencher a estrutura com os parâmetros do indicador
MqlParam pars[2];
//--- período
pars[0].type=TYPE_INT;
pars[0].integer_value=ma_period;
//--- tipo de preço
pars[1].type=TYPE_INT;
pars[1].integer_value=applied_price;
handle=IndicatorCreate(name,period,IND_TRIX,2,pars);
}
//--- se o manipulador não é criado
if(handle==INVALID_HANDLE)
{
//--- mensagem sobre a falha e a saída do código de erro
PrintFormat("Falha ao criar o manipulador do indicador iTriX para o símbolo %s/%s, código de
name,
EnumToString(period),
GetLastError());
//--- o indicador é interrompido precocemente
return(INIT_FAILED);
}
//--- mostra que o símbolo/prazo do indicador Triple Exponential Moving Averages Oscillator é calcu
short_name=StringFormat("iTriX(%s/%s, %d, %s)",name,EnumToString(period),
ma_period,EnumToString(applied_price));
IndicatorSetString(INDICATOR_SHORTNAME,short_name);
//--- inicialização normal do indicador
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
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[])
{
//--- número de valores copiados a partir do indicador iTriX
int values_to_copy;
//--- determinar o número de valores calculados no indicador
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat("BarsCalculated() retornando %d, código de erro %d",calculated,GetLastError());
return(0);
}
//--- se for o princípio do cálculo do indicador, ou se o número de valores é modificado no indicad
//--- ou se é necessário cálculo do indicador para duas ou mais barras (isso significa que algo mud
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//--- se o array iTriXBuffer é maior do que o número de valores no indicador iTriX para o sím
//--- caso contrário, copiamos menor do que o tamanho dos buffers do indicador
if(calculated>rates_total) values_to_copy=rates_total;
else values_to_copy=calculated;
}
else
{
//--- isso significa que não é a primeira vez do cálculo do indicador, é desde a última chama
//--- para o cálculo não mais do que uma barra é adicionada
values_to_copy=(rates_total-prev_calculated)+1;
}
//--- preencher o array com valores do indicador Triple Exponential Moving Averages Oscillator
//--- se FillArrayFromBuffer retorna falso, significa que a informação não está pronta ainda, sair
if(!FillArrayFromBuffer(iTriXBuffer,handle,values_to_copy)) return(0);
//--- formar a mensagem
string comm=StringFormat("%s ==> Valor atualizado no indicador %s: %d",
TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS),
short_name,
values_to_copy);
//--- exibir a mensagem de serviço no gráfico
Comment(comm);
//--- memorizar o número de valores no indicador Triple Exponential Moving Averages Oscillator
bars_calculated=calculated;
//--- retorna o valor prev_calculated para a próxima chamada
return(rates_total);
}
//+------------------------------------------------------------------+
//| Preencher buffers do indicador a partir do indicador iTriX |
//+------------------------------------------------------------------+
bool FillArrayFromBuffer(double &trix_buffer[], // buffer do indicator para valores do Triple Expon
int ind_handle, // manipulador do indicador iTriX
int amount // número de valores copiados
)
{
//--- redefinir o código de erro
ResetLastError();
//--- preencher uma parte do array iTriXBuffer com valores do buffer do indicador que tem índice 0
if(CopyBuffer(ind_handle,0,0,amount,trix_buffer)<0)
{
//--- Se a cópia falhar, informe o código de erro
PrintFormat("Falha ao copiar dados do indicador iTriX, código de erro %d",GetLastError());
//--- parar com resultado zero - significa que indicador é considerado como não calculado
return(false);
}
//--- está tudo bem
return(true);
}
//+------------------------------------------------------------------+
//| Função de desinicialização do indicador |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(handle!=INVALID_HANDLE)
IndicatorRelease(handle);
//--- limpar o gráfico após excluir o indicador
Comment("");
}
iW PR
A função retorna o manipulador do indicador Larry W illiams ' Percent R ange. T em apenas um buffer.
int iWPR(
string symbol, // símbolo nome
ENUM_TIMEFRAMES period, // período
int calc_period // período médio
);
Parâmetros
symbol
[in] O nome do símbolo de segurança, os dados que devem ser usados para calcular o indicador. O
valor NULL significa o símbolo atual.
period
[in] O valor do período pode ser um dos valores ENUM _TIMEFR AMES, 0 (zero) significa o prazo
corrente.
calc_period
[in] Período (barras contadas) para cálculo do indicador.
Valor de retorno
R etorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVAL ID_H ANDLE. A memória do computador pode ser liberada a partir de um indicador que não é
mais utilizado, usando a função IndicatorR elease(), onde o manipulador de indicador é transmitido.
Exemplo:
//+------------------------------------------------------------------+
//| 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 "O indicador demonstra como obter dados"
#property description "de buffers do indicador para o indicador técnico iWPR."
#property description "Um símbolo e o prazo utilizado para o cálculo do indicador,"
#property description "são definidos pelos parâmetros de símbolo e período."
#property description "O método de criação do manipulador é definido através do parâmetro "type" (t
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1
//--- plotar iWPR
#property indicator_label1 "iWPR"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrCyan
return(false);
}
//--- está tudo bem
return(true);
}
//+------------------------------------------------------------------+
//| Função de desinicialização do indicador |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(handle!=INVALID_HANDLE)
IndicatorRelease(handle);
//--- limpar o gráfico após excluir o indicador
Comment("");
}
iVIDyA
A função retorna o manipulador do indicador Variable Index Dynamic Average. T em apenas um buffer.
int iVIDyA(
string symbol, // símbolo nome
ENUM_TIMEFRAMES period, // período
int cmo_period, // período para indicador Chande Momentum
int ema_period, // período suavizado do indicador EMA
int ma_shift, // deslocamento horizontal no gráfico
ENUM_APPLIED_PRICE applied_price // tipo de preço ou manipulador
);
Parâmetros
symbol
[in] O nome do símbolo de segurança, os dados que devem ser usados para calcular o indicador. O
valor NULL significa o símbolo atual.
period
[in] O valor do período pode ser um dos valores ENUM _TIMEFR AMES, 0 (zero) significa o prazo
corrente.
cmo_period
[in] Período (barras contadas) para cálculo do indicador Chande Momentum Oscillator.
ema_period
[in] Período do indicador EMA (barras contadas) para cálculo do fator de suavização.
ma_shift
[in] Deslocamento do indicador relativo ao gráfico de preços.
applied_price
[in] O preço usado. Pode ser qualquer das constantes de preços ENUM _APPL IED_PRICE ou um
manipulador de outro indicador.
Valor de retorno
R etorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVAL ID_H ANDLE. A memória do computador pode ser liberada a partir de um indicador que não é
mais utilizado, usando a função IndicatorR elease(), onde o manipulador de indicador é transmitido.
Exemplo:
//+------------------------------------------------------------------+
//| 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
//--- plotar iVIDyA
#property indicator_label1 "iVIDyA"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//+------------------------------------------------------------------+
//| Enumerador dos métodos de criação do manipulador |
//+------------------------------------------------------------------+
enum Creation
{
Call_iVIDyA, // usar iVIDyA
Call_IndicatorCreate // usar IndicatorCreate
};
//--- parâmetros de entrada
input Creation type=Call_iVIDyA; // tipo de função
input int cmo_period=15; // o período do indicador Chande Momentum
input int ema_period=12; // período do fator de suavização
input int ma_shift=0; // deslocamento
input ENUM_APPLIED_PRICE applied_price=PRICE_CLOSE; // tipo de preço
input string symbol=" "; // símbolo
input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // timeframe
//--- buffer do indicador
double iVIDyABuffer[];
//--- variável para armazenar o manipulador do indicator iVIDyA
int handle;
//--- variável para armazenamento
string name=symbol;
//--- nome do indicador num gráfico
string short_name;
//--- manteremos o número de valores no indicador Variable Index Dynamic Average
int bars_calculated=0;
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado |
//+------------------------------------------------------------------+
int OnInit()
{
//--- atribuição de array para buffer do indicador
SetIndexBuffer(0,iVIDyABuffer,INDICATOR_DATA);
iVolumes
A função retorna o manipulador do indicador. T em apenas um buffer.
int iVolumes(
string symbol, // símbolo nome
ENUM_TIMEFRAMES period, // período
ENUM_APPLIED_VOLUME applied_volume // tipo de volume para o cálculo
)
Parâmetros
symbol
[in] O nome do símbolo de segurança, os dados que devem ser usados para calcular o indicador. O
valor NULL significa o símbolo atual.
period
[in] O valor do período pode ser um dos valores ENUM _TIMEFR AMES, 0 (zero) significa o prazo
corrente.
applied_volume
[in] O volume utilizado. Pode ser um dos valores ENUM _APPL IED_VOL UME.
Valor de retorno
R etorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVAL ID_H ANDLE. A memória do computador pode ser liberada a partir de um indicador que não é
mais utilizado, usando a função IndicatorR elease(), onde o manipulador de indicador é transmitido.
Exemplo:
//+------------------------------------------------------------------+
//| 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 "O indicador demonstra como obter dados"
#property description "de buffers do indicador para o indicador técnico iVolumes."
#property description "Um símbolo e o prazo utilizado para o cálculo do indicador,"
#property description "são definidos pelos parâmetros de símbolo e período."
#property description "O método de criação do manipulador é definido através do parâmetro "type" (t
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots 1
//--- plotar iVolumes
#property indicator_label1 "iVolumes"
#property indicator_type1 DRAW_COLOR_HISTOGRAM
#property indicator_color1 clrGreen, clrRed
{
//--- preencher a estrutura com os parâmetros do indicador
MqlParam pars[1];
//--- tipo de preço
pars[0].type=TYPE_INT;
pars[0].integer_value=applied_volume;
handle=IndicatorCreate(name,period,IND_VOLUMES,1,pars);
}
//--- se o manipulador não é criado
if(handle==INVALID_HANDLE)
{
//--- mensagem sobre a falha e a saída do código de erro
PrintFormat("Falha ao criar o manipulador do indicador iVolumes para o símbolo %s/%s, código
name,
EnumToString(period),
GetLastError());
//--- o indicador é interrompido precocemente
return(INIT_FAILED);
}
//--- mostra que o símbolo/prazo do indicador Volumes é calculado para
short_name=StringFormat("iVolumes(%s/%s, %s)",name,EnumToString(period),EnumToString(applied_vol
IndicatorSetString(INDICATOR_SHORTNAME,short_name);
//--- inicialização normal do indicador
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado |
//+------------------------------------------------------------------+
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[])
{
//--- número de valores copiados a partir do indicador
int values_to_copy;
//--- determinar o número de valores calculados no indicador
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat("BarsCalculated() retornando %d, código de erro %d",calculated,GetLastError());
return(0);
}
//--- se for o princípio do cálculo do indicador, ou se o número de valores é modificado no indicad
//--- ou se é necessário cálculo do indicador para duas ou mais barras (isso significa que algo mud
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//--- se o array iVolumesBuffer é maior do que o número de valores no indicador iVolumes para
//--- caso contrário, copiamos menor do que o tamanho dos buffers do indicador
if(calculated>rates_total) values_to_copy=rates_total;
else values_to_copy=calculated;
}
else
{
//--- isso significa que não é a primeira vez do cálculo do indicador, é desde a última chama
//--- para o cálculo não mais do que uma barra é adicionada
values_to_copy=(rates_total-prev_calculated)+1;
}
//--- preencher os arrays com valores do indicador iVolumes
//--- se FillArraysFromBuffer retorna falso, isto significa que a informação ainda não está pronta,
if(!FillArraysFromBuffers(iVolumesBuffer,iVolumesColors,handle,values_to_copy)) return(0);
//--- formar a mensagem
string comm=StringFormat("%s ==> Valor atualizado no indicador %s: %d",
TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS),
short_name,
values_to_copy);
//--- exibir a mensagem de serviço no gráfico
Comment(comm);
//--- memorizar o número de valores no indicador Volumes
bars_calculated=calculated;
//--- retorna o valor prev_calculated para a próxima chamada
return(rates_total);
}
//+------------------------------------------------------------------+
//| Preencher buffers do indicador a partir do indicador iVolumes |
//+------------------------------------------------------------------+
bool FillArraysFromBuffers(double &volume_buffer[], // buffer do indicator para valores do Volume
double &color_buffer[], // buffer do indicator de cores
int ind_handle, // manipulador do indicador iVolumes
int amount // número dos valores copiados
)
{
//--- redefinir o código de erro
ResetLastError();
//--- preencher uma parte do array iVolumesBuffer com valores do buffer do indicador que tem índice
if(CopyBuffer(ind_handle,0,0,amount,volume_buffer)<0)
{
//--- Se a cópia falhar, informe o código de erro
PrintFormat("Falha ao copiar dados do indicador iVolumes, código de erro %d",GetLastError());
//--- parar com resultado zero - significa que indicador é considerado como não calculado
return(false);
}
//--- preencher uma parte do array iVolumesColors com valores do buffer do indicador que tem índice
if(CopyBuffer(ind_handle,1,0,amount,color_buffer)<0)
{
//--- Se a cópia falhar, informe o código de erro
PrintFormat("Falha ao copiar dados do indicador iVolumes, código de erro %d",GetLastError());
//--- parar com resultado zero - significa que indicador é considerado como não calculado
return(false);
}
//--- está tudo bem
return(true);
}
//+------------------------------------------------------------------+
//| Função de desinicialização do indicador |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(handle!=INVALID_HANDLE)
IndicatorRelease(handle);
//--- limpar o gráfico após excluir o indicador
Comment("");
}
Quando você executa um Expert Advisor no testador de estratégia, você pode criar seu próprio
conjunto de dados com base nos tipos simples ou estruturas simples (não contêm strings, objetos de
classe ou objetos de arrays dinâmicas). Este conjunto de dados podem ser salvos utilizando a função
FrameAdd() numa estrutura especial chamando um quadro. Durante a otimização de um Expert
Advisor cada agente pode enviar uma série de quadros para o terminal. T odos os quadros recebidos
são gravados no arquivo *.MQD na pasta terminal_directory/MQL5/Files /T ester expert nomeada igual
ao Expert Advisor. Eles são escritos na ordem em que são recebidas dos agentes. O recebimento de
um quadro no terminal do cliente a partir de um agente de teste gera o evento T esterPass.
Os quadros podem ser armazenados na memória do computador e num arquivo com o nome
especifico. A linguagem MQL5 não estabelece limitações sobre o número de quadros.
Função Ação
FrameFirst Move um ponteiro de leitura de quadro para o
início e redefine previamente um conjunto de
filtros
Também Veja
T estando Estatísticas, Propriedades de Execução do Programa MQL5
FrameFirst
Move um ponteiro de leitura de quadro para o início e redefine um conjunto de filtros.
bool FrameFirst();
Valor do Retorno
R etorna true se bem sucedido, caso contrário false. Para obter informações sobre o erro, chamar a
função GetLastError().
FrameFilter
Define a estrutura do filtro de leitura e move o ponteiro para o início.
bool FrameFilter(
const string name, // Nome público/etiqueta
long id // ID Pública
);
Valor do Retorno
R etorna true se bem sucedido, caso contrário false. Para obter informações sobre o erro, chamar a
função GetLastError().
Observação
Se uma string vazia é passado como o primeiro parâmetro, o filtro funcionará apenas com um
parâmetro numérico, ou seja, apenas quadros com o id especifico serão vistos. Se o valor do
segundo parâmetro é ULONG_MAX, apenas o filtro de texto funcionará.
FrameNext
L ê um quadro e move o ponteiro para o próximo. Existem duas variantes da função.
bool FrameNext(
ulong& pass, // O número de uma passagem na otimização, durante o qual o quadro foi adici
string& name, // Nome público/etiqueta
long& id, // ID pública
double& value // Valor
);
bool FrameNext(
ulong& pass, // O número de uma passagem na otimização, durante o qual o quadro foi adici
string& name, // Nome público/etiqueta
long& id, // ID pública
double& value, // Valor
void& data[] // Array de qualquer tipo
);
Parâmetros
pass
[out] O número de um passe durante a otimização do testador de estratégia.
name
[out] O nome do identificador.
id
[out] O valor do identificador.
value
[out] Um valor numérico único.
data
[out] Uma array de qualquer tipo.
Valor do Retorno
R etorna true se bem sucedido, caso contrário false. Para obter informações sobre o erro, chamar a
função GetLastError().
Observação
Na segunda versão da chamada, você deve manipular corretamente os dados recebidos no array
data[].
FrameInputs
R ecebe parâmetros de entrada, no qual o quadro com o número especificado de passe é formado.
bool FrameInputs(
ulong pass, // O número de um passe na otimização
string& parameters[], // Um array de strings na forma "parameterN=valueN"
uint& parameters_count // O número total de parâmetros
);
Parâmetros
pass
[in] O número de um passe durante a otimização do testador de estratégia.
parameters
[out] Um array de uma string com a descrição de nomes e valores de parâmetros
parameters_count
[out] O número de elementos no array parameters[].
Valor do Retorno
R etorna true se bem sucedido, caso contrário false. Para obter informações sobre o erro, chamar a
função GetLastError().
Observação
T endo obtido o número de strings parameters_count no array parameters[], pode organizar um loop
para percorrer todos os registros. Isso ajudará você a encontrar os valores dos parâmetros de
entrada de um Expert Advisor para o número de passe especificado.
FrameAdd
Adicionar um quadro com dados. Existem duas variantes da função.
bool FrameAdd(
const string name, // Nome público/etiqueta
long id, // ID público
double value, // Valor
const string filename // Nome de um arquivo de dados
);
bool FrameAdd(
const string name, // Nome público/etiqueta
long id, // ID público
double value, // Valor
const void& data[] // Array de qualquer tipo
);
Parâmetros
name
[in] Etiqueta de um quadro Público. Ele pode ser usado para um filtro na função FrameFilter().
id
[in] Um identificador público do quadro. Ele pode ser usado para um filtro na função
FrameFilter().
value
[in] Um valor numérico para escrever no quadro. Ele é utilizado para transmitir um passe único
como resultado da função OnT ester().
filename
[in] O nome do arquivo que contém os dados para adicionar ao quadro. O arquivo deve ser
localizar na pasta MQL5/Files.
data
[in] Uma array de um tipo qualquer para escrever no quadro. Passado por referência.
Valor do Retorno
R etorna true se bem sucedido, caso contrário false. Para obter informações sobre o erro, chamar a
função GetLastError().
ParameterGetRange
R ecebe os dados na faixa de valores e o passo de alteração para uma variável de entrada ao otimizar
um Expert Advisor no T estador de Estratégia. Existem 2 variantes da função.
Parâmetros
name
[in] variável de entrada ID. Essas variáveis são parâmetros externos de uma aplicação. Seus
valores podem ser especificados quando do lançamento num gráfico ou durante um único teste.
enable
[out] Sinaliza que este parâmetro pode ser usado para enumerar os valores durante a otimização
no T estador de Estratégia.
value
[out] Valor do parâmetro.
start
[out] Valor do parâmetro inicial durante a otimização.
step
[out] Parâmetro altera o passo ao enumerar os seus valores.
stop
[out] Valor do parâmetro final durante a otimização.
Valor de retorno
R etorna true se bem sucedido, caso contrário false. Para obter informações sobre o erro, utilize a
função GetLastError().
Observação
A função pode ser chamado apenas pelos manipuladores OnT esterInit(), OnT esterPass() e
OnT esterDeinit(). Foi introduzida para receber os valores dos parâmetros de entrada do Expert
Advisor e faixas de variação durante a otimização no T estador de Estratégia.
Quando chamado em OnT esterInit(), os dados obtidos podem ser usados para redefinir as regras de
enumeração de qualquer variável de entrada usando ParameterSetR ange(). Portanto, novo Start,
Stop e valores do Step podem ser definidos no parâmetro de entrada e podem até mesmo serem
completamente excluídos a partir da otimização, independentemente das configurações do T estador
de Estratégia. Isto permite-lhe gerenciar a área dos parâmetros de entrada durante a otimização,
excluindo alguns parâmetros a partir da otimização de acordo com os valores dos parâmetros
fundamentais do Expert Advisor.
Exemplo:
#property description "Expert Advisor para a demonstração da função ParameterGetRange()."
#property description "Deve ser lançado no modo de otimização do Testador de Estratégia"
//--- parâmetros de entrada
input int Input1=1;
input double Input2=2.0;
input bool Input3=false;
input ENUM_DAY_OF_WEEK Input4=SUNDAY;
//+------------------------------------------------------------------+
//| Função de inicialização do Expert |
//+------------------------------------------------------------------+
int OnInit()
{
//--- Expert Advisor é projetado para operação somente no Testador de Estratégia
if(!MQL5InfoInteger(MQL5_OPTIMIZATION))
{
MessageBox("Deve ser lançado no modo de otimização do Testador de Estratégia!");
//--- finalizar a operação do Expert Advisor com antecedência e remover do gráfico
return(INIT_FAILED);
}
//--- completada com sucesso a inicialização
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função TesterInit |
//+------------------------------------------------------------------+
void OnTesterInit()
{
//--- exemplo de parâmetros de entrada 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("Primeiro parâmetro");
PrintFormat("%s=%d habilitado=%s a partir de %d para %d com passo=%d",
name,par1,(string)enable,par1_start,par1_stop,par1_step);
//--- exemplo de parâmetros de entrada tipo double
name="Input2";
double par2,par2_start,par2_step,par2_stop;
ParameterGetRange(name,enable,par2,par2_start,par2_step,par2_stop);
Print("Segundo parâmetro");
PrintFormat("%s=%G habilitado=%s a partir de %G para %G com passo=%G",
name,par2,(string)enable,par2_start,par2_stop,par2_step);
ParameterSetRange
Especifica o uso de variável de entrada ao otimizar um Expert Advisor no T estador de Estratégia:
valor, mudança de passo, os valores iniciais e finais. Existem 2 variantes da função.
Parâmetros
name
[in] input ou sinput ID variável. Essas variáveis são parâmetros externos de uma aplicação. Seus
valores podem ser especificados quando iniciar o programa.
enable
[in] Ativar este parâmetro para enumerar os valores durante a otimização no T estador de
Estratégia.
value
[in] valor do parâmetro.
start
[in] Valor do parâmetro inicial durante a otimização.
step
[in] Alteração de parâmetro etapa ao enumerar seus valores.
stop
[in] Valor do parâmetro final durante a otimização.
Valor de retorno
R etorna true se bem sucedido, caso contrário false. Para obter informações sobre o erro, utilize a
função GetLastError().
Observação
A função só pode ser chamado pelo manipulador OnT esterInit() ao lançar otimização a partir do
T estador de Estratégia. Ele é projetado para especificar o alcance do parâmetro e alterar o passo. O
parâmetro pode ser completamente excluído da otimização, independentemente das configurações
do T estador de Estratégia. Ele também permite o uso de variáveis declaradas com modificador de
entrada no processo de otimização.
A função ParameterSetR ange() permite que você gerencie uma otimização Expert Advisor no
T estador de Estratégia dependendo dos valores de seus parâmetros fundamentais, incluindo ou
excluindo os parâmetros de entrada necess ários a partir da otimização e definir o intervalo
necess ário e o passo de mudança.
Funções de Eventos
Este grupo contém funções para trabalhar com eventos personalizados e eventos de timer. Além deste
grupo, há funções especiais para manipulação de eventos pré-definidos.
Função Ação
EventSetMillisecondT imer Inicia gerador de eventos de timer de alta
resolução com um período de menos de 1
segundo para o gráfico em curso
Também Veja
T ipos de Eventos de Gráficos
EventSetMillisecondTimer
A função indica ao terminal de cliente que eventos de timer devem ser gerados em intervalos
inferiores a um segundo, para este Expert Advisor ou aquele indicador.
bool EventSetMillisecondTimer(
int milliseconds // número de milissegundos
);
Parâmetros
milliseconds
[in] Número de milissegundos que definem a freqüência de eventos de timer.
Valor de retorno
No caso de sucesso na execução, retorna true, do contrário - false. Para receber um código de erro,
a função GetLastError() deverá ser utilizada.
Observação
Este recurso é projetado para os casos em que é necess ário timer de alta resolução. Em outras
palavras, eventos de timer devem ser recebidos com mais freqüência do que uma vez por segundo.
Se um timer convencional, com o período de mais de um segundo é o suficiente para você, use o
evento EventSetT imer().
O intervalo mínimo de 1000 milissegundos é usado no dispositivo para testar estratégia. Em geral,
quando o período do timer é reduzido, o tempo de teste é maior, então o manipulador de eventos de
timer é utilizado mais frequentemente. Ao trabalhar em modo de tempo real, os eventos de timer
são gerados não mais do que uma vez em 10-16 milissegundos, devido a limitações de hardware.
Normalmente, esta função será chamada pela função OnInit() ou no construtor de classe. Para
manipular eventos provenientes do timer, um Expert Advisor ou um indicador deve usar a função
OnT imer().
Cada Expert Advisor e cada indicador trabalha com o seu próprio timer, recebendo eventos
exclusivamente deste timer. Durante fechamento do aplicativo MQL5, o cronômetro é forçosamente
encerrado caso tenha sido criado, mas não foi desativado pela função EventKillT imer().
Apenas um timer pode ser utilizado para cada programa. Cada aplicativo MQL5 e gráfico tem sua
própria lista de eventos, onde todos os novos eventos são colocados. Se a lista já contém eventos
de T imer ou este evento está em fase de processamento, então o novo evento de T imer não é
adicionado a fila do aplicativo MQL5.
EventSetTimer
A função indica ao terminal do cliente que para este indicador ou Expert Advisor, eventos do timer
devem ser gerados com a periodicidade especificada.
bool EventSetTimer(
int seconds // número de segundos
);
Parâmetros
seconds
[in] Número de segundos que determinam a freqüência de ocorrência do evento timer.
Valor do Retorno
Em caso de sucesso retorna verdadeiro, caso contrário falso. A fim de obter o código de erro, a
função GetLastError() deve ser chamada.
Observação
Normalmente, esta função deve ser chamada a partir da função OnInit() ou de uma classe
construtor. A fim de manipular eventos provenientes do timer, o Expert Advisor deve ter a função
OnT imer().
T odo Expert Advisor, assim como todo indicador funciona com seu próprio timer e recebe eventos
apenas a partir dele. Assim quando um programa MQL5 deixa de funcionar, o timer é destruído
forçadamente se ele foi criado, mas ainda não foi desativado pela função EventKillT imer().
Para cada programa não mais de que um timer pode ser executado. Cada programa MQL5 e cada
gráfico tem a sua própria fila de eventos em que todos os eventos recentemente recebidos são
colocados. Se o evento T imer está presente ou está a ser processado, o novo evento de timer não
será colocado na fila do programa MQL5.
EventKillTimer
Especifica o terminal do cliente o que é necess ário para finalizar a geração de eventos do T imer.
void EventKillTimer();
Valor do Retorno
Sem valor de retorno.
Observação
Normalmente, esta função deve ser chamada a partir de uma função OnDeinit(), se a função
EventSetT imer() for chamada de OnInit(). Esta função também pode ser chamada para formar o
destruidor de classe, se a função EventSetT imer() foi chamada no construtor dessa classe.
T odo Expert Advisor, assim como todo indicador funciona com seu próprio timer e recebe eventos
apenas a partir dele. Assim quando programa MQL5 deixa de funcionar, o timer é destruído
forçadamente se ele foi criado, mas ainda não foi desativado pela função EventKillT imer().
EventChartCustom
A função gera um evento personalizado para o gráfico especificado.
bool EventChartCustom(
long chart_id, // identificador do evento recebendo gráfico
ushort custom_event_id, // identificador de evento
long lparam, // parâmetro do tipo long
double dparam, // parâmetro do tipo double
string sparam // parâmetro de string do evento
);
Parâmetros
chart_id
[in] Identificador gráfico. Significa o gráfico atual.
custom_event_id
[in] ID dos usuários do evento. Este identificador é automaticamente adicionado ao valor
CH ART EVENT_CUS T OM e convertido para o tipo integer.
lparam
[in] Evento parâmetro do tipo long passado para a função OnChartEvent.
dparam
[in] Evento parâmetro do tipo double passado para a função OnChartEvent.
sparam
[in] Evento parâmetro do tipo string passado para a função OnChartEvent. Se a string é maior do
que 63 caracteres, será truncado.
Valor do Retorno
R etorna verdadeiro se um evento personalizado foi colocada com sucesso na fila do gráfico de
eventos que recebe os eventos. Em caso de falha, ele retorna false. Use GetLastError() para obter o
código de erro.
Observação
Um Expert Advisor ou o indicador ligado a tabela especificada manipula o evento utilizando a função
OnChartEvent(int event_id, long & lparam, double& dparam, string & sparam).
Para cada tipo de evento, os parâmetros de entrada da função OnChartEvent() têm valores definidos
que são requeridos para o processamento deste evento. Os eventos e valores passados através destes
parâmetros são listados na tabela abaixo.
Exemplo:
//+------------------------------------------------------------------+
//| 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="Botão";
string labelID="Informação";
int broadcastEventID=5000;
//+------------------------------------------------------------------+
//| Função de inicialização do Expert |
//+------------------------------------------------------------------+
int OnInit()
{
//--- Criar um botão para enviar eventos personalizados
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,"Botão");
ObjectSetInteger(0,buttonID,OBJPROP_FONTSIZE,10);
ObjectSetInteger(0,buttonID,OBJPROP_SELECTABLE,0);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de Desinicialização do Expert |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
ObjectDelete(0,buttonID);
ObjectDelete(0,labelID);
}
//+------------------------------------------------------------------+
//| Função tick (ponto) de um Expert |
//+------------------------------------------------------------------+
void OnTick()
{
//---
}
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
const long &lparam,
const double &dparam,
const string &sparam)
{
//--- Verifique o evento pressionando um botão do mouse
if(id==CHARTEVENT_OBJECT_CLICK)
{
string clickedChartObject=sparam;
//--- Se você clicar sobre o objeto com o nome buttonID
if(clickedChartObject==buttonID)
{
//--- Estado do botão - pressionado ou não
bool selected=ObjectGetInteger(0,buttonID,OBJPROP_STATE);
//--- registrar uma mensagem de depuração
int i=0;
while(i<CHARTS_MAX) // Temos, certamente, não mais do que CHARTS_MAX abrindo grá
{
EventChartCustom(currChart,eventID,lparam,dparam,sparam);
currChart=ChartNext(currChart); // Recebemos um novo gráfico do anterior
if(currChart==-1) break; // Alcançado o final da lista de gráficos
i++;// Não esqueça de aumentar o contador
}
}
//+------------------------------------------------------------------+
Também Veja
Eventos do T erminal Cliente, Funções de Manipulação de Evento
Em algumas placas de vídeo, o modo com números de tipo double está desativado por padrão, o que
leva a o erro de compilação 5105. Para ativar o modo de suporte de números double, no texto do
programa OpenCl, é preciso adicionar a diretiva #pragma OPENCL EXT ENS ION cl_k hr_fp64 : enable.
No entanto, se a placa de vídeo não suportar double, a desativação dessa diretiva não irá ajudar.
É recomendado escrever o código-fonte OpenCL em arquivos CL separados, que podem então ser
ligados ao programa MQL5 usando variáveis de recursos.
Função Ação
CL H andleType R etorna o tipo do manipulador de OpenCL como
valor da enumeração
ENUM _OPENCL _H ANDLE_TYPE
CLSetKernelArgMemLocal
CLExecutionStatus
Também Veja
OpenCL, R ecursos
CLHandleType
R etorna o tipo de um manipulador de OpenCL como um valor do enumerador
ENUM _OPENCL _H ANDLE_TYPE.
ENUM_OPENCL_HANDLE_TYPE CLHandleType(
int handle // Manipulação de um objeto OpenCL
);
Parâmetros
handle
[in] Um manipulador para um objeto OpenCL : um contexto, um k ernel ou um programa OpenCL.
Valor do Retorno
O tipo de manipulador de OpenCL como valor do enumerador ENUM _OPENCL _H ANDLE_TYPE.
ENUM_OPENCL_HANDLE_TY PE
Identificador Descrição
OPENCL _INVAL ID Manipulador incorreto
CLGetInfoInteger
R etorna o valor de uma propriedade integer para um objeto ou dispositivo OpenCL.
long CLGetInfoInteger(
int handle, // O manipulador do objeto OpenCL ou o número do disposit
ENUM_OPENCL_PROPERTY_INTEGER prop // Propriedade solicitada
);
Parâmetros
handle
[in] Um manipulador para o objeto OpenCL ou o número do dispositivo OpenCL. A numeração dos
dispositivos OpenCL começa com um zero.
prop
[in] O tipo de uma propriedade solicitada do enumerador ENUM _OPENCL _PR OPERTY_INT EGER , o
valor que você deseja obter.
Valor do Retorno
O valor da propriedade, se for bem-sucedido ou -1 em caso de erro. Para obter informações sobre o
erro, utilize a função GetLastError().
ENUM_OPENCL_PROPERTY_INTEGER
O enumerador ENUM _CL _DEVICE_TYPE contém possíveis tipos de dispositivos que suportam OpenCL.
Você pode receber o tipo de dispositivo pelo seu número ou o manipulador do objeto OpenCL,
chamando CL GetInfoInteger(handle_or_deviceN, CL _DEVICE_TYPE).
ENUM_CL_DEVICE_TY PE
Identificador Descrição
CL _DEVICE_ACCELER AT OR Aceleradores OpenCL dedicados (por exemplo, a
IBM CELL Blade). Estes dispositivos se
comunicam com o processador hospedeiro
utilizando uma interconexão de periféricos,
como PCIe.
Exemplo:
void OnStart()
{
int cl_ctx;
//--- inicializar contexto OpenCL
if((cl_ctx=CLContextCreate(CL_USE_GPU_ONLY))==INVALID_HANDLE)
{
Print("OpenCL não encontrado");
return;
}
//--- Exibir informações sobre a plataforma
Print("Tipo OpenCL: ",EnumToString((ENUM_CL_DEVICE_TYPE)CLGetInfoInteger(cl_ctx,CL_DEVICE_TYPE))
Print("Fornecedor ID OpenCL: ",CLGetInfoInteger(cl_ctx,CL_DEVICE_VENDOR_ID));
Print("Unidades OpenCL: ",CLGetInfoInteger(cl_ctx,CL_DEVICE_MAX_COMPUTE_UNITS));
Print("Freqüência OpenCL: ",CLGetInfoInteger(cl_ctx,CL_DEVICE_MAX_CLOCK_FREQUENCY)," MHz");
Print("Memória global OpenCL: ",CLGetInfoInteger(cl_ctx,CL_DEVICE_GLOBAL_MEM_SIZE)," bytes");
Print("Memória local OpenCL: ",CLGetInfoInteger(cl_ctx,CL_DEVICE_LOCAL_MEM_SIZE)," bytes");
//--- free OpenCL context
CLContextFree(cl_ctx);
}
CLGetInfoString
R etorna valor string de uma propriedade para o objeto OpenCL ou dispositivo.
bool CLGetInfoString(
int handle, // Objeto manipulador de OpenCL ou número de dispositivo
ENUM_OPENCL_PROPERTY_STRING prop, // propriedade solicitada
string& value // string referenciada
);
Parâmetros
handle
[in] Objeto manipulador de OpenCL ou número de dispositivo OpenCL. A numeração dos
dispositivos OpenCL começa com um zero.
prop
[in] T ipo de propriedade requerida do enumerador ENUM _OPENCL _PR OPERTY_S TRING, o valor do
qual deve ser obtido.
value
[out] String para receber o valor da propriedade.
Valor de retorno
true se bem sucedido, caso contrário false. Para obter informações sobre o erro, utilize a função
GetLastError().
ENUM_OPENCL_PROPERTY_STRING
Identificador Descrição
CL _PLATFOR M _PR OFILE CL _PLATFOR M _PR OFILE - Perfil OpenCL. Nome do
perfil pode ser um dos seguintes valores :
· FULL _PR OFI LE - implementação suporta
OpenCL (funcionalidade é definida como a
parte da especificação do k ernel sem
necessidade de extens ões adicionais para o
apoio OpenCL);
· EM BEDDED_PR OFI LE - implementação
suporta OpenCL como um suplemento.
Perfil alterado é definido como um
subconjunto para cada versão OpenCL.
CL _PLATFOR M _EXT ENS IONS Lista de extens ões suportadas pela plataforma.
Nomes de extensão deve ser suportado por todos
os dispositivos relacionados com esta plataforma
Exemplo:
void OnStart()
{
int cl_ctx;
string str;
//--- inicializar contexto OpenCL
if((cl_ctx=CLContextCreate(CL_USE_GPU_ONLY))==INVALID_HANDLE)
{
Print("OpenCL não encontrado");
return;
}
CLContextCreate
Cria um contexto OpenCL e retorna seu manipulador.
int CLContextCreate(
int device // Número de série do dispositivo OpenCL ou macro
);
Parâmetro
device
[in] O número ordinal do dispositivo-OpenCL no sistema. Em vez de um número específico, você
pode especificar um dos seguintes valores :
Valor do Retorno
Um manipulador para o contexto OpenCL se for bem sucedido, caso contrário, -1. Para obter
informações sobre o erro, utilize a função GetLastError().
CLContextFree
R emove um contexto OpenCL.
void CLContextFree(
int context // Manipulador para um contexto OpenCL
);
Parâmetros
context
[in] Manipula o contexto OpenCL.
Valor do Retorno
Nenhum. No caso de um erro interno o valor do modificador _LastError. Para obter informações
sobre o erro, utilize a função GetLastError().
CLGetDeviceInfo
A função recebe a propriedade do dispositivo do driver OpenCL.
bool CLGetDeviceInfo(
int handle, // manipulador de dispositivo OpenCL
int property_id, // solicitado propriedade ID
uchar& data[], // array para recebimento de dados
uint& size // deslocamento na array de elementos, 0 por padrão
);
Parâmetros
manipulador
[in] OpenCL identificador de dispositivo ou identificador OpenCL criado pela função
CLContextCreate().
property_id
[in] ID da propriedade do dispositivo OpenCL que deve ser recebida. Os valores podem ser de um
dos predeterminados listados na tabela abaixo.
data[]
[out] O array para receber dados sobre a propriedade solicitada.
tamanho
[out] T amanho dos dados recebidos no array data[].
Valor de retorno
true se bem sucedido, caso contrário false. Para obter informações sobre o erro, utilize a função
GetLastError().
Observação
Para array unidimensionais, o número do elemento, com o qual a leitura de dados para a escrita
num buffer de OpenCL começa, é calculado tendo em conta os sinalizadores AS _SERIES.
Identificador Valor
CL _DEVICE_TYPE 0x 1000
CL _DEVICE_VENDOR_ID 0x 1001
CL _DEVICE_IMAGE2D_MAX_WIDTH 0x 1011
CL _DEVICE_IMAGE3D_MAX_WIDTH 0x 1013
CL _DEVICE_IMAGE3D_MAX_DEPTH 0x 1015
CL _DEVICE_MAX_SAMPLER S 0x 1018
CL _DEVICE_AVAILABLE 0x 1027
CL _DEVICE_COMPILER_AVAILABLE 0x 1028
CL _DEVICE_NAME 0x 102B
CL _DEVICE_VENDOR 0x 102C
CL _DEVICE_PLATFOR M 0x 1031
CL _DEVICE_DOUBLE_FP_CONFIG 0x 1032
CL _DEVICE_PARTITION_AFFINITY_DOMAIN 0x 1045
CL _DEVICE_PARTITION_TYPE 0x 1046
Exemplo:
void OnStart()
{
//---
int dCount= CLGetInfoInteger(0,CL_DEVICE_COUNT);
for(int i = 0; i<dCount; i++)
{
int clCtx=CLContextCreate(i);
if(clCtx == -1)
Print("ERRO na CLContextCreate");
string device;
CLGetInfoString(clCtx,CL_DEVICE_NAME,device);
Print(i,": ",device);
uchar data[1024];
uint size;
CLGetDeviceInfo(clCtx,CL_DEVICE_VENDOR,data,size);
Print("tamanho = ",size);
string str=CharArrayToString(data);
Print(str);
}
}
//--- Exemplo de entradas no diário Experts
// 2013.07.24 10:50:48 opencl (EURUSD,H1) 2: Advanced Micro Devices, Inc.
// 2013.07.24 10:50:48 opencl (EURUSD,H1) size = 32
// 2013.07.24 10:50:48 opencl (EURUSD,H1) Tahiti
// 2013.07.24 10:50:48 opencl (EURUSD,H1) Intel(R) Corporation
// 2013.07.24 10:50:48 opencl (EURUSD,H1) size = 21
// 2013.07.24 10:50:48 opencl (EURUSD,H1) 1: Intel(R) Core(TM) i7-3770 CPU @ 3.40G
// 2013.07.24 10:50:48 opencl (EURUSD,H1) NVIDIA Corporation
// 2013.07.24 10:50:48 opencl (EURUSD,H1) size = 19
// 2013.07.24 10:50:48 opencl (EURUSD,H1) 0: GeForce GTX 580
CLProgramCreate
Cria um programa OpenCL a partir de um código fonte.
int CLProgramCreate(
int context, // Manipulador para um contexto OpenCL
const string source // O código-fonte
);
Parâmetros
context
[in] Manipula o contexto OpenCL.
source
[in] String com o código-fonte do programa OpenCL.
Valor do Retorno
Um manipulador para um objeto OpenCL se for bem sucedido. Em caso de erro é retornado -1. Para
obter informações sobre o erro, utilize a função GetLastError().
Observação
Até o momento, são utilizados os seguintes códigos de erro:
· ERR_OPENCL _INVAL ID_H ANDLE – manipulador inv álido para lidar com o OpenCL contexto.
· ERR_INVAL ID_PAR AMET ER – parâmetro inv álido de string.
· ERR_NOT_ENOUGH_MEMORY – não há memória suficiente para concluir a operação.
· ERR_OPENCL _PR OGR AM _CR EAT E – erro interno do OpenCL ou erro de compilação.
Em alguns cartões gráficos, o trabalho com números do tipo double são desativados por padrão. Isso
pode levar ao erro de compilação 5105. Para ativar o suporte para os números de tipo duplo,
adicione a seguinte diretiva ao seu programa OpenCL : #pragma OPENCL EXT ENS ION cl_k hr_fp64 :
ativado
Exemplo:
//+------------------------------------------------------------------+
//| OpenCL kernel |
//+------------------------------------------------------------------+
const string
cl_src=
//--- por padrão alguns GPUs não suportam doubles
//--- a directiva cl_khr_fp64 é usada para habilitar o trabalho com doubles
"#pragma OPENCL EXTENSION cl_khr_fp64 : enable \r\n"
//--- função OpenCL kernel
"__kernel void Test_GPU(__global double *data, \r\n"
" const int N, \r\n"
" const int total_arrays) \r\n"
" { \r\n"
" uint kernel_index=get_global_id(0); \r\n"
" if (kernel_index>total_arrays) return; \r\n"
{
CLContextFree(cl_ctx);
Print("criação programa OpenCL falhou. Error=",GetLastError());
return(1);
}
//--- criar kernel do OpenCL
if((cl_krn=CLKernelCreate(cl_prg,"Test_GPU"))==INVALID_HANDLE)
{
CLProgramFree(cl_prg);
CLContextFree(cl_ctx);
Print("criação do kernel do OpenCL falhou. Error=",GetLastError());
return(1);
}
//--- criar buffer do OpenCL
if((cl_mem=CLBufferCreate(cl_ctx,ARRAY_SIZE*TOTAL_ARRAYS*sizeof(double),CL_MEM_READ_WRITE))==INV
{
CLKernelFree(cl_krn);
CLProgramFree(cl_prg);
CLContextFree(cl_ctx);
Print("criação do buffer do OpenCL falhou. Error=",GetLastError());
return(1);
}
//--- Definir parâmetros de constante do kernel OpenCL
CLSetKernelArgMem(cl_krn,0,cl_mem);
CLSetKernelArg(cl_krn,1,ARRAY_SIZE);
CLSetKernelArg(cl_krn,2,TOTAL_ARRAYS);
//--- preparar dados dos arrays
ArrayResize(DataArray1,ARRAY_SIZE*TOTAL_ARRAYS);
ArrayResize(DataArray2,ARRAY_SIZE*TOTAL_ARRAYS);
//--- preencher arrays com dados
for(int j=0; j<TOTAL_ARRAYS; j++)
{
//--- Calcular o deslocamento de partida local para a jth array
uint local_offset=j*ARRAY_SIZE;
//--- preparar array com o índice j
for(int i=0; i<ARRAY_SIZE; i++)
{
//--- Preencher arrays com funções MathCos(i+j);
DataArray1[i+local_offset]=MathCos(i+j);
DataArray2[i+local_offset]=MathCos(i+j);
}
};
//--- teste de cálculo do CPU
for(int j=0; j<TOTAL_ARRAYS; j++)
{
//--- cálculo do array com o índice j
Test_CPU(DataArray1,ARRAY_SIZE,j,TOTAL_ARRAYS);
}
//--- preparar os parâmetros do CLExecute
uint offset[]={};
//--- tamanho do trabalho global
uint work[]={TOTAL_ARRAYS};
//--- escrever dados para o buffer do OpenCL
CLBufferWrite(cl_mem,DataArray2);
//--- executar kernel do OpenCL
CLExecute(cl_krn,1,offset,work);
//--- Ler dados do buffer OpenCL
CLBufferRead(cl_mem,DataArray2);
//--- total de erros
double total_error=0;
//--- Comparar os resultados e calcular o erro
for(int j=0; j<TOTAL_ARRAYS; j++)
{
//--- Calcular deslocamento local para o jth array
uint local_offset=j*ARRAY_SIZE;
//--- comparar os resultados
for(int i=0; i<ARRAY_SIZE; i++)
{
double v1=DataArray1[i+local_offset];
double v2=DataArray2[i+local_offset];
double delta=MathAbs(v2-v1);
total_error+=delta;
//--- Mostrar primeiro e último arrays
if((j==0) || (j==TOTAL_ARRAYS-1))
PrintFormat("array %d of %d, element [%d]: %f, %f, [error]=%f",j+1,TOTAL_ARRAYS,i,v1,v
}
}
PrintFormat("Total error: %f",total_error);
//--- deletar objetos do OpenCL
//--- buffer OpenCL livre
CLBufferFree(cl_mem);
//--- kernel OpenCL livre
CLKernelFree(cl_krn);
//--- programa OpenCL livre
CLProgramFree(cl_prg);
//--- contexto OpenCL livre
CLContextFree(cl_ctx);
//---
return(0);
}
CLProgramFree
R emove um programa OpenCL.
void CLProgramFree(
int program // Manipulador para um objeto OpenCL
);
Parâmetros
program
[in] Manipulador para um objeto OpenCL.
Valor do Retorno
Nenhum. No caso de um erro interno o valor do modificador _LastError. Para obter informações
sobre o erro, utilize a função GetLastError().
CLKernelCreate
Cria o k ernel do programa OpenCL e retorna seu manipulador.
int CLKernelCreate(
int program, // Manipulador para um objeto OpenCL
const string kernel_name // Nome do kernel
);
Parâmetros
program
[in] Manipulador para um objeto do programa OpenCL.
kernel_name
[in] O nome da função do k ernel no programa apropriado OpenCL, em que a execução se inicia.
Valor do Retorno
Um manipulador para um objeto OpenCL se for bem sucedido. Em caso de erro é retornado -1. Para
obter informações sobre o erro, utilize a função GetLastError().
Observação
Até o momento, são utilizados os seguintes códigos de erro:
· ERR_OPENCL _INVAL ID_H ANDLE - manipulador inv álido para lidar com o programa OpenCL.
· ERR_INVAL ID_PAR AMET ER - parâmetro inv álido de string.
· ERR_OPENCL _T OO_LONG_KERNEL _NAME - nome do k ernel contém mais de 127 caracteres.
· ERR_OPENCL _KERNEL _CR EAT E - Ocorreu um erro interno durante a criação de um objeto OpenCL.
CLKernelFree
R emove uma função inicial OpenCL.
void CLKernelFree(
int kernel // Manipulador para o kernel de um programa OpenCL
);
Parâmetros
kernel_name
[in] Manipulador do objeto do k ernel.
Valor do Retorno
Nenhum. No caso de um erro interno o valor do modificador _LastError. Para obter informações
sobre o erro, utilize a função GetLastError().
CLSetKernelArg
Define um parâmetro para a função OpenCL.
bool CLSetKernelArg(
int kernel, // Manipulador para o kernel de um programa OpenCL
uint arg_index, // O número do argumento da função OpenCL
void arg_value // Código-fonte
);
Parâmetros
kernel
[in] Manipulador para um k ernel do programa OpenCL.
arg_index
[in] O número do argumento da função, a numeração começa com zero.
arg_value
[in] O valor do argumento da função.
Valor do Retorno
R etorna true se for bem sucedido, caso contrário retorna false. Para obter informações sobre o erro,
utilize a função GetLastError().
Observação
Até o momento, são utilizados os seguintes códigos de erro:
· ERR_INVAL ID_PAR AMET ER ,
· ERR_OPENCL _INVAL ID_H ANDLE – manipulador inv álido para o k ernel OpenCL.
· ERR_OPENCL _SET_KERNEL _PAR AMET ER - erro interno do OpenCL.
CLSetKernelArgMem
Define um buffer OpenCL como um parâmetro da função OpenCL.
bool CLSetKernelArgMem(
int kernel, // Manipulador para o kernel de um programa OpenCL
uint arg_index, // O número do argumento da função OpenCL
int cl_mem_handle // Manipulador para buffer de OpenCL
);
Parâmetros
kernel
[in] Manipulador para um k ernel do programa OpenCL.
arg_index
[in] O número do argumento da função, a numeração começa com zero.
cl_mem_handle
[in] Um manipulador para um buffer OpenCL.
Valor do Retorno
R etorna true se for bem sucedido, caso contrário retorna false. Para obter informações sobre o erro,
utilize a função GetLastError().
CLSetKernelArgMemLocal
Ele define o buffer local como argumento da função k ernel.
bool CLSetKernelArgMemLocal(
int kernel, // identificador para a kernel do programa OpenCL
uint arg_index, // número do argumento OpenCL de função
ulong local_mem_size // tamanho do buffer
);
Parâmetros
kernel
[in] Identificador para a k ernel do programa OpenCL.
arg_index
[in] Número de argumento de função, a numeração começa em zero.
local_mem_size
[in] T amanho do buffer em bytes.
Valor de retorno
R etorna true se a execução for bem-sucedida, caso contrario, false. Para obter informações sobre o
erro utilize a função GetLastError().
CLBufferCreate
Cria um buffer OpenCL e retorna seu manipulador.
int CLBufferCreate(
int context, // Manipulador para um contexto OpenCL
uint size, // Tamanho do buffer
uint flags // Combinação de sinalizadores que especifique as propriedades do buffer Open
);
Parâmetros
context
[in] Um manipulador de contexto OpenCL.
size
[in] T amanho do buffer em bites.
flags
[in] Propriedades de buffer que são definidas usando uma combinação de
sinalizadores : CL _MEM _R EAD_WRIT E, CL _MEM _WRIT E_ONL Y, CL _MEM _R EAD_ONL Y,
CL _MEM _ALLOC_H OS T_PTR .
Valor do Retorno
Um manipulador para um buffer OpenCL se for bem sucedido. Em caso de erro é retornado -1. Para
obter informações sobre o erro, utilize a função GetLastError().
Observação
Até o momento, são utilizados os seguintes códigos de erro:
· ERR_OPENCL _INVAL ID_H ANDLE - inv álido manipulador ao contexto OpenCL.
· ERR_NOT_ENOUGH_MEMORY – memória insuficiente.
· ERR_OPENCL _BUFFER_CR EAT E – erro interno criando buffers.
CLBufferFree
Exclui um buffer de OpenCL.
void CLBufferFree(
int buffer // Manipulador para um buffer OpenCL
);
Parâmetros
buffer
[in] Um manipulador para um buffer OpenCL.
Valor do Retorno
Nenhum. No caso de um erro interno o valor do modificador _LastError. Para obter informações
sobre o erro, utilize a função GetLastError().
CLBufferW rite
Escreve para o buffer OpenCL e retorna o número de elementos escritos.
uint CLBufferWrite(
int buffer, // Um manipulador para o buffer OpenCL
const void& data[], // Uma array de valores
uint buffer_offset=0, // Um deslocamento no buffer OpenCL em bites, 0 por padr
uint data_offset=0, // Um deslocamento na array de elementos, 0 por padrão
uint data_count=WHOLE_ARRAY // O número de valores a partir do array para a escrita,
);
Parâmetros
buffer
[in] O manipulador do buffer OpenCL.
data[]
[in] Um array de valores que deve ser escrito no buffer OpenCL. Passado por referência.
buffer_offset
[in] Uma compensação no buffer OpenCL em bites, a partir do qual começa a escrita. Por padrão,
a escrita começa com o início do buffer.
data_offset
[in] O índice do primeiro elemento array, começando a partir do qual valores de array são escritos
no buffer OpenCL. Por padrão, são tomados os valores desde o início do array.
data_count
[in] O número de valores que devem ser escritos. T odos os valores do array, por padrão.
Valor do Retorno
O número de elementos escritos. 0 (zero) é devolvido em caso de erro. Para obter informações
sobre o erro, utilize a função GetLastError().
Observação
Para arrays unidimensionais, o número do elemento, com o qual a leitura de dados para a escrita
num buffer de OpenCL começa, é calculado tendo em conta os sinalizadores AS _SERIES.
Um array de duas ou mais dimens ões é apresentado como unidimensional. Neste caso, data_offset é
o número de elementos que devem ser ignorados na apresentação, e não o número de elementos na
primeira dimensão.
CLBufferRead
L ê um buffer de OpenCL em uma array e retorna o número de elementos de leitura.
uint CLBufferRead(
int buffer, // Um manipulador para o buffer OpenCL
const void& data[], // Uma array de valores
uint buffer_offset=0, // Um deslocamento no buffer OpenCL em bites, 0 por padr
uint data_offset=0, // Um deslocamento na array de elementos, 0 por padrão
uint data_count=WHOLE_ARRAY // O número de valores a partir da buffer de leitura, to
);
Parâmetros
buffer
[in] Um manipulador do buffer OpenCL.
data[]
[in] Um array para receber os valores do buffer OpenCL. Passado por referência.
buffer_offset
[in] Um deslocamento no buffer OpenCL em bites, a partir da qual se inicia a leitura. Por padrão,
a leitura começa com o início do buffer.
data_offset
[in] O índice do primeiro elemento array para escrever os valores de buffer OpenCL. Por padrão, a
escrita dos valores lidos em um array começa a partir do índice zero.
data_count
[in] O número de valores que devem ser lidos. T odo o buffer OpenCL é lido por padrão.
Valor do Retorno
O número de elementos de leitura. 0 (zero) é devolvido em caso de erro. Para obter informações
sobre o erro, utilize a função GetLastError().
Observação
Para arrays unidimensionais, o número do elemento, em que a escrita de dados num buffer de
OpenCL inicia, é calculado tendo em conta os sinalizadores AS _SERIES.
Um array de duas ou mais dimens ões é apresentado como unidimensional. Neste caso, data_offset é
o número de elementos que devem ser ignorados na apresentação, e não o número de elementos na
primeira dimensão.
CLExecute
A função executa um programa OpenCL. Existem três vers ões da função:
2. Lançamento de v árias cópias do k ernel (função OpenCL) com descrição do espaço de tarefas
bool CLExecute(
int kernel, // Manipulador para o kernel de um programa OpenCL
uint work_dim, // Dimensão do espaço de tarefas
const uint& global_work_offset[], // Compensação inicial no espaço de tarefas
const uint& global_work_size[] // Número total de tarefas
);
3. Lançamento de v árias cópias do k ernel (função OpenCL) com descrição do espaço de tarefa e
especificação do tamanho de subconjunto de tarefa local do grupo
bool CLExecute(
int kernel, // Manipulador para o kernel de um programa OpenCL
uint work_dim, // Dimensão do espaço de tarefas
const uint& global_work_offset[], // Compensação inicial no espaço de tarefas
const uint& global_work_size[], // Número total de tarefas
const uint& local_work_size[] // Número de tarefas no grupo local
);
Parâmetros
kernel
[in] Manipulador para o k ernel OpenCL.
work_dim
[in] Dimensão do espaço tarefas.
global_work_offset[]
[in] Compensação inicial no espaço de tarefas.
global_work_size[]
[in] O tamanho de um subconjunto de tarefas.
local_work_size[]
[in] O tamanho do subconjunto de tarefa local do grupo.
Valor do Retorno
R etorna true se for bem sucedido, caso contrário retorna false. Para obter informações sobre o erro,
utilize a função GetLastError().
Observação
CLExecutionStatus
R etornar o estado de execução do programa OpenCL.
int CLExecutionStatus(
int kernel // identificador para a kernel do programa OpenCL
);
Parâmetros
kernel
[in] Identificador para a k ernel do programa OpenCL.
Valor de retorno
R etorna o estado do programa OpenCL, o valor pode ser um dos seguintes :
· CL _COMPLET E=0 - programa concluído,
· CL _RUNNING=1 – em execução,
· CL _S UBM ITT ED=2 – enviado para execução,
· CL _QUEUED=3 – encontra-se na fila para execução,
· -1 (menos um) – teve lugar erro durante a execução de CLExecutionStatus().
As funções de banco de dados usam o SQLite, um mecanismo popular e fácil de usar. Esse mecanismo
é conveniente porque todo o banco de dados fica em um único arquivo no computador do usuário.
Usando essas funções, é fácil criar tabelas, adicionar dados a elas, fazer modificações e fazer seleções
com consultas SQL simples :
As funções para trabalhar com bancos de dados permitem substituir as operações mais repetitivas,
quanto ao processamento de grandes matrizes de dados, por consultas SQL, o que permite, em muitos
casos, usar chamadas em vez de programar loops e comparações complexas
DatabaseExecute/DatabasePrepare. Para obter convenientemente os resultados de consulta em uma
estrutura pronta, use a função DatabaseR eadBind, que permite ler todos os campos de registro em
uma chamada diretamente.
Para acelerar as operações de leitura, gravação e modificação, o banco de dados pode ser
aberto/criado no banco de dados online com o sinalizador DAT ABASE_OPEN_MEMORY, sendo que esse
banco de dados estará disponível apenas para esse programa específico e não será compartilhado com
ninguém. Ao trabalhar com bancos de dados localizados no disco rígido, é necess ário embrulhar
grandes inserções /alterações de dados em uma transação usando
DatabaseT ransactionBegin/DatabaseT ransactionCommit/DatabaseT ransactionR ollback , o que fornece
aceleração centenas de vezes.
Para começar a trabalhar com estas funções, basta ler o artigo SQLite: trabalho nativo com bancos de
dados SQL em MQL5.
Função Ação
DatabaseOpen Abre ou cria um banco de dados no arquivo
especificado
DatabaseR eadBind Moves to the next record and reads data into
the structure from it
Funções estatísticas :
· mode — moda
Funções matemáticas
· exp(X) - exponente
Exemplo:
select
count(*) as book_count,
cast(avg(parent) as integer) as mean,
cast(median(parent) as integer) as median,
mode(parent) as mode,
percentile_90(parent) as p90,
percentile_95(parent) as p95,
percentile_99(parent) as p99
from moz_bookmarks;
DatabaseOpen
Abre ou cria um banco de dados no arquivo especificado.
int DatabaseOpen(
string filename, // nome do arquivo
uint flags, // combinação de sinalizadores
);
Parâmetros
filename
[in] Nome do arquivo relativo à pasta " MQL5\Files " .
flags
[in] Combinação de sinalizadores da enumeração ENUM _DAT ABASE_OPEN_FLAGS.
Valor retornado
Se for bem-sucedida, a função retorna o identificador do banco de dados, que é usado para acessar
os dados do banco de dados, caso contrário, retorna INVAL ID_H ANDLE. Para obter o código de erro,
use GetLastError(), possíveis respostas :
· ERR_INT ERNAL _ERR OR (4001) – erro crítico de tempo de execução do sistema;
· ERR_WR ONG_INT ERNAL _PAR AMET ER (4002) - erro interno ao acessar a pasta " MQL5\Files ";
· ERR_INVAL ID_PAR AMET ER (4003) – caminho para o arquivo de banco de dados
contendo uma string vazia ou definida uma combinação incompatível de sinalizadores ;
· ERR_NOT_ENOUGH_MEMORY (4004) - memória insuficiente;
· ERR_WR ONG_FILENAME (5002) - nome de arquivo de banco de dados inv álido;
· ERR_T OO_LONG_FILENAME (5003) - caminho absoluto para o arquivo de banco de
dados excedendo o tamanho máximo;
· ERR_DAT ABASE_T OO_MANY_OBJECT S (5122) - excedido número máximo de objetos Database;
· ERR_DAT ABASE_CONNECT (5123) - erro de conexão ao banco de dados ;
· ERR_DAT ABASE_M IS USE (5621) - uso incorreto da biblioteca SQLite.
Geral
Se no parâmetro filename estiver especificado NULL ou uma string vazia "" , no disco será criado um
arquivo temporário, que será excluído automaticamente após encerrada a conexão com o banco de
dados.
Se no parâmetro filename es tiv er es pecificadoн " :memory:" , o banco de dados será criado na
memória e o banco de dados será excluído automaticamente após encerrada a conexão.
Se não estiver especificada a extensão do arquivo, será usada a extensão " .sqlite"
ENUM_DATABASE_OPEN_FLAGS
Identificador Descrição
Veja também
DatabaseClose
DatabaseClose
Закрывает базу данных.
void DatabaseClose(
int database // identificador de banco de dados recebido em DatabaseOpen
);
Parâmetros
database
[in] Identificador de banco de dados recebido em DatabaseOpen().
Valor retornado
Não.
Observação
Após chamar DatabaseClose, todos os identificadores de consulta de banco de dados são excluídos
automaticamente e se tornam inv álidos.
No caso de um identificador v álido, a função mostrará o erro ERR_DAT ABASE_INVAL ID_H ANDLE. O
erro pode ser verificado usando GetLastError().
Veja também
DatabaseOpen, DatabasePrepare
DatabaseImport
Importa para uma tabela dados de um arquivo.
long DatabaseImport(
int database, // identificador de banco de dados recebido em DatabaseOpen
const string table, // nome da tabela para inserir dados
const string filename, // nome do arquivo para importar dados
uint flags, // combinação de sinalizadores
const string separator, // separador de dados
ulong skip_rows, // quantas primeiras linhas ignorar
const string skip_comments // strings de símbolos que definem comentários
);
Parâmetros
database
[in] Identificador do banco de dados obtido em DatabaseOpen().
table
[in] Nome da tabela à qual serão adicionados os dados do arquivo.
filename
[in] Arquivo CS V ou arquivo ZIP para leitura de dados, o nome pode conter subpastas e é definido
em relação à pasta MQL5\Files.
flags
[in] Combinação de sinalizadores.
separator
[in] Separador de dados em um arquivo CS V.
skip_rows
[in] Número de linhas iniciais a serem ignoradas ao ler dados de um arquivo.
skip_comments
[in] Linhas dos símbolos para designar strings como comentários. Se, no início da linha, for
encontrado qualquer símbolo de skip_comments , tal linha é considerada um comentário e não é
importada.
Valor retornado
R etorna o número de linhas importadas ou -1 em caso de erro. Para obter o código de erro, use
GetLastError(), respostas possíveis :
· ERR_INVAL ID_PAR AMET ER (4003) – o nome da tabela não está especificado (linha vazia
ou NULL);
· ERR_DAT ABASE_INT ERNAL (5120) – erro interno do banco de dados ;
· ERR_DAT ABASE_INVAL ID_H ANDLE (5121) - identificador de banco de dados inv álido.
Observação
Se tabelas cujo nome é table não existirem, elas serão criadas automaticamente. Os nomes e o tipo
de campos na tabela criada serão reconhecidos automaticamente com base nos dados contidos no
arquivo.
Veja também
DatabaseOpen, DatabasePrint
DatabaseExport
Exporta uma tabela ou resultado sobre a execução da consulta SQL para um arquivo CS V. O arquivo é
criado com codificação UTF-8.
long DatabaseExport(
int database, // identificador de banco de dados recebido em DatabaseOpen
const string table_or_sql, // nome da tabela ou consulta SQL
const string filename, // nome do arquivo CSV para exportação de dados
uint flags, // combinação de sinalizadores
const string separator // separador de dados no arquivo CVS
);
Parâmetros
database
[in] Identificador do banco de dados, obtido em DatabaseOpen().
table_or_sql
[in] Nome da tabela ou o texto da consulta SQL, cujos resultados serão exportados para o arquivo
especificado.
filename
[in] Nome do arquivo para exportar dados. O caminho é definido em relação à pasta MQL5\Files.
flags
[in] Combinação de sinalizadores que definem a saída para um arquivo. Os sinalizadores são
definidos da seguinte maneira:
separator
[in] Separador de dados. Se especificado NULL, como separador será utilizado o símbolo de
tabulação '\t'. Linha vazia "" é considerada um delimitador v álido, mas o arquivo CS V não pode ser
lido como tabela, pois será um conjunto de linhas.
Valor retornado
R etorna o número de registros exportados ou um valor negativo em caso de erro. Para obter o
código de erro, use GetLastError(), respostas possíveis :
· ERR_INT ERNAL _ERR OR (4001) – erro crítico de tempo de execução do sistema;
Observação
Se os resultados da consulta forem exportados, a consulta SQL deverá começar com " SELECT" ou
" select" . Em outras palavras, a consulta SQL não pode alterar o estado do banco de dados, caso
contrário DatabaseExport() falhará.
Os valores de string no banco de dados podem conter um caractere de conversão ('\r' ou '\r\n' ), além
de um caractere separador de valores especificado no parâmetro separator. Nesse caso, é
necess ário usar o sinalizador DAT ABASE_EXPORT_QUOT ED_S TRINGS no parâmetro flags. Se esse
sinalizador estiver presente, todas as linhas exibidas serão colocadas entre aspas duplas, mas se a
linha contiver aspas duplas, ela será substituída por duas aspas duplas.
Veja também
DatabasePrint, DatabaseImport
DatabasePrint
Exibe uma tabela ou resultado sobre a execução da consulta SQL no log do EA.
long DatabasePrint(
int database, // identificador de banco de dados recebido em DatabaseOpen
const string table_or_sql, // tabela ou consulta SQL
uint flags // combinação de sinalizadores
);
Parâmetros
database
[in] Identificador do banco de dados, obtido em DatabaseOpen().
table_or_sql
[in] Nome da tabela ou o texto da consulta SQL, cujos resultados são exibidos no log do EA.
flags
[in] Combinação de sinalizadores que definem a formatação de exibição. Os sinalizadores são
definidos da seguinte maneira:
DAT ABASE_PRINT_NO_H EADER – não exibir nomes de colunas da tabela (nomes de campos)
DAT ABASE_PRINT_NO_INDEX – não exibir os números de linha
DAT ABASE_PRINT_NO_FR AME – não exibir o quadro que separa o cabeçalho e os dados
DAT ABASE_PRINT_S TRINGS _RIGHT – alinhar as linhas à direita.
Se flags =0, serão exibidas colunas e linhas, o cabeçalho e os dados são separados por um quadro,
as linhas são alinhadas à esquerda.
Valor retornado
R etorna o número de linhas exportadas ou -1 em caso de erro. Para obter o código de erro, use
GetLastError(), respostas possíveis :
· ERR_INT ERNAL _ERR OR (4001) – erro crítico de tempo de execução do sistema;
· ERR_NOT_ENOUGH_MEMORY (4004) - memória insuficiente;
· ERR_DAT ABASE_INT ERNAL (5120) – erro interno do banco de dados ;
· ERR_DAT ABASE_INVAL ID_H ANDLE (5121) - identificador de banco de dados inv álido;
Observação
Se os resultados da consulta forem exportados para o log, a consulta SQL deverá começar com
" SELECT" ou " select" . Em outras palavras, a consulta SQL não pode alterar o estado do banco de
dados, caso contrário DatabasePrint() falhará.
Exemplo:
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
string filename="departments.sqlite";
DatabaseClose(db);
}
/*
Conclusão:
Try to print request "PRAGMA TABLE_INFO(COMPANY);PRAGMA TABLE_INFO(DEPARTMENT)"
#| cid name type notnull dflt_value pk
-+-------------------------------------------
1| 0 ID INT 1 1
2| 1 NAME TEXT 1 0
3| 2 AGE INT 1 0
4| 3 ADDRESS CHAR(50) 0 0
5| 4 SALARY REAL 0 0
#| cid name type notnull dflt_value pk
-+------------------------------------------
1| 0 ID INT 1 1
2| 1 DEPT CHAR(50) 1 0
3| 2 EMP_ID INT 1 0
Try to print request "SELECT * from COMPANY"
#| ID NAME AGE ADDRESS SALARY
-+--------------------------------
1| 1 Paul 32 California 25000.0
2| 2 Allen 25 Texas 15000.0
3| 3 Teddy 23 Norway 20000.0
4| 4 Mark 25 Rich-Mond 65000.0
5| 5 David 27 Texas 85000.0
6| 6 Kim 22 South-Hall 45000.0
7| 7 James 24 Houston 10000.0
Try to print request "SELECT EMP_ID, NAME, DEPT FROM COMPANY LEFT OUTER JOIN DEPARTMENT"
#| EMP_ID NAME DEPT
-+-------------------------
1| 1 Paul IT Billing
2| 2 Allen Engineering
3| Teddy
4| Mark
5| David
6| Kim
7| 7 James Finance
*/
//+------------------------------------------------------------------+
//| Cria a tabela COMPANY |
//+------------------------------------------------------------------+
bool CreataTableCompany(int database)
{
//--- se a tabela COMPANY existir, vamos exclui-la
if(DatabaseTableExists(database, "COMPANY"))
{
//--- excluímos a tabela
if(!DatabaseExecute(database, "DROP TABLE COMPANY"))
{
Veja também
DatabaseExport, DatabaseImport
DatabaseTableExists
Verifica a existência de tabela no banco de dados.
bool DatabaseTableExists(
int database, // identificador de banco de dados recebido em DatabaseOpen
string table // nome da tabela
);
Parâmetros
database
[in] Identificador do banco de dados, obtido em DatabaseOpen().
table
[in] Nome da tabela.
Valor retornado
R etorna true em caso de sucesso ou false, em caso de erro. Para obter o código de erro, use
GetLastError(), possíveis respostas :
· ERR_INVAL ID_PAR AMET ER (4003) – nome da tabela não está especificado (string vazia
ou NULL);
· ERR_WR ONG_S TRING_PAR AMET ER (5040) – erro ao converter a consulta em uma string UTF-8;
· ERR_DAT ABASE_INT ERNAL (5120) – erro interno do banco de dados ;
· ERR_DAT ABASE_INVAL ID_H ANDLE (5121) - identificador de banco de dados inv álido;
· ERR_DAT ABASE_EXECUT E (5124) - erro de execução de consulta;
· ERR_DAT ABASE_NO_MOR E_DAT A (5126) - a tabela não existe (não é um erro, finalização
normal);
Veja também
DatabasePrepare, DatabaseFinalize
DatabaseExecute
Исполняет запрос к указанной базе данных.
bool DatabaseExecute(
int database, // identificador de banco de dados recebido em DatabaseOpen
string sql, // consulta SQL
);
Parâmetros
database
[in] Identificador do banco de dados, obtido em DatabaseOpen().
sql
[in] consulta SQL.
Valor retornado
R etorna true em caso de sucesso ou false, em caso de erro. Para obter o código de erro, use
GetLastError(), possíveis respostas :
· ERR_INT ERNAL _ERR OR (4001) – erro crítico de tempo de execução do sistema;
· ERR_INVAL ID_PAR AMET ER (4003) – parâmetro sql contendo string vazia;
· ERR_NOT_ENOUGH_MEMORY (4004) – memória insuficiente;
· ERR_WR ONG_S TRING_PAR AMET ER (5040) – erro ao converter a consulta em uma string UTF-8;
· ERR_DAT ABASE_INT ERNAL (5120) – erro interno do banco de dados ;
· ERR_DAT ABASE_INVAL ID_H ANDLE (5121) – identificador de banco de dados inv álido;
· ERR_DAT ABASE_EXECUT E (5124) – erro de execução de consulta.
Example:
//--- symbol statistics
struct Symbol_Stats
{
string name; // symbol name
int trades; // number of trades for the symbol
double gross_profit; // total profit for the symbol
double gross_loss; // total loss for the symbol
double total_commission; // total commission for the symbol
double total_swap; // total swaps for the symbol
double total_profit; // total profit excluding swaps and commissions
double net_profit; // net profit taking into account swaps and commissions
int win_trades; // number of profitable trades
int loss_trades; // number of losing trades
double expected_payoff; // expected payoff for the trade excluding swaps and commiss
double win_percent; // percentage of winning trades
double loss_percent; // percentage of losing trades
double average_profit; // average profit
double average_loss; // average loss
double profit_factor; // profit factor
};
int ExtDealsTotal=0;;
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- create the file name
string filename=IntegerToString(AccountInfoInteger(ACCOUNT_LOGIN))+"_stats.sqlite";
//--- open/create the database in the common terminal folder
int db=DatabaseOpen(filename, DATABASE_OPEN_READWRITE | DATABASE_OPEN_CREATE | DATABASE_OPEN_COM
if(db==INVALID_HANDLE)
{
Print("DB: ", filename, " open failed with code ", GetLastError());
return;
}
//--- create the DEALS table
if(!CreateTableDeals(db))
{
DatabaseClose(db);
return;
}
PrintFormat("Deals in the trading history: %d ", ExtDealsTotal);
//--- make sure that hedging system for open position management is used on the account
if((ENUM_ACCOUNT_MARGIN_MODE)AccountInfoInteger(ACCOUNT_MARGIN_MODE)!=ACCOUNT_MARGIN_MODE_RETAIL
{
//--- deals cannot be transformed to trades using a simple method through transactions, there
DatabaseClose(db);
return;
}
//--- now create the TRADES table based on the DEALS table
if(!CreateTableTrades(db))
{
DatabaseClose(db);
return;
}
//--- fill in the TRADES table using an SQL query based on DEALS table data
if(DatabaseTableExists(db, "DEALS"))
//--- populate the TRADES table
if(!DatabaseExecute(db, "INSERT INTO TRADES(TIME_IN,HOUR_IN,TICKET,TYPE,VOLUME,SYMBOL,PRICE_I
"SELECT "
" d1.time as time_in,"
" d1.hour as hour_in,"
" d1.position_id as ticket,"
" d1.type as type,"
" d1.volume as volume,"
" d1.symbol as symbol,"
" d1.price as price_in,"
" d2.time as time_out,"
" d2.price as price_out,"
" d1.commission+d2.commission as commission,"
" d2.swap as swap,"
" d2.profit as profit "
"FROM DEALS d1 "
"INNER JOIN DEALS d2 ON d1.position_id=d2.position_id "
"WHERE d1.entry=0 AND d2.entry=1 "))
{
Print("DB: fillng the table TRADES failed with code ", GetLastError());
return;
}
" ) as r");
if(request==INVALID_HANDLE)
{
Print("DB: ", filename, " request failed with code ", GetLastError());
DatabaseClose(db);
return;
}
Hour_Stats hours_stats[], h_stats;
ArrayResize(hours_stats, ExtDealsTotal);
i=0;
//--- print
for(; DatabaseReadBind(request, h_stats) ; i++)
{
hours_stats[i].hour_in=h_stats.hour_in;
hours_stats[i].trades=h_stats.trades;
hours_stats[i].volume=h_stats.volume;
hours_stats[i].gross_profit=h_stats.gross_profit;
hours_stats[i].gross_loss=h_stats.gross_loss;
hours_stats[i].net_profit=h_stats.net_profit;
hours_stats[i].win_trades=h_stats.win_trades;
hours_stats[i].loss_trades=h_stats.loss_trades;
hours_stats[i].expected_payoff=h_stats.expected_payoff;
hours_stats[i].win_percent=h_stats.win_percent;
hours_stats[i].loss_percent=h_stats.loss_percent;
hours_stats[i].average_profit=h_stats.average_profit;
hours_stats[i].average_loss=h_stats.average_loss;
hours_stats[i].profit_factor=h_stats.profit_factor;
}
ArrayResize(hours_stats, i);
Print("Trade statistics by entry hour");
ArrayPrint(hours_stats);
Print("");
//--- delete the request
DatabaseFinalize(request);
//+------------------------------------------------------------------+
//| Creates the DEALS table |
//+------------------------------------------------------------------+
bool CreateTableDeals(int database)
{
//--- if the DEALS table already exists, delete it
if(!DeleteTable(database, "DEALS"))
{
return(false);
}
//--- check if the table exists
if(!DatabaseTableExists(database, "DEALS"))
//--- create the table
if(!DatabaseExecute(database, "CREATE TABLE DEALS("
"ID INT KEY NOT NULL,"
"ORDER_ID INT NOT NULL,"
"POSITION_ID INT NOT NULL,"
"TIME INT NOT NULL,"
"TYPE INT NOT NULL,"
"ENTRY INT NOT NULL,"
"SYMBOL CHAR(10),"
"VOLUME REAL,"
"PRICE REAL,"
"PROFIT REAL,"
"SWAP REAL,"
"COMMISSION REAL,"
"MAGIC INT,"
"HOUR INT,"
"REASON INT);"))
{
Print("DB: create the DEALS table failed with code ", GetLastError());
return(false);
}
//--- request the entire trading history
datetime from_date=0;
datetime to_date=TimeCurrent();
//--- request the history of deals in the specified interval
HistorySelect(from_date, to_date);
ExtDealsTotal=HistoryDealsTotal();
//--- add deals to the table
if(!InsertDeals(database))
return(false);
//--- the table has been successfully created
return(true);
}
//+------------------------------------------------------------------+
//| Deletes a table with the specified name from the database |
//+------------------------------------------------------------------+
bool DeleteTable(int database, string table_name)
{
if(!DatabaseExecute(database, "DROP TABLE IF EXISTS "+table_name))
{
Print("Failed to drop the DEALS table with code ", GetLastError());
return(false);
}
//--- the table has been successfully deleted
return(true);
}
//+------------------------------------------------------------------+
//| Adds deals to the database table |
//+------------------------------------------------------------------+
bool InsertDeals(int database)
{
//--- Auxiliary variables
ulong deal_ticket; // deal ticket
long order_ticket; // the ticket of the order by which the deal was executed
long position_ticket; // ID of the position to which the deal belongs
datetime time; // deal execution time
long type ; // deal type
long entry ; // deal direction
string symbol; // the symbol fro which the deal was executed
double volume; // operation volume
double price; // price
double profit; // financial result
double swap; // swap
double commission; // commission
long magic; // Magic number (Expert Advisor ID)
long reason; // deal execution reason or source
char hour; // deal execution hour
MqlDateTime time_strusture;
//--- go through all deals and add them to the database
bool failed=false;
int deals=HistoryDealsTotal();
// --- lock the database before executing transactions
DatabaseTransactionBegin(database);
for(int i=0; i<deals; i++)
{
deal_ticket= HistoryDealGetTicket(i);
order_ticket= HistoryDealGetInteger(deal_ticket, DEAL_ORDER);
position_ticket=HistoryDealGetInteger(deal_ticket, DEAL_POSITION_ID);
time= (datetime)HistoryDealGetInteger(deal_ticket, DEAL_TIME);
type= HistoryDealGetInteger(deal_ticket, DEAL_TYPE);
entry= HistoryDealGetInteger(deal_ticket, DEAL_ENTRY);
symbol= HistoryDealGetString(deal_ticket, DEAL_SYMBOL);
volume= HistoryDealGetDouble(deal_ticket, DEAL_VOLUME);
price= HistoryDealGetDouble(deal_ticket, DEAL_PRICE);
profit= HistoryDealGetDouble(deal_ticket, DEAL_PROFIT);
swap= HistoryDealGetDouble(deal_ticket, DEAL_SWAP);
commission= HistoryDealGetDouble(deal_ticket, DEAL_COMMISSION);
magic= HistoryDealGetInteger(deal_ticket, DEAL_MAGIC);
reason= HistoryDealGetInteger(deal_ticket, DEAL_REASON);
TimeToStruct(time, time_strusture);
hour= (char)time_strusture.hour;
//--- add each deal to the table using the following request
string request_text=StringFormat("INSERT INTO DEALS (ID,ORDER_ID,POSITION_ID,TIME,TYPE,ENTRY,
"VALUES (%d, %d, %d, %d, %d, %d, '%s', %G, %G, %G, %G, %G, %
deal_ticket, order_ticket, position_ticket, time, type, entr
if(!DatabaseExecute(database, request_text))
{
PrintFormat("%s: failed to insert deal #%d with code %d", __FUNCTION__, deal_ticket, GetLa
PrintFormat("i=%d: deal #%d %s", i, deal_ticket, symbol);
failed=true;
break;
}
}
//--- check for transaction execution errors
if(failed)
{
//--- roll back all transactions and unlock the database
DatabaseTransactionRollback(database);
PrintFormat("%s: DatabaseExecute() failed with code ", __FUNCTION__, GetLastError());
return(false);
}
//--- all transactions have been performed successfully - record changes and unlock the database
DatabaseTransactionCommit(database);
return(true);
}
//+------------------------------------------------------------------+
//| Creates the TRADES table |
//+------------------------------------------------------------------+
bool CreateTableTrades(int database)
{
//--- if the TRADES table already exists, delete it
if(!DeleteTable(database, "TRADES"))
return(false);
//--- check if the table exists
if(!DatabaseTableExists(database, "TRADES"))
//--- create the table
if(!DatabaseExecute(database, "CREATE TABLE TRADES("
"TIME_IN INT NOT NULL,"
"HOUR_IN INT NOT NULL,"
"TICKET INT NOT NULL,"
"TYPE INT NOT NULL,"
"VOLUME REAL,"
"SYMBOL CHAR(10),"
"PRICE_IN REAL,"
"TIME_OUT INT NOT NULL,"
"PRICE_OUT REAL,"
"COMMISSION REAL,"
"SWAP REAL,"
"PROFIT REAL);"))
{
Print("DB: create the TRADES table failed with code ", GetLastError());
return(false);
}
//--- the table has been successfully created
return(true);
}
//+------------------------------------------------------------------+
Veja também
DatabasePrepare, DatabaseFinalize
DatabasePrepare
Cria um identificador de consulta, que pode ser executado usando DatabaseR ead().
int DatabasePrepare(
int database, // identificador de banco de dados recebido em DatabaseOpen
string sql, // consulta SQL
... // parâmetros de consulta
);
Parâmetros
database
[in] Identificador do banco de dados, obtido em DatabaseOpen().
sql
[in] Consulta SQL que pode conter parâmetros de substituição automática com nomes ?1,?2,...
...
[in] Parâmetros de consulta substituídos automaticamente.
Valor retornado
Se for bem-sucedido, retorna o identificador para a consulta SQL, caso contrário, retorna
INVAL ID_H ANDLE. Para obter o código de erro, use GetLastError(), possíveis respostas :
· ERR_INVAL ID_PAR AMET ER (4003) – caminho para o arquivo de banco de dados
contendo uma string vazia ou definida uma combinação incompatível de sinalizadores ;
· ERR_NOT_ENOUGH_MEMORY (4004) - memória insuficiente;
· ERR_WR ONG_S TRING_PAR AMET ER (5040) – erro ao converter a consulta em uma string UTF-8;
· ERR_DAT ABASE_INVAL ID_H ANDLE (5121) - identificador de banco de dados inv álido;
· ERR_DAT ABASE_T OO_MANY_OBJECT S (5122) - excedido número máximo de objetos Database;
· ERR_DAT ABASE_PR EPAR E (5125) - erro ao criar consulta.
Observação
A função DatabasePrepare() não realiza a consulta relacionada ao banco de dados. Seu objetivo é
verificar se os parâmetros da consulta são corretos e retornar o identificador com base nos
resultados dessa verificação para executar a consulta SQL. A consulta em si será executada na
primeira chamada de DatabaseR ead().
Example:
//--- Structure to store the deal
struct Deal
{
ulong ticket; // DEAL_TICKET
long order_ticket; // DEAL_ORDER
long position_ticket; // DEAL_POSITION_ID
datetime time; // DEAL_TIME
char type; // DEAL_TYPE
char entry; // DEAL_ENTRY
string symbol; // DEAL_SYMBOL
//--- make sure that hedging system for open position management is used on the account
if((ENUM_ACCOUNT_MARGIN_MODE)AccountInfoInteger(ACCOUNT_MARGIN_MODE)!=ACCOUNT_MARGIN_MODE_RETAIL
{
//--- deals cannot be transformed to trades using a simple method through transactions, there
DatabaseClose(db);
return;
}
//--- now create the TRADES table based on the DEALS table
if(!CreateTableTrades(db))
{
DatabaseClose(db);
return;
}
//--- fill in the TRADES table using an SQL query based on DEALS table data
ulong start=GetMicrosecondCount();
if(DatabaseTableExists(db, "DEALS"))
//--- populate the TRADES table
if(!DatabaseExecute(db, "INSERT INTO TRADES(TIME_IN,TICKET,TYPE,VOLUME,SYMBOL,PRICE_IN,TIME_O
"SELECT "
" d1.time as time_in,"
" d1.position_id as ticket,"
" d1.type as type,"
" d1.volume as volume,"
" d1.symbol as symbol,"
" d1.price as price_in,"
" d2.time as time_out,"
" d2.price as price_out,"
" d1.commission+d2.commission as commission,"
" d2.swap as swap,"
" d2.profit as profit "
"FROM DEALS d1 "
"INNER JOIN DEALS d2 ON d1.position_id=d2.position_id "
"WHERE d1.entry=0 AND d2.entry=1 "))
{
Print("DB: fillng the TRADES table failed with code ", GetLastError());
return;
}
ulong transaction_time=GetMicrosecondCount()-start;
break;
trades[i].time_in=trade.time_in;
trades[i].ticket=trade.ticket;
trades[i].type=trade.type;
trades[i].volume=trade.volume;
trades[i].symbol=trade.symbol;
trades[i].price_in=trade.price_in;
trades[i].time_out=trade.time_out;
trades[i].price_out=trade.price_out;
trades[i].commission=trade.commission;
trades[i].swap=trade.swap;
trades[i].profit=trade.profit;
}
//--- print trades
if(i>0)
{
ArrayResize(trades, i);
PrintFormat("\r\nThe first %d trades:", i);
ArrayPrint(trades);
PrintFormat("Filling the TRADES table took %.2f milliseconds",double(transaction_time)/1000);
}
//--- delete request after use
DatabaseFinalize(request);
[4] 2019.09.06 08:00:00 51448053 1 0.10000 "USDCHF" 0.98701 2019.09.06 18:00:01 0.9
[5] 2019.09.06 08:00:00 51448064 0 0.10000 "USDJPY" 106.96200 2019.09.06 18:00:01 106.7
[6] 2019.09.06 10:30:00 51450470 1 0.10000 "EURUSD" 1.10399 2019.09.06 14:30:00 1.1
[7] 2019.09.06 10:30:00 51450476 0 0.10000 "GBPUSD" 1.23038 2019.09.06 14:30:00 1.2
[8] 2019.09.06 10:30:00 51450479 1 0.10000 "EURJPY" 118.12000 2019.09.06 14:30:00 117.9
[9] 2019.09.06 10:30:00 51450480 0 0.10000 "GBPJPY" 131.65300 2019.09.06 14:30:01 131.6
Filling the TRADES table took 12.51 milliseconds
*/
//+------------------------------------------------------------------+
//| Creates the DEALS table |
//+------------------------------------------------------------------+
bool CreateTableDeals(int database)
{
//--- if the DEALS table already exists, delete it
if(!DeleteTable(database, "DEALS"))
{
return(false);
}
//--- check if the table exists
if(!DatabaseTableExists(database, "DEALS"))
//--- create the table
if(!DatabaseExecute(database, "CREATE TABLE DEALS("
"ID INT KEY NOT NULL,"
"ORDER_ID INT NOT NULL,"
"POSITION_ID INT NOT NULL,"
"TIME INT NOT NULL,"
"TYPE INT NOT NULL,"
"ENTRY INT NOT NULL,"
"SYMBOL CHAR(10),"
"VOLUME REAL,"
"PRICE REAL,"
"PROFIT REAL,"
"SWAP REAL,"
"COMMISSION REAL,"
"MAGIC INT,"
"REASON INT );"))
{
Print("DB: create the DEALS table failed with code ", GetLastError());
return(false);
}
//--- the table has been successfully created
return(true);
}
//+------------------------------------------------------------------+
//| Deletes a table with the specified name from the database |
//+------------------------------------------------------------------+
bool DeleteTable(int database, string table_name)
{
if(!DatabaseExecute(database, "DROP TABLE IF EXISTS "+table_name))
{
Print("Failed to drop the DEALS table with code ", GetLastError());
return(false);
}
//--- the table has been successfully deleted
return(true);
}
//+------------------------------------------------------------------+
//| Adds deals to the database table |
//+------------------------------------------------------------------+
bool InsertDeals(int database)
{
//--- Auxiliary variables
ulong deal_ticket; // deal ticket
long order_ticket; // the ticket of the order by which the deal was executed
long position_ticket; // ID of the position to which the deal belongs
datetime time; // deal execution time
long type ; // deal type
long entry ; // deal direction
string symbol; // the symbol fro which the deal was executed
double volume; // operation volume
double price; // price
double profit; // financial result
double swap; // swap
double commission; // commission
long magic; // Magic number (Expert Advisor ID)
long reason; // deal execution reason or source
//--- go through all deals and add them to the database
bool failed=false;
int deals=HistoryDealsTotal();
// --- lock the database before executing transactions
DatabaseTransactionBegin(database);
for(int i=0; i<deals; i++)
{
deal_ticket= HistoryDealGetTicket(i);
order_ticket= HistoryDealGetInteger(deal_ticket, DEAL_ORDER);
position_ticket=HistoryDealGetInteger(deal_ticket, DEAL_POSITION_ID);
time= (datetime)HistoryDealGetInteger(deal_ticket, DEAL_TIME);
type= HistoryDealGetInteger(deal_ticket, DEAL_TYPE);
entry= HistoryDealGetInteger(deal_ticket, DEAL_ENTRY);
symbol= HistoryDealGetString(deal_ticket, DEAL_SYMBOL);
volume= HistoryDealGetDouble(deal_ticket, DEAL_VOLUME);
price= HistoryDealGetDouble(deal_ticket, DEAL_PRICE);
profit= HistoryDealGetDouble(deal_ticket, DEAL_PROFIT);
swap= HistoryDealGetDouble(deal_ticket, DEAL_SWAP);
commission= HistoryDealGetDouble(deal_ticket, DEAL_COMMISSION);
magic= HistoryDealGetInteger(deal_ticket, DEAL_MAGIC);
reason= HistoryDealGetInteger(deal_ticket, DEAL_REASON);
//--- add each deal to the table using the following request
}
//--- the table has been successfully created
return(true);
}
//+------------------------------------------------------------------+
Veja também
DatabaseExecute, DatabaseFinalize
DatabaseReset
R edefine a consulta para seu status inicial, como após uma chamada de DatabasePrepare().
int DatabaseReset(
int request // identificador de consulta recebido em DatabasePrepare
);
Parâmetros
request
[in] Identificador de consulta recebido em DatabasePrepare().
Valor retornado
R etorna true em caso de sucesso ou false, em caso de erro. Para obter o código de erro, use
GetLastError(), possíveis respostas :
· ERR_DAT ABASE_INVAL ID_H ANDLE (5121) - identificador de banco de dados inv álido;
· código de erro SQLite, começando com ERR_DAT ABASE_ERR OR (5601).
Observação
A função DatabaseR eset() é projetada para execução múltipla de uma consulta com diferentes
valores de parâmetro. Por exemplo, ao adicionar em massa dados a uma tabela usando o comando
INSERT , para cada registro, é necess ário criar um conjunto próprio de valores para cada campo.
DatabaseR eset() é usado juntamente com a função DatabaseBind() e/ou DatabaseBindArray(), se for
necess ário alterar os valores dos parâmetros da consulta após a execução de DatabaseR ead(). Isso
significa que antes de definir novos valores de parâmetros de consulta (antes do bloco de chamada
de DatabaseBind/DatabaseBindArray) é necess ário chamar DatabaseR eset() para redefini-lo ao seu
estado inicial. A própria consulta parametrizada deve ser criada com a ajuda de DatabasePrepare().
T anto DatabaseR eset() quanto DatabasePrepare() não consultam o banco de dados. A consulta direta
é executada ao chamar DatabaseR ead() ou DatabaseR eadBind().
A chamada de DatabaseR eset() não redefine os valores dos parâmetros na consulta, se eles foram
definidos através da chamada de DatabaseBind()/DatabaseBindArray(), ou seja, os parâmetros
mantêm os seus valores. Assim, é possível alterar o valor de apenas um parâmetro, pois não há
necessidade de registrar novamente todos os parâmetros de consulta após chamar DatabaseR eset().
Não se pode passar ao DatabaseR eset() o identificador da consulta que foi excluída com a ajuda de
DatabaseFinalize(). Isso causa um erro.
Exemplo:
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
request_error=true;
break;
}
if(!DatabaseBind(request, 6, GetSymBolAsJson(symbol)))
{
PrintFormat("DatabaseBind() failed at line %d with code=%d", __LINE__, GetLastError());
request_error=true;
break;
}
else
Print("Database: DatabaseExport(\"SELECT * FROM SYMBOLS\") failed with code", GetLastError())
"\n"+indent3+"\"SwapLong\":\""+StringFormat("%G",(SymbolInfoDouble(symbol, SYMBOL_SW
"\n"+indent3+"\"SwapShort\":\""+StringFormat("%G",(SymbolInfoDouble(symbol, SYMBOL_S
"\n"+indent3+"\"Swap3Day\":\""+IntegerToString(SymbolInfoInteger(symbol, SYMBOL_SWAP
"\n"+indent2+"}"+
"\n"+indent1+"]"+
"\n}";
return(json);
}
//+------------------------------------------------------------------+
//| Cria o recuo de espaços |
//+------------------------------------------------------------------+
string Indent(const int number, const int characters=3)
{
int length=number*characters;
string indent=NULL;
StringInit(indent, length, ' ');
return indent;
}
/*
Resultado:
Database: symbols.sqlite opened successfully
#| cid name type notnull dflt_value pk
-+-------------------------------------------
1| 0 NAME TEXT 1 0
2| 1 DESCRIPTION TEXT 0 0
3| 2 PATH TEXT 0 0
4| 3 SPREAD INT 0 0
5| 4 POINT REAL 1 0
6| 5 DIGITS INT 1 0
7| 6 JSON BLOB 0 0
1: added EURUSD
2: added GBPUSD
3: added USDCHF
...
82: added USDCOP
83: added USDARS
84: added USDCLP
Table SYMBOLS: added 84 symbols
Database: table SYMBOLS saved in symbols.csv
Database: symbols.sqlite created and closed
*/
Veja também
DatabasePrepare, DatabaseBind, DatabaseBindArray, DatabaseFinalize
DatabaseBind
Define o valor do parâmetro na consulta.
bool DatabaseBind(
int request, // manipulador da consulta criada em DatabasePrepare
int index, // índice do parâmetro na consulta
T value // valor de parâmetro de tipo simples
);
Parâmetros
request
[in] Identificador da consulta criada em DatabasePrepare().
index
[in] Índice do parâmetro na consulta para o qual é necess ário definir o valor. A numeração começa
do zero.
value
[in] Valor do parâmetro que é necess ário definir. São permitidos os tipos : bool, char, uchar,
short, ushart, int, uint, color, datetime, long, ulong, float, double, string.
Valor retornado
R etorna true em caso de sucesso, caso contrário, false. Para obter o código de erro, use
GetLastError(), possíveis respostas :
· ERR_INVAL ID_PAR AMET ER (4003) – tipo não suportado;
· ERR_DAT ABASE_INVAL ID_H ANDLE (5121) - identificador de banco de dados inv álido;
· ERR_DAT ABASE_NOT_R EADY (5128) - não se pode usar a função para consulta no momento.
A consulta está sendo realizada ou já foi concluída, é necess ário chamar DatabaseR eset().
Observação
Esta função deve ser usada caso a consulta SQL contenha os valores parametrizáveis "?" ou"?N" ,
onde N é o número do parâmetro (começando de um). Ao mesmo tempo, a indexação de parâmetros
no DatabaseBind() começa do zero.
Por exemplo:
Esta função pode ser chamada imediatamente quer após criada a consulta parametrizável em
DatabasePrepare() quer após redefinir a consulta para o status inicial com a ajuda do
DatabaseR eset().
Use esta função juntamente com o DatabaseR eset(), para executar a consulta quantas vezes forem
necess árias com diferentes valores de parâmetros.
A função é projetada para trabalhar com parâmetros de tipos simples. Se o parâmetro precisar
mapear a matriz, use a função DatabaseBindArray().
Exemplo:
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
MqlTick ticks[];
//--- lembramo-nos da hora de início antes de receber ticks
uint start=GetTickCount();
//--- consultamos o histórico de ticks do dia
ulong to=TimeCurrent()*1000;
ulong from=to-PeriodSeconds(PERIOD_D1)*1000;
if(CopyTicksRange(_Symbol, ticks, COPY_TICKS_ALL, from, to)==-1)
{
PrintFormat("%s: CopyTicksRange(%s - %s) failed, error=%d",
_Symbol, TimeToString(datetime(from/1000)), TimeToString(datetime(to/1000)), _Las
return;
}
else
{
//--- quantidade de ticks obtidos em determinado intervalo de tempo
PrintFormat("%s: CopyTicksRange received %d ticks in %d ms (from %s to %s)",
_Symbol, ArraySize(ticks), GetTickCount()-start,
TimeToString(datetime(from/1000)), TimeToString(datetime(to/1000)));
}
"VOLUME_REAL REAL);"))
{
Print("DB: ", filename, " create table TICKS failed with code ", GetLastError());
DatabaseClose(db);
return;
}
//--- exibimos uma lista contendo todos os campos na tabela TICKS
if(DatabasePrint(db, "PRAGMA TABLE_INFO(TICKS)", 0)<0)
{
PrintFormat("DatabasePrint(\"PRAGMA TABLE_INFO(TICKS)\") failed, error code=%d at line %d", G
DatabaseClose(db);
return;
}
//--- criamos a consulta parametrizada para adicionar ticks à tabela TICKS
string sql="INSERT INTO TICKS (SYMBOL,TIME,BID,ASK,LAST,VOLUME,TIME_MSC,VOLUME_REAL)"
" VALUES (?1,?2,?3,?4,?5,?6,?7,?8)"; // parâmetro de consulta
int request=DatabasePrepare(db, sql);
if(request==INVALID_HANDLE)
{
PrintFormat("DatabasePrepare() failed with code=%d", GetLastError());
Print("SQL request: ", sql);
DatabaseClose(db);
return;
}
//--- definimos o valor do primeiro parâmetro da consulta
DatabaseBind(request, 0, _Symbol);
//--- lembramo-nos da hora de início antes de adicionar ticks à tabela TICKS
start=GetTickCount();
DatabaseTransactionBegin(db);
int total=ArraySize(ticks);
bool request_error=false;
for(int i=0; i<total; i++)
{
//--- definimos o valor dos restantes parâmetros antes de adicionar um registro
ResetLastError();
if(!DatabaseBind(request, 1, ticks[i].time))
{
PrintFormat("DatabaseBind() failed with code=%d", GetLastError());
PrintFormat("Tick #%d line=%d", i+1, __LINE__);
request_error=true;
break;
}
//--- se a chamada anterior de DatabaseBind() foi bem-sucedida, definimos o seguinte parâmetr
if(!request_error && !DatabaseBind(request, 2, ticks[i].bid))
{
PrintFormat("DatabaseBind() failed with code=%d", GetLastError());
PrintFormat("Tick #%d line=%d", i+1, __LINE__);
request_error=true;
break;
}
if(!request_error && !DatabaseBind(request, 3, ticks[i].ask))
{
PrintFormat("DatabaseBind() failed with code=%d", GetLastError());
PrintFormat("Tick #%d line=%d", i+1, __LINE__);
request_error=true;
break;
}
if(!request_error && !DatabaseBind(request, 4, ticks[i].last))
{
PrintFormat("DatabaseBind() failed with code=%d", GetLastError());
PrintFormat("Tick #%d line=%d", i+1, __LINE__);
request_error=true;
break;
}
if(!request_error && !DatabaseBind(request, 5, ticks[i].volume))
{
PrintFormat("DatabaseBind() failed with code=%d", GetLastError());
PrintFormat("Tick #%d line=%d", i+1, __LINE__);
request_error=true;
break;
}
if(!request_error && !DatabaseBind(request, 6, ticks[i].time_msc))
{
PrintFormat("DatabaseBind() failed with code=%d", GetLastError());
PrintFormat("Tick #%d line=%d", i+1, __LINE__);