0% acharam este documento útil (0 voto)
213 visualizações

Mql5 Portuguese

Enviado por

Linux Developer
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
213 visualizações

Mql5 Portuguese

Enviado por

Linux Developer
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
Você está na página 1/ 5581

Linguagem MQL5 REFERENTE

ao terminal do cliente MetaTrader 5

ESTUDAR MQL5 e
RESOLVER todas as tarefas:

• Criar seus próprios indicadores de análise


técnica com qualquer grau de complexidade

• Utilizar a automatização - automatizar


sistemas de negociação para trabalhar em
vários mercados financeiros

• Desenvolver suas próprias ferramentas


analíticas baseadas em cálculos matemáticos
e métodos tradicionais
methods

• Desenvolver sistemas de negociação para


resolver uma grande variedade de
necessidades(trading, monitoramento, alerta,
etc)

© 2000-2018, MetaQuotes Software Corp.


2 Conteúdo

Content
Referência MQL5 66
1 Elementos Básicos
.................................................................................................
da Linguagem 68
Sintaxe ............................................................................................................................69
Comentários
......................................................................................................................... 70
Identificadores
......................................................................................................................... 71
Palavras Reservadas
......................................................................................................................... 72
............................................................................................................................74
Tipos de Dados
Tipos Inteiros
......................................................................................................................... 75
Tipos char, short,
................................................................................................................
int e long 76
Constantes de ................................................................................................................
Caracteres 80
Tipo datetime................................................................................................................ 84
Tipo color ................................................................................................................ 85
Tipo bool ................................................................................................................ 86
Enumeradores................................................................................................................ 87
Tipos Reais.........................................................................................................................
(double, float) 89
Tipo string......................................................................................................................... 94
Estruturas,.........................................................................................................................
Classes e Interfaces 95
Objeto Array
.........................................................................................................................
Dinâmico 115
Conversão.........................................................................................................................
de Tipo (Typecasting) 116
Tipo void.........................................................................................................................
e constante NULL 121
Tipos personalizados
......................................................................................................................... 122
Ponteiros.........................................................................................................................
de Objeto 132
Referência,
.........................................................................................................................
Modificador & e Palavra-chave this 135
Operaç ões............................................................................................................................137
e Expressões
Express õ.........................................................................................................................
es 138
Operaç ões
.........................................................................................................................
Aritméticas 139
Operaç ões
.........................................................................................................................
de Atribuição 140
Operaç ões
.........................................................................................................................
de Relação 141
Operaç ões Booleanas
......................................................................................................................... 142
Operaç ões Binárias
......................................................................................................................... 144
Outras Operaç ões
......................................................................................................................... 147
Regras de
.........................................................................................................................
Precedência 151
Operadores............................................................................................................................153
Operador.........................................................................................................................
Composto 155
Operador.........................................................................................................................
de Expressão 156
Operador.........................................................................................................................
return 157
Operador.........................................................................................................................
Condicional if-else 158
Ternário ?
Operador......................................................................................................................... 159
Operador.........................................................................................................................
switch 161
Operador.........................................................................................................................
de loop while 163
Operador.........................................................................................................................
de loop for 164
Operador.........................................................................................................................
de loop do while 166
break
Operador......................................................................................................................... 167
Operador.........................................................................................................................
continue 168
Operador.........................................................................................................................
de Criação de Objeto new 169
Operação.........................................................................................................................
de Exclusão de Objeto delete 171
Funç ões ............................................................................................................................172
de Função
Chamada......................................................................................................................... 174
Passando.........................................................................................................................
Parâmetros 175
Sobrecarga de Função
......................................................................................................................... 178
Sobrecarga
.........................................................................................................................
de Operação 181
Descrição de Funç ões Externas
......................................................................................................................... 195
Exportação de Funç ões
......................................................................................................................... 197

© 2000-2018, MetaQuotes Software Corp.


3 Conteúdo

Funç ões .........................................................................................................................


de Manipulação de Evento 198
Variáveis ............................................................................................................................210
V ariáveis.........................................................................................................................
Locais 213
Parâmetros Formais
......................................................................................................................... 215
V ariáveis.........................................................................................................................
Estáticas 217
V ariáveis.........................................................................................................................
Globais 219
V ariáveis.........................................................................................................................
de Entrada 220
V ariáveis.........................................................................................................................
Externas 225
Inicialização de V ariáveis
......................................................................................................................... 226
V isibilidade Escopo e Tempo de V ida de V ariáveis
......................................................................................................................... 228
Criação e.........................................................................................................................
Exclusão de Objetos 230
............................................................................................................................233
Preproc essador
Substituição de Macro (#define)
......................................................................................................................... 235
Propriedades de Programa (#property)
......................................................................................................................... 238
Arquivos (#include)
Incluindo......................................................................................................................... 244
Importando Funç ões (#import)
......................................................................................................................... 245
Conditional Compilation (#ifdef, #ifndef, #else, #endif)
......................................................................................................................... 248
............................................................................................................................250
Programaç ão Orientada a Objetos
Encapsulamento
.........................................................................................................................
e Extensibilidade de Tipo 252
Herança ......................................................................................................................... 255
Polimorfismo
......................................................................................................................... 260
Sobrecarga
.........................................................................................................................
(Overload) 264
Funç ões .........................................................................................................................
V irtuais 265
Membros.........................................................................................................................
Estáticos de uma Classe 269
Templates de Função
......................................................................................................................... 273
Modelos de
.........................................................................................................................
classes 277
Classes abstratas
......................................................................................................................... 282
2 Constantes, Enumeradores
.................................................................................................
e Estruturas 284
Constantes............................................................................................................................285
de Gráfic o
Eventos de Gráficos
Tipos de ......................................................................................................................... 286
Janela temporal de Gráfico
......................................................................................................................... 293
Propriedades de Gráfico
......................................................................................................................... 295
Constantes
.........................................................................................................................
de Posicionamento 303
Representação de Gráfico
......................................................................................................................... 304
Exemplos.........................................................................................................................
de como trabalhar com um gráfico 306
Constantes............................................................................................................................365
de Objetos
Tipos de .........................................................................................................................
Objeto 366
O BJ_V LINE ................................................................................................................ 368
O BJ_HLINE ................................................................................................................ 373
O BJ_TREND ................................................................................................................ 378
O BJ_TRENDBY ANGLE
................................................................................................................ 385
O BJ_C Y CLES................................................................................................................ 391
O BJ_ARRO W................................................................................................................
ED_LINE 397
O BJ_C HANNEL ................................................................................................................ 403
O BJ_STDDEV................................................................................................................
C HANNEL 410
O BJ_REGRESSION
................................................................................................................ 417
O BJ_PITC HF................................................................................................................
ORK 423
O BJ_GANNLINE ................................................................................................................ 431
O BJ_GANNFAN ................................................................................................................ 438
O BJ_GANNGRID ................................................................................................................ 445
O BJ_FI BO ................................................................................................................ 452
O BJ_FI BOTIMES
................................................................................................................ 459
O BJ_FI BO FAN................................................................................................................ 466
O BJ_FI BOARC ................................................................................................................ 473
O BJ_FI BOC H................................................................................................................
ANNEL 480
O BJ_EX PANSION
................................................................................................................ 488
O BJ_ELLIOT................................................................................................................
W AV E5 496
O BJ_ELLIOT................................................................................................................
W AV E3 504

© 2000-2018, MetaQuotes Software Corp.


4 Conteúdo

O BJ_RECTAN................................................................................................................
GLE 511
O BJ_TRIANG................................................................................................................
LE 517
O BJ_ELLIPSE................................................................................................................ 524
O BJ_ARRO W_ THUMB_UP
................................................................................................................ 531
O BJ_ARRO W_ THUMB_DO W N
................................................................................................................ 537
O BJ_ARRO W_ ................................................................................................................
UP 543
O BJ_ARRO W_ DO W N
................................................................................................................ 549
O BJ_ARRO W_ ................................................................................................................
STOP 555
O BJ_ARRO W_ C HEC K
................................................................................................................ 561
O BJ_ARRO W_ LEFT_PRICE
................................................................................................................ 567
O BJ_ARRO W_ RI GHT_PRICE
................................................................................................................ 572
O BJ_ARRO W_B UY
................................................................................................................ 577
O BJ_ARRO W_ ................................................................................................................
SELL 582
O BJ_ARRO W................................................................................................................ 587
O BJ_TEX T ................................................................................................................ 593
O BJ_LABEL ................................................................................................................ 599
O BJ_BUTTON................................................................................................................ 607
O BJ_C HART ................................................................................................................ 614
O BJ_BITMAP................................................................................................................ 621
O BJ_BITMAP................................................................................................................
_LABEL 628
O BJ_EDIT ................................................................................................................ 635
O BJ_EV ENT ................................................................................................................ 642
O BJ_RECTAN................................................................................................................
GLE_LABEL 647
Propriedades
.........................................................................................................................
do Objeto 653
de V inculação de Objeto
Métodos ......................................................................................................................... 661
Gráfico
Canto de......................................................................................................................... 666
V isibilidade
.........................................................................................................................
de Objetos 669
Níveis de.........................................................................................................................
Onda de Elliott 672
Objetos G .........................................................................................................................
ann 673
Cores W eb ......................................................................................................................... 675
W ingdings ......................................................................................................................... 677
Constantes............................................................................................................................678
de Indic ador
Constantes.........................................................................................................................
de Preço 679
Métodos .........................................................................................................................
de Suavização 682
Linhas de.........................................................................................................................
Indicadores 683
Estilos de.........................................................................................................................
Desenho 685
Propriedades
.........................................................................................................................
de Indicador Customizado 689
Tipos de .........................................................................................................................
Indicador 692
Identificadores
.........................................................................................................................
de Tipo de Dados 694
............................................................................................................................695
Estado de Ambiente
Propriedades
.........................................................................................................................
do Terminal Cliente 696
Propriedades
.........................................................................................................................
de um Programa MQL5 em Execução 702
Propriedades
.........................................................................................................................
do Ativo 705
Propriedades
.........................................................................................................................
da Conta 722
Estatísticas
.........................................................................................................................
de Teste 726
Constantes............................................................................................................................730
de Negoc iaç ão
Propriedades de uma Base Histórica de Dados
......................................................................................................................... 731
Propriedades
.........................................................................................................................
de uma Ordem 732
Propriedades
.........................................................................................................................
de uma Posição 737
Propriedades
.........................................................................................................................
de uma Operação 740
Operaç ões de Negociação
Tipos de ......................................................................................................................... 744
Tipos de .........................................................................................................................
Transação de Negociação 756
Ordens de.........................................................................................................................
Negociação em DOM (Profundidade de Mercado) 759
Propriedades
.........................................................................................................................
de Sinal 760
Constantes............................................................................................................................762
Nomeados
Substituiç ões de Macro Predefinidas
......................................................................................................................... 763
Constantes
.........................................................................................................................
Matemáticas 765
Constantes
.........................................................................................................................
de Tipo Numérico 767

© 2000-2018, MetaQuotes Software Corp.


5 Conteúdo

Códigos de.........................................................................................................................
Motivos de Desinicialização 770
V erificação
.........................................................................................................................
de Ponteiro de Objeto 772
Outras Constantes
......................................................................................................................... 773
............................................................................................................................777
Estruturas de Dados
Estrutura
.........................................................................................................................
do Tipo Data 778
Estrutura
.........................................................................................................................
de Parâmetros de Entrada 779
Estrutura de Dados Históricos
......................................................................................................................... 780
Estrutura
.........................................................................................................................
DOM 781
Estrutura
.........................................................................................................................
de Solicitação de Negociação (Trade) 782
Estrutura de Resultados de V erificação de Solicitação
......................................................................................................................... 796
Estrutura
.........................................................................................................................
de Resultado de Solicitação de uma Negociação (Trade) 797
Estrutura
.........................................................................................................................
de uma Transação de Negociação 801
Estrutura
.........................................................................................................................
para Preços Correntes 809
Códigos de ............................................................................................................................810
Erros e Avisos
Códigos de
.........................................................................................................................
Retorno do Servidor de Negociação 811
Avisos do.........................................................................................................................
Compilador 815
Erros de .........................................................................................................................
Compilação 819
Erros em.........................................................................................................................
Tempo de Execução 831
Constantes............................................................................................................................843
de Entrada/Saída
Flags de Abertura
.........................................................................................................................
de Arquivo 844
Propriedades
.........................................................................................................................
de Arquivo 847
Posição In- File
......................................................................................................................... 849
Uso de um.........................................................................................................................
Código de Página (Codepage) 850
MessageB.........................................................................................................................
ox 851
3 Programas MQL5
................................................................................................. 853
............................................................................................................................854
Exec uç ão de Programa
............................................................................................................................861
Trade permission
Eventos do ............................................................................................................................865
Terminal Cliente
Rec ursos ............................................................................................................................868
Chamadas de............................................................................................................................880
Funç ões Importadas
............................................................................................................................882
Erros em Tempo de Exec uç ão
............................................................................................................................883
Testando Estratégias de Negoc iaç ão
4 Variáveis Predefinidas
................................................................................................. 909
_AppliedTo............................................................................................................................910
_Digits ............................................................................................................................912
_Point ............................................................................................................................913
_LastError ............................................................................................................................914
_Period ............................................................................................................................915
_RandomSeed............................................................................................................................916
_StopFlag ............................................................................................................................917
_Symbol ............................................................................................................................918
............................................................................................................................919
_UninitReason
_IsX 64 ............................................................................................................................920
5 Funções Comuns
................................................................................................. 921
Alert ............................................................................................................................923
Chec k Pointer
............................................................................................................................924
Comment ............................................................................................................................926
............................................................................................................................928
CryptEnc ode
............................................................................................................................930
CryptDec ode
k
DebugBrea............................................................................................................................931
............................................................................................................................932
ExpertRemove
GetPointer ............................................................................................................................934
GetTic k Count
............................................................................................................................938
............................................................................................................................939
GetMic rosec ondCount
MessageBox............................................................................................................................941
............................................................................................................................942
PeriodSec onds
PlaySound ............................................................................................................................943

© 2000-2018, MetaQuotes Software Corp.


6 Conteúdo

Print ............................................................................................................................944
PrintFormat............................................................................................................................946
............................................................................................................................952
ResetLastError
............................................................................................................................953
Resourc eCreate
............................................................................................................................955
Resourc eFree
............................................................................................................................956
Resourc eReadImage
............................................................................................................................957
Resourc eSave
............................................................................................................................958
SetUserError
SendFTP ............................................................................................................................959
SendNotific............................................................................................................................960
ation
SendMail ............................................................................................................................961
Sleep ............................................................................................................................962
............................................................................................................................963
TerminalClose
TesterH ideIndic
............................................................................................................................965
ators
............................................................................................................................967
TesterStatistic s
TesterW ithdra w al
............................................................................................................................968
Translate Key
............................................................................................................................969
W ebRe q uest
............................................................................................................................970
Z eroMemory............................................................................................................................973
6 Funções para .................................................................................................
Array 974
ArrayBsearc ............................................................................................................................975
h
ArrayCopy ............................................................................................................................979
ArrayCompare............................................................................................................................984
ArrayFree ............................................................................................................................985
............................................................................................................................994
ArrayGetAsSeries
ze
ArrayInitiali............................................................................................................................997
ArrayFill ............................................................................................................................999
............................................................................................................................1001
ArrayIsDynamic
............................................................................................................................1003
ArrayIsSeries
............................................................................................................................1005
ArrayMaximum
............................................................................................................................1016
ArrayMinimum
ArrayPrint............................................................................................................................1027
ArrayRange............................................................................................................................1030
ArrayResiz............................................................................................................................1031
e
............................................................................................................................1034
ArraySetAsSeries
ArraySize ............................................................................................................................1037
ArraySort............................................................................................................................1039
ArrayS w ap
............................................................................................................................1044
7 Funções de Conversão
................................................................................................. 1046
............................................................................................................................1048
CharToString
............................................................................................................................1049
CharArrayToString
............................................................................................................................1050
ColorToARGB
............................................................................................................................1052
ColorToString
............................................................................................................................1053
DoubleToString
............................................................................................................................1054
EnumToString
............................................................................................................................1056
IntegerToString
............................................................................................................................1057
ShortToString
............................................................................................................................1058
ShortArrayToString
............................................................................................................................1059
TimeToString
NormalizeDouble
............................................................................................................................1060
............................................................................................................................1062
StringToCharArray
............................................................................................................................1063
StringToColor
............................................................................................................................1064
StringToDouble
............................................................................................................................1065
StringToInteger
............................................................................................................................1066
StringToShortArray
............................................................................................................................1067
StringToTime
............................................................................................................................1068
StringFormat

© 2000-2018, MetaQuotes Software Corp.


7 Conteúdo

8 Funções Matemáticas
................................................................................................. 1072
MathAbs ............................................................................................................................1074
............................................................................................................................1075
MathArc c os
MathArc sin............................................................................................................................1076
MathArc tan............................................................................................................................1077
MathCeil ............................................................................................................................1078
MathCos ............................................................................................................................1079
MathExp ............................................................................................................................1080
MathFloor............................................................................................................................1081
MathLog ............................................................................................................................1082
MathLog10............................................................................................................................1083
MathMax ............................................................................................................................1084
MathMin ............................................................................................................................1085
MathMod ............................................................................................................................1086
MathPo w ............................................................................................................................1087
MathRand ............................................................................................................................1088
MathRound ............................................................................................................................1089
MathSin ............................................................................................................................1090
MathS q rt ............................................................................................................................1091
MathSrand............................................................................................................................1092
MathTan ............................................................................................................................1095
............................................................................................................................1096
MathIsValidNumber
MathExpm1 ............................................................................................................................1097
MathLog1p............................................................................................................................1098
............................................................................................................................1099
MathArc c osh
............................................................................................................................1100
MathArc sinh
............................................................................................................................1101
MathArc tanh
MathCosh ............................................................................................................................1102
MathSinh ............................................................................................................................1103
MathTanh ............................................................................................................................1104
9 Funções de String
................................................................................................. 1105
StringAdd ............................................................................................................................1107
............................................................................................................................1109
StringBufferLen
............................................................................................................................1110
StringCompare
StringConc............................................................................................................................1112
atenate
StringFill ............................................................................................................................1113
StringFind............................................................................................................................1114
............................................................................................................................1115
StringGetCharac ter
StringInit ............................................................................................................................1116
StringLen ............................................................................................................................1117
............................................................................................................................1118
StringReplac e
............................................................................................................................1119
StringSetCharac ter
StringSplit............................................................................................................................1121
............................................................................................................................1123
StringSubstr
w er
StringToLo............................................................................................................................1124
............................................................................................................................1125
StringToUpper
............................................................................................................................1126
StringTrimLeft
............................................................................................................................1127
StringTrimRight
10 Data e Hora ................................................................................................. 1128
............................................................................................................................1129
TimeCurrent
............................................................................................................................1130
TimeTradeServer
TimeLoc al............................................................................................................................1131
TimeGMT ............................................................................................................................1132
............................................................................................................................1133
TimeDaylightSavings
............................................................................................................................1134
TimeGMTOffset
............................................................................................................................1135
TimeToStruc t
............................................................................................................................1136
Struc tToTime

© 2000-2018, MetaQuotes Software Corp.


8 Conteúdo

11 Informações .................................................................................................
de Conta 1137
............................................................................................................................1138
Ac c ountInfoDouble
............................................................................................................................1139
Ac c ountInfoInteger
............................................................................................................................1141
Ac c ountInfoString
12 Verificando Estado
................................................................................................. 1142
............................................................................................................................1143
GetLastError
IsStopped ............................................................................................................................1144
UninitializeReason
............................................................................................................................1145
............................................................................................................................1146
TerminalInfoInteger
............................................................................................................................1147
TerminalInfoDouble
............................................................................................................................1148
TerminalInfoString
............................................................................................................................1149
MQLInfoInteger
............................................................................................................................1150
MQLInfoString
Symbol ............................................................................................................................1151
Period ............................................................................................................................1152
Digits ............................................................................................................................1153
Point ............................................................................................................................1154
13 Informações .................................................................................................
de Mercado 1155
............................................................................................................................1156
SymbolsTotal
SymbolName............................................................................................................................1157
............................................................................................................................1158
SymbolSelec t
............................................................................................................................1159
SymbolIsSync hronized
............................................................................................................................1160
SymbolInfoDouble
............................................................................................................................1162
SymbolInfoInteger
............................................................................................................................1164
SymbolInfoString
............................................................................................................................1165
SymbolInfoMarginRate
............................................................................................................................1166
SymbolInfoTic k
............................................................................................................................1167
SymbolInfoSessionQuote
............................................................................................................................1168
SymbolInfoSessionTrade
Mark etBoo............................................................................................................................1169
k Add
Mark etBoo............................................................................................................................1170
k Release
Mark etBoo............................................................................................................................1171
k Get
14 Séries Temporais
.................................................................................................
e Acesso a Indicadores 1172
Direç ão de............................................................................................................................1177
Indexaç ão em Arrays, Buffers e Séries Temporais
Organizando............................................................................................................................1181
Ac esso aos Dados
............................................................................................................................1191
SeriesInfoInteger
Bars ............................................................................................................................1193
............................................................................................................................1196
BarsCalc ulated
............................................................................................................................1198
Indic atorCreate
............................................................................................................................1200
Indic atorParameters
............................................................................................................................1202
Indic atorRelease
CopyBuffer ............................................................................................................................1204
CopyRates............................................................................................................................1209
CopyTime............................................................................................................................1213
CopyOpen............................................................................................................................1216
Copy H igh ............................................................................................................................1219
CopyLo w ............................................................................................................................1223
CopyClose............................................................................................................................1226
CopyTic k Volume
............................................................................................................................1229
............................................................................................................................1233
CopyRealVolume
CopySpread ............................................................................................................................1236
CopyTic k s............................................................................................................................1240
CopyTic k sRange
............................................................................................................................1245
iBars ............................................................................................................................1247
iBarShift ............................................................................................................................1248
iClose ............................................................................................................................1251
iH igh ............................................................................................................................1253

© 2000-2018, MetaQuotes Software Corp.


9 Conteúdo

iH ighest ............................................................................................................................1255
iLo w ............................................................................................................................1256
iLo w est ............................................................................................................................1258
iOpen ............................................................................................................................1259
iTime ............................................................................................................................1261
iTic k Volume
............................................................................................................................1263
iRealVolume............................................................................................................................1265
iVolume ............................................................................................................................1267
iSpread ............................................................................................................................1269
15 Símbolos personali zados
................................................................................................. 1271
............................................................................................................................1273
CustomSymbolCreate
............................................................................................................................1274
CustomSymbolDelete
............................................................................................................................1275
CustomSymbolSetInteger
............................................................................................................................1276
CustomSymbolSetDouble
............................................................................................................................1277
CustomSymbolSetString
............................................................................................................................1278
CustomSymbolSetMarginRate
............................................................................................................................1279
CustomSymbolSetSessionQuote
............................................................................................................................1280
CustomSymbolSetSessionTrade
............................................................................................................................1281
CustomRatesDelete
............................................................................................................................1282
CustomRatesReplac e
............................................................................................................................1283
CustomRatesUpdate
k sAdd
CustomTic............................................................................................................................1284
k sDelete
CustomTic............................................................................................................................1286
k sReplac e
CustomTic............................................................................................................................1287
16 Operações de.................................................................................................
Gráficos 1289
............................................................................................................................1292
ChartApplyTemplate
............................................................................................................................1295
ChartSaveTemplate
ChartW indo w Find
............................................................................................................................1300
............................................................................................................................1302
ChartTimePric eTo X Y
ChartX Y ToTimePric
............................................................................................................................1303
e
ChartOpen............................................................................................................................1305
ChartFirst ............................................................................................................................1306
ChartNext............................................................................................................................1307
ChartClose............................................................................................................................1308
ChartSymbol............................................................................................................................1309
ChartPeriod............................................................................................................................1310
ChartRedra w
............................................................................................................................1311
............................................................................................................................1312
ChartSetDouble
............................................................................................................................1313
ChartSetInteger
............................................................................................................................1315
ChartSetString
............................................................................................................................1317
ChartGetDouble
............................................................................................................................1319
ChartGetInteger
............................................................................................................................1321
ChartGetString
............................................................................................................................1323
ChartNavigate
ChartID ............................................................................................................................1326
ChartIndic............................................................................................................................1327
atorAdd
ChartIndic............................................................................................................................1331
atorDelete
ChartIndic............................................................................................................................1334
atorGet
ChartIndic............................................................................................................................1336
atorName
ChartIndic............................................................................................................................1337
atorsTotal
ChartW indo w OnDropped
............................................................................................................................1338
............................................................................................................................1339
ChartPric eOnDropped
............................................................................................................................1340
ChartTimeOnDropped
ChartX OnDropped
............................................................................................................................1341
ChartY OnDropped
............................................................................................................................1342
............................................................................................................................1343
ChartSetSymbolPeriod
............................................................................................................................1344
ChartSc reenShot

© 2000-2018, MetaQuotes Software Corp.


10 Conteúdo

17 Funções de Negociação (Trade)


................................................................................................. 1347
OrderCalc............................................................................................................................1349
Margin
OrderCalc............................................................................................................................1350
Profit
k
OrderChec............................................................................................................................1351
OrderSend............................................................................................................................1352
............................................................................................................................1357
OrderSendAsync
............................................................................................................................1368
PositionsTotal
............................................................................................................................1369
PositionGetSymbol
............................................................................................................................1370
PositionSelec t
............................................................................................................................1371
PositionSelec tByTic k et
............................................................................................................................1372
PositionGetDouble
............................................................................................................................1373
PositionGetInteger
............................................................................................................................1375
PositionGetTic k et
............................................................................................................................1376
PositionGetString
............................................................................................................................1377
OrdersTotal
............................................................................................................................1378
OrderGetTic k et
OrderSelec............................................................................................................................1380
t
............................................................................................................................1381
OrderGetDouble
............................................................................................................................1382
OrderGetInteger
............................................................................................................................1383
OrderGetString
H istorySelec
............................................................................................................................1384
t
H istorySelec
............................................................................................................................1386
tByPosition
H istoryOrderSelec
............................................................................................................................1387
t
H istoryOrdersTotal
............................................................................................................................1388
H istoryOrderGetTic k et
............................................................................................................................1389
H istoryOrderGetDouble
............................................................................................................................1391
H istoryOrderGetInteger
............................................................................................................................1392
H istoryOrderGetString
............................................................................................................................1395
H istoryDealSelec
............................................................................................................................1396
t
H istoryDealsTotal
............................................................................................................................1397
H istoryDealGetTic k et
............................................................................................................................1398
H istoryDealGetDouble
............................................................................................................................1400
H istoryDealGetInteger
............................................................................................................................1401
H istoryDealGetString
............................................................................................................................1404
18 Gerenciamento
.................................................................................................
de sinais 1405
............................................................................................................................1406
SignalBaseGetDouble
............................................................................................................................1407
SignalBaseGetInteger
............................................................................................................................1408
SignalBaseGetString
............................................................................................................................1409
SignalBaseSelec t
............................................................................................................................1410
SignalBaseTotal
............................................................................................................................1411
SignalInfoGetDouble
............................................................................................................................1412
SignalInfoGetInteger
............................................................................................................................1413
SignalInfoGetString
............................................................................................................................1414
SignalInfoSetDouble
............................................................................................................................1415
SignalInfoSetInteger
............................................................................................................................1416
SignalSubsc ribe
............................................................................................................................1417
SignalUnsubsc ribe
19 Variáveis Globais
.................................................................................................
do Terminal 1418
............................................................................................................................1419
GlobalVariableChec k
............................................................................................................................1420
GlobalVariableTime
............................................................................................................................1421
GlobalVariableDel
............................................................................................................................1422
GlobalVariableGet
............................................................................................................................1423
GlobalVariableName
............................................................................................................................1424
GlobalVariableSet
............................................................................................................................1425
GlobalVariablesFlush
............................................................................................................................1426
GlobalVariableTemp
............................................................................................................................1427
GlobalVariableSetOnCondition

© 2000-2018, MetaQuotes Software Corp.


11 Conteúdo

............................................................................................................................1428
GlobalVariablesDeleteAll
............................................................................................................................1429
GlobalVariablesTotal
20 Funções de Ar quivo
................................................................................................. 1430
............................................................................................................................1433
FileFindFirst
FileFindNext............................................................................................................................1435
............................................................................................................................1437
FileFindClose
FileIsExist ............................................................................................................................1439
FileOpen ............................................................................................................................1442
FileClose ............................................................................................................................1445
FileCopy ............................................................................................................................1446
FileDelete............................................................................................................................1449
FileMove ............................................................................................................................1451
FileFlush ............................................................................................................................1454
............................................................................................................................1456
FileGetInteger
FileIsEnding............................................................................................................................1459
............................................................................................................................1461
FileIsLineEnding
............................................................................................................................1466
FileReadArray
FileReadBool............................................................................................................................1468
............................................................................................................................1471
FileReadDatetime
............................................................................................................................1474
FileReadDouble
............................................................................................................................1477
FileReadFloat
............................................................................................................................1480
FileReadInteger
FileReadLong............................................................................................................................1484
............................................................................................................................1487
FileReadNumber
............................................................................................................................1492
FileReadString
............................................................................................................................1494
FileReadStruc t
FileSee k ............................................................................................................................1498
FileSize ............................................................................................................................1501
FileTell ............................................................................................................................1503
File W rite ............................................................................................................................1506
File W riteArray
............................................................................................................................1509
File W riteDouble
............................................................................................................................1512
File W riteFloat
............................................................................................................................1515
File W riteInteger
............................................................................................................................1517
File W riteLong
............................................................................................................................1520
File W riteString
............................................................................................................................1522
File W riteStruc
............................................................................................................................1525
t
FileLoad ............................................................................................................................1528
FileSave ............................................................................................................................1530
FolderCreate............................................................................................................................1532
FolderDelete............................................................................................................................1535
FolderClean ............................................................................................................................1538
21 Indicadores Customi zados
................................................................................................. 1541
............................................................................................................................1545
Estilos de Indic ador em Exemplos
DRAW_NONE
......................................................................................................................... 1553
DRAW_LINE
......................................................................................................................... 1556
DRAW_SECTION
......................................................................................................................... 1560
DRAW_H.........................................................................................................................
ISTO GRAM 1564
DRAW_H.........................................................................................................................
ISTO GRAM2 1568
DRAW_ARRO W
......................................................................................................................... 1572
DRAW_Z.........................................................................................................................
I GZAG 1577
DRAW_F.........................................................................................................................
ILLING 1582
DRAW_B.........................................................................................................................
ARS 1587
DRAW_CANDLES
......................................................................................................................... 1593
DRAW_COLOR _LINE
......................................................................................................................... 1600
DRAW_COLOR _SECTION
......................................................................................................................... 1605
DRAW_COLOR _HISTO GRAM
......................................................................................................................... 1611
DRAW_COLOR _HISTO GRAM2
......................................................................................................................... 1616

© 2000-2018, MetaQuotes Software Corp.


12 Conteúdo

DRAW_COLOR _ARRO W
......................................................................................................................... 1621
DRAW_COLOR _ZI GZAG
......................................................................................................................... 1627
DRAW_COLOR _BARS
......................................................................................................................... 1632
DRAW_COLOR _CANDLES
......................................................................................................................... 1639
............................................................................................................................1646
Conexão entre Propriedades do Indic ador e Funç ões
............................................................................................................................1649
SetIndexBuffer
............................................................................................................................1652
Indic atorSetDouble
............................................................................................................................1656
Indic atorSetInteger
............................................................................................................................1660
Indic atorSetString
............................................................................................................................1663
PlotIndexSetDouble
............................................................................................................................1664
PlotIndexSetInteger
............................................................................................................................1668
PlotIndexSetString
............................................................................................................................1669
PlotIndexGetInteger
22 Funções de Objeto
................................................................................................. 1672
............................................................................................................................1674
Objec tCreate
............................................................................................................................1678
Objec tName
............................................................................................................................1679
Objec tDelete
............................................................................................................................1680
Objec tsDeleteAll
............................................................................................................................1681
Objec tFind
............................................................................................................................1682
Objec tGetTimeByValue
............................................................................................................................1683
Objec tGetValueByTime
............................................................................................................................1684
Objec tMove
............................................................................................................................1685
Objec tsTotal
............................................................................................................................1686
Objec tSetDouble
............................................................................................................................1690
Objec tSetInteger
............................................................................................................................1693
Objec tSetString
............................................................................................................................1695
Objec tGetDouble
............................................................................................................................1697
Objec tGetInteger
............................................................................................................................1699
Objec tGetString
............................................................................................................................1701
TextSetFont
TextOut ............................................................................................................................1704
TextGetSiz............................................................................................................................1708
e
23 Indicadores Técnicos
................................................................................................. 1709
iAC ............................................................................................................................1712
iAD ............................................................................................................................1717
iADX ............................................................................................................................1722
iADX W ilder ............................................................................................................................1727
iAlligator ............................................................................................................................1732
iAMA ............................................................................................................................1739
iAO ............................................................................................................................1744
iATR ............................................................................................................................1749
iBearsPo w............................................................................................................................1754
er
iBands ............................................................................................................................1759
iBullsPo w er............................................................................................................................1765
iCCI ............................................................................................................................1770
iChaik in ............................................................................................................................1775
iCustom ............................................................................................................................1780
iDEMA ............................................................................................................................1783
iDeMark er............................................................................................................................1788
iEnvelopes............................................................................................................................1793
iForc e ............................................................................................................................1799
iFrac tals ............................................................................................................................1804
iFrAMA ............................................................................................................................1809
iGator ............................................................................................................................1814
iIc himo k u ............................................................................................................................1821
iB W MFI ............................................................................................................................1828
iMomentum ............................................................................................................................1833
iMFI ............................................................................................................................1838

© 2000-2018, MetaQuotes Software Corp.


13 Conteúdo

iMA ............................................................................................................................1843
iOsMA ............................................................................................................................1848
iMACD ............................................................................................................................1853
iOBV ............................................................................................................................1859
iSAR ............................................................................................................................1864
iRSI ............................................................................................................................1869
iRVI ............................................................................................................................1874
iStdDev ............................................................................................................................1879
iStoc hastic............................................................................................................................1884
iTEMA ............................................................................................................................1890
iTriX ............................................................................................................................1895
iW PR ............................................................................................................................1900
iVIDyA ............................................................................................................................1905
iVolumes ............................................................................................................................1910
com Resultados de Otimização
24 Trabalhando................................................................................................. 1915
FrameFirst............................................................................................................................1916
............................................................................................................................1917
FrameFilter
FrameNext............................................................................................................................1918
............................................................................................................................1919
FrameInputs
FrameAdd............................................................................................................................1920
............................................................................................................................1921
ParameterGetRange
............................................................................................................................1924
ParameterSetRange
25 Trabalhando.................................................................................................
com Eventos 1926
............................................................................................................................1927
EventSetMillisec ondTimer
............................................................................................................................1928
EventSetTimer
EventKillTimer
............................................................................................................................1929
............................................................................................................................1930
EventChartCustom
26 Trabalhando.................................................................................................
com OpenCL 1936
CLH andleType
............................................................................................................................1938
............................................................................................................................1939
CLGetInfoInteger
............................................................................................................................1942
CLGetInfoString
............................................................................................................................1945
CLContextCreate
............................................................................................................................1946
CLContextFree
CLGetDevic............................................................................................................................1947
eInfo
............................................................................................................................1951
CLProgramCreate
............................................................................................................................1955
CLProgramFree
CLKernelCreate
............................................................................................................................1956
CLKernelFree
............................................................................................................................1957
CLSetKernelArg
............................................................................................................................1958
CLSetKernelArgMem
............................................................................................................................1959
CLSetKernelArgMemLoc
............................................................................................................................1960
al
............................................................................................................................1961
CLBufferCreate
............................................................................................................................1962
CLBufferFree
CLBufferW............................................................................................................................1963
rite
............................................................................................................................1964
CLBufferRead
CLExec ute............................................................................................................................1965
............................................................................................................................1967
CLExec utionStatus
27 Biblioteca Padrão
................................................................................................. 1968
Matemátic ............................................................................................................................1969
a
Estatística
......................................................................................................................... 1970
Características
................................................................................................................
estatísticas 1973
MathMean ........................................................................................................... 1974
MathV ariance........................................................................................................... 1975
MathSk ewness........................................................................................................... 1976
MathKurtosis ........................................................................................................... 1977
MathMoments ........................................................................................................... 1978
MathMedian ........................................................................................................... 1979

© 2000-2018, MetaQuotes Software Corp.


14 Conteúdo

MathStandardDeviation
........................................................................................................... 1980
MathAverageDeviation
........................................................................................................... 1981
Distribuição
................................................................................................................
normal 1982
MathProbabilityDensityNormal
........................................................................................................... 1986
MathCumulativeDistributionNormal
........................................................................................................... 1988
MathQuantileNormal
........................................................................................................... 1990
MathRandomNormal
........................................................................................................... 1992
MathMomentsNormal
........................................................................................................... 1993
Distribuição
................................................................................................................
log-normal 1994
MathProbabilityDensityLognormal
........................................................................................................... 1998
MathCumulativeDistributionLognormal
........................................................................................................... 2000
MathQuantileLognormal
........................................................................................................... 2002
MathRandomLognormal
........................................................................................................... 2004
MathMomentsLognormal
........................................................................................................... 2005
Distribuição
................................................................................................................
beta 2006
MathProbabilityDensity Beta
........................................................................................................... 2010
MathCumulativeDistribution Beta
........................................................................................................... 2012
MathQuantile Beta
........................................................................................................... 2014
MathRandom Beta
........................................................................................................... 2016
MathMoments Beta
........................................................................................................... 2017
Distribuição
................................................................................................................
beta não-central 2018
MathProbabilityDensityNoncentral Beta
........................................................................................................... 2022
MathCumulativeDistributionNoncentral Beta
........................................................................................................... 2024
MathQuantileNoncentral Beta
........................................................................................................... 2026
MathRandomNoncentral Beta
........................................................................................................... 2028
MathMomentsNoncentral Beta
........................................................................................................... 2029
Distribuição
................................................................................................................
gama 2030
MathProbabilityDensity Gamma
........................................................................................................... 2034
MathCumulativeDistribution Gamma
........................................................................................................... 2036
MathQuantile Gamma
........................................................................................................... 2038
MathRandom Gamma
........................................................................................................... 2040
MathMoments Gamma
........................................................................................................... 2041
Qui-quadrado
................................................................................................................ 2042
MathProbabilityDensityChiSquare
........................................................................................................... 2046
MathCumulativeDistributionChiSquare
........................................................................................................... 2048
MathQuantileChiSquare
........................................................................................................... 2050
MathRandomChiSquare
........................................................................................................... 2052
MathMomentsChiSquare
........................................................................................................... 2053
Qui-quadrado
................................................................................................................
não-central 2054
MathProbabilityDensityNoncentralChiSquare
........................................................................................................... 2058
MathCumulativeDistributionNoncentralChiSquare
........................................................................................................... 2060
MathQuantileNoncentralChiSquare
........................................................................................................... 2062
MathRandomNoncentralChiSquare
........................................................................................................... 2064
MathMomentsNoncentralChiSquare
........................................................................................................... 2065
Distribuição
................................................................................................................
exponencial 2066
MathProbabilityDensityExponential
........................................................................................................... 2070
MathCumulativeDistributionExponential
........................................................................................................... 2072
MathQuantileExponential
........................................................................................................... 2074
MathRandomExponential
........................................................................................................... 2076
MathMomentsExponential
........................................................................................................... 2077
Distribuição F de Fisher
................................................................................................................ 2078
MathProbabilityDensity F
........................................................................................................... 2082
MathCumulativeDistribution F
........................................................................................................... 2084
MathQuantile F
........................................................................................................... 2086
MathRandom F
........................................................................................................... 2088
MathMoments F
........................................................................................................... 2089
Distribuição F de Fisher não-central
................................................................................................................ 2090
MathProbabilityDensityNoncentral F
........................................................................................................... 2094

© 2000-2018, MetaQuotes Software Corp.


15 Conteúdo

MathCumulativeDistributionNoncentral F
........................................................................................................... 2096
MathQuantileNoncentral F
........................................................................................................... 2098
MathRandomNoncentral F
........................................................................................................... 2100
MathMomentsNoncentral F
........................................................................................................... 2101
Distribuição
................................................................................................................
t de Student 2102
MathProbabilityDensityT
........................................................................................................... 2106
MathCumulativeDistributionT
........................................................................................................... 2108
MathQuantileT........................................................................................................... 2110
MathRandomT ........................................................................................................... 2112
MathMomentsT ........................................................................................................... 2113
Distribuição
................................................................................................................
t de Student não-central 2114
MathProbabilityDensityNoncentralT
........................................................................................................... 2118
MathCumulativeDistributionNoncentralT
........................................................................................................... 2120
MathQuantileNoncentralT
........................................................................................................... 2122
MathRandomNoncentralT
........................................................................................................... 2124
MathMomentsNoncentralT
........................................................................................................... 2125
Distribuição
................................................................................................................
logística 2126
MathProbabilityDensityLogistic
........................................................................................................... 2130
MathCumulativeDistributionLogistic
........................................................................................................... 2132
MathQuantileLogistic
........................................................................................................... 2134
MathRandomLogistic
........................................................................................................... 2136
MathMomentsLogistic
........................................................................................................... 2137
Distribuição
................................................................................................................
de Cauchy 2138
MathProbabilityDensityCauchy
........................................................................................................... 2142
MathCumulativeDistributionCauchy
........................................................................................................... 2144
MathQuantileCauchy
........................................................................................................... 2146
MathRandomCauchy
........................................................................................................... 2148
MathMomentsCauchy
........................................................................................................... 2149
Distribuição
................................................................................................................
uniforme 2150
MathProbabilityDensityUniform
........................................................................................................... 2154
MathCumulativeDistributionUniform
........................................................................................................... 2156
MathQuantileUniform
........................................................................................................... 2158
MathRandomUniform
........................................................................................................... 2160
MathMomentsUniform
........................................................................................................... 2161
Distribuição de W eibull
................................................................................................................ 2162
MathProbabilityDensity W eibull
........................................................................................................... 2166
MathCumulativeDistribution W eibull
........................................................................................................... 2168
MathQuantile W eibull
........................................................................................................... 2170
MathRandom W eibull
........................................................................................................... 2172
MathMoments W eibull
........................................................................................................... 2173
Distribuição
................................................................................................................
binomial 2174
MathProbabilityDensity Binomial
........................................................................................................... 2177
MathCumulativeDistribution Binomial
........................................................................................................... 2179
MathQuantile Binomial
........................................................................................................... 2181
MathRandom Binomial
........................................................................................................... 2183
MathMoments Binomial
........................................................................................................... 2184
Distribuição
................................................................................................................
binomial negativa 2185
MathProbabilityDensityNegative Binomial
........................................................................................................... 2188
MathCumulativeDistributionNegative Binomial
........................................................................................................... 2190
MathQuantileNegative Binomial
........................................................................................................... 2192
MathRandomNegative Binomial
........................................................................................................... 2194
MathMomentsNegative Binomial
........................................................................................................... 2195
Distribuição
................................................................................................................
geométrica 2196
MathProbabilityDensity Geometric
........................................................................................................... 2200
MathCumulativeDistribution Geometric
........................................................................................................... 2202
MathQuantile Geometric
........................................................................................................... 2204
MathRandom Geometric
........................................................................................................... 2206
MathMoments Geometric
........................................................................................................... 2207

© 2000-2018, MetaQuotes Software Corp.


16 Conteúdo

Distribuição
................................................................................................................
hipergeométrica 2208
MathProbabilityDensity Hypergeometric
........................................................................................................... 2212
MathCumulativeDistribution Hypergeometric
........................................................................................................... 2214
MathQuantile Hypergeometric
........................................................................................................... 2216
MathRandom Hypergeometric
........................................................................................................... 2218
MathMoments Hypergeometric
........................................................................................................... 2219
Distribuição
................................................................................................................
de Poisson 2220
MathProbabilityDensityPoisson
........................................................................................................... 2224
MathCumulativeDistributionPoisson
........................................................................................................... 2226
MathQuantilePoisson
........................................................................................................... 2228
MathRandomPoisson
........................................................................................................... 2230
MathMomentsPoisson
........................................................................................................... 2231
Funç ões auxiliares
................................................................................................................ 2232
MathRandomNon Zero
........................................................................................................... 2237
MathMoments ........................................................................................................... 2238
MathPowInt ........................................................................................................... 2239
MathFactorial
........................................................................................................... 2240
MathTrunc........................................................................................................... 2241
MathRound........................................................................................................... 2242
MathArctan2 ........................................................................................................... 2244
MathGamma ........................................................................................................... 2246
MathGammaLog........................................................................................................... 2247
MathBeta ........................................................................................................... 2248
MathBetaLog ........................................................................................................... 2249
MathBetaIncomplete
........................................................................................................... 2250
MathGammaIncomplete
........................................................................................................... 2251
MathBinomialCoefficient
........................................................................................................... 2252
MathBinomialCoefficientLog
........................................................................................................... 2253
MathHypergeometric2 F2
........................................................................................................... 2254
MathSequence........................................................................................................... 2255
MathSequence ByCount
........................................................................................................... 2256
MathReplicate
........................................................................................................... 2257
MathReverse ........................................................................................................... 2258
MathIdentical
........................................................................................................... 2259
MathUnique ........................................................................................................... 2260
MathQuic k...........................................................................................................
SortAscending 2261
MathQuic k...........................................................................................................
SortDescending 2262
MathQuic k...........................................................................................................
Sort 2263
MathOrder........................................................................................................... 2264
MathBitwiseNot
........................................................................................................... 2265
MathBitwiseAnd
........................................................................................................... 2266
MathBitwiseOr
........................................................................................................... 2267
MathBitwise X or
........................................................................................................... 2268
MathBitwiseShiftL
........................................................................................................... 2269
MathBitwiseShiftR
........................................................................................................... 2270
MathCumulativeSum
........................................................................................................... 2271
MathCumulativeProduct
........................................................................................................... 2272
MathCumulativeMin
........................................................................................................... 2273
MathCumulativeMax
........................................................................................................... 2274
MathSin ........................................................................................................... 2275
MathCos ........................................................................................................... 2276
MathTan ........................................................................................................... 2277
MathArcsin........................................................................................................... 2278
MathArccos........................................................................................................... 2279
MathArctan ........................................................................................................... 2280
MathSinPi ........................................................................................................... 2281
MathCosPi ........................................................................................................... 2282
MathTanPi ........................................................................................................... 2283

© 2000-2018, MetaQuotes Software Corp.


17 Conteúdo

MathAbs ........................................................................................................... 2284


MathCeil ........................................................................................................... 2285
MathFloor ........................................................................................................... 2286
MathSqrt ........................................................................................................... 2287
MathExp ........................................................................................................... 2288
MathPow ........................................................................................................... 2289
MathLog ........................................................................................................... 2290
MathLog2 ........................................................................................................... 2291
MathLog10........................................................................................................... 2292
MathLog1p........................................................................................................... 2293
MathDifference
........................................................................................................... 2294
MathSample........................................................................................................... 2296
MathTuk eySummary
........................................................................................................... 2299
MathRange........................................................................................................... 2300
MathMin ........................................................................................................... 2301
MathMax ........................................................................................................... 2302
MathSum ........................................................................................................... 2303
MathProduct ........................................................................................................... 2304
MathStandardDeviation
........................................................................................................... 2305
MathAverageDeviation
........................................................................................................... 2306
MathMedian ........................................................................................................... 2307
MathMean ........................................................................................................... 2308
MathV ariance........................................................................................................... 2309
MathSk ewness........................................................................................................... 2310
MathKurtosis ........................................................................................................... 2311
MathExpm1........................................................................................................... 2312
MathSinh ........................................................................................................... 2313
MathCosh ........................................................................................................... 2314
MathTanh ........................................................................................................... 2315
MathArcsinh ........................................................................................................... 2316
MathArccosh ........................................................................................................... 2317
MathArctanh ........................................................................................................... 2318
MathSignif ........................................................................................................... 2319
MathRank ........................................................................................................... 2321
MathCorrelationPearson
........................................................................................................... 2322
MathCorrelationSpearman
........................................................................................................... 2323
MathCorrelation Kendall
........................................................................................................... 2324
MathQuantile ........................................................................................................... 2325
MathProbabilityDensityEmpirical
........................................................................................................... 2326
MathCumulativeDistributionEmpirical
........................................................................................................... 2327
Lógica difusa
......................................................................................................................... 2328
Funç ões de................................................................................................................
associação 2330
CConstantMembership Function
........................................................................................................... 2332
Get V alue ........................................................................................................... 2334
CCompositeMembership Function
........................................................................................................... 2335
CompositionType
........................................................................................................... 2337
Membership Functions
........................................................................................................... 2337
Get V alue ........................................................................................................... 2337
CDifferencTwoSigmoidalMembership Function
........................................................................................................... 2339
A1 ........................................................................................................... 2341
A2 ........................................................................................................... 2341
C1 ........................................................................................................... 2342
C2 ........................................................................................................... 2342
Get V alue ........................................................................................................... 2343
C Generalized BellShapedMembershipFunction
........................................................................................................... 2344
A ........................................................................................................... 2346
B ........................................................................................................... 2346
C ........................................................................................................... 2347

© 2000-2018, MetaQuotes Software Corp.


18 Conteúdo

Get V alue ........................................................................................................... 2347


CNormalCombinationMembership Function
........................................................................................................... 2348
B1 ........................................................................................................... 2350
B2 ........................................................................................................... 2350
Sigma1 ........................................................................................................... 2351
Sigma2 ........................................................................................................... 2351
Get V alue ........................................................................................................... 2352
CNormalMembership Function
........................................................................................................... 2353
B ........................................................................................................... 2355
Sigma ........................................................................................................... 2355
Get V alue ........................................................................................................... 2356
CP_ShapedMembership Function
........................................................................................................... 2357
A ........................................................................................................... 2359
B ........................................................................................................... 2359
C ........................................................................................................... 2360
D ........................................................................................................... 2360
Get V alue ........................................................................................................... 2360
CProductTwoSigmoidalMembership Functions
........................................................................................................... 2362
A1 ........................................................................................................... 2364
A2 ........................................................................................................... 2364
C1 ........................................................................................................... 2365
C2 ........................................................................................................... 2365
Get V alue ........................................................................................................... 2366
CS_ShapedMembership Function
........................................................................................................... 2367
A ........................................................................................................... 2369
B ........................................................................................................... 2369
Get V alue ........................................................................................................... 2370
CSigmoidalMembership Function
........................................................................................................... 2371
A ........................................................................................................... 2373
C ........................................................................................................... 2373
Get V alue ........................................................................................................... 2374
CTrapezoidMembership Function
........................................................................................................... 2375
X1 ........................................................................................................... 2377
X2 ........................................................................................................... 2377
X3 ........................................................................................................... 2378
X4 ........................................................................................................... 2378
Get V alue ........................................................................................................... 2379
CTriangularMembership Function
........................................................................................................... 2380
X1 ........................................................................................................... 2382
X2 ........................................................................................................... 2382
X3 ........................................................................................................... 2383
F
ToNormalM........................................................................................................... 2383
Get V alue ........................................................................................................... 2383
C Z_ShapedMembership Function
........................................................................................................... 2385
A ........................................................................................................... 2387
B ........................................................................................................... 2387
Get V alue ........................................................................................................... 2388
IMembership Function
........................................................................................................... 2389
Get V alue ........................................................................................................... 2389
Regras para ................................................................................................................
sistemas difusos 2390
CMamdaniF...........................................................................................................
uzzyRule 2391
Conclusion........................................................................................................... 2392
W eight ........................................................................................................... 2392
CSugenoFuzzyRule
........................................................................................................... 2393
Conclusion........................................................................................................... 2394
CSingleCondition
........................................................................................................... 2395
Not ........................................................................................................... 2395
Term ........................................................................................................... 2396

© 2000-2018, MetaQuotes Software Corp.


19 Conteúdo

V ar ........................................................................................................... 2396
CConditions ........................................................................................................... 2398
ConditionsList
........................................................................................................... 2398
Not ........................................................................................................... 2399
Op ........................................................................................................... 2399
C Generic FuzzyRule
........................................................................................................... 2401
Conclusion........................................................................................................... 2401
Condition ........................................................................................................... 2402
CreateCondition
........................................................................................................... 2402
Variáveis ​p................................................................................................................
ara sistemas difusos 2404
C Fuzzy V ariable
........................................................................................................... 2405
AddTerm ........................................................................................................... 2406
GetTermByName........................................................................................................... 2406
Max ........................................................................................................... 2406
Min ........................................................................................................... 2407
Terms ........................................................................................................... 2407
V alues ........................................................................................................... 2407
CSugenoV ariable
........................................................................................................... 2409
Functions ........................................................................................................... 2409
Get Func ByName
........................................................................................................... 2410
V alues ........................................................................................................... 2410
Termos difusos................................................................................................................ 2411
Membership Function
........................................................................................................... 2412
Sistemas difusos
................................................................................................................ 2413
Sistema Mamdani
........................................................................................................... 2414
AggregationMethod
........................................................................................................... 2414
Calculate ........................................................................................................... 2415
DefuzzificationMethod
........................................................................................................... 2415
EmptyRule ........................................................................................................... 2415
ImplicationMethod
........................................................................................................... 2415
Output ........................................................................................................... 2416
Output ByName........................................................................................................... 2416
ParseRule ........................................................................................................... 2416
Rules ........................................................................................................... 2417
Sistema Sugeno
........................................................................................................... 2418
Calculate ........................................................................................................... 2418
CreateSugeno Function
........................................................................................................... 2419
EmptyRule ........................................................................................................... 2420
Output ........................................................................................................... 2420
Output ByName........................................................................................................... 2420
ParseRule ........................................................................................................... 2420
Rules ........................................................................................................... 2421
OpenCL ............................................................................................................................2422
BufferCreate
......................................................................................................................... 2424
Buffer Free
......................................................................................................................... 2425
Buffer FromArray
......................................................................................................................... 2426
BufferRead
......................................................................................................................... 2427
Buffer W.........................................................................................................................
rite 2428
Execute......................................................................................................................... 2429
GetContext
......................................................................................................................... 2430
Get Kernel
......................................................................................................................... 2431
Get KernelName
......................................................................................................................... 2432
GetProgram
......................................................................................................................... 2433
Initialize
......................................................................................................................... 2434
KernelCreate
......................................................................................................................... 2435
KernelFree
......................................................................................................................... 2436
SetArgument
......................................................................................................................... 2437
SetArgument Buffer
......................................................................................................................... 2438

© 2000-2018, MetaQuotes Software Corp.


20 Conteúdo

SetArgumentLocalMemory
......................................................................................................................... 2439
Set BuffersCount
......................................................................................................................... 2440
Set KernelsCount
......................................................................................................................... 2441
Shutdown......................................................................................................................... 2442
SupportDouble
......................................................................................................................... 2443
............................................................................................................................2444
Classe base CObjec t
Prev ......................................................................................................................... 2445
Prev ......................................................................................................................... 2446
Next ......................................................................................................................... 2447
Next ......................................................................................................................... 2448
Compare
......................................................................................................................... 2449
Save ......................................................................................................................... 2451
Load ......................................................................................................................... 2453
Type ......................................................................................................................... 2455
Coleç ões ............................................................................................................................2456
de dados
CArray ......................................................................................................................... 2457
Step ................................................................................................................ 2459
Step ................................................................................................................ 2460
Total ................................................................................................................ 2461
Available ................................................................................................................ 2462
Max ................................................................................................................ 2463
IsSorted ................................................................................................................ 2464
SortMode ................................................................................................................ 2465
Clear ................................................................................................................ 2466
Sort ................................................................................................................ 2467
Save ................................................................................................................ 2468
Load ................................................................................................................ 2469
CArrayChar
......................................................................................................................... 2470
Reserve ................................................................................................................ 2473
Resize ................................................................................................................ 2474
Shutdown ................................................................................................................ 2475
Add ................................................................................................................ 2476
AddArray ................................................................................................................ 2477
AddArray ................................................................................................................ 2478
Insert ................................................................................................................ 2480
InsertArray................................................................................................................ 2481
InsertArray................................................................................................................ 2482
AssignArray................................................................................................................ 2484
AssignArray................................................................................................................ 2485
Update ................................................................................................................ 2487
Shift ................................................................................................................ 2488
Delete ................................................................................................................ 2489
DeleteRange ................................................................................................................ 2490
At ................................................................................................................ 2491
CompareArray ................................................................................................................ 2493
CompareArray ................................................................................................................ 2494
InsertSort ................................................................................................................ 2495
Search ................................................................................................................ 2496
SearchGreat ................................................................................................................ 2497
SearchLess................................................................................................................ 2498
SearchGreatOrEqual
................................................................................................................ 2499
SearchLessOrEqual
................................................................................................................ 2500
SearchFirst................................................................................................................ 2501
SearchLast................................................................................................................ 2502
SearchLinear ................................................................................................................ 2503
Save ................................................................................................................ 2504
Load ................................................................................................................ 2505
Type ................................................................................................................ 2507

© 2000-2018, MetaQuotes Software Corp.


21 Conteúdo

CArrayShort
......................................................................................................................... 2508
Reserve ................................................................................................................ 2511
Resize ................................................................................................................ 2512
Shutdown ................................................................................................................ 2513
Add ................................................................................................................ 2514
AddArray ................................................................................................................ 2515
AddArray ................................................................................................................ 2516
Insert ................................................................................................................ 2518
InsertArray................................................................................................................ 2519
InsertArray................................................................................................................ 2520
AssignArray................................................................................................................ 2522
AssignArray................................................................................................................ 2523
Update ................................................................................................................ 2525
Shift ................................................................................................................ 2526
Delete ................................................................................................................ 2527
DeleteRange ................................................................................................................ 2528
At ................................................................................................................ 2529
CompareArray ................................................................................................................ 2531
CompareArray ................................................................................................................ 2532
InsertSort ................................................................................................................ 2533
Search ................................................................................................................ 2534
SearchGreat ................................................................................................................ 2535
SearchLess................................................................................................................ 2536
SearchGreatOrEqual
................................................................................................................ 2537
SearchLessOrEqual
................................................................................................................ 2538
SearchFirst................................................................................................................ 2539
SearchLast................................................................................................................ 2540
SearchLinear ................................................................................................................ 2541
Save ................................................................................................................ 2542
Load ................................................................................................................ 2544
Type ................................................................................................................ 2546
CArrayInt
......................................................................................................................... 2547
Reserve ................................................................................................................ 2550
Resize ................................................................................................................ 2551
Shutdown ................................................................................................................ 2552
Add ................................................................................................................ 2553
AddArray ................................................................................................................ 2554
AddArray ................................................................................................................ 2555
Insert ................................................................................................................ 2557
InsertArray................................................................................................................ 2558
InsertArray................................................................................................................ 2559
AssignArray................................................................................................................ 2561
AssignArray................................................................................................................ 2562
Update ................................................................................................................ 2564
Shift ................................................................................................................ 2565
Delete ................................................................................................................ 2566
DeleteRange ................................................................................................................ 2567
At ................................................................................................................ 2568
CompareArray ................................................................................................................ 2570
CompareArray ................................................................................................................ 2571
InsertSort ................................................................................................................ 2572
Search ................................................................................................................ 2573
SearchGreat ................................................................................................................ 2574
SearchLess................................................................................................................ 2575
SearchGreatOrEqual
................................................................................................................ 2576
SearchLessOrEqual
................................................................................................................ 2577
SearchFirst................................................................................................................ 2578
SearchLast................................................................................................................ 2579

© 2000-2018, MetaQuotes Software Corp.


22 Conteúdo

SearchLinear ................................................................................................................ 2580


Save ................................................................................................................ 2581
Load ................................................................................................................ 2583
Type ................................................................................................................ 2585
CArrayLong
......................................................................................................................... 2586
Reserve ................................................................................................................ 2589
Resize ................................................................................................................ 2590
Shutdown ................................................................................................................ 2591
Add ................................................................................................................ 2592
AddArray ................................................................................................................ 2593
AddArray ................................................................................................................ 2594
Insert ................................................................................................................ 2596
InsertArray................................................................................................................ 2597
InsertArray................................................................................................................ 2598
AssignArray................................................................................................................ 2600
AssignArray................................................................................................................ 2601
Update ................................................................................................................ 2603
Shift ................................................................................................................ 2604
Delete ................................................................................................................ 2605
DeleteRange ................................................................................................................ 2606
At ................................................................................................................ 2607
CompareArray ................................................................................................................ 2609
CompareArray ................................................................................................................ 2610
InsertSort ................................................................................................................ 2611
Search ................................................................................................................ 2612
SearchGreat ................................................................................................................ 2613
SearchLess................................................................................................................ 2614
SearchGreatOrEqual
................................................................................................................ 2615
SearchLessOrEqual
................................................................................................................ 2616
SearchFirst................................................................................................................ 2617
SearchLast................................................................................................................ 2618
SearchLinear ................................................................................................................ 2619
Save ................................................................................................................ 2620
Load ................................................................................................................ 2622
Type ................................................................................................................ 2624
CArray F.........................................................................................................................
loat 2625
Delta ................................................................................................................ 2628
Reserve ................................................................................................................ 2629
Resize ................................................................................................................ 2630
Shutdown ................................................................................................................ 2631
Add ................................................................................................................ 2632
AddArray ................................................................................................................ 2633
AddArray ................................................................................................................ 2634
Insert ................................................................................................................ 2636
InsertArray................................................................................................................ 2637
InsertArray................................................................................................................ 2638
AssignArray................................................................................................................ 2640
AssignArray................................................................................................................ 2641
Update ................................................................................................................ 2643
Shift ................................................................................................................ 2644
Delete ................................................................................................................ 2645
DeleteRange ................................................................................................................ 2646
At ................................................................................................................ 2647
CompareArray ................................................................................................................ 2649
CompareArray ................................................................................................................ 2650
InsertSort ................................................................................................................ 2651
Search ................................................................................................................ 2652
SearchGreat ................................................................................................................ 2653

© 2000-2018, MetaQuotes Software Corp.


23 Conteúdo

SearchLess................................................................................................................ 2654
SearchGreatOrEqual
................................................................................................................ 2655
SearchLessOrEqual
................................................................................................................ 2656
SearchFirst................................................................................................................ 2657
SearchLast................................................................................................................ 2658
SearchLinear ................................................................................................................ 2659
Save ................................................................................................................ 2660
Load ................................................................................................................ 2662
Type ................................................................................................................ 2664
CArrayDouble
......................................................................................................................... 2665
Delta ................................................................................................................ 2668
Reserve ................................................................................................................ 2669
Resize ................................................................................................................ 2670
Shutdown ................................................................................................................ 2671
Add ................................................................................................................ 2672
AddArray ................................................................................................................ 2673
AddArray ................................................................................................................ 2674
Insert ................................................................................................................ 2676
InsertArray................................................................................................................ 2677
InsertArray................................................................................................................ 2678
AssignArray................................................................................................................ 2680
AssignArray................................................................................................................ 2681
Update ................................................................................................................ 2683
Shift ................................................................................................................ 2684
Delete ................................................................................................................ 2685
DeleteRange ................................................................................................................ 2686
At ................................................................................................................ 2687
CompareArray ................................................................................................................ 2689
CompareArray ................................................................................................................ 2690
Minimum ................................................................................................................ 2691
Maximum ................................................................................................................ 2692
InsertSort ................................................................................................................ 2693
Search ................................................................................................................ 2694
SearchGreat ................................................................................................................ 2695
SearchLess................................................................................................................ 2696
SearchGreatOrEqual
................................................................................................................ 2697
SearchLessOrEqual
................................................................................................................ 2698
SearchFirst................................................................................................................ 2699
SearchLast................................................................................................................ 2700
SearchLinear ................................................................................................................ 2701
Save ................................................................................................................ 2702
Load ................................................................................................................ 2704
Type ................................................................................................................ 2706
CArrayString
......................................................................................................................... 2707
Reserve ................................................................................................................ 2710
Resize ................................................................................................................ 2711
Shutdown ................................................................................................................ 2712
Add ................................................................................................................ 2713
AddArray ................................................................................................................ 2714
AddArray ................................................................................................................ 2715
Insert ................................................................................................................ 2717
InsertArray................................................................................................................ 2718
InsertArray................................................................................................................ 2719
AssignArray................................................................................................................ 2721
AssignArray................................................................................................................ 2722
Update ................................................................................................................ 2724
Shift ................................................................................................................ 2725
Delete ................................................................................................................ 2726

© 2000-2018, MetaQuotes Software Corp.


24 Conteúdo

DeleteRange ................................................................................................................ 2727


At ................................................................................................................ 2728
CompareArray ................................................................................................................ 2730
CompareArray ................................................................................................................ 2731
InsertSort ................................................................................................................ 2732
Search ................................................................................................................ 2733
SearchGreat ................................................................................................................ 2734
SearchLess................................................................................................................ 2735
SearchGreatOrEqual
................................................................................................................ 2736
SearchLessOrEqual
................................................................................................................ 2737
SearchFirst................................................................................................................ 2738
SearchLast................................................................................................................ 2739
SearchLinear ................................................................................................................ 2740
Save ................................................................................................................ 2741
Load ................................................................................................................ 2743
Type ................................................................................................................ 2745
CArrayObj
......................................................................................................................... 2746
FreeMode ................................................................................................................ 2751
FreeMode ................................................................................................................ 2752
Reserve ................................................................................................................ 2754
Resize ................................................................................................................ 2755
Clear ................................................................................................................ 2756
Shutdown ................................................................................................................ 2757
CreateElement................................................................................................................ 2758
Add ................................................................................................................ 2760
AddArray ................................................................................................................ 2761
Insert ................................................................................................................ 2764
InsertArray................................................................................................................ 2766
AssignArray................................................................................................................ 2768
Update ................................................................................................................ 2770
Shift ................................................................................................................ 2771
Detach ................................................................................................................ 2772
Delete ................................................................................................................ 2774
DeleteRange ................................................................................................................ 2775
At ................................................................................................................ 2776
CompareArray ................................................................................................................ 2777
InsertSort ................................................................................................................ 2778
Search ................................................................................................................ 2779
SearchGreat ................................................................................................................ 2780
SearchLess................................................................................................................ 2781
SearchGreatOrEqual
................................................................................................................ 2782
SearchLessOrEqual
................................................................................................................ 2783
SearchFirst................................................................................................................ 2784
SearchLast................................................................................................................ 2785
Save ................................................................................................................ 2786
Load ................................................................................................................ 2787
Type ................................................................................................................ 2789
CList ......................................................................................................................... 2790
FreeMode ................................................................................................................ 2793
FreeMode ................................................................................................................ 2794
Total ................................................................................................................ 2796
IsSorted ................................................................................................................ 2797
SortMode ................................................................................................................ 2798
CreateElement................................................................................................................ 2799
Add ................................................................................................................ 2800
Insert ................................................................................................................ 2801
DetachCurrent................................................................................................................ 2803
DeleteCurrent................................................................................................................ 2804

© 2000-2018, MetaQuotes Software Corp.


25 Conteúdo

Delete ................................................................................................................ 2805


Clear ................................................................................................................ 2806
IndexOf ................................................................................................................ 2807
GetNodeAtIndex
................................................................................................................ 2808
Get FirstNode................................................................................................................ 2809
GetPrevNode ................................................................................................................ 2810
GetCurrentNode
................................................................................................................ 2811
GetNextNode ................................................................................................................ 2812
GetLastNode ................................................................................................................ 2813
Sort ................................................................................................................ 2814
MoveToIndex ................................................................................................................ 2815
Exchange ................................................................................................................ 2816
CompareList ................................................................................................................ 2817
Search ................................................................................................................ 2818
Save ................................................................................................................ 2819
Load ................................................................................................................ 2821
Type ................................................................................................................ 2823
CTreeNode
......................................................................................................................... 2824
Owner ................................................................................................................ 2829
Left ................................................................................................................ 2830
Right ................................................................................................................ 2831
Balance ................................................................................................................ 2832
BalanceL ................................................................................................................ 2833
BalanceR ................................................................................................................ 2834
CreateSample ................................................................................................................ 2835
RefreshBalance
................................................................................................................ 2836
GetNext ................................................................................................................ 2837
SaveNode ................................................................................................................ 2838
LoadNode ................................................................................................................ 2839
Type ................................................................................................................ 2840
CTree ......................................................................................................................... 2841
Root ................................................................................................................ 2847
CreateElement................................................................................................................ 2848
Insert ................................................................................................................ 2849
Detach ................................................................................................................ 2850
Delete ................................................................................................................ 2851
Clear ................................................................................................................ 2852
Find ................................................................................................................ 2853
Save ................................................................................................................ 2854
Load ................................................................................................................ 2855
Type ................................................................................................................ 2856
Coleç ões ............................................................................................................................2857
de dados genéric as
ICollection <T>
......................................................................................................................... 2860
Add ................................................................................................................ 2861
Count ................................................................................................................ 2862
Contains ................................................................................................................ 2863
CopyTo ................................................................................................................ 2864
Clear ................................................................................................................ 2865
Remove ................................................................................................................ 2866
IEqualityComparable <T>
......................................................................................................................... 2867
Equals ................................................................................................................ 2868
HashCode ................................................................................................................ 2869
IComparable <T>
......................................................................................................................... 2870
Compare ................................................................................................................ 2871
IComparer <T>
......................................................................................................................... 2872
Compare ................................................................................................................ 2873
IEqualityComparer <T>
......................................................................................................................... 2874
Equals ................................................................................................................ 2875

© 2000-2018, MetaQuotes Software Corp.


26 Conteúdo

HashCode ................................................................................................................ 2876


IList <T>......................................................................................................................... 2877
Try Get V alue................................................................................................................ 2878
TrySet V alue ................................................................................................................ 2879
Insert ................................................................................................................ 2880
IndexOf ................................................................................................................ 2881
LastIndexOf ................................................................................................................ 2882
RemoveAt ................................................................................................................ 2883
IMap<TK.........................................................................................................................
ey,TV alue> 2884
Add ................................................................................................................ 2885
Contains ................................................................................................................ 2886
Remove ................................................................................................................ 2887
Try Get V alue................................................................................................................ 2888
TrySet V alue ................................................................................................................ 2889
CopyTo ................................................................................................................ 2890
ISet <T>......................................................................................................................... 2891
Except W ith................................................................................................................ 2893
Intersect W................................................................................................................
ith 2894
SymmetricExcept W ith
................................................................................................................ 2895
UnionW ith ................................................................................................................ 2896
IsProperSubsetOf
................................................................................................................ 2897
IsProperSupersetOf
................................................................................................................ 2898
IsSubsetOf................................................................................................................ 2899
IsSupersetOf ................................................................................................................ 2900
Overlaps ................................................................................................................ 2901
SetEquals ................................................................................................................ 2902
CDefaultComparer <T>
......................................................................................................................... 2903
Compare ................................................................................................................ 2904
CDefaultEqualityComparer <T>
......................................................................................................................... 2905
Equals ................................................................................................................ 2906
HashCode ................................................................................................................ 2907
CRedBlac k TreeNode<T>
......................................................................................................................... 2908
V alue ................................................................................................................ 2909
Parent ................................................................................................................ 2910
Left ................................................................................................................ 2911
Right ................................................................................................................ 2912
Color ................................................................................................................ 2913
IsLeaf ................................................................................................................ 2914
CreateEmptyNode
................................................................................................................ 2915
CLink edListNode <T>
......................................................................................................................... 2916
List ................................................................................................................ 2917
Next ................................................................................................................ 2918
Previous ................................................................................................................ 2919
V alue ................................................................................................................ 2920
C Key V aluePair <TKey,TV alue>
......................................................................................................................... 2921
Key ................................................................................................................ 2922
V alue ................................................................................................................ 2923
Clone ................................................................................................................ 2924
Compare ................................................................................................................ 2925
Equals ................................................................................................................ 2926
HashCode ................................................................................................................ 2927
CArrayList <T>
......................................................................................................................... 2928
Capacity ................................................................................................................ 2930
Count ................................................................................................................ 2931
Contains ................................................................................................................ 2932
TrimExcess................................................................................................................ 2933
Try Get V alue................................................................................................................ 2934
TrySet V alue ................................................................................................................ 2935

© 2000-2018, MetaQuotes Software Corp.


27 Conteúdo

Add ................................................................................................................ 2936


AddRange ................................................................................................................ 2937
Insert ................................................................................................................ 2938
InsertRange ................................................................................................................ 2939
CopyTo ................................................................................................................ 2940
BinarySearch ................................................................................................................ 2941
IndexOf ................................................................................................................ 2942
LastIndexOf ................................................................................................................ 2943
Clear ................................................................................................................ 2944
Remove ................................................................................................................ 2945
RemoveAt ................................................................................................................ 2946
RemoveRange ................................................................................................................ 2947
Reverse ................................................................................................................ 2948
Sort ................................................................................................................ 2949
C HashMap <TKey,TV alue>
......................................................................................................................... 2950
Add ................................................................................................................ 2952
Count ................................................................................................................ 2953
Comparer ................................................................................................................ 2954
Contains ................................................................................................................ 2955
Contains Key ................................................................................................................ 2956
Contains V alue
................................................................................................................ 2957
CopyTo ................................................................................................................ 2958
Clear ................................................................................................................ 2959
Remove ................................................................................................................ 2960
Try Get V alue
................................................................................................................ 2961
TrySet V alue................................................................................................................ 2962
C HashSet <T>
......................................................................................................................... 2963
Add ................................................................................................................ 2965
Count ................................................................................................................ 2966
Contains ................................................................................................................ 2967
Comparer ................................................................................................................ 2968
TrimExcess................................................................................................................ 2969
CopyTo ................................................................................................................ 2970
Clear ................................................................................................................ 2971
Remove ................................................................................................................ 2972
Except W ith................................................................................................................ 2973
Intersect W................................................................................................................
ith 2974
SymmetricExcept W ith
................................................................................................................ 2975
UnionW ith ................................................................................................................ 2976
IsProperSubsetOf
................................................................................................................ 2977
IsProperSupersetOf
................................................................................................................ 2978
IsSubsetOf................................................................................................................ 2979
IsSupersetOf ................................................................................................................ 2980
Overlaps ................................................................................................................ 2981
SetEquals ................................................................................................................ 2982
CLink edList <T>
......................................................................................................................... 2983
Add ................................................................................................................ 2985
AddAfter ................................................................................................................ 2986
AddBefore ................................................................................................................ 2987
AddFirst ................................................................................................................ 2988
AddLast ................................................................................................................ 2989
Count ................................................................................................................ 2990
Head ................................................................................................................ 2991
First ................................................................................................................ 2992
Last ................................................................................................................ 2993
Contains ................................................................................................................ 2994
CopyTo ................................................................................................................ 2995
Clear ................................................................................................................ 2996

© 2000-2018, MetaQuotes Software Corp.


28 Conteúdo

Remove ................................................................................................................ 2997


RemoveFirst ................................................................................................................ 2998
RemoveLast................................................................................................................ 2999
Find ................................................................................................................ 3000
FindLast ................................................................................................................ 3001
<T>
CQueue......................................................................................................................... 3002
Add ................................................................................................................ 3003
Enqueue ................................................................................................................ 3004
Count ................................................................................................................ 3005
Contains ................................................................................................................ 3006
TrimExcess................................................................................................................ 3007
CopyTo ................................................................................................................ 3008
Clear ................................................................................................................ 3009
Remove ................................................................................................................ 3010
Dequeue ................................................................................................................ 3011
Peek ................................................................................................................ 3012
CRedBlac k Tree<T>
......................................................................................................................... 3013
Add ................................................................................................................ 3015
Count ................................................................................................................ 3016
Root ................................................................................................................ 3017
Contains ................................................................................................................ 3018
Comparer ................................................................................................................ 3019
Try GetMin ................................................................................................................ 3020
Try GetMax................................................................................................................ 3021
CopyTo ................................................................................................................ 3022
Clear ................................................................................................................ 3023
Remove ................................................................................................................ 3024
RemoveMin................................................................................................................ 3025
RemoveMax................................................................................................................ 3026
Find ................................................................................................................ 3027
FindMin ................................................................................................................ 3028
FindMax ................................................................................................................ 3029
CSortedMap <TKey, TV alue>
......................................................................................................................... 3030
Add ................................................................................................................ 3032
Count ................................................................................................................ 3033
Comparer ................................................................................................................ 3034
Contains ................................................................................................................ 3035
Contains Key ................................................................................................................ 3036
Contains V alue
................................................................................................................ 3037
CopyTo ................................................................................................................ 3038
Clear ................................................................................................................ 3039
Remove ................................................................................................................ 3040
Try Get V alue
................................................................................................................ 3041
TrySet V alue................................................................................................................ 3042
CSortedSet <T>
......................................................................................................................... 3043
Add ................................................................................................................ 3045
Count ................................................................................................................ 3046
Contains ................................................................................................................ 3047
Comparer ................................................................................................................ 3048
Try GetMin ................................................................................................................ 3049
Try GetMax................................................................................................................ 3050
CopyTo ................................................................................................................ 3051
Clear ................................................................................................................ 3052
Remove ................................................................................................................ 3053
Except W ith................................................................................................................ 3054
Intersect W................................................................................................................
ith 3055
SymmetricExcept W ith
................................................................................................................ 3056
UnionW ith ................................................................................................................ 3057

© 2000-2018, MetaQuotes Software Corp.


29 Conteúdo

IsProperSubsetOf
................................................................................................................ 3058
IsProperSupersetOf
................................................................................................................ 3059
IsSubsetOf................................................................................................................ 3060
IsSupersetOf ................................................................................................................ 3061
Overlaps ................................................................................................................ 3062
SetEquals ................................................................................................................ 3063
Get V iewBetween
................................................................................................................ 3064
GetReverse................................................................................................................ 3065
CStac k<.........................................................................................................................
T> 3066
Add ................................................................................................................ 3067
Count ................................................................................................................ 3068
Contains ................................................................................................................ 3069
TrimExcess................................................................................................................ 3070
CopyTo ................................................................................................................ 3071
Clear ................................................................................................................ 3072
Remove ................................................................................................................ 3073
Push ................................................................................................................ 3074
Peek ................................................................................................................ 3075
Pop ................................................................................................................ 3076
Array BinarySearch <T>
......................................................................................................................... 3077
ArrayIndexOf <T>
......................................................................................................................... 3078
ArrayLastIndexOf <T>
......................................................................................................................... 3079
ArrayReverse <T>
......................................................................................................................... 3080
Compare ......................................................................................................................... 3081
Equals <T >
......................................................................................................................... 3084
Get HashCode
......................................................................................................................... 3085
Arq uivos ............................................................................................................................3088
C File ......................................................................................................................... 3089
Handle ................................................................................................................ 3091
Filename ................................................................................................................ 3092
Flags ................................................................................................................ 3093
SetUnicode................................................................................................................ 3094
SetCommon................................................................................................................ 3095
Open ................................................................................................................ 3096
Close ................................................................................................................ 3097
Delete ................................................................................................................ 3098
IsExist ................................................................................................................ 3099
Copy ................................................................................................................ 3100
Move ................................................................................................................ 3101
Size ................................................................................................................ 3102
Tell ................................................................................................................ 3103
Seek ................................................................................................................ 3104
Flush ................................................................................................................ 3105
IsEnding ................................................................................................................ 3106
IsLineEnding ................................................................................................................ 3107
FolderCreate ................................................................................................................ 3108
FolderDelete ................................................................................................................ 3109
FolderClean................................................................................................................ 3110
FileFindFirst................................................................................................................ 3111
FileFindNext ................................................................................................................ 3112
FileFindClose................................................................................................................ 3113
C FileBin......................................................................................................................... 3114
Open ................................................................................................................ 3116
W riteChar ................................................................................................................ 3117
W riteShort................................................................................................................ 3118
W riteInteger................................................................................................................ 3119
W riteLong ................................................................................................................ 3120
W riteFloat ................................................................................................................ 3121

© 2000-2018, MetaQuotes Software Corp.


30 Conteúdo

W riteDouble ................................................................................................................ 3122


W riteString................................................................................................................ 3123
W riteCharArray
................................................................................................................ 3124
W riteShortArray
................................................................................................................ 3125
W riteIntegerArray
................................................................................................................ 3126
W riteLongArray
................................................................................................................ 3127
W riteFloatArray
................................................................................................................ 3128
W riteDoubleArray
................................................................................................................ 3129
W riteObject ................................................................................................................ 3130
ReadChar ................................................................................................................ 3131
ReadShort ................................................................................................................ 3132
ReadInteger ................................................................................................................ 3133
ReadLong ................................................................................................................ 3134
ReadFloat ................................................................................................................ 3135
ReadDouble................................................................................................................ 3136
ReadString ................................................................................................................ 3137
ReadCharArray ................................................................................................................ 3138
ReadShortArray................................................................................................................ 3139
ReadIntegerArray
................................................................................................................ 3140
ReadLongArray ................................................................................................................ 3141
ReadFloatArray................................................................................................................ 3142
ReadDoubleArray
................................................................................................................ 3143
ReadObject................................................................................................................ 3144
C FileTxt......................................................................................................................... 3145
Open ................................................................................................................ 3146
W riteString................................................................................................................ 3147
ReadString ................................................................................................................ 3148
Cadeias de............................................................................................................................3149
c arac teres
CString ......................................................................................................................... 3150
Str ................................................................................................................ 3152
Len ................................................................................................................ 3153
Copy ................................................................................................................ 3154
Fill ................................................................................................................ 3155
Assign ................................................................................................................ 3156
Append ................................................................................................................ 3157
Insert ................................................................................................................ 3158
Compare ................................................................................................................ 3159
CompareNoCase ................................................................................................................ 3160
Left ................................................................................................................ 3161
Right ................................................................................................................ 3162
Mid ................................................................................................................ 3163
Trim ................................................................................................................ 3164
TrimLeft ................................................................................................................ 3165
TrimRight ................................................................................................................ 3166
Clear ................................................................................................................ 3167
ToUpper ................................................................................................................ 3168
ToLower ................................................................................................................ 3169
Reverse ................................................................................................................ 3170
Find ................................................................................................................ 3171
FindRev ................................................................................................................ 3172
Remove ................................................................................................................ 3173
Replace ................................................................................................................ 3174
............................................................................................................................3175
Objetos gráfic os
CChartObject
......................................................................................................................... 3176
ChartId ................................................................................................................ 3179
W indow ................................................................................................................ 3180
Name ................................................................................................................ 3181
NumPoints ................................................................................................................ 3182

© 2000-2018, MetaQuotes Software Corp.


31 Conteúdo

Attach ................................................................................................................ 3183


SetPoint ................................................................................................................ 3184
Delete ................................................................................................................ 3185
Detach ................................................................................................................ 3186
ShiftObject................................................................................................................ 3187
ShiftPoint ................................................................................................................ 3188
Time ................................................................................................................ 3189
Price ................................................................................................................ 3191
Color ................................................................................................................ 3193
Style ................................................................................................................ 3194
W idth ................................................................................................................ 3195
Bac k ground................................................................................................................ 3196
Selected ................................................................................................................ 3197
Selectable ................................................................................................................ 3198
Description................................................................................................................ 3199
Tooltip ................................................................................................................ 3200
Timeframes................................................................................................................ 3201
Z_Order ................................................................................................................ 3202
CreateTime................................................................................................................ 3203
LevelsCount ................................................................................................................ 3204
LevelColor ................................................................................................................ 3205
LevelStyle ................................................................................................................ 3207
LevelW idth................................................................................................................ 3209
LevelV alue ................................................................................................................ 3211
LevelDescription
................................................................................................................ 3213
GetInteger................................................................................................................ 3215
SetInteger ................................................................................................................ 3217
GetDouble ................................................................................................................ 3219
SetDouble ................................................................................................................ 3221
GetString ................................................................................................................ 3223
SetString ................................................................................................................ 3225
Save ................................................................................................................ 3227
Load ................................................................................................................ 3228
Type ................................................................................................................ 3229
Objetos.........................................................................................................................
de Linhas 3230
CChartObject V Line
................................................................................................................ 3231
Create ........................................................................................................... 3232
Type ........................................................................................................... 3233
CChartObject HLine
................................................................................................................ 3234
Create ........................................................................................................... 3235
Type ........................................................................................................... 3236
CChartObjectTrend
................................................................................................................ 3237
Create ........................................................................................................... 3239
RayLeft ........................................................................................................... 3240
RayRight ........................................................................................................... 3241
Save ........................................................................................................... 3242
Load ........................................................................................................... 3243
Type ........................................................................................................... 3244
CChartObjectTrend ByAngle
................................................................................................................ 3245
Create ........................................................................................................... 3247
Angle ........................................................................................................... 3248
Type ........................................................................................................... 3249
CChartObjectCycles
................................................................................................................ 3250
Create ........................................................................................................... 3251
Type ........................................................................................................... 3252
Objetos.........................................................................................................................
de Canais 3253
CChartObjectChannel
................................................................................................................ 3254
Create ........................................................................................................... 3256

© 2000-2018, MetaQuotes Software Corp.


32 Conteúdo

Type ........................................................................................................... 3257


CChartObjectRegression
................................................................................................................ 3258
Create ........................................................................................................... 3260
Type ........................................................................................................... 3261
CChartObjectStdDevChannel
................................................................................................................ 3262
Create ........................................................................................................... 3264
Deviations ........................................................................................................... 3265
Save ........................................................................................................... 3266
Load ........................................................................................................... 3267
Type ........................................................................................................... 3268
CChartObjectPitchfor k
................................................................................................................ 3269
Create ........................................................................................................... 3271
Type ........................................................................................................... 3272
Ferramentas Gann
......................................................................................................................... 3273
CChartObject GannLine
................................................................................................................ 3274
Create ........................................................................................................... 3276
PipsPer Bar........................................................................................................... 3277
Save ........................................................................................................... 3278
Load ........................................................................................................... 3279
Type ........................................................................................................... 3280
CChartObject GannFan
................................................................................................................ 3281
Create ........................................................................................................... 3283
PipsPer Bar........................................................................................................... 3284
Downtrend........................................................................................................... 3285
Save ........................................................................................................... 3286
Load ........................................................................................................... 3287
Type ........................................................................................................... 3288
CChartObject GannGrid
................................................................................................................ 3289
Create ........................................................................................................... 3291
PipsPer Bar........................................................................................................... 3292
Downtrend........................................................................................................... 3293
Save ........................................................................................................... 3294
Load ........................................................................................................... 3295
Type ........................................................................................................... 3296
Ferramentas Fibonacci
......................................................................................................................... 3297
CChartObject Fibo
................................................................................................................ 3298
Create ........................................................................................................... 3300
Type ........................................................................................................... 3301
CChartObject FiboTimes
................................................................................................................ 3302
Create ........................................................................................................... 3303
Type ........................................................................................................... 3304
CChartObject FiboFan
................................................................................................................ 3305
Create ........................................................................................................... 3306
Type ........................................................................................................... 3307
CChartObject FiboArc
................................................................................................................ 3308
Create ........................................................................................................... 3310
Scale ........................................................................................................... 3311
Ellipse ........................................................................................................... 3312
Save ........................................................................................................... 3313
Load ........................................................................................................... 3314
Type ........................................................................................................... 3315
CChartObject FiboChannel
................................................................................................................ 3316
Create ........................................................................................................... 3318
Type ........................................................................................................... 3319
CChartObject FiboExpansion
................................................................................................................ 3320
Create ........................................................................................................... 3322
Type ........................................................................................................... 3323
Ferramentas
.........................................................................................................................
Elliott 3324

© 2000-2018, MetaQuotes Software Corp.


33 Conteúdo

CChartObjectElliott W ave3
................................................................................................................ 3325
Create ........................................................................................................... 3327
Degree ........................................................................................................... 3328
Lines ........................................................................................................... 3329
Save ........................................................................................................... 3330
Load ........................................................................................................... 3331
Type ........................................................................................................... 3332
CChartObjectElliott W ave5
................................................................................................................ 3333
Create ........................................................................................................... 3335
Type ........................................................................................................... 3337
de Formas
Objetos......................................................................................................................... 3338
CChartObjectRectangle
................................................................................................................ 3339
Create ........................................................................................................... 3340
Type ........................................................................................................... 3341
CChartObjectTriangle
................................................................................................................ 3342
Create ........................................................................................................... 3343
Type ........................................................................................................... 3344
CChartObjectEllipse
................................................................................................................ 3345
Create ........................................................................................................... 3346
Type ........................................................................................................... 3347
Objetos.........................................................................................................................
de Setas 3348
CChartObjectArrow
................................................................................................................ 3349
Create ........................................................................................................... 3351
ArrowCode........................................................................................................... 3353
Anchor ........................................................................................................... 3355
Save ........................................................................................................... 3357
Load ........................................................................................................... 3358
Type ........................................................................................................... 3359
Arrows with ................................................................................................................
fixed code 3360
Create ........................................................................................................... 3362
ArrowCode........................................................................................................... 3364
Type ........................................................................................................... 3365
Objetos.........................................................................................................................
de Controles 3366
CChartObjectText
................................................................................................................ 3367
Create ........................................................................................................... 3369
Angle ........................................................................................................... 3370
Font ........................................................................................................... 3371
FontSize ........................................................................................................... 3372
Anchor ........................................................................................................... 3373
Save ........................................................................................................... 3374
Load ........................................................................................................... 3375
Type ........................................................................................................... 3376
CChartObjectLabel
................................................................................................................ 3377
Create ........................................................................................................... 3379
X_Distance........................................................................................................... 3380
Y_Distance........................................................................................................... 3381
X_Size ........................................................................................................... 3382
Y_Size ........................................................................................................... 3383
Corner ........................................................................................................... 3384
Time ........................................................................................................... 3385
Price ........................................................................................................... 3386
Save ........................................................................................................... 3387
Load ........................................................................................................... 3388
Type ........................................................................................................... 3389
CChartObjectEdit
................................................................................................................ 3390
Create ........................................................................................................... 3392
TextAlign ........................................................................................................... 3393
X_Size ........................................................................................................... 3394

© 2000-2018, MetaQuotes Software Corp.


34 Conteúdo

Y_Size ........................................................................................................... 3395


Bac k Color ........................................................................................................... 3396
BorderColor ........................................................................................................... 3397
ReadOnly ........................................................................................................... 3398
Angle ........................................................................................................... 3399
Save ........................................................................................................... 3400
Load ........................................................................................................... 3401
Type ........................................................................................................... 3402
CChartObject Button
................................................................................................................ 3403
State ........................................................................................................... 3405
Save ........................................................................................................... 3406
Load ........................................................................................................... 3407
Type ........................................................................................................... 3408
CChartObjectSubChart
................................................................................................................ 3409
Create ........................................................................................................... 3411
X_Distance........................................................................................................... 3412
Y_Distance........................................................................................................... 3413
Corner ........................................................................................................... 3414
X_Size ........................................................................................................... 3415
Y_Size ........................................................................................................... 3416
Symbol ........................................................................................................... 3417
Period ........................................................................................................... 3418
Scale ........................................................................................................... 3419
DateScale ........................................................................................................... 3420
PriceScale ........................................................................................................... 3421
Time ........................................................................................................... 3422
Price ........................................................................................................... 3423
Save ........................................................................................................... 3424
Load ........................................................................................................... 3425
Type ........................................................................................................... 3426
CChartObject Bitmap
................................................................................................................ 3427
Create ........................................................................................................... 3429
BmpFile ........................................................................................................... 3430
X_Offset ........................................................................................................... 3431
Y_Offset ........................................................................................................... 3432
Save ........................................................................................................... 3433
Load ........................................................................................................... 3434
Type ........................................................................................................... 3435
CChartObject BmpLabel
................................................................................................................ 3436
Create ........................................................................................................... 3438
X_Distance........................................................................................................... 3439
Y_Distance........................................................................................................... 3440
X_Offset ........................................................................................................... 3441
Y_Offset ........................................................................................................... 3442
Corner ........................................................................................................... 3443
X_Size ........................................................................................................... 3444
Y_Size ........................................................................................................... 3445
BmpFileOn ........................................................................................................... 3446
BmpFileOff........................................................................................................... 3447
State ........................................................................................................... 3448
Time ........................................................................................................... 3449
Price ........................................................................................................... 3450
Save ........................................................................................................... 3451
Load ........................................................................................................... 3452
Type ........................................................................................................... 3453
CChartObjectRectLabel
................................................................................................................ 3454
Create ........................................................................................................... 3456
X_Size ........................................................................................................... 3457

© 2000-2018, MetaQuotes Software Corp.


35 Conteúdo

Y_Size ........................................................................................................... 3458


Bac k Color ........................................................................................................... 3459
Angle ........................................................................................................... 3460
BorderType........................................................................................................... 3461
Save ........................................................................................................... 3462
Load ........................................................................................................... 3463
Type ........................................................................................................... 3464
............................................................................................................................3465
Gráfic os personali zados
CCanvas......................................................................................................................... 3466
Attach ................................................................................................................ 3470
Arc ................................................................................................................ 3471
Pie ................................................................................................................ 3475
FillPolygon ................................................................................................................ 3479
FillEllipse ................................................................................................................ 3480
GetDefaultColor
................................................................................................................ 3481
ChartObjectName
................................................................................................................ 3482
Circle ................................................................................................................ 3483
CircleAA ................................................................................................................ 3484
CircleW u ................................................................................................................ 3485
Create ................................................................................................................ 3486
CreateBitmap ................................................................................................................ 3487
CreateBitmapLabel
................................................................................................................ 3489
Destroy ................................................................................................................ 3491
Ellipse ................................................................................................................ 3492
EllipseAA ................................................................................................................ 3493
EllipseW u ................................................................................................................ 3494
Erase ................................................................................................................ 3495
Fill ................................................................................................................ 3496
FillCircle ................................................................................................................ 3497
FillRectangle ................................................................................................................ 3498
FillTriangle ................................................................................................................ 3499
FontAngleG................................................................................................................
et 3500
FontAngleSet ................................................................................................................ 3501
Font Flags G................................................................................................................
et 3502
Font FlagsSet ................................................................................................................ 3503
Font Get ................................................................................................................ 3504
FontNameG................................................................................................................
et 3505
FontNameSet ................................................................................................................ 3506
FontSet ................................................................................................................ 3507
FontSizeGet ................................................................................................................ 3508
FontSizeSet................................................................................................................ 3509
Height ................................................................................................................ 3510
Line ................................................................................................................ 3511
LineAA ................................................................................................................ 3512
LineW u ................................................................................................................ 3513
LineHorizontal................................................................................................................ 3514
LineV ertical ................................................................................................................ 3515
LineStyleSet ................................................................................................................ 3516
LineThic k ................................................................................................................ 3517
LineThic kV................................................................................................................
ertical 3518
LineThic kH................................................................................................................
orizontal 3519
LoadFromF................................................................................................................
ile 3520
PixelGet ................................................................................................................ 3521
PixelSet ................................................................................................................ 3522
PixelSetAA ................................................................................................................ 3523
Polygon ................................................................................................................ 3524
PolygonAA ................................................................................................................ 3525
PolygonW u................................................................................................................ 3526

© 2000-2018, MetaQuotes Software Corp.


36 Conteúdo

k
PolygonThic................................................................................................................ 3527
PolygonSmooth................................................................................................................ 3528
Polyline ................................................................................................................ 3529
PolylineSmooth
................................................................................................................ 3530
k
PolylineThic................................................................................................................ 3531
PolylineW u ................................................................................................................ 3532
PolylineAA ................................................................................................................ 3533
Rectangle ................................................................................................................ 3534
Resize ................................................................................................................ 3535
ResourceName ................................................................................................................ 3536
Text Height................................................................................................................ 3537
TextOut ................................................................................................................ 3538
TextSize ................................................................................................................ 3539
Text W idth ................................................................................................................ 3540
TransparentLevelSet
................................................................................................................ 3541
Triangle ................................................................................................................ 3542
TriangleAA ................................................................................................................ 3543
TriangleW u................................................................................................................ 3544
Update ................................................................................................................ 3545
W idth ................................................................................................................ 3546
CChartCanvas
......................................................................................................................... 3547
Color Bac k ground
................................................................................................................ 3551
Color Border................................................................................................................ 3552
ColorText ................................................................................................................ 3553
Color Grid ................................................................................................................ 3554
MaxData ................................................................................................................ 3555
MaxDescrLen ................................................................................................................ 3556
ShowFlags ................................................................................................................ 3557
IsShowLegend ................................................................................................................ 3558
IsShowScaleLeft
................................................................................................................ 3559
IsShowScaleRight
................................................................................................................ 3560
IsShowScaleTop
................................................................................................................ 3561
Bottom
IsShowScale................................................................................................................ 3562
IsShowGrid................................................................................................................ 3563
IsShowDescriptors
................................................................................................................ 3564
IsShowPercent................................................................................................................ 3565
V ScaleMin ................................................................................................................ 3566
V ScaleMax ................................................................................................................ 3567
NumGrid ................................................................................................................ 3568
DataOffset................................................................................................................ 3569
DataTotal ................................................................................................................ 3570
DrawDescriptors
................................................................................................................ 3571
DrawData ................................................................................................................ 3572
Create ................................................................................................................ 3573
AllowedShow Flags
................................................................................................................ 3574
ShowLegend ................................................................................................................ 3575
ShowScaleLeft................................................................................................................ 3576
ShowScaleRight
................................................................................................................ 3577
ShowScaleTop ................................................................................................................ 3578
ShowScaleB................................................................................................................
ottom 3579
ShowGrid ................................................................................................................ 3580
ShowDescriptors
................................................................................................................ 3581
ShowV alue ................................................................................................................ 3582
ShowPercent ................................................................................................................ 3583
LegendAlignment
................................................................................................................ 3584
Accumulative ................................................................................................................ 3585
V ScaleParams................................................................................................................ 3586
DescriptorUpdate
................................................................................................................ 3587

© 2000-2018, MetaQuotes Software Corp.


37 Conteúdo

ColorUpdate ................................................................................................................ 3588


V aluesChec................................................................................................................
k 3589
Redraw ................................................................................................................ 3590
DrawBac k ground
................................................................................................................ 3591
DrawLegend ................................................................................................................ 3592
DrawLegend V ertical
................................................................................................................ 3593
DrawLegend Horizontal
................................................................................................................ 3594
CalcScales ................................................................................................................ 3595
DrawScales................................................................................................................ 3596
DrawScaleLeft ................................................................................................................ 3597
DrawScaleRight................................................................................................................ 3598
DrawScaleTop ................................................................................................................ 3599
DrawScaleB................................................................................................................
ottom 3600
DrawGrid ................................................................................................................ 3601
DrawChart................................................................................................................ 3602
C HistogramChart
......................................................................................................................... 3603
Gradient ................................................................................................................ 3608
Bar Gap ................................................................................................................ 3609
BarMinSize................................................................................................................ 3610
Bar Border ................................................................................................................ 3611
Create ................................................................................................................ 3612
SeriesAdd ................................................................................................................ 3613
SeriesInsert ................................................................................................................ 3614
SeriesUpdate ................................................................................................................ 3615
SeriesDelete ................................................................................................................ 3616
V alueUpdate ................................................................................................................ 3617
DrawData ................................................................................................................ 3618
DrawBar ................................................................................................................ 3619
Gradient Brush................................................................................................................ 3620
CLineChart
......................................................................................................................... 3621
Filled ................................................................................................................ 3625
Create ................................................................................................................ 3626
SeriesAdd ................................................................................................................ 3627
SeriesInsert ................................................................................................................ 3628
SeriesUpdate ................................................................................................................ 3629
SeriesDelete ................................................................................................................ 3630
V alueUpdate ................................................................................................................ 3631
DrawChart................................................................................................................ 3632
DrawData ................................................................................................................ 3633
CalcArea ................................................................................................................ 3634
CPieChart......................................................................................................................... 3635
Create ................................................................................................................ 3639
SeriesSet ................................................................................................................ 3640
V alueAdd ................................................................................................................ 3641
V alueInsert................................................................................................................ 3642
V alueUpdate ................................................................................................................ 3643
V alueDelete................................................................................................................ 3644
DrawChart................................................................................................................ 3645
DrawPie ................................................................................................................ 3646
LabelMak e ................................................................................................................ 3647
............................................................................................................................3648
Gráfic os de preç os
ChartID......................................................................................................................... 3654
Mode ......................................................................................................................... 3655
Foreground
......................................................................................................................... 3656
Shift ......................................................................................................................... 3657
ShiftSize
......................................................................................................................... 3658
AutoScroll
......................................................................................................................... 3659
Scale ......................................................................................................................... 3660

© 2000-2018, MetaQuotes Software Corp.


38 Conteúdo

ScaleFix......................................................................................................................... 3661
ScaleFix.........................................................................................................................
_11 3662
FixedMax ......................................................................................................................... 3663
FixedMin ......................................................................................................................... 3664
PointsPer Bar
......................................................................................................................... 3665
ScalePPB ......................................................................................................................... 3666
ShowO H.........................................................................................................................
LC 3667
ShowLine Bid
......................................................................................................................... 3668
ShowLineAs k
......................................................................................................................... 3669
ShowLastLine
......................................................................................................................... 3670
ShowPeriodSep
......................................................................................................................... 3671
ShowGrid ......................................................................................................................... 3672
ShowV olumes
......................................................................................................................... 3673
ShowObjectDescr
......................................................................................................................... 3674
ShowDateScale
......................................................................................................................... 3675
ShowPriceScale
......................................................................................................................... 3676
Color Bac k ground
......................................................................................................................... 3677
Color Foreground
......................................................................................................................... 3678
Color Grid......................................................................................................................... 3679
Color BarUp
......................................................................................................................... 3680
Color BarDown
......................................................................................................................... 3681
ColorCandle Bull
......................................................................................................................... 3682
ColorCandle Bear
......................................................................................................................... 3683
ColorChartLine
......................................................................................................................... 3684
Color V olumes
......................................................................................................................... 3685
ColorLine Bid
......................................................................................................................... 3686
ColorLineAs k
......................................................................................................................... 3687
ColorLineLast
......................................................................................................................... 3688
ColorStopLevels
......................................................................................................................... 3689
V isibleB.........................................................................................................................
ars 3690
W indowsTotal
......................................................................................................................... 3691
W indowIs V isible
......................................................................................................................... 3692
W indow.........................................................................................................................
Handle 3693
First V isible Bar
......................................................................................................................... 3694
W idthIn.........................................................................................................................
Bars 3695
W idthInPixels
......................................................................................................................... 3696
HeightInPixels
......................................................................................................................... 3697
PriceMin ......................................................................................................................... 3698
PriceMax ......................................................................................................................... 3699
Attach ......................................................................................................................... 3700
FirstChart......................................................................................................................... 3701
NextChart ......................................................................................................................... 3702
Open ......................................................................................................................... 3703
Detach ......................................................................................................................... 3704
Close ......................................................................................................................... 3705
BringToTop......................................................................................................................... 3706
EventObjectCreate
......................................................................................................................... 3707
EventObjectDelete
......................................................................................................................... 3708
IndicatorAdd
......................................................................................................................... 3709
IndicatorDelete
......................................................................................................................... 3710
IndicatorsTotal
......................................................................................................................... 3711
IndicatorName
......................................................................................................................... 3712
Navigate ......................................................................................................................... 3713
Symbol ......................................................................................................................... 3714
Period ......................................................................................................................... 3715
Redraw......................................................................................................................... 3716
GetInteger......................................................................................................................... 3717
SetInteger......................................................................................................................... 3718

© 2000-2018, MetaQuotes Software Corp.


39 Conteúdo

GetDouble......................................................................................................................... 3719
SetDouble......................................................................................................................... 3720
GetString......................................................................................................................... 3721
SetString......................................................................................................................... 3722
SetSymbolPeriod
......................................................................................................................... 3723
ApplyTemplate
......................................................................................................................... 3724
ScreenShot
......................................................................................................................... 3725
W indowOnDropped
......................................................................................................................... 3726
PriceOnDropped
......................................................................................................................... 3727
TimeOnDropped
......................................................................................................................... 3728
X OnDropped
......................................................................................................................... 3729
Y OnDropped
......................................................................................................................... 3730
Save ......................................................................................................................... 3731
Load ......................................................................................................................... 3732
Type ......................................................................................................................... 3733
Gráfic os c ............................................................................................................................3734
ientífic os
GraphPlot......................................................................................................................... 3735
CAxis ......................................................................................................................... 3739
AutoScale ................................................................................................................ 3741
Min ................................................................................................................ 3742
Max ................................................................................................................ 3743
Step ................................................................................................................ 3744
Name ................................................................................................................ 3745
Color ................................................................................................................ 3746
V aluesSize ................................................................................................................ 3747
V alues W idth................................................................................................................ 3748
V alues Format................................................................................................................ 3749
V aluesDateTimeMode
................................................................................................................ 3750
V alues Function Format
................................................................................................................ 3751
V alues Function FormatC BData
................................................................................................................ 3753
NameSize ................................................................................................................ 3754
ZeroLever ................................................................................................................ 3755
DefaultStep................................................................................................................ 3756
MaxLabels ................................................................................................................ 3757
MinGrace ................................................................................................................ 3758
Max Grace ................................................................................................................ 3759
SelectAxisScale
................................................................................................................ 3760
CColor G.........................................................................................................................
enerator 3761
Next ................................................................................................................ 3762
Reset ................................................................................................................ 3763
CCurve......................................................................................................................... 3764
Type ................................................................................................................ 3767
Name ................................................................................................................ 3768
Color ................................................................................................................ 3769
X Max ................................................................................................................ 3770
X Min ................................................................................................................ 3771
Y Max ................................................................................................................ 3772
Y Min ................................................................................................................ 3773
Size ................................................................................................................ 3774
PointsSize ................................................................................................................ 3775
Points Fill ................................................................................................................ 3776
PointsColor................................................................................................................ 3777
Get X ................................................................................................................ 3778
Get Y ................................................................................................................ 3779
LinesStyle ................................................................................................................ 3780
LinesIsSmooth ................................................................................................................ 3781
LinesSmoothTension
................................................................................................................ 3782
LinesSmoothStep
................................................................................................................ 3783

© 2000-2018, MetaQuotes Software Corp.


40 Conteúdo

LinesEndStyle ................................................................................................................ 3784


Lines W idth................................................................................................................ 3785
HistogramW ................................................................................................................
idth 3787
CustomPlotC BData
................................................................................................................ 3788
Function
CustomPlot................................................................................................................ 3789
PointsType................................................................................................................ 3793
StepsDimension................................................................................................................ 3794
TrendLineCoefficients
................................................................................................................ 3795
TrendLineColor................................................................................................................ 3796
TrendLineV................................................................................................................
isible 3797
Update ................................................................................................................ 3799
V isible ................................................................................................................ 3801
C Graphic......................................................................................................................... 3802
Create ................................................................................................................ 3805
Destroy ................................................................................................................ 3806
Update ................................................................................................................ 3807
ChartObjectName
................................................................................................................ 3808
ResourceName ................................................................................................................ 3809
X Axis ................................................................................................................ 3810
Y Axis ................................................................................................................ 3811
GapSize ................................................................................................................ 3812
Bac k groundColor
................................................................................................................ 3813
Bac k groundMain
................................................................................................................ 3814
Bac k groundMainSize
................................................................................................................ 3815
Bac k groundMainColor
................................................................................................................ 3816
Bac k groundSub
................................................................................................................ 3817
Bac k groundSubSize
................................................................................................................ 3818
Bac k groundSubColor
................................................................................................................ 3819
GridLineColor ................................................................................................................ 3820
GridBac k groundColor
................................................................................................................ 3821
GridCircleRadius
................................................................................................................ 3822
GridCircleColor
................................................................................................................ 3823
GridHasCircle ................................................................................................................ 3824
HistoryName W idth
................................................................................................................ 3825
HistoryNameSize
................................................................................................................ 3826
HistorySymbolSize
................................................................................................................ 3827
TextAdd ................................................................................................................ 3828
LineAdd ................................................................................................................ 3829
CurveAdd ................................................................................................................ 3830
CurvePlot ................................................................................................................ 3833
CurvePlotAll ................................................................................................................ 3834
CurvesTotal ................................................................................................................ 3835
CurveGet ByIndex
................................................................................................................ 3836
CurveGet ByName
................................................................................................................ 3837
CurveRemove ByIndex
................................................................................................................ 3838
CurveRemove ByName
................................................................................................................ 3839
CurvesTotal ................................................................................................................ 3840
Mar k sToAxisAdd
................................................................................................................ 3841
MajorMar k Size
................................................................................................................ 3842
FontSet ................................................................................................................ 3843
Font Get ................................................................................................................ 3844
GridAxisLineColor
................................................................................................................ 3845
Attach ................................................................................................................ 3846
CalculateMaxMin V alues
................................................................................................................ 3847
Height ................................................................................................................ 3848
IndentDown ................................................................................................................ 3849
IndentLeft ................................................................................................................ 3850
IndentRight................................................................................................................ 3851

© 2000-2018, MetaQuotes Software Corp.


41 Conteúdo

IndentUp ................................................................................................................ 3852


Redraw ................................................................................................................ 3853
ResetParameters
................................................................................................................ 3854
SetDefaultParameters
................................................................................................................ 3855
ScaleX ................................................................................................................ 3856
ScaleY ................................................................................................................ 3857
W idth ................................................................................................................ 3858
............................................................................................................................3859
Indic adores
Base
Classes ......................................................................................................................... 3860
CSpreadBuffer................................................................................................................ 3861
Size ........................................................................................................... 3863
SetSymbolPeriod
........................................................................................................... 3864
At ........................................................................................................... 3865
Refresh ........................................................................................................... 3866
RefreshCurrent
........................................................................................................... 3867
CTimeBuffer ................................................................................................................ 3868
Size ........................................................................................................... 3870
SetSymbolPeriod
........................................................................................................... 3871
At ........................................................................................................... 3872
Refresh ........................................................................................................... 3873
RefreshCurrent
........................................................................................................... 3874
CTic kV olume Buffer
................................................................................................................ 3875
Size ........................................................................................................... 3877
SetSymbolPeriod
........................................................................................................... 3878
At ........................................................................................................... 3879
Refresh ........................................................................................................... 3880
RefreshCurrent
........................................................................................................... 3881
CRealV olume Buffer
................................................................................................................ 3882
Size ........................................................................................................... 3884
SetSymbolPeriod
........................................................................................................... 3885
At ........................................................................................................... 3886
Refresh ........................................................................................................... 3887
RefreshCurrent
........................................................................................................... 3888
CDoubleBuffer
................................................................................................................ 3889
Size ........................................................................................................... 3891
SetSymbolPeriod
........................................................................................................... 3892
At ........................................................................................................... 3893
Refresh ........................................................................................................... 3894
RefreshCurrent
........................................................................................................... 3895
COpenBuffer ................................................................................................................ 3896
Refresh ........................................................................................................... 3897
RefreshCurrent
........................................................................................................... 3898
C HighBuffer................................................................................................................ 3899
Refresh ........................................................................................................... 3900
RefreshCurrent
........................................................................................................... 3901
CLowBuffer................................................................................................................ 3902
Refresh ........................................................................................................... 3903
RefreshCurrent
........................................................................................................... 3904
CCloseBuffer................................................................................................................ 3905
Refresh ........................................................................................................... 3906
RefreshCurrent
........................................................................................................... 3907
CIndicator B................................................................................................................
uffer 3908
Offset ........................................................................................................... 3910
Name ........................................................................................................... 3911
At ........................................................................................................... 3912
Refresh ........................................................................................................... 3913
RefreshCurrent
........................................................................................................... 3914
CSeries ................................................................................................................ 3915

© 2000-2018, MetaQuotes Software Corp.


42 Conteúdo

Name ........................................................................................................... 3917


BuffersTotal ........................................................................................................... 3918
Timeframe ........................................................................................................... 3919
Symbol ........................................................................................................... 3920
Period ........................................................................................................... 3921
RefreshCurrent
........................................................................................................... 3922
BufferSize ........................................................................................................... 3923
BufferResize ........................................................................................................... 3924
Refresh ........................................................................................................... 3925
PeriodDescription
........................................................................................................... 3926
CPriceSeries ................................................................................................................ 3927
BufferResize ........................................................................................................... 3929
GetData ........................................................................................................... 3930
Refresh ........................................................................................................... 3931
MinIndex ........................................................................................................... 3932
MinV alue ........................................................................................................... 3933
MaxIndex ........................................................................................................... 3934
Max V alue ........................................................................................................... 3935
CIndicator ................................................................................................................ 3936
Handle ........................................................................................................... 3939
Status ........................................................................................................... 3940
FullRelease........................................................................................................... 3941
Create ........................................................................................................... 3942
BufferResize ........................................................................................................... 3943
BarsCalculated
........................................................................................................... 3944
GetData ........................................................................................................... 3945
Refresh ........................................................................................................... 3948
Minimum ........................................................................................................... 3949
MinV alue ........................................................................................................... 3950
Maximum ........................................................................................................... 3951
Max V alue ........................................................................................................... 3952
MethodDescription
........................................................................................................... 3953
PriceDescription
........................................................................................................... 3954
V olumeDescription
........................................................................................................... 3955
AddToChart........................................................................................................... 3956
DeleteFromChart
........................................................................................................... 3957
CIndicators................................................................................................................ 3958
Create ........................................................................................................... 3959
Refresh ........................................................................................................... 3960
Classes .........................................................................................................................
de timesseries 3961
CiSpread ................................................................................................................ 3962
Create ........................................................................................................... 3964
BufferResize ........................................................................................................... 3965
GetData ........................................................................................................... 3966
Refresh ........................................................................................................... 3968
CiTime ................................................................................................................ 3969
Create ........................................................................................................... 3971
BufferResize ........................................................................................................... 3972
GetData ........................................................................................................... 3973
Refresh ........................................................................................................... 3975
CiTic kV olume
................................................................................................................ 3976
Create ........................................................................................................... 3978
BufferResize ........................................................................................................... 3979
GetData ........................................................................................................... 3980
Refresh ........................................................................................................... 3982
CiRealV olume................................................................................................................ 3983
Create ........................................................................................................... 3985
BufferResize ........................................................................................................... 3986

© 2000-2018, MetaQuotes Software Corp.


43 Conteúdo

GetData ........................................................................................................... 3987


Refresh ........................................................................................................... 3989
CiOpen ................................................................................................................ 3990
Create ........................................................................................................... 3992
GetData ........................................................................................................... 3993
CiHigh ................................................................................................................ 3995
Create ........................................................................................................... 3997
GetData ........................................................................................................... 3998
CiLow ................................................................................................................ 4000
Create ........................................................................................................... 4002
GetData ........................................................................................................... 4003
CiClose ................................................................................................................ 4005
Create ........................................................................................................... 4007
GetData ........................................................................................................... 4008
Indicadores
.........................................................................................................................
de Tendência 4010
CiADX ................................................................................................................ 4011
MaPeriod ........................................................................................................... 4013
Create ........................................................................................................... 4014
Main ........................................................................................................... 4015
Plus ........................................................................................................... 4016
Minus ........................................................................................................... 4017
Type ........................................................................................................... 4018
CiADXW ilder ................................................................................................................ 4019
MaPeriod ........................................................................................................... 4021
Create ........................................................................................................... 4022
Main ........................................................................................................... 4023
Plus ........................................................................................................... 4024
Minus ........................................................................................................... 4025
Type ........................................................................................................... 4026
CiBands ................................................................................................................ 4027
MaPeriod ........................................................................................................... 4029
MaShift ........................................................................................................... 4030
Deviation ........................................................................................................... 4031
Applied ........................................................................................................... 4032
Create ........................................................................................................... 4033
Base ........................................................................................................... 4034
Upper ........................................................................................................... 4035
Lower ........................................................................................................... 4036
Type ........................................................................................................... 4037
CiEnvelopes................................................................................................................ 4038
MaPeriod ........................................................................................................... 4040
MaShift ........................................................................................................... 4041
MaMethod ........................................................................................................... 4042
Deviation ........................................................................................................... 4043
Applied ........................................................................................................... 4044
Create ........................................................................................................... 4045
Upper ........................................................................................................... 4046
Lower ........................................................................................................... 4047
Type ........................................................................................................... 4048
CiIchimok u................................................................................................................ 4049
Tenk anSenPeriod
........................................................................................................... 4051
KijunSenPeriod
........................................................................................................... 4052
Senk ouSpan...........................................................................................................
BPeriod 4053
Create ........................................................................................................... 4054
Tenk anSen........................................................................................................... 4055
KijunSen ........................................................................................................... 4056
Senk ouSpanA ........................................................................................................... 4057
Senk ouSpan...........................................................................................................
B 4058

© 2000-2018, MetaQuotes Software Corp.


44 Conteúdo

Chink ouSpan........................................................................................................... 4059


Type ........................................................................................................... 4060
CiMA ................................................................................................................ 4061
MaPeriod ........................................................................................................... 4063
MaShift ........................................................................................................... 4064
MaMethod ........................................................................................................... 4065
Applied ........................................................................................................... 4066
Create ........................................................................................................... 4067
Main ........................................................................................................... 4068
Type ........................................................................................................... 4069
CiSAR ................................................................................................................ 4070
SarStep ........................................................................................................... 4072
Maximum ........................................................................................................... 4073
Create ........................................................................................................... 4074
Main ........................................................................................................... 4075
Type ........................................................................................................... 4076
CiStdDev ................................................................................................................ 4077
MaPeriod ........................................................................................................... 4079
MaShift ........................................................................................................... 4080
MaMethod ........................................................................................................... 4081
Applied ........................................................................................................... 4082
Create ........................................................................................................... 4083
Main ........................................................................................................... 4084
Type ........................................................................................................... 4085
CiDEMA ................................................................................................................ 4086
MaPeriod ........................................................................................................... 4088
IndShift ........................................................................................................... 4089
Applied ........................................................................................................... 4090
Create ........................................................................................................... 4091
Main ........................................................................................................... 4092
Type ........................................................................................................... 4093
CiTEMA ................................................................................................................ 4094
MaPeriod ........................................................................................................... 4096
IndShift ........................................................................................................... 4097
Applied ........................................................................................................... 4098
Create ........................................................................................................... 4099
Main ........................................................................................................... 4100
Type ........................................................................................................... 4101
CiFrAMA ................................................................................................................ 4102
MaPeriod ........................................................................................................... 4104
IndShift ........................................................................................................... 4105
Applied ........................................................................................................... 4106
Create ........................................................................................................... 4107
Main ........................................................................................................... 4108
Type ........................................................................................................... 4109
CiAMA ................................................................................................................ 4110
MaPeriod ........................................................................................................... 4112
FastEmaPeriod
........................................................................................................... 4113
SlowEmaPeriod
........................................................................................................... 4114
IndShift ........................................................................................................... 4115
Applied ........................................................................................................... 4116
Create ........................................................................................................... 4117
Main ........................................................................................................... 4118
Type ........................................................................................................... 4119
CiV IDyA ................................................................................................................ 4120
CmoPeriod........................................................................................................... 4122
EmaPeriod ........................................................................................................... 4123
IndShift ........................................................................................................... 4124

© 2000-2018, MetaQuotes Software Corp.


45 Conteúdo

Applied ........................................................................................................... 4125


Create ........................................................................................................... 4126
Main ........................................................................................................... 4127
Type ........................................................................................................... 4128
Osciladores
......................................................................................................................... 4129
CiATR ................................................................................................................ 4130
MaPeriod ........................................................................................................... 4132
Create ........................................................................................................... 4133
Main ........................................................................................................... 4134
Type ........................................................................................................... 4135
CiBearsPower ................................................................................................................ 4136
MaPeriod ........................................................................................................... 4138
Create ........................................................................................................... 4139
Main ........................................................................................................... 4140
Type ........................................................................................................... 4141
CiBullsPower ................................................................................................................ 4142
MaPeriod ........................................................................................................... 4144
Create ........................................................................................................... 4145
Main ........................................................................................................... 4146
Type ........................................................................................................... 4147
CiCCI ................................................................................................................ 4148
MaPeriod ........................................................................................................... 4150
Applied ........................................................................................................... 4151
Create ........................................................................................................... 4152
Main ........................................................................................................... 4153
Type ........................................................................................................... 4154
CiChaik in ................................................................................................................ 4155
FastMaPeriod ........................................................................................................... 4157
SlowMaPeriod ........................................................................................................... 4158
MaMethod ........................................................................................................... 4159
Applied ........................................................................................................... 4160
Create ........................................................................................................... 4161
Main ........................................................................................................... 4162
Type ........................................................................................................... 4163
CiDeMar k er................................................................................................................ 4164
MaPeriod ........................................................................................................... 4166
Create ........................................................................................................... 4167
Main ........................................................................................................... 4168
Type ........................................................................................................... 4169
CiForce ................................................................................................................ 4170
MaPeriod ........................................................................................................... 4172
MaMethod ........................................................................................................... 4173
Applied ........................................................................................................... 4174
Create ........................................................................................................... 4175
Main ........................................................................................................... 4176
Type ........................................................................................................... 4177
CiMACD ................................................................................................................ 4178
FastEmaPeriod........................................................................................................... 4180
SlowEmaPeriod........................................................................................................... 4181
SignalPeriod ........................................................................................................... 4182
Applied ........................................................................................................... 4183
Create ........................................................................................................... 4184
Main ........................................................................................................... 4185
Signal ........................................................................................................... 4186
Type ........................................................................................................... 4187
CiMomentum ................................................................................................................ 4188
MaPeriod ........................................................................................................... 4190
Applied ........................................................................................................... 4191

© 2000-2018, MetaQuotes Software Corp.


46 Conteúdo

Create ........................................................................................................... 4192


Main ........................................................................................................... 4193
Type ........................................................................................................... 4194
CiOsMA ................................................................................................................ 4195
FastEmaPeriod........................................................................................................... 4197
SlowEmaPeriod........................................................................................................... 4198
SignalPeriod ........................................................................................................... 4199
Applied ........................................................................................................... 4200
Create ........................................................................................................... 4201
Main ........................................................................................................... 4202
Type ........................................................................................................... 4203
CiRSI ................................................................................................................ 4204
MaPeriod ........................................................................................................... 4206
Applied ........................................................................................................... 4207
Create ........................................................................................................... 4208
Main ........................................................................................................... 4209
Type ........................................................................................................... 4210
CiRV I ................................................................................................................ 4211
MaPeriod ........................................................................................................... 4213
Create ........................................................................................................... 4214
Main ........................................................................................................... 4215
Signal ........................................................................................................... 4216
Type ........................................................................................................... 4217
CiStochastic ................................................................................................................ 4218
Kperiod ........................................................................................................... 4220
Dperiod ........................................................................................................... 4221
Slowing ........................................................................................................... 4222
MaMethod ........................................................................................................... 4223
PriceField ........................................................................................................... 4224
Create ........................................................................................................... 4225
Main ........................................................................................................... 4226
Signal ........................................................................................................... 4227
Type ........................................................................................................... 4228
CiTriX ................................................................................................................ 4229
MaPeriod ........................................................................................................... 4231
Applied ........................................................................................................... 4232
Create ........................................................................................................... 4233
Main ........................................................................................................... 4234
Type ........................................................................................................... 4235
CiW PR ................................................................................................................ 4236
CalcPeriod........................................................................................................... 4238
Create ........................................................................................................... 4239
Main ........................................................................................................... 4240
Type ........................................................................................................... 4241
Indicadores de V olume
......................................................................................................................... 4242
CiAD ................................................................................................................ 4243
Applied ........................................................................................................... 4245
Create ........................................................................................................... 4246
Main ........................................................................................................... 4247
Type ........................................................................................................... 4248
CiMFI ................................................................................................................ 4249
MaPeriod ........................................................................................................... 4251
Applied ........................................................................................................... 4252
Create ........................................................................................................... 4253
Main ........................................................................................................... 4254
Type ........................................................................................................... 4255
CiO BV ................................................................................................................ 4256
Applied ........................................................................................................... 4258

© 2000-2018, MetaQuotes Software Corp.


47 Conteúdo

Create ........................................................................................................... 4259


Main ........................................................................................................... 4260
Type ........................................................................................................... 4261
CiV olumes ................................................................................................................ 4262
Applied ........................................................................................................... 4264
Create ........................................................................................................... 4265
Main ........................................................................................................... 4266
Type ........................................................................................................... 4267
Indicadores Bill W illiams
......................................................................................................................... 4268
CiAC ................................................................................................................ 4269
Create ........................................................................................................... 4271
Main ........................................................................................................... 4272
Type ........................................................................................................... 4273
CiAlligator ................................................................................................................ 4274
JawPeriod ........................................................................................................... 4276
JawShift ........................................................................................................... 4277
TeethPeriod ........................................................................................................... 4278
TeethShift ........................................................................................................... 4279
LipsPeriod ........................................................................................................... 4280
LipsShift ........................................................................................................... 4281
MaMethod ........................................................................................................... 4282
Applied ........................................................................................................... 4283
Create ........................................................................................................... 4284
Jaw ........................................................................................................... 4285
Teeth ........................................................................................................... 4286
Lips ........................................................................................................... 4287
Type ........................................................................................................... 4288
CiAO ................................................................................................................ 4289
Create ........................................................................................................... 4291
Main ........................................................................................................... 4292
Type ........................................................................................................... 4293
CiFractals ................................................................................................................ 4294
Create ........................................................................................................... 4296
Upper ........................................................................................................... 4297
Lower ........................................................................................................... 4298
Type ........................................................................................................... 4299
CiGator ................................................................................................................ 4300
JawPeriod ........................................................................................................... 4302
JawShift ........................................................................................................... 4303
TeethPeriod ........................................................................................................... 4304
TeethShift ........................................................................................................... 4305
LipsPeriod ........................................................................................................... 4306
LipsShift ........................................................................................................... 4307
MaMethod ........................................................................................................... 4308
Applied ........................................................................................................... 4309
Create ........................................................................................................... 4310
Upper ........................................................................................................... 4311
Lower ........................................................................................................... 4312
Type ........................................................................................................... 4313
CiBW MFI ................................................................................................................ 4314
Applied ........................................................................................................... 4316
Create ........................................................................................................... 4317
Main ........................................................................................................... 4318
Type ........................................................................................................... 4319
indicadores
.........................................................................................................................
personalizados 4320
NumBuffers................................................................................................................ 4321
NumParams................................................................................................................ 4322
ParamType................................................................................................................ 4323

© 2000-2018, MetaQuotes Software Corp.


48 Conteúdo

ParamLong................................................................................................................ 4324
ParamDouble
................................................................................................................ 4325
ParamString
................................................................................................................ 4326
Type ................................................................................................................ 4327
Classes de............................................................................................................................4328
negoc iaç ão
CAccountInfo
......................................................................................................................... 4329
Login ................................................................................................................ 4331
TradeMode................................................................................................................ 4332
TradeModeDescription
................................................................................................................ 4333
Leverage ................................................................................................................ 4334
StopoutMode ................................................................................................................ 4335
StopoutModeDescription
................................................................................................................ 4336
MarginMode ................................................................................................................ 4337
MarginModeDescription
................................................................................................................ 4338
TradeAllowed ................................................................................................................ 4339
TradeExpert ................................................................................................................ 4340
LimitOrders................................................................................................................ 4341
Balance ................................................................................................................ 4342
Credit ................................................................................................................ 4343
Profit ................................................................................................................ 4344
Equity ................................................................................................................ 4345
Margin ................................................................................................................ 4346
FreeMargin................................................................................................................ 4347
MarginLevel ................................................................................................................ 4348
MarginCall ................................................................................................................ 4349
MarginStopOut ................................................................................................................ 4350
Name ................................................................................................................ 4351
Server ................................................................................................................ 4352
Currency ................................................................................................................ 4353
Company ................................................................................................................ 4354
InfoInteger................................................................................................................ 4355
InfoDouble ................................................................................................................ 4356
InfoString ................................................................................................................ 4357
OrderProfitChec k
................................................................................................................ 4358
k
MarginChec................................................................................................................ 4359
FreeMarginChec k
................................................................................................................ 4360
MaxLotChec k
................................................................................................................ 4361
CSymbolInfo
......................................................................................................................... 4362
Refresh ................................................................................................................ 4367
RefreshRates ................................................................................................................ 4368
Name ................................................................................................................ 4369
Select ................................................................................................................ 4370
IsSynchronized................................................................................................................ 4371
V olume ................................................................................................................ 4372
V olumeHigh................................................................................................................ 4373
V olumeLow................................................................................................................ 4374
Time ................................................................................................................ 4375
Spread ................................................................................................................ 4376
SpreadFloat................................................................................................................ 4377
Tic k s Book Depth
................................................................................................................ 4378
StopsLevel................................................................................................................ 4379
FreezeLevel ................................................................................................................ 4380
Bid ................................................................................................................ 4381
BidHigh ................................................................................................................ 4382
BidLow ................................................................................................................ 4383
As k ................................................................................................................ 4384
As kHigh ................................................................................................................ 4385
As k Low ................................................................................................................ 4386

© 2000-2018, MetaQuotes Software Corp.


49 Conteúdo

Last ................................................................................................................ 4387


Last High ................................................................................................................ 4388
LastLow ................................................................................................................ 4389
TradeCalcMode
................................................................................................................ 4390
TradeCalcModeDescription
................................................................................................................ 4391
TradeMode................................................................................................................ 4392
TradeModeDescription
................................................................................................................ 4393
TradeExecution
................................................................................................................ 4394
TradeExecutionDescription
................................................................................................................ 4395
SwapMode ................................................................................................................ 4396
SwapModeDescription
................................................................................................................ 4397
SwapRollover3days
................................................................................................................ 4398
SwapRollover3daysDescription
................................................................................................................ 4399
MarginInitial
................................................................................................................ 4400
MarginMaintenance
................................................................................................................ 4401
MarginLong................................................................................................................ 4402
MarginShort ................................................................................................................ 4403
MarginLimit................................................................................................................ 4404
MarginStop................................................................................................................ 4405
MarginStopLimit
................................................................................................................ 4406
TradeTimeF................................................................................................................
lags 4407
TradeFillFlags
................................................................................................................ 4408
Digits ................................................................................................................ 4409
Point ................................................................................................................ 4410
Tic kV alue ................................................................................................................ 4411
Tic kV alueProfit
................................................................................................................ 4412
Tic kV alueLoss
................................................................................................................ 4413
Tic k Size ................................................................................................................ 4414
ContractSize................................................................................................................ 4415
LotsMin ................................................................................................................ 4416
LotsMax ................................................................................................................ 4417
LotsStep ................................................................................................................ 4418
LotsLimit ................................................................................................................ 4419
SwapLong ................................................................................................................ 4420
SwapShort ................................................................................................................ 4421
Currency Base
................................................................................................................ 4422
CurrencyProfit
................................................................................................................ 4423
CurrencyMargin
................................................................................................................ 4424
Bank ................................................................................................................ 4425
Description................................................................................................................ 4426
Path ................................................................................................................ 4427
SessionDeals................................................................................................................ 4428
SessionBuyOrders
................................................................................................................ 4429
SessionSellOrders
................................................................................................................ 4430
SessionTurnover
................................................................................................................ 4431
SessionInterest
................................................................................................................ 4432
SessionBuyOrders V olume
................................................................................................................ 4433
SessionSellOrders V olume
................................................................................................................ 4434
SessionOpen ................................................................................................................ 4435
SessionClose................................................................................................................ 4436
SessionAW ................................................................................................................ 4437
SessionPriceSettlement
................................................................................................................ 4438
SessionPriceLimitMin
................................................................................................................ 4439
SessionPriceLimitMax
................................................................................................................ 4440
InfoInteger................................................................................................................ 4441
InfoDouble ................................................................................................................ 4442
InfoString ................................................................................................................ 4443
NormalizePrice
................................................................................................................ 4444

© 2000-2018, MetaQuotes Software Corp.


50 Conteúdo

COrderInfo
......................................................................................................................... 4445
Tic k et ................................................................................................................ 4448
TimeSetup ................................................................................................................ 4449
TimeSetupMsc ................................................................................................................ 4450
OrderType................................................................................................................ 4451
TypeDescription
................................................................................................................ 4452
State ................................................................................................................ 4453
StateDescription
................................................................................................................ 4454
TimeExpiration................................................................................................................ 4455
TimeDone ................................................................................................................ 4456
TimeDoneMsc ................................................................................................................ 4457
TypeFilling ................................................................................................................ 4458
TypeFillingDescription
................................................................................................................ 4459
TypeTime ................................................................................................................ 4460
TypeTimeDescription
................................................................................................................ 4461
Magic ................................................................................................................ 4462
PositionId ................................................................................................................ 4463
V olumeInitial................................................................................................................ 4464
V olumeCurrent................................................................................................................ 4465
PriceOpen ................................................................................................................ 4466
StopLoss ................................................................................................................ 4467
Tak eProfit ................................................................................................................ 4468
PriceCurrent ................................................................................................................ 4469
PriceStopLimit................................................................................................................ 4470
Symbol ................................................................................................................ 4471
Comment ................................................................................................................ 4472
InfoInteger................................................................................................................ 4473
InfoDouble ................................................................................................................ 4474
InfoString ................................................................................................................ 4475
StoreState................................................................................................................ 4476
Chec k State................................................................................................................ 4477
Select ................................................................................................................ 4478
Select ByIndex................................................................................................................ 4479
C HistoryOrderInfo
......................................................................................................................... 4480
TimeSetup ................................................................................................................ 4482
TimeSetupMsc ................................................................................................................ 4483
OrderType................................................................................................................ 4484
TypeDescription
................................................................................................................ 4485
State ................................................................................................................ 4486
StateDescription
................................................................................................................ 4487
TimeExpiration................................................................................................................ 4488
TimeDone ................................................................................................................ 4489
TimeDoneMsc ................................................................................................................ 4490
TypeFilling ................................................................................................................ 4491
TypeFillingDescription
................................................................................................................ 4492
TypeTime ................................................................................................................ 4493
TypeTimeDescription
................................................................................................................ 4494
Magic ................................................................................................................ 4495
PositionId ................................................................................................................ 4496
V olumeInitial................................................................................................................ 4497
V olumeCurrent................................................................................................................ 4498
PriceOpen ................................................................................................................ 4499
StopLoss ................................................................................................................ 4500
Tak eProfit ................................................................................................................ 4501
PriceCurrent ................................................................................................................ 4502
PriceStopLimit................................................................................................................ 4503
Symbol ................................................................................................................ 4504
Comment ................................................................................................................ 4505

© 2000-2018, MetaQuotes Software Corp.


51 Conteúdo

InfoInteger................................................................................................................ 4506
InfoDouble ................................................................................................................ 4507
InfoString ................................................................................................................ 4508
Tic k et ................................................................................................................ 4509
Select ByIndex................................................................................................................ 4510
CPositionInfo
......................................................................................................................... 4511
Time ................................................................................................................ 4513
TimeMsc ................................................................................................................ 4514
TimeUpdate................................................................................................................ 4515
TimeUpdateMsc ................................................................................................................ 4516
PositionType ................................................................................................................ 4517
TypeDescription
................................................................................................................ 4518
Magic ................................................................................................................ 4519
Identifier ................................................................................................................ 4520
V olume ................................................................................................................ 4521
PriceOpen ................................................................................................................ 4522
StopLoss ................................................................................................................ 4523
Tak eProfit ................................................................................................................ 4524
PriceCurrent ................................................................................................................ 4525
Commission................................................................................................................ 4526
Swap ................................................................................................................ 4527
Profit ................................................................................................................ 4528
Symbol ................................................................................................................ 4529
Comment ................................................................................................................ 4530
InfoInteger................................................................................................................ 4531
InfoDouble ................................................................................................................ 4532
InfoString ................................................................................................................ 4533
Select ................................................................................................................ 4534
Select ByIndex................................................................................................................ 4535
Select ByMagic................................................................................................................ 4536
Select ByTic................................................................................................................
k et 4537
StoreState................................................................................................................ 4538
Chec k State................................................................................................................ 4539
CDealInfo
......................................................................................................................... 4540
Order ................................................................................................................ 4542
Time ................................................................................................................ 4543
TimeMsc ................................................................................................................ 4544
DealType ................................................................................................................ 4545
TypeDescription
................................................................................................................ 4546
Entry ................................................................................................................ 4547
EntryDescription
................................................................................................................ 4548
Magic ................................................................................................................ 4549
PositionId ................................................................................................................ 4550
V olume ................................................................................................................ 4551
Price ................................................................................................................ 4552
Commision ................................................................................................................ 4553
Swap ................................................................................................................ 4554
Profit ................................................................................................................ 4555
Symbol ................................................................................................................ 4556
Comment ................................................................................................................ 4557
InfoInteger................................................................................................................ 4558
InfoDouble ................................................................................................................ 4559
InfoString ................................................................................................................ 4560
Tic k et ................................................................................................................ 4561
Select ByIndex................................................................................................................ 4562
CTrade ......................................................................................................................... 4563
LogLevel ................................................................................................................ 4568
SetExpertMagicNumber
................................................................................................................ 4569

© 2000-2018, MetaQuotes Software Corp.


52 Conteúdo

SetDeviationInPoints
................................................................................................................ 4570
SetTypeFilling
................................................................................................................ 4571
SetTypeFilling BySymbol
................................................................................................................ 4572
SetAsyncMode................................................................................................................ 4573
SetMarginMode
................................................................................................................ 4574
OrderOpen................................................................................................................ 4575
OrderModify ................................................................................................................ 4577
OrderDelete ................................................................................................................ 4578
PositionOpen................................................................................................................ 4579
PositionModify
................................................................................................................ 4580
PositionClose
................................................................................................................ 4581
PositionClosePartial
................................................................................................................ 4582
PositionClose By
................................................................................................................ 4584
Buy ................................................................................................................ 4585
Sell ................................................................................................................ 4586
BuyLimit ................................................................................................................ 4587
BuyStop ................................................................................................................ 4589
SellLimit ................................................................................................................ 4590
SellStop ................................................................................................................ 4591
Request ................................................................................................................ 4592
RequestAction
................................................................................................................ 4593
RequestActionDescription
................................................................................................................ 4594
RequestMagic................................................................................................................ 4595
RequestOrder................................................................................................................ 4596
RequestSymbol
................................................................................................................ 4597
Request V olume
................................................................................................................ 4598
RequestPrice................................................................................................................ 4599
RequestStopLimit
................................................................................................................ 4600
RequestSL ................................................................................................................ 4601
RequestTP ................................................................................................................ 4602
RequestDeviation
................................................................................................................ 4603
RequestType ................................................................................................................ 4604
RequestTypeDescription
................................................................................................................ 4605
RequestType Filling
................................................................................................................ 4606
RequestType FillingDescription
................................................................................................................ 4607
RequestTypeTime
................................................................................................................ 4608
RequestTypeTimeDescription
................................................................................................................ 4609
RequestExpiration
................................................................................................................ 4610
RequestComment
................................................................................................................ 4611
RequestPosition
................................................................................................................ 4612
RequestPosition By
................................................................................................................ 4613
Result ................................................................................................................ 4614
ResultRetcode
................................................................................................................ 4615
ResultRetcodeDescription
................................................................................................................ 4616
ResultDeal ................................................................................................................ 4617
ResultOrder................................................................................................................ 4618
Result V olume
................................................................................................................ 4619
ResultPrice................................................................................................................ 4620
Result Bid ................................................................................................................ 4621
ResultAs k ................................................................................................................ 4622
ResultComment
................................................................................................................ 4623
Chec k Result
................................................................................................................ 4624
Chec k ResultRetcode
................................................................................................................ 4625
Chec k ResultRetcodeDescription
................................................................................................................ 4626
Chec k Result Balance
................................................................................................................ 4627
Chec k ResultEquity
................................................................................................................ 4628
Chec k ResultProfit
................................................................................................................ 4629
Chec k ResultMargin
................................................................................................................ 4630

© 2000-2018, MetaQuotes Software Corp.


53 Conteúdo

Chec k ResultMargin Free


................................................................................................................ 4631
Chec k ResultMarginLevel
................................................................................................................ 4632
Chec k ResultComment
................................................................................................................ 4633
PrintRequest ................................................................................................................ 4634
PrintResult................................................................................................................ 4635
FormatRequest ................................................................................................................ 4636
FormatRequestResult
................................................................................................................ 4637
CTerminalInfo
......................................................................................................................... 4638
Build ................................................................................................................ 4640
IsConnected ................................................................................................................ 4641
IsDLLsAllowed ................................................................................................................ 4642
IsTradeAllowed ................................................................................................................ 4643
IsEmailEnabled ................................................................................................................ 4644
Is FtpEnabled ................................................................................................................ 4645
Max Bars ................................................................................................................ 4646
CodePage ................................................................................................................ 4647
CPUCores ................................................................................................................ 4648
MemoryPhysical ................................................................................................................ 4649
MemoryTotal ................................................................................................................ 4650
MemoryAvailable................................................................................................................ 4651
MemoryUsed ................................................................................................................ 4652
Is X 64 ................................................................................................................ 4653
OpenCLSupport ................................................................................................................ 4654
Dis k Space ................................................................................................................ 4655
Language ................................................................................................................ 4656
Name ................................................................................................................ 4657
Company ................................................................................................................ 4658
Path ................................................................................................................ 4659
DataPath ................................................................................................................ 4660
CommonDataPath ................................................................................................................ 4661
InfoInteger................................................................................................................ 4662
InfoString ................................................................................................................ 4663
............................................................................................................................4664
Módulos de estratégias
Base para Expert Advisors
Classes ......................................................................................................................... 4667
CExpert Base ................................................................................................................ 4668
InitPhase ........................................................................................................... 4671
TrendType........................................................................................................... 4672
UsedSeries........................................................................................................... 4673
EveryTic k ........................................................................................................... 4674
Open ........................................................................................................... 4675
High ........................................................................................................... 4676
Low ........................................................................................................... 4677
Close ........................................................................................................... 4678
Spread ........................................................................................................... 4679
Time ........................................................................................................... 4680
Tic kV olume........................................................................................................... 4681
RealV olume........................................................................................................... 4682
Init ........................................................................................................... 4683
Symbol ........................................................................................................... 4684
Period ........................................................................................................... 4685
Magic ........................................................................................................... 4686
V alidationSettings
........................................................................................................... 4687
SetPriceSeries
........................................................................................................... 4688
SetOtherSeries
........................................................................................................... 4689
InitIndicators
........................................................................................................... 4690
InitOpen ........................................................................................................... 4691
Init High ........................................................................................................... 4692
InitLow ........................................................................................................... 4693

© 2000-2018, MetaQuotes Software Corp.


54 Conteúdo

InitClose ........................................................................................................... 4694


InitSpread ........................................................................................................... 4695
InitTime ........................................................................................................... 4696
InitTic kV olume
........................................................................................................... 4697
InitRealV olume
........................................................................................................... 4698
PriceLevelUnit
........................................................................................................... 4699
StartIndex........................................................................................................... 4700
CompareMagic ........................................................................................................... 4701
CExpert ................................................................................................................ 4702
Init ........................................................................................................... 4707
Magic ........................................................................................................... 4708
InitSignal ........................................................................................................... 4709
InitTrailing........................................................................................................... 4710
InitMoney ........................................................................................................... 4711
InitTrade ........................................................................................................... 4712
Deinit ........................................................................................................... 4713
OnTic k Process
........................................................................................................... 4714
OnTradeProcess
........................................................................................................... 4715
OnTimerProcess
........................................................................................................... 4716
OnChartEventProcess
........................................................................................................... 4717
OnBook EventProcess
........................................................................................................... 4718
MaxOrders........................................................................................................... 4719
Signal ........................................................................................................... 4720
V alidationSettings
........................................................................................................... 4721
InitIndicators
........................................................................................................... 4722
OnTic k ........................................................................................................... 4723
OnTrade ........................................................................................................... 4724
OnTimer ........................................................................................................... 4725
OnChartEvent ........................................................................................................... 4726
OnBook Event ........................................................................................................... 4727
InitParameters
........................................................................................................... 4728
DeinitTrade ........................................................................................................... 4729
DeinitSignal ........................................................................................................... 4730
DeinitTrailing
........................................................................................................... 4731
DeinitMoney ........................................................................................................... 4732
DeinitIndicators
........................................................................................................... 4733
Refresh ........................................................................................................... 4734
Processing........................................................................................................... 4735
SelectPosition
........................................................................................................... 4737
Chec k Open........................................................................................................... 4738
Chec k OpenLong
........................................................................................................... 4739
Chec k OpenShort
........................................................................................................... 4740
OpenLong ........................................................................................................... 4741
OpenShort ........................................................................................................... 4742
Chec k Reverse
........................................................................................................... 4743
Chec k ReverseLong
........................................................................................................... 4744
Chec k ReverseShort
........................................................................................................... 4745
ReverseLong ........................................................................................................... 4746
ReverseShort ........................................................................................................... 4747
Chec k Close........................................................................................................... 4748
Chec k CloseLong
........................................................................................................... 4749
Chec k CloseShort
........................................................................................................... 4750
CloseAll ........................................................................................................... 4751
Close ........................................................................................................... 4752
CloseLong ........................................................................................................... 4753
CloseShort ........................................................................................................... 4754
Chec k TrailingStop
........................................................................................................... 4755
Chec k TrailingStopLong
........................................................................................................... 4756

© 2000-2018, MetaQuotes Software Corp.


55 Conteúdo

Chec k TrailingStopShort
........................................................................................................... 4757
TrailingStopLong
........................................................................................................... 4758
TrailingStopShort
........................................................................................................... 4759
Chec k TrailingOrderLong
........................................................................................................... 4760
Chec k TrailingOrderShort
........................................................................................................... 4761
TrailingOrderLong
........................................................................................................... 4762
TrailingOrderShort
........................................................................................................... 4763
Chec k DeleteOrderLong
........................................................................................................... 4764
Chec k DeleteOrderShort
........................................................................................................... 4765
DeleteOrders........................................................................................................... 4766
DeleteOrder ........................................................................................................... 4767
DeleteOrderLong
........................................................................................................... 4768
DeleteOrderShort
........................................................................................................... 4769
LotOpenLong ........................................................................................................... 4770
LotOpenShort........................................................................................................... 4771
LotReverse........................................................................................................... 4772
PrepareHistoryDate
........................................................................................................... 4773
HistoryPoint........................................................................................................... 4774
Chec k TradeState
........................................................................................................... 4775
W aitEvent ........................................................................................................... 4776
NoW aitEvent........................................................................................................... 4777
TradeEventPositionStopTa ke
........................................................................................................... 4778
TradeEventOrderTriggered
........................................................................................................... 4779
TradeEventPositionOpened
........................................................................................................... 4780
TradeEventPosition V olumeChanged
........................................................................................................... 4781
TradeEventPositionModified
........................................................................................................... 4782
TradeEventPositionClosed
........................................................................................................... 4783
TradeEventOrderPlaced
........................................................................................................... 4784
TradeEventOrderModified
........................................................................................................... 4785
TradeEventOrderDeleted
........................................................................................................... 4786
TradeEventNotIdentified
........................................................................................................... 4787
TimeframeAdd........................................................................................................... 4788
Flags
Timeframes........................................................................................................... 4789
CExpertSignal
................................................................................................................ 4790
BasePrice ........................................................................................................... 4793
UsedSeries........................................................................................................... 4794
W eight ........................................................................................................... 4795
PatternsUsage
........................................................................................................... 4796
General ........................................................................................................... 4797
Ignore ........................................................................................................... 4798
Invert ........................................................................................................... 4799
ThresholdOpen
........................................................................................................... 4800
ThresholdClose
........................................................................................................... 4801
PriceLevel........................................................................................................... 4802
StopLevel ........................................................................................................... 4803
Tak eLevel ........................................................................................................... 4804
Expiration ........................................................................................................... 4805
Magic ........................................................................................................... 4806
V alidationSettings
........................................................................................................... 4807
InitIndicators
........................................................................................................... 4808
AddFilter ........................................................................................................... 4809
Chec k OpenLong
........................................................................................................... 4810
Chec k OpenShort
........................................................................................................... 4811
OpenLongParams
........................................................................................................... 4812
OpenShortParams
........................................................................................................... 4813
Chec k CloseLong
........................................................................................................... 4814
Chec k CloseShort
........................................................................................................... 4815
CloseLongParams
........................................................................................................... 4816

© 2000-2018, MetaQuotes Software Corp.


56 Conteúdo

CloseShortParams
........................................................................................................... 4817
Chec k ReverseLong
........................................................................................................... 4818
Chec k ReverseShort
........................................................................................................... 4819
Chec k TrailingOrderLong
........................................................................................................... 4820
Chec k TrailingOrderShort
........................................................................................................... 4821
LongCondition........................................................................................................... 4822
ShortCondition
........................................................................................................... 4823
Direction ........................................................................................................... 4824
CExpertTrailing
................................................................................................................ 4825
Chec k TrailingStopLong
........................................................................................................... 4827
Chec k TrailingStopShort
........................................................................................................... 4828
CExpertMoney ................................................................................................................ 4829
Percent ........................................................................................................... 4830
V alidationSettings
........................................................................................................... 4831
Chec k OpenLong
........................................................................................................... 4832
Chec k OpenShort
........................................................................................................... 4833
Chec k Reverse
........................................................................................................... 4834
Chec k Close........................................................................................................... 4835
Módulos.........................................................................................................................
de Sinais de Negociação 4836
Signals of the
................................................................................................................
Indicator Accelerator Oscillator 4839
Signals of the
................................................................................................................
Indicator Adaptive Moving Average 4842
Signals of the
................................................................................................................
Indicator Awesome Oscillator 4846
Signals of the Oscillator Bears Power
................................................................................................................ 4850
Signals of the Oscillator Bulls Power
................................................................................................................ 4852
Signals of the
................................................................................................................
Oscillator Commodity Channel Index 4854
Signals of the Oscillator DeMar k er
................................................................................................................ 4858
Signals of the
................................................................................................................
Indicator Double Exponential Moving Average 4862
Signals of the
................................................................................................................
Indicator Envelopes 4866
Signals of the Indicator Fractal Adaptive Moving Average
................................................................................................................ 4869
Signals of the Intraday Time Filter
................................................................................................................ 4873
Signals of the
................................................................................................................
Oscillator MACD 4875
Signals of the
................................................................................................................
Indicator Moving Average 4881
Signals of the
................................................................................................................
Indicator Parabolic SAR 4885
Signals of the
................................................................................................................
Oscillator Relative Strength Index 4887
Signals of the Oscillator Relative V igor Index
................................................................................................................ 4893
Signals of the
................................................................................................................
Oscillator Stochastic 4895
Signals of the
................................................................................................................
Oscillator Triple Exponential Average 4900
Signals of the
................................................................................................................
Indicator Triple Exponential Moving Average 4904
Signals of the Oscillator W illiams Percent Range
................................................................................................................ 4908
Classes .........................................................................................................................
de Trailing Stop 4911
CTrailing FixedPips
................................................................................................................ 4912
StopLevel ........................................................................................................... 4914
ProfitLevel........................................................................................................... 4915
V alidationSettings
........................................................................................................... 4916
Chec k TrailingStopLong
........................................................................................................... 4917
Chec k TrailingStopShort
........................................................................................................... 4918
CTrailingMA................................................................................................................ 4919
Period ........................................................................................................... 4921
Shift ........................................................................................................... 4922
Method ........................................................................................................... 4923
Applied ........................................................................................................... 4924
InitIndicators
........................................................................................................... 4925
V alidationSettings
........................................................................................................... 4926
Chec k TrailingStopLong
........................................................................................................... 4927
Chec k TrailingStopShort
........................................................................................................... 4928
CTrailingNone................................................................................................................ 4929
Chec k TrailingStopLong
........................................................................................................... 4930
Chec k TrailingStopShort
........................................................................................................... 4931

© 2000-2018, MetaQuotes Software Corp.


57 Conteúdo

CTrailingPSAR................................................................................................................ 4932
Step ........................................................................................................... 4934
Maximum ........................................................................................................... 4935
InitIndicators
........................................................................................................... 4936
Chec k TrailingStopLong
........................................................................................................... 4937
Chec k TrailingStopShort
........................................................................................................... 4938
de Gerenciamento de Dinheiro
Classes ......................................................................................................................... 4939
CMoney FixedLot
................................................................................................................ 4940
Lots ........................................................................................................... 4942
V alidationSettings
........................................................................................................... 4943
Chec k OpenLong
........................................................................................................... 4944
Chec k OpenShort
........................................................................................................... 4945
CMoney FixedMargin
................................................................................................................ 4946
Chec k OpenLong
........................................................................................................... 4947
Chec k OpenShort
........................................................................................................... 4948
CMoney FixedRis k
................................................................................................................ 4949
Chec k OpenLong
........................................................................................................... 4950
Chec k OpenShort
........................................................................................................... 4951
CMoneyNone ................................................................................................................ 4952
V alidationSettings
........................................................................................................... 4953
Chec k OpenLong
........................................................................................................... 4954
Chec k OpenShort
........................................................................................................... 4955
CMoneySizeOptimized
................................................................................................................ 4956
DecreaseFactor
........................................................................................................... 4958
V alidationSettings
........................................................................................................... 4959
Chec k OpenLong
........................................................................................................... 4960
Chec k OpenShort
........................................................................................................... 4961
Painéis e c............................................................................................................................4962
aixas de diálogo
CRect ......................................................................................................................... 4964
Left ................................................................................................................ 4965
Top ................................................................................................................ 4966
Right ................................................................................................................ 4967
Bottom ................................................................................................................ 4968
W idth ................................................................................................................ 4969
Height ................................................................................................................ 4970
Set Bound ................................................................................................................ 4971
Move ................................................................................................................ 4972
Shift ................................................................................................................ 4973
Contains ................................................................................................................ 4974
Format ................................................................................................................ 4975
CDateTime
......................................................................................................................... 4976
MonthName................................................................................................................ 4978
ShortMonthName................................................................................................................ 4979
DayName ................................................................................................................ 4980
ShortDayName ................................................................................................................ 4981
DaysInMonth ................................................................................................................ 4982
DateTime ................................................................................................................ 4983
Date ................................................................................................................ 4984
Time ................................................................................................................ 4985
Sec ................................................................................................................ 4986
Min ................................................................................................................ 4987
Hour ................................................................................................................ 4988
Day ................................................................................................................ 4989
Mon ................................................................................................................ 4990
Y ear ................................................................................................................ 4991
SecDec ................................................................................................................ 4992
SecInc ................................................................................................................ 4993
MinDec ................................................................................................................ 4994

© 2000-2018, MetaQuotes Software Corp.


58 Conteúdo

MinInc ................................................................................................................ 4995


HourDec ................................................................................................................ 4996
HourInc ................................................................................................................ 4997
DayDec ................................................................................................................ 4998
DayInc ................................................................................................................ 4999
MonDec ................................................................................................................ 5000
MonInc ................................................................................................................ 5001
Y earDec ................................................................................................................ 5002
Y earInc ................................................................................................................ 5003
C W nd ......................................................................................................................... 5004
Create ................................................................................................................ 5008
Destroy ................................................................................................................ 5009
OnEvent ................................................................................................................ 5010
OnMouseEvent................................................................................................................ 5011
Name ................................................................................................................ 5012
ControlsTotal
................................................................................................................ 5013
Control ................................................................................................................ 5014
ControlFind................................................................................................................ 5015
Rect ................................................................................................................ 5016
Left ................................................................................................................ 5017
Top ................................................................................................................ 5018
Right ................................................................................................................ 5019
Bottom ................................................................................................................ 5020
W idth ................................................................................................................ 5021
Height ................................................................................................................ 5022
Move ................................................................................................................ 5023
Shift ................................................................................................................ 5024
Resize ................................................................................................................ 5025
Contains ................................................................................................................ 5026
Alignment ................................................................................................................ 5027
Align ................................................................................................................ 5028
Id ................................................................................................................ 5029
IsEnabled ................................................................................................................ 5030
Enable ................................................................................................................ 5031
Disable ................................................................................................................ 5032
Is V isible ................................................................................................................ 5033
V isible ................................................................................................................ 5034
Show ................................................................................................................ 5035
Hide ................................................................................................................ 5036
IsActive ................................................................................................................ 5037
Activate ................................................................................................................ 5038
Deactivate................................................................................................................ 5039
StateFlags ................................................................................................................ 5040
StateFlagsSet
................................................................................................................ 5041
StateFlagsReset
................................................................................................................ 5042
PropFlags ................................................................................................................ 5043
PropFlagsSet................................................................................................................ 5044
PropFlagsReset
................................................................................................................ 5045
MouseX ................................................................................................................ 5046
MouseY ................................................................................................................ 5047
MouseFlags................................................................................................................ 5048
MouseFocus................................................................................................................
Kill 5049
OnCreate ................................................................................................................ 5050
OnDestroy ................................................................................................................ 5051
OnMove ................................................................................................................ 5052
OnResize ................................................................................................................ 5053
OnEnable ................................................................................................................ 5054
OnDisable ................................................................................................................ 5055

© 2000-2018, MetaQuotes Software Corp.


59 Conteúdo

OnShow ................................................................................................................ 5056


OnHide ................................................................................................................ 5057
OnActivate................................................................................................................ 5058
OnDeactivate ................................................................................................................ 5059
OnClic k ................................................................................................................ 5060
OnChange ................................................................................................................ 5061
OnMouseDown ................................................................................................................ 5062
OnMouseUp................................................................................................................ 5063
OnDragStart ................................................................................................................ 5064
OnDragProcess................................................................................................................ 5065
OnDragEnd................................................................................................................ 5066
DragObjectCreate
................................................................................................................ 5067
DragObjectDestroy
................................................................................................................ 5068
C W ndObj
......................................................................................................................... 5069
OnEvent ................................................................................................................ 5071
Text ................................................................................................................ 5072
Color ................................................................................................................ 5073
Color Bac k ground
................................................................................................................ 5074
Color Border................................................................................................................ 5075
Font ................................................................................................................ 5076
FontSize ................................................................................................................ 5077
ZOrder ................................................................................................................ 5078
OnObjectCreate
................................................................................................................ 5079
OnObjectChange
................................................................................................................ 5080
OnObjectDelete
................................................................................................................ 5081
OnObjectDrag ................................................................................................................ 5082
OnSetText ................................................................................................................ 5083
OnSetColor................................................................................................................ 5084
Bac k ground
OnSetColor................................................................................................................ 5085
OnSet Font ................................................................................................................ 5086
OnSet FontSize
................................................................................................................ 5087
OnSet ZOrder ................................................................................................................ 5088
OnDestroy ................................................................................................................ 5089
OnChange ................................................................................................................ 5090
C W ndContainer
......................................................................................................................... 5091
Destroy ................................................................................................................ 5093
OnEvent ................................................................................................................ 5094
OnMouseEvent ................................................................................................................ 5095
ControlsTotal................................................................................................................ 5096
Control ................................................................................................................ 5097
ControlFind................................................................................................................ 5098
Add ................................................................................................................ 5099
Delete ................................................................................................................ 5100
Move ................................................................................................................ 5101
Shift ................................................................................................................ 5102
Id ................................................................................................................ 5103
Enable ................................................................................................................ 5104
Disable ................................................................................................................ 5105
Show ................................................................................................................ 5106
Hide ................................................................................................................ 5107
MouseFocus................................................................................................................
Kill 5108
Save ................................................................................................................ 5109
Load ................................................................................................................ 5110
OnResize ................................................................................................................ 5111
OnActivate................................................................................................................ 5112
OnDeactivate ................................................................................................................ 5113
CLabel ......................................................................................................................... 5114
Create ................................................................................................................ 5119

© 2000-2018, MetaQuotes Software Corp.


60 Conteúdo

OnSetText ................................................................................................................ 5120


OnSetColor................................................................................................................ 5121
OnSet Font ................................................................................................................ 5122
OnSet FontSize
................................................................................................................ 5123
OnCreate ................................................................................................................ 5124
OnShow ................................................................................................................ 5125
OnHide ................................................................................................................ 5126
OnMove ................................................................................................................ 5127
C BmpButton
......................................................................................................................... 5128
Create ................................................................................................................ 5135
Border ................................................................................................................ 5136
BmpNames ................................................................................................................ 5137
BmpOffName ................................................................................................................ 5138
BmpOnName ................................................................................................................ 5139
BmpPassiveName
................................................................................................................ 5140
BmpActiveName................................................................................................................ 5141
Pressed ................................................................................................................ 5142
Loc k ing ................................................................................................................ 5143
OnSet ZOrder ................................................................................................................ 5144
OnCreate ................................................................................................................ 5145
OnShow ................................................................................................................ 5146
OnHide ................................................................................................................ 5147
OnMove ................................................................................................................ 5148
OnChange ................................................................................................................ 5149
OnActivate................................................................................................................ 5150
OnDeactivate ................................................................................................................ 5151
OnMouseDown ................................................................................................................ 5152
OnMouseUp................................................................................................................ 5153
C Button......................................................................................................................... 5154
Create ................................................................................................................ 5161
Pressed ................................................................................................................ 5162
Loc k ing ................................................................................................................ 5163
OnSetText ................................................................................................................ 5164
OnSetColor................................................................................................................ 5165
Bac k ground
OnSetColor................................................................................................................ 5166
Border
OnSetColor................................................................................................................ 5167
OnSet Font ................................................................................................................ 5168
OnSet FontSize
................................................................................................................ 5169
OnCreate ................................................................................................................ 5170
OnShow ................................................................................................................ 5171
OnHide ................................................................................................................ 5172
OnMove ................................................................................................................ 5173
OnResize ................................................................................................................ 5174
OnMouseDown ................................................................................................................ 5175
OnMouseUp................................................................................................................ 5176
CEdit ......................................................................................................................... 5177
Create ................................................................................................................ 5182
ReadOnly ................................................................................................................ 5183
TextAlign ................................................................................................................ 5184
OnObjectEndEdit
................................................................................................................ 5185
OnSetText ................................................................................................................ 5186
OnSetColor................................................................................................................ 5187
Bac k ground
OnSetColor................................................................................................................ 5188
Border
OnSetColor................................................................................................................ 5189
OnSet Font ................................................................................................................ 5190
OnSet FontSize
................................................................................................................ 5191
OnSet ZOrder ................................................................................................................ 5192
OnCreate ................................................................................................................ 5193

© 2000-2018, MetaQuotes Software Corp.


61 Conteúdo

OnShow ................................................................................................................ 5194


OnHide ................................................................................................................ 5195
OnMove ................................................................................................................ 5196
OnResize ................................................................................................................ 5197
OnChange ................................................................................................................ 5198
OnClic k ................................................................................................................ 5199
CPanel ......................................................................................................................... 5200
Create ................................................................................................................ 5205
BorderType................................................................................................................ 5206
OnSetText ................................................................................................................ 5207
Bac k ground
OnSetColor................................................................................................................ 5208
Border
OnSetColor................................................................................................................ 5209
OnCreate ................................................................................................................ 5210
OnShow ................................................................................................................ 5211
OnHide ................................................................................................................ 5212
OnMove ................................................................................................................ 5213
OnResize ................................................................................................................ 5214
OnChange ................................................................................................................ 5215
CPicture......................................................................................................................... 5216
Create ................................................................................................................ 5221
Border ................................................................................................................ 5222
BmpName ................................................................................................................ 5223
OnCreate ................................................................................................................ 5224
OnShow ................................................................................................................ 5225
OnHide ................................................................................................................ 5226
OnMove ................................................................................................................ 5227
OnChange ................................................................................................................ 5228
CScroll ......................................................................................................................... 5229
Create ................................................................................................................ 5231
OnEvent ................................................................................................................ 5232
MinPos ................................................................................................................ 5233
MaxPos ................................................................................................................ 5234
CurrPos ................................................................................................................ 5235
CreateBac k................................................................................................................ 5236
CreateInc ................................................................................................................ 5237
CreateDec ................................................................................................................ 5238
CreateThumb ................................................................................................................ 5239
OnClic k Inc ................................................................................................................ 5240
OnClic k Dec................................................................................................................ 5241
OnShow ................................................................................................................ 5242
OnHide ................................................................................................................ 5243
OnChangePos ................................................................................................................ 5244
OnThumbDragStart
................................................................................................................ 5245
OnThumbDragProcess
................................................................................................................ 5246
OnThumbDragEnd................................................................................................................ 5247
CalcPos ................................................................................................................ 5248
CScrollV......................................................................................................................... 5249
CreateInc ................................................................................................................ 5255
CreateDec ................................................................................................................ 5256
CreateThumb ................................................................................................................ 5257
OnResize ................................................................................................................ 5258
OnChangePos ................................................................................................................ 5259
OnThumbDragStart
................................................................................................................ 5260
OnThumbDragProcess
................................................................................................................ 5261
OnThumbDragEnd................................................................................................................ 5262
CalcPos ................................................................................................................ 5263
CScrollH......................................................................................................................... 5264
CreateInc ................................................................................................................ 5270

© 2000-2018, MetaQuotes Software Corp.


62 Conteúdo

CreateDec ................................................................................................................ 5271


CreateThumb ................................................................................................................ 5272
OnResize ................................................................................................................ 5273
OnChangePos ................................................................................................................ 5274
OnThumbDragStart
................................................................................................................ 5275
OnThumbDragProcess
................................................................................................................ 5276
OnThumbDragEnd................................................................................................................ 5277
CalcPos ................................................................................................................ 5278
C W ndClient
......................................................................................................................... 5279
Create ................................................................................................................ 5282
OnEvent ................................................................................................................ 5283
Color Bac k ground
................................................................................................................ 5284
Color Border................................................................................................................ 5285
BorderType................................................................................................................ 5286
V Scrolled ................................................................................................................ 5287
HScrolled ................................................................................................................ 5288
CreateBac k................................................................................................................ 5289
CreateScroll V
................................................................................................................ 5290
CreateScroll H
................................................................................................................ 5291
OnResize ................................................................................................................ 5292
OnV ScrollShow................................................................................................................ 5293
OnV ScrollHide................................................................................................................ 5294
OnHScrollShow ................................................................................................................ 5295
OnHScrollHide ................................................................................................................ 5296
OnScrollLineDown
................................................................................................................ 5297
OnScrollLineUp................................................................................................................ 5298
OnScrollLineLeft
................................................................................................................ 5299
OnScrollLineRight
................................................................................................................ 5300
Rebound ................................................................................................................ 5301
CList V iew
......................................................................................................................... 5302
Create ................................................................................................................ 5308
OnEvent ................................................................................................................ 5309
TotalV iew ................................................................................................................ 5310
AddItem ................................................................................................................ 5311
Select ................................................................................................................ 5312
Select ByText ................................................................................................................ 5313
Select By V alue
................................................................................................................ 5314
V alue ................................................................................................................ 5315
CreateRow................................................................................................................ 5316
OnResize ................................................................................................................ 5317
OnV ScrollShow................................................................................................................ 5318
OnV ScrollHide................................................................................................................ 5319
OnScrollLineDown
................................................................................................................ 5320
OnScrollLineUp................................................................................................................ 5321
k
OnItemClic................................................................................................................ 5322
Redraw ................................................................................................................ 5323
RowState ................................................................................................................ 5324
Chec kV iew................................................................................................................ 5325
Box
CCombo......................................................................................................................... 5326
Create ................................................................................................................ 5332
OnEvent ................................................................................................................ 5333
AddItem ................................................................................................................ 5334
List V iewItems
................................................................................................................ 5335
Select ................................................................................................................ 5336
Select ByText ................................................................................................................ 5337
Select By V alue
................................................................................................................ 5338
V alue ................................................................................................................ 5339
CreateEdit................................................................................................................ 5340

© 2000-2018, MetaQuotes Software Corp.


63 Conteúdo

CreateButton ................................................................................................................ 5341


CreateList ................................................................................................................ 5342
OnClic k Edit................................................................................................................ 5343
OnClic kButton................................................................................................................ 5344
OnChangeList ................................................................................................................ 5345
ListShow ................................................................................................................ 5346
List Hide ................................................................................................................ 5347
CChec kB.........................................................................................................................
ox 5348
Create ................................................................................................................ 5354
OnEvent ................................................................................................................ 5355
Text ................................................................................................................ 5356
Color ................................................................................................................ 5357
Chec k ed ................................................................................................................ 5358
V alue ................................................................................................................ 5359
CreateButton ................................................................................................................ 5360
CreateLabel ................................................................................................................ 5361
OnClic kButton................................................................................................................ 5362
OnClic k Label................................................................................................................ 5363
CChec kG.........................................................................................................................
roup 5364
Create ................................................................................................................ 5370
OnEvent ................................................................................................................ 5371
AddItem ................................................................................................................ 5372
V alue ................................................................................................................ 5373
CreateButton ................................................................................................................ 5374
OnV ScrollShow................................................................................................................ 5375
OnV ScrollHide................................................................................................................ 5376
OnScrollLineDown
................................................................................................................ 5377
OnScrollLineUp................................................................................................................ 5378
OnChangeItem ................................................................................................................ 5379
Redraw ................................................................................................................ 5380
RowState ................................................................................................................ 5381
CRadioB.........................................................................................................................
utton 5382
Create ................................................................................................................ 5384
OnEvent ................................................................................................................ 5385
Text ................................................................................................................ 5386
Color ................................................................................................................ 5387
State ................................................................................................................ 5388
CreateButton ................................................................................................................ 5389
CreateLabel ................................................................................................................ 5390
OnClic kButton................................................................................................................ 5391
OnClic k Label................................................................................................................ 5392
CRadioG.........................................................................................................................
roup 5393
Create ................................................................................................................ 5399
OnEvent ................................................................................................................ 5400
AddItem ................................................................................................................ 5401
V alue ................................................................................................................ 5402
CreateButton ................................................................................................................ 5403
OnV ScrollShow................................................................................................................ 5404
OnV ScrollHide................................................................................................................ 5405
OnScrollLineDown
................................................................................................................ 5406
OnScrollLineUp................................................................................................................ 5407
OnChangeItem ................................................................................................................ 5408
Redraw ................................................................................................................ 5409
RowState ................................................................................................................ 5410
Select ................................................................................................................ 5411
CSpinEdit
......................................................................................................................... 5412
Create ................................................................................................................ 5417
OnEvent ................................................................................................................ 5418

© 2000-2018, MetaQuotes Software Corp.


64 Conteúdo

MinV alue ................................................................................................................ 5419


Max V alue ................................................................................................................ 5420
V alue ................................................................................................................ 5421
CreateEdit................................................................................................................ 5422
CreateInc ................................................................................................................ 5423
CreateDec ................................................................................................................ 5424
OnClic k Inc ................................................................................................................ 5425
OnClic k Dec................................................................................................................ 5426
OnChangeV................................................................................................................
alue 5427
CDialog ......................................................................................................................... 5428
Create ................................................................................................................ 5431
OnEvent ................................................................................................................ 5432
Caption ................................................................................................................ 5433
Add ................................................................................................................ 5434
CreateW hite Border
................................................................................................................ 5435
CreateBac k................................................................................................................
ground 5436
CreateCaption ................................................................................................................ 5437
CreateButtonClose
................................................................................................................ 5438
CreateClientArea
................................................................................................................ 5439
OnClic k Caption
................................................................................................................ 5440
OnClic kButtonClose
................................................................................................................ 5441
ClientAreaV................................................................................................................
isible 5442
ClientAreaLeft................................................................................................................ 5443
ClientAreaTop ................................................................................................................ 5444
ClientAreaRight
................................................................................................................ 5445
ClientAreaB................................................................................................................
ottom 5446
ClientAreaW ................................................................................................................
idth 5447
ClientAreaH................................................................................................................
eight 5448
OnDialogDragStart
................................................................................................................ 5449
OnDialogDragProcess
................................................................................................................ 5450
OnDialogDragEnd
................................................................................................................ 5451
CAppDialog
......................................................................................................................... 5452
Create ................................................................................................................ 5455
Destroy ................................................................................................................ 5456
OnEvent ................................................................................................................ 5457
Run ................................................................................................................ 5458
ChartEvent................................................................................................................ 5459
Minimized ................................................................................................................ 5460
IniFileSave ................................................................................................................ 5461
IniFileLoad................................................................................................................ 5462
IniFileName................................................................................................................ 5463
IniFileExt ................................................................................................................ 5464
CreateCommon ................................................................................................................ 5465
CreateExpert ................................................................................................................ 5466
CreateIndicator
................................................................................................................ 5467
CreateButtonMinMax
................................................................................................................ 5468
OnClic kButtonClose
................................................................................................................ 5469
OnClic kButtonMinMax
................................................................................................................ 5470
OnAnotherApplicationClose
................................................................................................................ 5471
Rebound ................................................................................................................ 5472
Minimize ................................................................................................................ 5473
Maximize ................................................................................................................ 5474
CreateInstanceId
................................................................................................................ 5475
ProgramName ................................................................................................................ 5476
SubwinOff ................................................................................................................ 5477
28 Migrando do .................................................................................................
MQL4 5478
29 List of MQL5 .................................................................................................
Functions 5482

© 2000-2018, MetaQuotes Software Corp.


65 Conteúdo

30 List of MQL5 .................................................................................................


Constants 5509

© 2000-2018, MetaQuotes Software Corp.


66

Referência MQL5
A linguagem MetaQuotes 5 (MQL5) é uma linguagem incorporada para programação de estratégias de
negociação. Este linguagem é desenvolvida pela MetaQuotes Software Corp. baseada em sua longa
experiência na criação de plataformas de negociação online. Usando esta linguagem, você pode criar
seus próprios Expert Advisors que fazem gerenciamento automático de negociação e são
perfeitamente adequados para implementar suas estratégias de negociação. Além disso, usando MQL5
você pode criar seus próprios indicadores técnicos (indicadores customizados), scripts (códigos
avulsos) e bibliotecas (libraries).

O MQL5 contém um grande número de funções necessárias para analisar as cotações corrente e
previamente recebidas, e tem indicadores básicos embutidos e funções para gerenciar posições de
negociação (trade) e controlá-las. O MetaEditor 5 (editor de texto), que destaca diferentes
construtores da linguagem MQL5, é usado para escrever o código do programa. Ele ajuda usuários a se
orientarem no texto do sistema especiado com bastante facilidade.

Um breve guia contém funções, operações, palavras reservadas, e outras construções de linguagem
divididas em categorias, e permite encontrar a descrição de todos os elemento usados na linguagem.

Programas escritos na linguagem MetaQuotes 5 têm diferentes características e propósitos :


· Expert Advisor é um sistema de negociação mecânico associado a um certo gráfico. Um Expert
Advisor começa a rodar quando um evento que pode ser manipulado por ele ocorre: eventos de
inicialização e desinicialização, evento de recepção de novo preço (tick ), um evento de timer,
evento de mudança na Profundidade do Mercado, evento de gráfico e eventos customizados.
Um Expert Advisor pode tanto informar sobre uma possibilidade de negociação quanto
automaticamente negociar sob uma conta enviando ordens diretamente ao servidor de negociação.
Expert Advisors são armazenados em terminal_directory\MQL5\Experts.
· Indicador customizado é um indicador técnico escrito de forma independente, em acréscimo aos já
integrados ao terminal cliente. Como os indicadores embutidos, eles não podem negociar
automaticamente e são destinados a implementação de funções analíticas somente.
Indicadores customizados são armazenados em terminal_directory\MQL5\Indicators
· Script (Código avulso) é um programa destinado a uma única execução de algumas ações.
Diferentemente de Expert Advisors, scripts não processam quaisquer ações, exceto o evento start
(isso requer que a função de manipulação OnStart() esteja presente no script). Scripts são
armazenados em terminal_directory\MQL5\Scripts
· Library (Biblioteca) é um conjunto de funções customizadas destinado a armazenar e distribuir
blocos de programas customizados usados frequentemente. Bibliotecas (libraries) não podem
começar uma execução por si mesmas.
Bibliotecas são armazenadas em terminal_directory\MQL5\Libraries
· Arquivo incluído é um texto fonte com blocos de programas customizados utilizados com mais
freqüência. T ais arquivos podem ser incluídos nos textos fonte de Expert Advisors, scripts,
indicadores customizados, e bibliotecas (libraries) na etapa de compilação. O uso de arquivos
incluídos é mais preferível ao o uso de bibliotecas (libraries) por causa da custo adicional que ocorre
na chamada de funções de biblioteca (library).
Include files podem ser armazenados no mesmo diretório do arquivo fonte - neste caso a diretiva
#include com aspas duplas é usado. Um outro lugar para armazenar include files é
terminal_directory\MQL5\Include, neste caso a diretiva #include é usado entre colchetes.

© 2000-2018, MetaQuotes Software Corp.


67

© 2000-2018, MetaQuotes Software Corp.

© 2000-2018, MetaQuotes Software Corp.


68 Elementos Básicos da Linguagem

Elementos Básicos da Linguagem


A Linguagem MetaQuotes 5 (MQL5) é uma linguagem orientado a objetos de alto nível destinado para
escrever estratégias de negociação automatizadas, e indicadores técnicos customizados para a a
análise de vários mercados financeiros. Ele permite não somente escrever uma variedade de sistemas
especialistas, concebidos para operar em tempo real, mas também criar suas próprias ferramentas
gráficas para ajudar você a tomar decisões de negociação (trade).

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
· Operações e Expressões

· Operadores

· Funções
· Variáveis
· Preprocessador
· Programação Orientada a Objetos

© 2000-2018, MetaQuotes Software Corp.


69 Elementos Básicos da Linguagem

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 :

· ausência de aritmética com endereço

· ausência do operador goto

· um enumerador anônimo não pode ser declarado

· ausência de herança múltipla

Também Veja
Enumeradores, Estruturas e Classes, H erança

© 2000-2018, MetaQuotes Software Corp.


70 Elementos Básicos da Linguagem

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
*/

© 2000-2018, MetaQuotes Software Corp.


71 Elementos Básicos da Linguagem

Identificadores
Identificadores são usados como nomes de variáveis e funções. O comprimento de um identificador
não pode exceder 63 caracteres.

Caracteres permitidos na formação de um identificador: números 0-9, as letras maiúsculas e


minúsculas latinas a-z e A-Z, reconhecidos como caracteres diferentes, o caractere sublinhado (_). O
primeiro caractere não pode ser um dígito.

O identificador não deve coincidir com uma palavra reservada.

Exemplos:
NAME1 namel Total_5 Paper

Também Veja
Variáveis, Funções

© 2000-2018, MetaQuotes Software Corp.


72 Elementos Básicos da Linguagem

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

bool enum struct

char float uchar

class int uint

color long ulong

datetime s hort us hort

double string void

Especificadores de Acesso

const private protected

public virtual

Classes de Memória

extern input static

Operadores

break dynamic_cast return

case else sizeof

continue for switch

default if while

delete new

do operator

Outros

false #define #property


this #import template

© 2000-2018, MetaQuotes Software Corp.


73 Elementos Básicos da Linguagem

true #include typename

© 2000-2018, MetaQuotes Software Corp.


74 Elementos Básicos da Linguagem

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.

Os tipos básicos de dado são:

· inteiros (char, s hort, int, long, uchar, us hort, uint, ulong);

· lógico (bool);

· literais (us hort);

· strings (string);

· números com ponto flutuante (double, float);

· cor (color);

· data e hora(datetime);

· enumeradores (enum).

Os tipos complexos de dado são:

· 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)

© 2000-2018, MetaQuotes Software Corp.


75 Elementos Básicos da Linguagem

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.

Tipo Tamanho em Valor Mínimo Valor Máximo C++ Análogo


Bytes
char 1 -128 127 char

uchar 1 0 255 unsigned char,


BYT E
bool 1 0(false) 1(true) bool

s hort 2 -32 768 32 767 s hort, wchar_t

us hort 2 0 65 535 unsigned s hort,


W ORD
int 4 - 2 147 483 648 2 147 483 647 int

uint 4 0 4 294 967 295 unsigned int,


DW ORD
color 4 -1 16 777 215 int, COLORR EF

long 8 -9 223 372 036 9 223 372 036 __int64


854 775 808 854 775 807
ulong 8 0 18 446 744 073 unsigned __int64
709 551 615
datetime 8 0 (1970.01.01 32 535 244 799 __time64_t
0:00:00) (3000.12.31
23:59:59)

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

© 2000-2018, MetaQuotes Software Corp.


76 Elementos Básicos da Linguagem

Tipos char, short, int e long


char
O tipo char usa 1 byte de memória (8 bits) e permite expressar em notação binária 2^8=256 valores. O
tipo char pode conter tanto valores positivos quanto negativos. A faixa de valores é de -128 a 127.

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;

© 2000-2018, MetaQuotes Software Corp.


77 Elementos Básicos da Linguagem

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:

//--- Loop infinito


void OnStart()
{
uchar u_ch;

for(char ch=-128;ch<128;ch++)
{
u_ch=ch;
Print("ch = ",ch," u_ch = ",u_ch);
}
}

A variante correta é:

//--- Variante correta


void OnStart()
{
uchar u_ch;

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

© 2000-2018, MetaQuotes Software Corp.


78 Elementos Básicos da Linguagem

ch= -111 u_ch= 145


...

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++)

© 2000-2018, MetaQuotes Software Corp.


79 Elementos Básicos da Linguagem

{
//--- 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)

© 2000-2018, MetaQuotes Software Corp.


80 Elementos Básicos da Linguagem

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 us hort. 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:

Nome do Caractere Código Mnemônico Anotação em MQL5 Valor Numérico


ou imagem
linha nova (line feed) LF '\n' 10
tab horizontal HT '\t' 9
retorno de carro CR '\r' 13
barra invertida \ '\\' 92
aspas simples ' '\'' 39
aspas duplas " '\"' 34
código hexadecimal hhhh '\x hhhh' 1 a 4 caracteres
hexadecimais

© 2000-2018, MetaQuotes Software Corp.


81 Elementos Básicos da Linguagem

código decimal d '\d' número decimal de 0


a 65535

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);
}

© 2000-2018, MetaQuotes Software Corp.


82 Elementos Básicos da Linguagem

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);
}

A representação internal de um literal de caractere é do tipo us hort. Constantes de caracteres podem


aceitar valores de 0 a 65535.

© 2000-2018, MetaQuotes Software Corp.


83 Elementos Básicos da Linguagem

Também Veja
StringSetCharacter(), String GetCharacter(), S hortT oString(), S hortArrayT oString(),
String T oS hortArray()

© 2000-2018, MetaQuotes Software Corp.


84 Elementos Básicos da Linguagem

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

© 2000-2018, MetaQuotes Software Corp.


85 Elementos Básicos da Linguagem

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.

A representação dos valores inteiros é escrito na forma de um número hexadecimal ou decimal. Um


número hexadecimal tem a forma 0x 00BBGGRR , onde RR é a taxa do componente da cor vermelha
(R ed), GG - da cor verde (Green), e BB - da cor azul (Blue). As constantes decimais não são
diretamente refletidos no RGB. Eles representam um valor decimal da representação hexadecimal de
inteiros.

Cores específicas refletem o chamado conjunto de W eb-colors.

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)

© 2000-2018, MetaQuotes Software Corp.


86 Elementos Básicos da Linguagem

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");

if(d) Print("d = ",d," e tem o valor true");


else Print("d = ",d," e tem o 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");

//--- Resultados da execução


// i= 5 e tem o valor true
// d= -2.5 e tem o valor true
// i= 0 e tem o valor false
// d= 0 e tem o valor false

Também Veja
Operações Booleanas, R egras de Precedência

© 2000-2018, MetaQuotes Software Corp.


87 Elementos Básicos da Linguagem

Enumeradores
Dados do tipo enum pertencem a um determinado conjunto limitado de dados. Definindo o tipo
enumerador:

enum nome do tipo enumerável


{
  lista de valores
};

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
};

© 2000-2018, MetaQuotes Software Corp.


88 Elementos Básicos da Linguagem

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)

© 2000-2018, MetaQuotes Software Corp.


89 Elementos Básicos da Linguagem

Tipos Reais (double, float)


T ipos Reais (ou tipos de ponto flutuante) representam valores com um parte fracionária. Na linguagem
MQL5 existem dois tipos para números de ponto flutuante. O método de representação dos números
reais na memória do computador é definido pelo padrão IEEE 754 e é independente de plataformas,
sistemas operacionais ou linguagens de programação.

Tipo Tamanho em Valor Positivo Valor Máximo C++ Análogo


bytes Mínimo
float 4 1.175494351e-38 3.402823466e+3 float
8
double 8 2.225073858507 1.797693134862 double
2014e-308 3158e+308

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.

© 2000-2018, MetaQuotes Software Corp.


90 Elementos Básicos da Linguagem

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
}

© 2000-2018, MetaQuotes Software Corp.


91 Elementos Básicos da Linguagem

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 +
FLT_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;
};

© 2000-2018, MetaQuotes Software Corp.


92 Elementos Básicos da Linguagem

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);
//---

© 2000-2018, MetaQuotes Software Corp.


93 Elementos Básicos da Linguagem

s2.l=0x7FEFFFFFFFFFFFFF; // Maior número normalizado (MAX_DBL)


s1=s2;
printf("11. %.16e %I64X",s1.d,s2.l);
//---
s2.l=0x0010000000000000; // Menor normalizado positivo (MIN_DBL)
s1=s2;
printf("12. %.16e %.16I64X",s1.d,s2.l);
//---
s1.d=0.7; // Mostra que o número 0.7 é uma fração sem fim
s2=s1;
printf("13. %.16e %.16I64X",s1.d,s2.l);
/*
1. -1.#IND00 FFF8000000000000
2. -1.#QNAN0 FFFF000000000000
3. 1.#SNAN0 7FF7000000000000
4. 1.#QNAN0 7FF8000000000000
5. 1.#QNAN0 7FFF000000000000
6. 1.#INF00 7FF0000000000000
7. -1.#INF00 FFF0000000000000
8. -0.000000 8000000000000000
9. 0.500000 3FE0000000000000
10. 1.000000 3FF0000000000000
11. 1.7976931348623157e+308 7FEFFFFFFFFFFFFF
12. 2.2250738585072014e-308 0010000000000000
13. 6.9999999999999996e-001 3FE6666666666666
*/

Também Veja
DoubleT oString, NormalizeDouble, Constantes de T ipos Numéricos

© 2000-2018, MetaQuotes Software Corp.


94 Elementos Básicos da Linguagem

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 : "This 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:

//--- Declare uma longa string constante


string HTML_head="<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\""
" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n"
"<html xmlns=\"http://www.w3.org/1999/xhtml\">\n"
"<head>\n"
"<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n"
"<title>Trade Operations Report</title>\n"
"</head>";
//---Saída da string constante no log
Print(HTML_head);
}

Também Veja
Funções de Conversão, Funções de String, FileOpen, FileReadString, FileW riteString

© 2000-2018, MetaQuotes Software Corp.


95 Elementos Básicos da Linguagem

Estruturas, Classes e Interfaces


Estruturas
Uma estrutura é um conjunto de elementos de qualquer tipo (exceto o tipo void). Portanto, a estrutura
combina dados logicamente relacionados de diferentes tipos.

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

© 2000-2018, MetaQuotes Software Corp.


96 Elementos Básicos da Linguagem

As estruturas contendo cadeias de caracteres, objetos de classe, ponteiros e objetos de matrizes


dinâmicas são chamadas de estruturas simples. As variáveis ​de estruturas simples e suas matrizes
podem ser transferidas ​como parâmetros para as funções importadas a partir de DLL.

Copiar e colar estruturas simples é permitido apenas em dois casos :

· se os objetos pertencem ao mesmo tipo de estrutura

· 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:

//--- copiar estruturas simples de diferentes tipos é restrito


my_tick1=last_tick; // aqui o compilador gerará um erro

//--- combinar estruturas de diferente tipo também é restrito


my_tick1=(CustomMqlTick)last_tick;// aqui o compilador gerará um erro

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
};

© 2000-2018, MetaQuotes Software Corp.


97 Elementos Básicos da Linguagem

//--- obtemos os valores do último ticks


MqlTick last_tick;
CustomMqlTick my_tick1,my_tick2;
//--- tentamos colar e copiar os dados a partir do MqlTick no CustomMqlTick
if(SymbolInfoTick(Symbol(),last_tick))
{
//--- copiar e colar estruturas simples não aparentadas é restrito
//1. my_tick1=last_tick; // aqui o compilador gerará um erro

//--- combinar estruturas não aparentadas também é restrito


//2. my_tick1=(CustomMqlTick)last_tick;// aqui o compilador gerará um erro

//--- 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;

//--- 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;
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 descrever cães


struct Dog: Animal
{
bool hunting; // raça de caça

© 2000-2018, MetaQuotes Software Corp.


98 Elementos Básicos da Linguagem

};
//--- 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

Código completo de exemplo:

//--- estrutura básica para descrever animais


struct Animal
{
int head; // número de cabeças
int legs; // número de patas
int wings; // número de assas
bool tail; // presença de cauda
bool fly; // voa
bool swim; // nada
bool run; // corre
};
//--- estrutura para descrever cães
struct Dog: Animal
{
bool hunting; // raça de caça
};
//--- estrutura para descrição de gatos
struct Cat: Animal
{
bool home; // raça domestica
};
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- criamos um objeto do tipo básico Animal e descrevemo-lo
Animal some_animal;
some_animal.head=1;
some_animal.legs=4;
some_animal.wings=0;
some_animal.tail=true;

© 2000-2018, MetaQuotes Software Corp.


99 Elementos Básicos da Linguagem

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.

Acesso a Membros de Estrutura


A estrutura é um novo tipo de dados permitindo declarar variáveis deste tipo. A estrutura pode ser
declarado somente um vez dentro de um projeto. Os membros de estrutura são acessados usando a
operação ponto (.).

© 2000-2018, MetaQuotes Software Corp.


100 Elementos Básicos da Linguagem

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;

Modificador final
A presença do modificador 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 modificador final. Além disso, todos os membros da
estrutura também serão implicitamente considerados como final.

struct settings final


{
//--- corpo da estrutura
};

struct trade_settings : public settings


{
//--- corpo da estrutura
};

Como no exemplo acima, ao tentar herdar a partir da estrutura, usando o modificador final, o
compilador irá emitir um erro:

cannot inherit from 'settings' as it has been declared as 'final'


see declaration of 'settings'

Classes
As classes diferem das estruturas no seguinte:

· a palavra-chave class é usado na declaração;

· 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.

© 2000-2018, MetaQuotes Software Corp.


101 Elementos Básicos da Linguagem

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.

Um construtor sem parâmetros é chamado um construtor default. Se nenhum construtor for


declarado em uma classe, o compilador cria um construtor default durante a compilação.

//+------------------------------------------------------------------+
//| 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);
};

© 2000-2018, MetaQuotes Software Corp.


102 Elementos Básicos da Linguagem

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
{

© 2000-2018, MetaQuotes Software Corp.


103 Elementos Básicos da Linguagem

datetime m_call_time; // Hora da última chamada ao objeto


public:
//--- Um construtor com um parâmetro que tem um valor default não é um construtor default
CFoo(const datetime t=0){m_call_time=t;};
//--- Um construtor copiador
CFoo(const CFoo &foo){m_call_time=foo.m_call_time;};

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
}

Se você descomentar estas strings

  //CFoo foo_array[3]; // Esta variante não pode ser usada - um construtor default não está def

© 2000-2018, MetaQuotes Software Corp.


104 Elementos Básicos da Linguagem

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 :

· Listas de inicialização podem ser usados somente em construtores ;

· Membros paternos não podem ser inicializados na lista de inicialização;

· 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.

© 2000-2018, MetaQuotes Software Corp.


105 Elementos Básicos da Linguagem

//+------------------------------------------------------------------+
//| 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();

//--- Apaga um objeto criado dinamicamente


delete Pooh;
}

Neste caso, a classe CPerson tem três construtores :


1. Um construtor default explícito, que permite a criação de um array de objetos desta classe;

© 2000-2018, MetaQuotes Software Corp.


106 Elementos Básicos da Linguagem

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:

 class_member (uma lista de expressões)

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;
}

© 2000-2018, MetaQuotes Software Corp.


107 Elementos Básicos da Linguagem

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.

Definindo Métodos de Classe


Métodos de funções de classe podem ser definidos tanto dentro quanto fora da declaração de classe.
Se o método é definido dentro de uma classe, então seu corpo vem logo após a declaração do método.

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[]);
};

© 2000-2018, MetaQuotes Software Corp.


108 Elementos Básicos da Linguagem

Funções a partir de SetRig htBorder(int border) até Draw() são declarados e definidos diretamente
dentro da classe CT etrisS hape.

O construtor CT etrisS hape() e os métodos CheckDown(int& pad_array[]), Check Left(int& side_row[]) e


CheckR ig ht(int& side_row[]) são declarados somente dentro da classe, mas ainda não definidos. As
definições destas funções serão feitas mais adiante no código. A fim de definir o método do lado de
fora da classe, o operador de resolução de scope é usado, o nome da classe é usado como o escopo.

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);
}

Modificadores de Acesso Public, Protected e Private


Quando desenvolver um nova classe, é recomendável restringir o acesso do lado de fora aos membros
da classe. São usadas palavras-chave privateouprotected para esta finalidade. Neste caso, dados
escondidos podem ser acessados somente a partir de métodos-funções da mesma classe. Se a palavra-
chave protected é usada, dados escondidos podem ser acessados também a partir de métodos de
classes herdeiras desta classe. O mesmo método pode ser usado para restringir o acesso de métodos-
funções de uma classe.

Se você precisar de acesso com abertura completa aos membros e/ou métodos de uma classe, use a
palavra-chave public.

© 2000-2018, MetaQuotes Software Corp.


109 Elementos Básicos da Linguagem

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(), Rig ht(), Rotate() 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.

O acesso aos membros de uma classe base pode ser redefinido durante a herança nas classes
derivadas.

Modificador final
A presença do modificador 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.

© 2000-2018, MetaQuotes Software Corp.


110 Elementos Básicos da Linguagem

class CFoo final


{
//--- corpo da classe
};

class CBar : public CFoo


{
//--- corpo da classe
};

Como no exemplo acima, ao tentar herdar a partir da classe, usando o modificador final, o compilador
irá emitir um erro:

cannot inherit from 'CFoo' as it has been declared as 'final'


see declaration of 'CFoo'

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()
{
//---

© 2000-2018, MetaQuotes Software Corp.


111 Elementos Básicos da Linguagem

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

· ponteiros de objetos e funções

· classes de objetos

· estruturas de objeto que têm construtores ou destruidores

· estruturas de objeto com um membro a partir dos pontos 1-5

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]);};

© 2000-2018, MetaQuotes Software Corp.


112 Elementos Básicos da Linguagem

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);

© 2000-2018, MetaQuotes Software Corp.


113 Elementos Básicos da Linguagem

}
/* 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.

A interface é definida usando a palavra-chave interface, como é mostrado no exemplo a seguir:

//--- interface básica para descrever animais


interface IAnimal
{
//--- métodos da interface padrão têm acesso público
void Sound(); // som que produz o animal
};
//+------------------------------------------------------------------+
//| a classe CCat é herdada da interface IAnimal |
//+------------------------------------------------------------------+
class CCat : public IAnimal
{
public:
CCat() { Print("Cat was born"); }
~CCat() { Print("Cat is dead"); }
//--- implementamos o método Sound da interface IAnimal
void Sound(){ Print("meou"); }
};
//+------------------------------------------------------------------+
//| a classe CDog é herdada da interface IAnimal |
//+------------------------------------------------------------------+
class CDog : public IAnimal
{
public:
CDog() { Print("Dog was born"); }
~CDog() { Print("Dog is dead"); }
//--- implementamos o método Sound da interface IAnimal
void Sound(){ Print("guaf"); }
};
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


114 Elementos Básicos da Linguagem

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.

É imposs ível declarar a interface dentro da declaração da classe ou estrutura, porém é poss ível
armazenar o ponteiro para a interface na variável do tipo void *. De um modo geral, é poss ível
armazenar os ponteiros para objetos de qualquer classe na variável do tipo void *. Para converter um
ponteiro void * para outro ponteiro para um objeto de uma classe específica, é indispensável utilizar o
operador dynamic_cast. Quando a conversão é imposs ível, o resultado da operação dynamic_cast será
NULL.

Veja Também
Programação Orientada a Objetos

© 2000-2018, MetaQuotes Software Corp.


115 Elementos Básicos da Linguagem

Objeto Array Dinâmico


Arrays Dinâmicos
No máximo pode-se declarar arrays de 4 dimensões. Quando declarar um array dinâmico (um array
sem valor especificado no primeiro par de colchetes), o compilador automaticamente cria uma
variável da estrutura acima (um objeto array dinâmico) e fornece um código para a correta
inicialização.

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

© 2000-2018, MetaQuotes Software Corp.


116 Elementos Básicos da Linguagem

Conversão de Tipo (Typecasting)


Conversão de Tipos Numéricos
Frequentemente surge a necessidade de converter um tipo numérico em outro. Nem todos os tipos
numéricos podem ser convertidos em outro. Aqui está o esquema de conversão permitida:

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, s hort e us hort, 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
*/

© 2000-2018, MetaQuotes Software Corp.


117 Elementos Básicos da Linguagem

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, s hort, e us hort 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

//--- Segundo exemplo


d2=c1/2.0+0.3;
Print("c1/2.0 + 0.3 = ",d2);
// Resultado: c1/2.0+0.3 = 1.8

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.

Conversão de Tipos Numéricos


Nas expressões da linguagem MQL5 tanto conversão explicita quanto implícita podem ser usadas. A
conversão explícita é escrita da seguinte forma:

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);

Vamos considerar uma conversão explícita com base no primeiro exemplo.

//--- Terceiro exemplo

© 2000-2018, MetaQuotes Software Corp.


118 Elementos Básicos da Linguagem

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);

int k=1/2.0; // a expressão é convertida para o tipo double,


Print("k = 1/2 ",k); // então é convertido para o tipo destino, o resultado é 0

double d=1.0/2.0; // nenhuma conversão de tipos, o resultado é 0.5


Print("d = 1/2.0; ",d);

double e=1/2.0; // a expressão é convertida para o tipo double,


Print("e = 1/2.0; ",e);// que é o mesmo do tipo destino, o resultado é 0.5

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))

© 2000-2018, MetaQuotes Software Corp.


119 Elementos Básicos da Linguagem

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
}

Conversão para o tipo String


O tipo string tem a mais alta prioridade entre os tipos simples. Portanto, se um dos operandos de uma
operação é do tipo string, o segundo operando será convertido para uma string automaticamente.
Observe que para uma string, uma única operação de dois-lugares diádicos de adição é poss ível. A
conversão explicita de string para qualquer tipo numérico é permitida.

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 s2=NULL; // string desinicialização


Print("s2 = NULL; ",s2); // o resultado é uma string vazia
string s3="Ticket N"+12345; // a expressão é convertida para o tipo string
Print("s3 = \"Ticket N\"+12345",s3);

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));

Conversão de Ponteiros de Classe Base para Ponteiros de Classes Derivadas


Objetos de classe derivada podem ser vistos como objetos da correspondente classe base. Isso leva a
algumas conseqüências interessantes. Por exemplo, apesar do fato que objetos de diferentes classes,

© 2000-2018, MetaQuotes Software Corp.


120 Elementos Básicos da Linguagem

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.

Conversão dinâmica de tipos usando o operador dynamic _cast


Existe a possibilidade de realizar uma conversão dinâmica de tipos usando o operador dynamic_cast,
ele pode ser aplicado apenas para ponteiros de classes. Além disso, a revisão dos tipos é realizada
quando o programa está em execução. Isto significa que, ao usar operador compilador dynamic_cast
não se verifica o tipo de dados usado para a conversão. Se for levada a cabo conversão do apontador
para o tipo de dados que não é um tipo real de objeto, o resultado será o valor NULL.

dynamic_cast <type-id> ( expression )

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

© 2000-2018, MetaQuotes Software Corp.


121 Elementos Básicos da Linguagem

Tipo void e constante NULL


Sintaticamente o tipo void é um tipo fundamental, juntamente com os tipos char, uchar, bool, s hort,
us hort, int, uint, color, long, ulong, datetime, float, double e string. Este tipo é usado tanto para
indicar que a função não retorna nenhum valor ou, como um parâmetro de função, para indicar
ausência de parâmetros.

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

© 2000-2018, MetaQuotes Software Corp.


122 Elementos Básicos da Linguagem

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:

typedef tipo novo_nome;

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.

Ponteiro para a função


Ponteiro para a função geralmente é determinado pelo formato de registro

typedef tipo_de_resultado_de_função (*Nome_de_tipo_de_função)(lista_de_tipos_de_parâmetros_de_en

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.

Organizaç ão dos modelos de eventos na interface personalizada

© 2000-2018, MetaQuotes Software Corp.


123 Elementos Básicos da Linguagem

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.

//--- criamos o tipo personalizado de função


typedef int(*TAction)(string,int);
//+------------------------------------------------------------------+
//| Abre o arquivo |
//+------------------------------------------------------------------+
int Open(string name,int id)
{
PrintFormat("Função chamada %s (name=%s id=%d)",__FUNCTION__,name,id);
return(1);
}
//+------------------------------------------------------------------+
//| Salva o arquivo |
//+------------------------------------------------------------------+
int Save(string name,int id)
{
PrintFormat("Função chamada %s (name=%s id=%d)",__FUNCTION__,name,id);
return(2);
}
//+------------------------------------------------------------------+
//| Fecha o arquivo |
//+------------------------------------------------------------------+
int Close(string name,int id)
{
PrintFormat("Função chamada %s (name=%s id=%d)",__FUNCTION__,name,id);
return(3);
}

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)
{

© 2000-2018, MetaQuotes Software Corp.


124 Elementos Básicos da Linguagem

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))

© 2000-2018, MetaQuotes Software Corp.


125 Elementos Básicos da Linguagem

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);
}

© 2000-2018, MetaQuotes Software Corp.


126 Elementos Básicos da Linguagem

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);
}

A aparência do aplicativo em execução e os resultados dos botões pressionados são mostrados na


imagem.

© 2000-2018, MetaQuotes Software Corp.


127 Elementos Básicos da Linguagem

Código-fonte completo do programa

//+------------------------------------------------------------------+
//| Panel_Buttons.mq5 |
//| Copyright 2017, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+

#property copyright "Copyright 2017, MetaQuotes Software Corp."


#property link "https://www.mql5.com"
#property version "1.00"
#property description "Painel com vários botões CButton"
#include <Controls\Dialog.mqh>
#include <Controls\Button.mqh>
//+------------------------------------------------------------------+
//| 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

© 2000-2018, MetaQuotes Software Corp.


128 Elementos Básicos da Linguagem

//--- 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

//--- criamos o tipo personalizado de função


typedef int(*TAction)(string,int);
//+------------------------------------------------------------------+
//| Abre o arquivo |
//+------------------------------------------------------------------+
int Open(string name,int id)
{
PrintFormat("Função chamada %s (name=%s id=%d)",__FUNCTION__,name,id);
return(1);
}
//+------------------------------------------------------------------+
//| Salva o arquivo |
//+------------------------------------------------------------------+
int Save(string name,int id)
{
PrintFormat("Função chamada %s (name=%s id=%d)",__FUNCTION__,name,id);
return(2);
}
//+------------------------------------------------------------------+
//| Fecha o arquivo |
//+------------------------------------------------------------------+
int Close(string name,int id)
{
PrintFormat("Função chamada %s (name=%s id=%d)",__FUNCTION__,name,id);
return(3);
}
//+------------------------------------------------------------------+
//| 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()

© 2000-2018, MetaQuotes Software Corp.


129 Elementos Básicos da Linguagem

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(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));
}
};
//+------------------------------------------------------------------+
//| 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());
//---
}
//+------------------------------------------------------------------+
//| Criação e adição de botões para o painel CControlsDialog |
//+------------------------------------------------------------------+
bool CControlsDialog::CreateButtons(void)
{

© 2000-2018, MetaQuotes Software Corp.


130 Elementos Básicos da Linguagem

//--- 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);
}
//--- 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);

© 2000-2018, MetaQuotes Software Corp.


131 Elementos Básicos da Linguagem

}
//+------------------------------------------------------------------+
//| 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

© 2000-2018, MetaQuotes Software Corp.


132 Elementos Básicos da Linguagem

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);

//--- Declarar um ponteiro para um objeto e criá-lo usando o operador 'novo'


Foo *foo2=new Foo("foo2");
//--- Variante para passar um ponteiro para um objeto por referência
PrintObject(foo2); // ponteiro para um objeto é convertido automaticamente pelo compilador

//--- Declarar um array de objetos do tipo Foo


Foo foo_objects[5];

© 2000-2018, MetaQuotes Software Corp.


133 Elementos Básicos da Linguagem

//--- Variante de passagem de um array de objetos


PrintObjectsArray(foo_objects); // Função separada para passar um array de objetos

//--- Declarar um array de ponteiros para objetos do tipo Foo


Foo *foo_pointers[5];
for(int i=0;i<5;i++)
{
foo_pointers[i]=new Foo("foo_pointer");
}
//--- Variante para passar um array de ponteiros
PrintPointersArray(foo_pointers); // Função separada para passar um array de ponteiros

//--- É obrigatório excluir objetos criados como ponteiros antes da terminação


delete(foo2);
//--- deletar array de ponteiros
int size=ArraySize(foo_pointers);
for(int i=0;i<5;i++)
delete(foo_pointers[i]);
//---
}
//+------------------------------------------------------------------+
//| Os objetos são sempre passados por referência  |
//+------------------------------------------------------------------+
void PrintObject(Foo &object)
{
Print(__FUNCTION__,": ",object.m_id," Object name=",object.m_name);
}
//+------------------------------------------------------------------+
//| Passando um array de objetos  |
//+------------------------------------------------------------------+
void PrintObjectsArray(Foo &objects[])
{
int size=ArraySize(objects);
for(int i=0;i<size;i++)
{
PrintObject(objects[i]);
}
}
//+------------------------------------------------------------------+
//| Passando um array de ponteiros para objeto |
//+------------------------------------------------------------------+
void PrintPointersArray(Foo* &objects[])
{
int size=ArraySize(objects);
for(int i=0;i<size;i++)
{
PrintObject(objects[i]);
}
}

© 2000-2018, MetaQuotes Software Corp.


134 Elementos Básicos da Linguagem

//+------------------------------------------------------------------+

Também Veja
Variáveis, Inicialização de Variáveis, Visibilidade Escopo e T empo de Vida de Variáveis, Criando e
Excluindo Objetos

© 2000-2018, MetaQuotes Software Corp.


135 Elementos Básicos da Linguagem

Referência, Modificador & e Palavra-chave this


Passando Parâmetros por Referência
Em MQL5, parâmetros de tipos simples podem ser passados tanto por valor como por referência,
enquanto que parâmetros de tipos compostos são sempre passados por referência. Para informar ao
compilador que um parâmetro deve ser passado por referência, o caractere " e comercial" & é
adicionado antes do nome do parâmetro.

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

© 2000-2018, MetaQuotes Software Corp.


136 Elementos Básicos da Linguagem

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

© 2000-2018, MetaQuotes Software Corp.


137 Elementos Básicos da Linguagem

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:

+ - * / % Símbolos de operações aritméticas


&& || Símbolos de operações lógicas
= += *= Caracteres de operador de atribuição

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.

Esta seção contém a descrição dos seguintes tópicos :

· 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

· Regras de Precedência

© 2000-2018, MetaQuotes Software Corp.


138 Elementos Básicos da Linguagem

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;

Uma expressão que termina com um ponto e v írgula (;) é um operador.

Também Veja
Regras de Precedência

© 2000-2018, MetaQuotes Software Corp.


139 Elementos Básicos da Linguagem

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;

Problemas computacionais podem ocorrer na movimentação da expressão acima de um ambiente de


programação para outro (por exemplo, do Borland C++ para MQL5). Geralmente, a ordem de
computação depende da implementação do compilador. Na prática, existem duas formas de
implementar o pós-decremento (pós-incremento):
1. O pós-decremento (pós-incremento) é aplicado à variável depois de se calcular a expressão toda.
2. O pós-decremento (pós-incremento) é aplicado à variável imediatamente na operação.
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
Regras de Precedência

© 2000-2018, MetaQuotes Software Corp.


140 Elementos Básicos da Linguagem

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:

Atribuindo o valor x para a variável y  y = x;

As seguintes operações unem operações ariméticas e binárias com operações de 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
Regras de Precedência

© 2000-2018, MetaQuotes Software Corp.


141 Elementos Básicos da Linguagem

Operações de Relação
A booleana FALSE é representada pelo valor zero inteiro, enquanto que a booleana TR UE é
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 TR UE (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
Regras de Precedência

© 2000-2018, MetaQuotes Software Corp.


142 Elementos Básicos da Linguagem

Operações Booleanas
Negaç ão Lógica NOT (!)
Operando da negação lógia (!) deve ser de tipo aritmético. O resultado é TR UE (1), se o valor do
operando é FALSE (0); e é igual a FALSE (0), se o operando difere de FALSE (0).

if(!a) Print("não 'a'");

Operaç ão lógica OR (||)


Operação OR lógico (||) entre valores x e y. O valor da expressão é TR UE (1), se os valores x ou y são
verdadeiros (not null). Senão - FALSE (0).

if(x<0 || x>=max_bars) Print("fora da faixa");

Operaç ão lógica AND (&&)


Operação lógica AND (&&) entre valores de x e y. O valor da expressão é TR UE (1), se os valores de x
e y são verdadeiros (not null). Senão - FALSE (0).

Estimaç ão breve de Operaç õ es Booleanas


O esquema do chamado " brief estimate" (estimação breve) é aplicado a operações booleanas, isto é, o
cálculo da expressão é finalizado quando o resultado da expressão pode ser precisamente estimado.

//+------------------------------------------------------------------+
//| 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");
}
}
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


143 Elementos Básicos da Linguagem

//| a função sempre retorna false  |


//+------------------------------------------------------------------+
bool func_false()
{
Print("Função func_false()");
return(false);
}
//+------------------------------------------------------------------+
//| a função sempre retorna true  |
//+------------------------------------------------------------------+
bool func_true()
{
Print("Função func_true()");
return(true);
}

Também Veja
Regras de Precedência

© 2000-2018, MetaQuotes Software Corp.


144 Elementos Básicos da Linguagem

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

Deslocamento para Direita


A representação binária de x é deslocada para direita em y dígitos. Se o valor a ser deslocado é de um
tipo sem sinal (unsigned type), o deslocamento lógico para a direita é feito, isto é, os bits do lado
esquerdo liberados serão preenchido com zeros.

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

Deslocamento para Esquerda


A representação binária de x é deslocada para esquerda em y dígitos, os dígitos do lado direito
liberados são preenchidos com zero.

x = x << y;

Exemplo:
char a='a',b='b';
Print("Antes: a = ",a, " b = ",b);
//--- deslocamento para a esquerda

© 2000-2018, MetaQuotes Software Corp.


145 Elementos Básicos da Linguagem

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.

Operaç ão AND bit a bit


A operação AND bit a bit em representações binárias de x e y. O valor da expressão contem 1 (TR UE)
em todos os dígitos onde ambos x e y contém não-zero, e contem 0 (FALSE) em todos os demais
dígitos.

b = ((x & y) != 0);

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

Operaç ão OR bit a bit


A operação OR bit a bit de representações binárias de x e y. O valor da expressão contem 1 em todos
os dígitos onde x ou y não contém 0, e contém 0 em todos os demais dígitos.

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

Operaç ão OR Exclusivo bit a bit


A operação OR exclusivo bit a bit (eXclusive OR ) de representações binárias de x e y. O valor da
expressão contem 1 em todos os dígitos onde x e y tem valores binários diferentes, e contém 0 em
todos os demais dígitos.

b = x ^ y;

© 2000-2018, MetaQuotes Software Corp.


146 Elementos Básicos da Linguagem

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

Operações bit a bit são realizadas somente com inteiros.

Também Veja
Regras de Precedência

© 2000-2018, MetaQuotes Software Corp.


147 Elementos Básicos da Linguagem

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.

Chamando Função com argumentos x1, x2 ,..., xn


Cada argumento pode representar uma constante, variável, ou expressão do correspondente tipo. Os
argumentos passados são separados por v írgula e devem estar dentro dos parênteses, o parêntese de
abertura deve seguir o nome da função chamada.

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:

© 2000-2018, MetaQuotes Software Corp.


148 Elementos Básicos da Linguagem

for(i=0,j=99; i<100; i++,j--) Print(array[i][j]);

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;

Operação de Resolução de Escopo ( :: )


Cada função em um programa MQL5 tem seu próprio escopo de execução. Por exemplo, a função de
sistema Print() é realizada em um escopo global. Funções Importadas são chamadas no escopo do
correspondente import. Métodos de funções de classes têm o escopo da correspondente classe. A
sintaxe do operador de resolução de escopo é o seguinte:

[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.

A resolução de escopo é também usada para definir funções membros de classe.

type Class_name::Function_name(parameters_description)
{
// corpo da função
}

O uso de várias funções do mesmo nome a partir de contextos de execução diferentes em um


programa pode causar ambig üidade. A ordem de prioridade das chamadas da função sem
especificação de escopo explícita é a seguinte:

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.

© 2000-2018, MetaQuotes Software Corp.


149 Elementos Básicos da Linguagem

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();
}
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


150 Elementos Básicos da Linguagem

Operação de Obtenção do Tamanho do Tipo de Dados ou Tamanho


do Objeto de Qualquer Tipo de Dados ( sizeof )
Usando a operação sizeof o tamanho de memória correspondente a um identificador ou tipo pode ser
definido. A operação sizeof é do seguinte formato:

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.

Quando sizeof é aplicado ao nome de um tipo de estrutura ou classe, ou ao identificador do tipo de


uma estrutura ou classe, o resultado é tamanho real da estrutura ou classe.

Exemplo:
struct myStruct
{
char h;
int b;
double f;
} str;
Print("sizeof(str) = ",sizeof(str));
Print("sizeof(myStruct) = ",sizeof(myStruct));

O tamanho é calculado na etapa de compilação.

Veja Também
Regras de Precedência

© 2000-2018, MetaQuotes Software Corp.


151 Elementos Básicos da Linguagem

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.

Atenção: A precedência de operações na linguagem MQL5 corresponde à prioridade adotada em C++, e


difere da prioridade dada na linguagem MQL 4.

Operação Descrição Ordem de Execução


() Chamada de Função Da esquerda para direita
[] Referenciando um elemento de
. array
Referenciando um elemento de
estrutura

! Negação lógica Direita para esquerda


~ Negação bit a bit
– (complemento)
++ Mudança de Sinal
-- Incremento por um
(tipo) Decremento por um
sizeof Conversão de T ipo
(Typecasting)
Determinação de tamanho em
bytes

* Multiplicação Da esquerda para direita


/ Divisão
% Quociente de divisão

+ Adição Da esquerda para direita


– Subtração

<< Deslocamento para esquerda Da esquerda para direita


>> Deslocamento para direita
< Menor que Da esquerda para direita
<= Menor ou igual a
> Maior que
>= Maior ou igual a

== Igual Da esquerda para direita


!= Não igual
& Operação AND bit a bit Da esquerda para direita
^ OR exclusivo bit a bit Da esquerda para direita
| Operação OR bit a bit Da esquerda para direita
&& Operação lógica AND Da esquerda para direita
|| Operação lógica OR Da esquerda para direita

© 2000-2018, MetaQuotes Software Corp.


152 Elementos Básicos da Linguagem

?: Operador condicional Direita para esquerda


= Atribuição Direita para esquerda
*= Multiplicação com atribuição
/= Divisão com atribuição
%= Quociente de divisão com
+= atribuição
-= Adição com atribuição
<<= Subtração com atribuição
>>= Deslocamento para esquerda
&= com atribuição
^= Deslocamento para direita com
|= atribuição
AND bit a bit com atribuição
OR Exclusivo com atribuição
OR bit a bit com atribuição

, Vírgula Da esquerda para direita

Para mudar a ordem de execução de operação, são usados parênteses, que são de prioridade mais
alta.

© 2000-2018, MetaQuotes Software Corp.


153 Elementos Básicos da Linguagem

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 {}

Operador de Expressão (;) Qualquer expressão que termina com ponto e


v írgula (;)

return operador Finaliza a função corrente e retorna o controle


para o programa chamador

if-else operador condicional É usado quando é necessário fazer uma escolha


?: operador condicional Um análogo simples do operador condicional if-
else

switch operador de seleção Passa o controle para o operador que


corresponde ao valor da expressão

while operador de loop Realiza uma operação até que a expressão


verificada se torne falsa. A expressão é
verificada antes de cada iteração

for operador de loop Realiza uma operação até que a expressão


verificada se torne falsa. A expressão é
verificada antes de cada iteração

do-while operador de loop Realiza uma operação até que a expressão


verificada se torne falsa. A condição de
finalização é verificada, após cada loop. O
corpo do loop é executado pelo menos uma vez.

break operador Finaliza a execução do operador externo


adjunto mais próximo: switch, while, do-while
ou for.

continue operador Passa controle para o começo do loop do


operador externo mais próximo: while, do-while
ou for

new operador Cria um objeto de tamanho apropriado e


retorna um descritor do objeto criado.

delete operador Exclui o objeto criado pelo operador new

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:

© 2000-2018, MetaQuotes Software Corp.


154 Elementos Básicos da Linguagem

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

© 2000-2018, MetaQuotes Software Corp.


155 Elementos Básicos da Linguagem

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

© 2000-2018, MetaQuotes Software Corp.


156 Elementos Básicos da Linguagem

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.

Operador de Chamada de Função


Function_name (argument1,..., argumentN);

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

© 2000-2018, MetaQuotes Software Corp.


157 Elementos Básicos da Linguagem

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

© 2000-2018, MetaQuotes Software Corp.


158 Elementos Básicos da Linguagem

Operador Condicional If-Else


O operador IF - ELSE é usado quando uma escolha deve ser feita. Formalmente, a sintaxe é a
seguinte:

if (expressão)
  operador1
else
  operador2

Se a expressão é verdadeira, o operador1 é executado e o controle é dado ao operador que segue o


operador2. Se a expressão é falsa, o operador2 é executado.

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

© 2000-2018, MetaQuotes Software Corp.


159 Elementos Básicos da Linguagem

Operador Ternário ?
A forma geral do operador ternário é a seguinte:

expressão1 ? expressão2 : expressão3

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);

Esta entrada é equivalente ao seguinte:

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

Restrições ao Uso do Operador


Baseado no valor da " expressão1" , o operador deve retornar um dentre dois valores - ou " expressão2"
ou " expressão3" . Existem várias limitações nessas expressões :

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.

Restrições ao tipos user-defined (classes ou estruturas definidas pelo usuário):


a) Os tipos devem ser idênticos ou um deve ser derivado do outro.
b) Se os tipo não forem idênticos (herança), então a filha é implicitamente convertida para o pai, isto
é, o operador será do tipo paterno.
c) Não confunda objetos com ponteiros - ambas as expressão ou são objetos ou são ponteiros. NULL
pode ser usado para ponteiro.

Observação

© 2000-2018, MetaQuotes Software Corp.


160 Elementos Básicos da Linguagem

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);

func(Expression1?Expression2:Expression3); // aviso sobre conversão implícita para string


func(!Expression1?Expression2:Expression3); // aviso sobre conversão implícita para string
}

// 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

© 2000-2018, MetaQuotes Software Corp.


161 Elementos Básicos da Linguagem

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;
}

//--- Segundo exemplo


string res="";
int i=0;
switch(i)
{

© 2000-2018, MetaQuotes Software Corp.


162 Elementos Básicos da Linguagem

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

© 2000-2018, MetaQuotes Software Corp.


163 Elementos Básicos da Linguagem

Operador de Loop while


O operador while consiste de uma expressão verificada e um operador:

while(expression)
 operador;

Se a expressão é verdadeira, o operador é executado até que a expressão se torne falsa. Se a


expressão é falsa, o controle é passado para o próximo operador. O valor da expressão é definido
antes do operador ser executado. Portanto se a expressão é falsa logo no começo, o operador não será
executado.

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

© 2000-2018, MetaQuotes Software Corp.


164 Elementos Básicos da Linguagem

Operador de Loop For


O operador for consiste de três expressões e um operador executável:

for(expressão1; expressão2; expressão3)


  operador;

Expressão1 descreve a inicialização do loop. Expression2 verifica as condições de finalização do loop.


Se for verdadeira, o corpo do loop do for é executado. R ealiza uma operação até que a expressão
verificada se torne falsa. Se a expressão é verdadeira, o operador1 é executado e o controle é dado ao
operador que segue o operador2. Expression3 é calculado após cada iteração.

O operador for é equivalente à seguinte sucessão de operadores :

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

© 2000-2018, MetaQuotes Software Corp.


165 Elementos Básicos da Linguagem

Inicialização de Variáveis, Visibilidade Escopo e T empo de Vida de Variáveis, Criando e Excluindo


Objetos

© 2000-2018, MetaQuotes Software Corp.


166 Elementos Básicos da Linguagem

Operador de loop do while


Os loops for e while verificam o término no começo, não no fim de um loop. O terceiro operador de
loop do - while verifica a condição de término no fim, após cada interação do loop. O corpo do loop é
sempre executado pelo menos uma vez.

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

© 2000-2018, MetaQuotes Software Corp.


167 Elementos Básicos da Linguagem

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

© 2000-2018, MetaQuotes Software Corp.


168 Elementos Básicos da Linguagem

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

© 2000-2018, MetaQuotes Software Corp.


169 Elementos Básicos da Linguagem

Operador de Criação de Objeto new


O operador new automaticamente cria um objeto de tamanho correspondente, chama o construtor do
objeto e retorna um descritor do objeto criado. Em caso de falha, o operador retorna um descritor de
null que pode ser comparado com a constante NULL.

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

© 2000-2018, MetaQuotes Software Corp.


170 Elementos Básicos da Linguagem

Inicialização de Variáveis, Visibilidade Escopo e T empo de Vida de Variáveis, Criando e Excluindo


Objetos

© 2000-2018, MetaQuotes Software Corp.


171 Elementos Básicos da Linguagem

Operação de Exclusão de Objeto delete


O operador delete exclui um objeto criado pelo operador new, chama o destrutor da classe
correspondente e libera memória ocupada pelo objeto. Um descritor real de um objeto existente é
usado como um operando. Após a operação de exclusão (delete) ser executada, o descritor do objeto
torna-se inválido.

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

© 2000-2018, MetaQuotes Software Corp.


172 Elementos Básicos da Linguagem

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);
}

© 2000-2018, MetaQuotes Software Corp.


173 Elementos Básicos da Linguagem

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.

Exemplo de declaração incorreta:


int somefunc(double a,
double d=0.0001, // valor padrão declarado 0.0001
int n, // não é determinado o valor padrão!
bool b, // não é determinado o valor padrão!
string s="string transmitida")
{
}

Também Veja
Sobrecarga (Overload), Funções Virtuais, Polimorfismo

© 2000-2018, MetaQuotes Software Corp.


174 Elementos Básicos da Linguagem

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.

function_name (x1, x2,..., xn)

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:

somefunc(3.14, , 10); // Chamada errada -> o segundo parâmetros foi pulado.

Também Veja
Sobrecarga (Overload), Funções Virtuais, Polimorfismo

© 2000-2018, MetaQuotes Software Corp.


175 Elementos Básicos da Linguagem

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;

© 2000-2018, MetaQuotes Software Corp.


176 Elementos Básicos da Linguagem

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;

func(a[i],a[i++],"First call (i = "+string(i)+")");


func(a[i++],a[i],"Second call (i = "+string(i)+")");
// Result:
// First call (i = 0) : par1 = 1 par2 = 0
// Second call (i = 1) : par1 = 1 par2 = 1

}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void func(int par1,int par2,string comment)

© 2000-2018, MetaQuotes Software Corp.


177 Elementos Básicos da Linguagem

{
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 :

"Primeira chamada (i = "+string(i)+")"

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

© 2000-2018, MetaQuotes Software Corp.


178 Elementos Básicos da Linguagem

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;
}

Cada função contém a saída da mensagem via a função Print();

Print("Cálculo da média para um array do tipo int");

© 2000-2018, MetaQuotes Software Corp.


179 Elementos Básicos da Linguagem

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.

Abaixo está um algoritmo de correspondência para cada argumento.

Algoritmo de Escolha de uma Função Sobrecarregada


1. Use estrita correspondência (se poss ível).
2. T ente incremento de tipo padrão.
3. T ente conversão de tipo padrão.
O incremento de tipo padrão é melhor que outras conversões padrão. Incremento é a conversão de
float para double, de bool, char, s hort 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 s hort e us hort; 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

© 2000-2018, MetaQuotes Software Corp.


180 Elementos Básicos da Linguagem

deve confiar em diferenças sutis de tipos e conversões implícitas que tornam a função sobrecarregada
não clara.

No caso de dúvida, use conversão explícita para assegurar estrita adequação.

Exemplos de funções sobrecarregadas no MQL5 podem ser vistas no exemplo de funções


ArrayInitialize().

Regras de sobrecarga de função para sobrecarga de métodos de classe.

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);

// 2. sobrecarga não é permitida!


// número de parâmetros é diferente, mas o último tem um valor default
// isso leva ao ocultamento da função de sistema ao chamar-lo, o que é inaceitável
double MathMax(double a,double b,double c=DBL_MIN);

// 3. sobrecarga é permitida - sobrecarga normal para tipos de parâmetros 'a' e 'b'


double MathMax(int a,int b);

// 4. sobrecarga não é permitida!


// o número e tipos de parâmetros são os mesmos que no original double MathMax (double a,double b)
int MathMax(double a,double b);

Também Veja
Sobrecarga (Overload), Funções Virtuais, Polimorfismo

© 2000-2018, MetaQuotes Software Corp.


181 Elementos Básicos da Linguagem

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);

© 2000-2018, MetaQuotes Software Corp.


182 Elementos Básicos da Linguagem

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)); }

O exemplo completo do script:

//+------------------------------------------------------------------+
//| 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;

© 2000-2018, MetaQuotes Software Corp.


183 Elementos Básicos da Linguagem

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;

© 2000-2018, MetaQuotes Software Corp.


184 Elementos Básicos da Linguagem

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;

© 2000-2018, MetaQuotes Software Corp.


185 Elementos Básicos da Linguagem

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

© 2000-2018, MetaQuotes Software Corp.


186 Elementos Básicos da Linguagem

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

© 2000-2018, MetaQuotes Software Corp.


187 Elementos Básicos da Linguagem

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());

//--- Adição de matrizes


Print("---- Adição das matrizes A e B");
C=A+B;
//--- Saída da representação da string formatada
Print(C.String());

//--- Multiplicação de matrizes


Print("---- Multiplicação das matrizes A e B");
C=A*B;
Print(C.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++)
{

© 2000-2018, MetaQuotes Software Corp.


188 Elementos Básicos da Linguagem

string com="| ";


//--- Formar linhas a partir da matriz para o valor
for(int j=0;j<3;j++)
{
//--- Obter o elemento da matriz pelo número de linha e coluna
double element=C[i][j];// [i] - Acesso para CRow no array m_rows[] ,
// [j] - Operador sobrecarregado da indexação em CRow
com=com+StringFormat("a(%d,%d)=%G ; ",i,j,element);
}
com+="|";
//--- Saída dos valores da linha
Print(com);
}
}
//+------------------------------------------------------------------+
//| Class "Row" |
//+------------------------------------------------------------------+
class CRow
{
private:
double m_array[];
public:
//--- Construtores e um destrutor
CRow(void) { ArrayResize(m_array,0); }
CRow(const CRow &r) { this=r; }
CRow(const double &array[]);
~CRow(void){};
//--- Número de elementos na linha
int Size(void) const { return(ArraySize(m_array));}
//--- Retorna uma string com valores
string String(void) const;
//--- Operador de indexação
double operator[](int i) const { return(m_array[i]); }
//--- Operadores de atribuição
void operator=(const double &array[]); // Uma array
void operator=(const CRow & r); // Outro objeto CRow
double operator*(const CRow &o); // Objeto CRow para multiplicação
};
//+------------------------------------------------------------------+
//| Construtor para inicializar uma linha com um array  |
//+------------------------------------------------------------------+
void CRow::CRow(const double &array[])
{
int size=ArraySize(array);
//--- Se o array não está vazio
if(size>0)
{
ArrayResize(m_array,size);
//--- Preencher com valores

© 2000-2018, MetaQuotes Software Corp.


189 Elementos Básicos da Linguagem

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);
}
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


190 Elementos Básicos da Linguagem

//| Retorno da representação da string formatada  |


//+------------------------------------------------------------------+
string CRow::String(void) const
{
string out="";
//--- Se o tamanho do array é maior do que zero
int size=ArraySize(m_array);
//--- Trabalhamos apenas com números diferentes de zero dos elementos array
if(size>0)
{
out="{";
for(int i=0;i<size;i++)
{
//--- Recolher os valores para a string
out+=StringFormat(" %G;",m_array[i]);
}
out+=" }";
}
//--- Resultado
return(out);
}
//+------------------------------------------------------------------+
//| Class "Matrix" |
//+------------------------------------------------------------------+
class CMatrix
{
private:
CRow m_rows[];

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);

© 2000-2018, MetaQuotes Software Corp.


191 Elementos Básicos da Linguagem

};
//+------------------------------------------------------------------+
//| 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();

© 2000-2018, MetaQuotes Software Corp.


192 Elementos Básicos da Linguagem

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[];

© 2000-2018, MetaQuotes Software Corp.


193 Elementos Básicos da Linguagem

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);
}

© 2000-2018, MetaQuotes Software Corp.


194 Elementos Básicos da Linguagem

Também Veja
Sobrecarga, Operações Aritméticas, Sobrecarga de Função, R egras de Precedência

© 2000-2018, MetaQuotes Software Corp.


195 Elementos Básicos da Linguagem

Descrição de Funções Externas


As funções externas definidas em outro módulo devem ser explicitamente descritas. A descrição inclui
o tipo retornado, o nome da função e uma série dos parâmetros de entrada com os seus tipos. A
ausência de tal descrição pode levar a erros ao compilar, construir e executar um programa. Ao
descrever um objeto externo, use a palavra-chave #import indicando o módulo.

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();
}

© 2000-2018, MetaQuotes Software Corp.


196 Elementos Básicos da Linguagem

Também Veja
Sobrecarga (Overload), Funções Virtuais, Polimorfismo

© 2000-2018, MetaQuotes Software Corp.


197 Elementos Básicos da Linguagem

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.

int Function() export


{
}

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

© 2000-2018, MetaQuotes Software Corp.


198 Elementos Básicos da Linguagem

Funções de Manipulação de Evento


A linguagem MQL5 fornece processamento de alguns eventos pré-definidos. Funções para manipulação
destes eventos devem ser definidas em um programa MQL5; nome da função, tipo de retorno,
composição dos parâmetros (se existir algum) e seus tipos devem estar rigorosamente em
conformidade com a descrição da função de handler (manipulador) de evento.

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();

Para a função OnStart(), o tipo de retorno int pode ser especificado.

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.

Para otimizar os parâmetros de entrada de um Expert Advisor, é recomendado usar valores da


enumeração ENUM _INIT_R ET CODE como código de retorno. Esses valores são usados para organizar o
curso da otimização, incluindo a seleção dos mais apropriados agentes de teste. Durante a
inicialização de um Expert Advisor, antes do início do teste, você pode solicitar informação sobre a
configuração e recursos de um agente (o número de cores, quantidade de memória livre, etc) usando a
função T erminalInfoInteger(). Baseado nestas informações obtidas, pode-se tanto permitir usar este
agente de teste, ou rejeitar usá-lo durante a otimização deste Expert Advisor.

ENUM_INIT_RETCODE

Identificador Descrição
INIT_SUCCEEDED 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.

INIT_FAILED Inicialização com falha; não existe motivo para


continuar testando por cause de erros fatais.

© 2000-2018, MetaQuotes Software Corp.


199 Elementos Básicos da Linguagem

Por exemplo, falha em criar um indicador que é


requerido para o funcionamento do Expert
Advisor.
Este valor de retorno significa o mesmo que um
valor diferente de zero - inicialização do Expert
Advisor pelo Provador de Estratégia falhou.

INIT_PARAMET ERS _INCORRECT Este valor significa a incorreta definição da


entrada de parâmetros. A seqüência de
resultado contendo o código de retorno é
destacado em vermelho na tabela de otimização
geral.
O teste para o dado conjunto de parâmetros do
Expert Advisor não será executado, o agente é
liberado para receber uma nova tarefa.
Depois de receber este valor, o testador de
estratégia com segurança não vai passar essa
tarefa para que outros agentes tentem
novamente.

INIT_AGENT_NOT_SUIT ABLE Nenhum erro durante a inicialização, mas por


alguma razão o agente não é adequado para o
teste. Por exemplo, ausência de memória
suficiente, sem support ao OpenCL, etc.
Após este código de retorno, o agente não
receberá tarefas até o fim desta otimização.

A função OnInit() do tipo void sempre indica inicialização bem sucedida.

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.

void OnDeinit(const int reason);

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;
à mudança de parâmetros de entrada;
· antes de uma reinicialização devido
· 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.

© 2000-2018, MetaQuotes Software Corp.


200 Elementos Básicos da Linguagem

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();

Os usuários devem implementar de forma independente no código a verificação do estado de uma


conta de negociação quanto tal evento é recebido (se isto é requerido pelas condições da estratégia de
negócio). Se a chamada da função OrderSend() foi concluída com sucesso e retornou um valor de true,
isso significa que o servidor de negociação postou a ordem na fila de execução e atribuiu um número
de bilhetagem (tick et number) nele. T ão logo o servidor processe esta ordem, o evento T rade será
gerado. E se um usuário lembrar valor da bilhetagem (tick et), ele/ela será capaz de descobrir o que
aconteceu com a ordem usando este valor na função OnT rade().

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.

© 2000-2018, MetaQuotes Software Corp.


201 Elementos Básicos da Linguagem

· Ativação de ordens pendentes e ordens de stop no servidor.

· Realização de operações no lado de um servidor de negociação.


As seguintes transações de negociação são realizadas como resultado destas ações :

· tratamento de uma solicitação de negociação

· mudança de ordens de abertura

· mudança de histórico de ordens

· mudança de histórico de operações (deals)

· 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
);

O handler (manipulador) contém três parâmetros :

· 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 obtém a estrutura MqlTradeRequest descrevendo uma solicitação de
negócio;
· result - este parâmetro obtém a estrutura MqlTradeResult descrevendo o resultado da execução de
uma solicitação de negociação.

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().

Uma solicitação de negociação manualmente enviada a partir do terminal ou via funções


OrderSend()/OrderSendAs ync() podem gerar várias transações consecutivas no servidor de negócios. A
prioridade de chegada dessas transações no terminal não é garantida. Assim, você não deve esperar
que um grupo de transações chegará após um outro grupo ao desenvolver seu algoritmo de
negociação.

© 2000-2018, MetaQuotes Software Corp.


202 Elementos Básicos da Linguagem

· T odos os tipo de transações de negociação são descritas na enumeração


ENUM _TR ADE_TR ANSACTION_TYPE.
· A estrutura MqlT radeT ransaction descrevendo um transação de negociação é preenchida de
diferentes formas dependendo do tipo de transação. Por exemplo, somente o campo de tipo
(tipo de transação de negociação) deve ser analisado para transações do tipo
TRADE_TRANSACTION_REQUES T . O segundo e terceiro parâmetros (request e result) da função
OnT radeT ransaction deve ser analisado para dados adicionais. Para informações adicionais,
veja Estrutura de uma T ransação de Negociação.
· Uma descrição de transação de negociação não entrega todas as informações disponíveis
relativas a ordens, operações (deals) e posições (por exemplo, comentários). As funções
OrderGet*, H istoryOrderGet*, H istoryDealGet* e PositionGet* devem ser usadas para obter
informações adicionais.

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

© 2000-2018, MetaQuotes Software Corp.


203 Elementos Básicos da Linguagem

em consideração). Em tal ordenação, os piores valores são posicionados no final e posteriormente


jogados fora e não participam na formação da nova geração.

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();

Um Expert Advisor com o handler (manipulador) OnT esterPass() é automaticamente carregado em um


gráfico separado do terminal com o ativo/período especificados para teste, e obtém eventos
T esterPass quando um plano é recebido durante uma otimização. A função é usada para tratamento
dinâmico dos resultados de otimização " no local" sem precisar esperar pela sua conclusão. Planos são
adicionados usando a função FrameAdd(), que pode ser chamada após o fim de um passo único no
handler (manipulador) OnT ester() .

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();

Um Expert Advisor com o handler (manipulador) T esterDeinit() é automaticamente carregada em um


gráfico no início da otimização, e recebe T esterDeinit após sua conclusão. A função é usada para um
processamento final de todos os resultados da otimização.

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 :

void OnBookEvent (const string& symbol);

© 2000-2018, MetaQuotes Software Corp.


204 Elementos Básicos da Linguagem

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;
· CH ART EVENT_MOUSE_MOVE— eventos de movimento de mouse e eventos de click de mouse (se
CH ART_EVENT_MOUSE_MOVE=true é definido para o gráfico);
· CH ART EVENT_OBJECT_CR EAT E — evento de criação de objeto gráfico (se
CH ART_EVENT_OBJECT_CR EAT E=true é definido para o gráfico);
· CH ART EVENT_OBJECT_CH ANGE — evento de mudança de um propriedade de objeto via janela
diálogo de propriedades ;
· CH ART EVENT_OBJECT_DELET E — evento de exclusão de objeto gráfico (se
CH ART_EVENT_OBJECT_DELET E=true é definido para o gráfico);
· CH ART EVENT_CL I CK — evento de um click de mouse no gráfico;

· CH ART EVENT_OBJECT_CL I CK — evento de um click de mouse em um objeto gráfico pertencente ao


gráfico;
· CH ART EVENT_OBJECT_DR AG — evento de um movimento de objeto gráfico usando o mouse;
· CH ART EVENT_OBJECT_ENDEDIT — evento da edição de texto finalizada na caixa de entrada do
objeto gráfico LabelEdit;
· CH ART EVENT_CH ART_CH ANGE — evento de mudanças de gráfico;
· CH ART EVENT_CUS T OM +n — ID do evento do usuário, onde n está na faixa de 0 a 65535.
· CH ART EVENT_CUS T OM _LAS T — o último ID aceitável de um evento customizado
(CH ART EVENT_CUS T OM +65535).

A função pode ser chamada somente em Expert Advisors e indicadores. A função deve ser de tipo void
com 4 parâmetros :

void OnChartEvent(const int id, // Evento ID


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
);

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.

© 2000-2018, MetaQuotes Software Corp.


205 Elementos Básicos da Linguagem

Evento Valor do Valor do Valor do Valor do


parâmetro id parâmetro parâmetro parâmetro
lparam dparam sparam
Evento de uma CH ART EVENT_KE código de uma Repita a O valor da string
teclada YDOWN tecla pressionada contagem (o de uma pequena
número de vezes máscara de
que a tecla é descrever o
repetida como estado de botões
um resultado de do teclado
que o usuário
pressiona a
tecla)

Eventos de CH ART EVENT_MO a coordenada X a coordenada Y O valor de string


mouse (se a USE_MOVE de uma máscara
propriedade de bites
CH ART_EVENT_ descrevendo o
MOUSE_MOVE=tr estado de botões
ue está definida de mouse
para o gráfico)

Evento de CH ART EVENT_OB — — Nome do objeto


criação de JECT_CREAT E gráfico criado
objeto gráfico
(se
CH ART_EVENT_O
BJECT_CREAT E=t
rue, então é
definido para o
gráfico)

Evento de CH ART EVENT_OB — — Nome do objeto


mudança de uma JECT_CH ANGE gráfico
propriedade de modificado
objeto via janela
de diálogo de
propriedades

Evento de CH ART EVENT_OB — — Nome do objeto


exclusão de JECT_DELET E gráfico excluído
objeto gráfico
(se
CH ART_EVENT_O
BJECT_DELET E=t
rue está definido
para o gráfico)

Evento de um CH ART EVENT_C a coordenada X a coordenada Y —


click de mouse L I CK
no gráfico

© 2000-2018, MetaQuotes Software Corp.


206 Elementos Básicos da Linguagem

Evento de um CH ART EVENT_OB a coordenada X a coordenada Y Nome do objeto


click de mouse JECT_CLICK gráfico, na qual
num objeto o evento ocorreu
gráfico
pertencente ao
gráfico

Evento de um CH ART EVENT_OB — — Nome do objeto


objeto gráfico JECT_DRAG gráfico movido
arrastado usando
o mouse

Evento da edição CH ART EVENT_OB — — Nome do objeto


de texto JECT_ENDEDIT gráfico
finalizada na LabelEdit, cuja
caixa de entrada edição de texto
do objeto gráfico foi concluída
LabelEdit

Evento de CH ART EVENT_C — — —


mudanças de H ART_CH ANGE
gráfico

ID do evento de CH ART EVENT_CU Valor definido Valor definido Valor definido


usuário sob N S T OM +N pela função pela função pela função
número EventChartCusto EventChartCusto EventChartCusto
m() m() m()

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).

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
);

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.

© 2000-2018, MetaQuotes Software Corp.


207 Elementos Básicos da Linguagem

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
}

Neste exemplo, o último parâmetro passado é o valor PRICE_TYPICAL (da enumeração


ENUM _APPL IED_PRICE), que indica que o indicador customizado será construído baseado em preços
típicos obtidos como (H ig h+Low+Close)/3. Se este parâmetro não for especificado, o indicador é
construído baseado em valores de PRICE_CLOSE, isto é, preços de fechamento de cada barra.

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

© 2000-2018, MetaQuotes Software Corp.


208 Elementos Básicos da Linguagem

const int prev_calculated, // barras tratadas na chamada anterior


const datetime& time[], // Hora
const double& open[], // Open (abertura)
const double& high[], // High (máximo)
const double& low[], // Low (mínimo)
const double& close[], // Close (fechamento)
const long& tick_volume[], // Volume de Tick
const long& volume[], // Volume Real
const int& spread[] // Spread
);

Os parâmetros open[], hig h[], 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[], hig h[], 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

© 2000-2018, MetaQuotes Software Corp.


209 Elementos Básicos da Linguagem

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

© 2000-2018, MetaQuotes Software Corp.


210 Elementos Básicos da Linguagem

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.

Os tipos simples são:

· char, s hort, int, long, uchar, us hort, uint, ulong – inteiros ;


· color – inteiro representando a cor-RGB (red, green, blue);
· 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;

· double – número de ponto flutuante de dupla precisão;


· float – número de ponto flutuante de precisão simples ;
· string – strings de caractere.
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';

Tipos compostos ou complexos:

Estruturas são tipos de dados compostos construídos usando outros tipos.

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

Array é uma seqüência indexada de dados de tipos idênticos :

int a[50]; // Array de uma dimensão de 50 inteiros.


double m[7][50]; // Array de duas dimensões de sete arrays,
// cada um deles constituído de 50 números.
MyTime t[100]; // Array contendo elementos como MyTime

© 2000-2018, MetaQuotes Software Corp.


211 Elementos Básicos da Linguagem

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
);

Para acessar membros de estruturas e classes use os seguintes qualificadores :


· public – permite acesso irrestrito às variáveis ou métodos da classe

· 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.

© 2000-2018, MetaQuotes Software Corp.


212 Elementos Básicos da Linguagem

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

© 2000-2018, MetaQuotes Software Corp.


213 Elementos Básicos da Linguagem

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);
}

© 2000-2018, MetaQuotes Software Corp.


214 Elementos Básicos da Linguagem

/* 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

© 2000-2018, MetaQuotes Software Corp.


215 Elementos Básicos da Linguagem

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++)
{

© 2000-2018, MetaQuotes Software Corp.


216 Elementos Básicos da Linguagem

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.

No máximo 64 parâmetros podem ser passado para um função.

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

© 2000-2018, MetaQuotes Software Corp.


217 Elementos Básicos da Linguagem

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

© 2000-2018, MetaQuotes Software Corp.


218 Elementos Básicos da Linguagem

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 de Classe Estáticos

© 2000-2018, MetaQuotes Software Corp.


219 Elementos Básicos da Linguagem

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

© 2000-2018, MetaQuotes Software Corp.


220 Elementos Básicos da Linguagem

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;

Variáveis de entrada determinam a entrada de parâmetros de um programa. Eles estão disponíveis a


partir da janela de Propriedades de um programa.

É 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
input int InpMAShift=0; // Deslocamento da linha horizontal
input ENUM_MA_METHOD InpMAMethod=MODE_SMMA; // Método de Suavização

© 2000-2018, MetaQuotes Software Corp.


221 Elementos Básicos da Linguagem

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.

Passando Parâmetros Ao Chamar Indicadores Customizados a partir de


Programas MQL5
Indicadores Customizados são chamados usando a função iCustom(). Após o nome do indicador
customizado, os parâmetros devem aparecer em estrita conformidade com a declaração das variáveis
de entrada deste indicador customizado. Se os parâmetros indicados são em número menor que as
variáveis de entrada declaradas no indicador customizado chamado, os parâmetros faltantes são
preenchidos com os valores especificados durante a declaração de variáveis.

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.

Enumeraç õ es como Parâmetros de Entrada


Não apenas enumerações internas fornecidos no MQL5, mas também variáveis definidas pelo usuário
podem ser usadas como variáveis de entrada (parâmetros de entrada para programas MQL5). Não
apenas enumerações internas fornecidos no MQL5, mas também variáveis definidas pelo usuário
podem ser usadas como variáveis de entrada (parâmetros de entrada para programas MQL5).

Exemplo:
#property script_show_inputs
//--- dias da semana
enum dayOfWeek
{

© 2000-2018, MetaQuotes Software Corp.


222 Elementos Básicos da Linguagem

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 s how
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.

Variáveis com Modificador sinput

© 2000-2018, MetaQuotes Software Corp.


223 Elementos Básicos da Linguagem

Variáveis com modificador input não apenas permitem definir parâmetros externos ao iniciar
programas mas também são necessárias na otimização de estratégias de negociação no Provador de
Estratégia. Cada variável de entrada excluindo-se o do tipo string pode ser usada em optimização.

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

sinput int layers=6; // Número de camadas

será equivalente a declaração completa

static input int layers=6; // Número de camadas

A variável declarada com o modificador sinput é um parâmetro de entrada de um programa MQL5. O


valor deste parâmetro pode ser modificado ao iniciar o programa. Entretanto, esta variável não pode
ser usado na otimização de parâmetros de entrada. Em outras palavras, seu valor não é enumerado ao
procurar pelo melhor conjunto ajustado de parâmetros a uma condição específica.

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.

Também Veja

© 2000-2018, MetaQuotes Software Corp.


224 Elementos Básicos da Linguagem

iCustom, Enumerações, Propriedades de Programas

© 2000-2018, MetaQuotes Software Corp.


225 Elementos Básicos da Linguagem

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

© 2000-2018, MetaQuotes Software Corp.


226 Elementos Básicos da Linguagem

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.

A inicialização de variáveis globais e estáticas é realizada apenas uma vez. A inicialização de


variáveis locais é feita toda a vez que se chama as funções correspondentes.

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={0};

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. A seqüência de inicialização deve ter ao menos um valor: este
valor é inicializado para o primeiro elemento da estrutura correspondente ou array, elementos
faltantes são considerados iguais a zero.

Se o tamanho do array inicializado não é especificado, ele é determinado pelo compilador, baseado no
tamanho da seqüência de inicialização. Arrays multi-dimensionais não podem ser inicializados por uma
seqüência unidimensional (uma seqüência sem chaves adicionais), exceto para o caso quando apenas
um elemento inicializante é especificado (zero, como regra).

Arrays (incluindo aqueles declarados no nível local) podem ser inicializados apenas por constantes.

Exemplos:
struct str3
{
int low_part;
int high_part;
};
struct str10
{
str3 s3;
double d1[10];
int i3;
};
void OnStart()
{

© 2000-2018, MetaQuotes Software Corp.


227 Elementos Básicos da Linguagem

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},{0},100};
str10 s10_3={{1,0},{1.0}};
//---
Print("1. s10_1.d1[5] = ",s10_1.d1[5]);
Print("2. s10_2.d1[5] = ",s10_2.d1[5]);
Print("3. s10_3.d1[5] = ",s10_3.d1[5]);
Print("4. s10_3.d1[0] = ",s10_3.d1[0]);
}

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

© 2000-2018, MetaQuotes Software Corp.


228 Elementos Básicos da Linguagem

Visibilidade Escopo e Tempo de Vida de Variáveis


Existem dois tipos básicos de escopo: escopo local e escopo global.

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;

© 2000-2018, MetaQuotes Software Corp.


229 Elementos Básicos da Linguagem

for(int j=0; j<MA_Period; j++) sum+=(MA_Period-j)*price[i-j];


LineBuffer[i]=sum/weightsum;
}
//---
}

Preste atenção na variável i, declarada na linha

for(int i=begin; i<limit; i++)


{
int k=i-begin+1;
weightsum+=k;
firstValue+=k*price[i];
}

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

© 2000-2018, MetaQuotes Software Corp.


230 Elementos Básicos da Linguagem

Criação e Exclusão de Objetos


Após um programa MQL5 ser carregado para execução, memória é alocada para cada variável de
acordo com seu tipo. De acordo com o nível de acesso, todas as variáveis são dividas em dois tipos -
variáveis globais e variáveis locais. De acordo com a classe de memória, elas pode ser parâmetros de
entrada de um programa MQL5, estáticas (static) e automáticas. Se necessário, cada variável é
inicializada por um valor correspondente. Após ser usada, uma variável é desinicializada e a memória
usada por ela é retornada ao sistema executável MQL5.

Inicialização e Desinicialização de Variáveis Globais


Variáveis globais são inicializados automaticamente logo após um programa mql5 ser carregado e
antes de qualquer função ser chamada. Durante a inicialização valores iniciais são atribuídos a
variáveis de tipos simples e um construtor (se existir algum) é chamado para objetos. Variáveis de
entrada são sempre declarados em um nível global, e são inicializados por valores definidos pelo
usuário na janela de diálogo durante o começo do programa.

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.

A ordem de inicialização corresponde a ordem de declaração da variável no programa. A


desinicialização é realizada em ordem inversa. Este regra é verdadeira apenas para as variáveis que
não foram criadas pelo operador new. T ais variáveis são criadas e inicializadas automaticamente logo
após carregamento, e são desinicializadas depois do descargamento do programa.

Inicialização e Desinicialização de Variáveis Locais


Se uma variável declarada em um nível local não é estática, memória é alocada automaticamente para
tal variável. Variáveis locais, bem como variáveis globais, são inicializados automaticamente no
momento que a execução do programa encontra a declaração de uma variável local. Assim, a ordem de
inicialização corresponde à ordem de declaração.

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.

Inicialização e Desinicialização de Objetos Colocados


Um caso especial é aquele com ponteiros de objeto, porque a declaração de um ponteiro não implica
em inicialização de objetos correspondentes. Objetos colocados dinamicamente são inicializados
somente no momento em que a instância da classe é criada pelo operador new. Inicialização de
objetos pressupõe chamada de um construtor da classe correspondente. Se não existir construtor
correspondente na classe, seus membros de tipo simples não serão automaticamente inicializados ;
membros de tipos string, array dinâmico e objeto complexo serão automaticamente inicializados.

© 2000-2018, MetaQuotes Software Corp.


231 Elementos Básicos da Linguagem

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.

Características Transitórias de Variáveis


A principal informação sobre a ordem de criação, exclusão, sobre chamadas de construtores e
destrutores é dada na tabela a baixo.

Variável automática Variável automática Objeto criado


global local dinamicamente
Inicialização logo após um quando a linha de na execução do
programa MQL5 ser código onde ela está operador new
carregado declarada é alcançada
durante execução

Ordem de na ordem da na ordem da independente da


inicialização declaração declaração ordem de declaração

Desinicialização antes de um programa quando a execução sai quando o operador


MQL5 ser do bloco da declaração delete é executado ou
descarregado antes de um programa
mql5 ser descarregado

Ordem de na ordem oposta da na ordem oposta da independente da


desinicialização ordem de inicialização ordem de inicialização ordem de inicialização

Chamada de no carregamento do na inicialização na execução do


construtor programa MQL5 operador new

Chamada de na descarga do quando sair do bloco na execução do


destrutor programa MQL5 onde a variável foi operador delete
inicializada

Logs de Erro mensagem de log no mensagem de log no mensagem de logo no


diário " Experts " sobre diário " Experts " sobre diário " Experts " sobre

© 2000-2018, MetaQuotes Software Corp.


232 Elementos Básicos da Linguagem

a tentativa de excluir a tentativa de excluir objetos criados


um objeto criado um objeto criado dinamicamente não
automaticamente automaticamente excluídos na descarga
de um programa mql5

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

© 2000-2018, MetaQuotes Software Corp.


233 Elementos Básicos da Linguagem

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.

O preprocessador também permite determinar parâmetros específicos de programas MQL5:

· Declarar constantes
· Definir propriedades de programa
· I ncluir arquivos no texto do programa

· I mportar funções

· Conditional compilation

As diretivas do pré-processador são usadas ​pelo do compilador para pré-processamento do código


fonte antes de sua compilação. A diretiva sempre começa com o # (jogo da velha), por isso o
compilador proíbe o uso deste s ímbolo nos nomes das variáveis, funções, etc.

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

© 2000-2018, MetaQuotes Software Corp.


234 Elementos Básicos da Linguagem

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.

© 2000-2018, MetaQuotes Software Corp.


235 Elementos Básicos da Linguagem

Substituição de Macro (#define, #undef)


As diretivas do pré-processador são usadas ​pelo do compilador para pré-processamento do código
fonte antes de sua compilação. A diretiva sempre começa com o # (jogo da velha), por isso o
compilador proíbe o uso deste s ímbolo nos nomes das variáveis, funções, etc.

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 :

#define identificador expressão  // forma sem parâmetro


#define identificador(par1,... par8) expressão  // forma paramétrica

A diretiva #define substitui em expressão todas as entradas encontradas adiante do identificador no


texto fonte. O identificador é substituído somente se ele é um s ímbolo (tok en) separado. O
identificador não é substituído se ele é parte de um comentário, parte de uma string, ou parte de um
outro identificador mais longo.

O identificador de constante é governado pelas mesmas regras de nomes de variáveis. O valor pode
ser de qualquer tipo:

#define ABC 100


#define PI 3.14
#define COMPANY_NAME "MetaQuotes Software Corp."
...
void ShowCopyright()
{
Print("Copyright 2001-2009, ",COMPANY_NAME);
Print("https://www.metaquotes.net");
}

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

© 2000-2018, MetaQuotes Software Corp.


236 Elementos Básicos da Linguagem

// (2 + 3)*2 = 10

Forma paramétrica do #define


Na forma paramétrica, todas as subseqüentes entradas encontradas do identificador serão
substituídas pela expressão levando em conta os respectivos parâmetros. Por exemplo:

// exemplo com dois parâmetros a e b


#define A 2+3
#define B 5-1
#define MUL(a, b) ((a)*(b))

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:

// exemplo com dois parâmetros a e b


#define A 2+3
#define B 5-1
#define MUL(a, b) a*b

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

Ao usar a forma paramétrica, são permitidos no máximo 8 parâmetros.

// forma paramétrica correta


#define LOG(text) Print(__FILE__,"(",__LINE__,") :",text) // um parâmetro - 'text'

// forma paramétrica incorreta


#define WRONG_DEF(p1, p2, p3, p4, p5, p6, p7, p8, p9) p1+p2+p3+p4 // mais do que 8 parâmetros a p

© 2000-2018, MetaQuotes Software Corp.


237 Elementos Básicos da Linguagem

The #undef directive


The #undef directive cancels declaration of the macro substitution, defined before.

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

© 2000-2018, MetaQuotes Software Corp.


238 Elementos Básicos da Linguagem

Propriedades de Programa (#property)


T odo programa-mql5 permite especificar parâmetros específicos adicionais denominados #property
que ajudam o terminal cliente em prover adequadamente serviços a programas sem a necessidade de
lançá-los explicitamente. Isso diz respeito a configurações externas de indicadores, em primeiro lugar.
Propriedades descritas em arquivos incluídos (included files) são completamente ignorados.
Propriedades devem ser especificadas no principal arquivo MQL5.

#property identifier value

O compilador escreverá valores declarados na configuração do módulo executado.

Constante T ipo Descrição


icon string Caminho para o arquivo de
uma imagem que será usada
como um ícone do programa
EX5. R egras de especificação
de caminho são as mesmas
para recursos. A propriedade
deve ser especificada no
módulo principal com o código
fonte MQL5. O arquivo de
ícone deve estar no formato
ICO.
link string Link para o website da
empresa

copyrig ht string O nome da empresa

version string Versão do programa, máximo


de 31 caracteres

description string Breve descrição em texto do


programa MQL5. Vários
description podem ser
presentes, cada uma
descrevendo uma linha do
texto. O comprimento total de
todo description não pode
exceder 511 caracteres
incluindo a quebra de linha.

stack size int T amanho do stack no


programa MQL5. É necessário
um stack de tamanho
satisfatório ao executar
chamadas recursivas da
função.
Ao lançar um script ou um
Expert Advisor no gráfico, o
stack de pelo menos 8 M B é

© 2000-2018, MetaQuotes Software Corp.


239 Elementos Básicos da Linguagem

alocado. No caso de
indicadores, o tamanho da
pilha é sempre fixo e igual a 1
M B.
Quando um programa é
iniciado no testador de
estratégia, o stack de 16 M B é
sempre alocado para ele.

library Uma biblioteca (library);


nenhuma função start é
atribuída, funções com o
modificador export podem ser
importadas em outros
programas-mql5

indicator_applied_price int Especifica o valor padrão para


o campo " Aplicar a" . Pode-se
especificar um dos valores de
ENUM _APPL IED_PRICE. Se a
propriedade não é
especificada, o valor padrão é
PRICE_CLOSE
indicator_chart_window Exibe o indicador na janela do
gráfico

indicator_separate_window Exibe o indicador em uma


janela separada

indicator_heig ht int Altura (heig ht) fixa da sub-


janela do indicador em pixels
(property INDICAT OR_H EIGHT )

indicator_buffers int Número de buffers para cálculo


do indicador

indicator_plots int Número de séries gráficas no


indicador

indicator_minimum double O limite de escala inferior


para uma janela de indicador
separada

indicator_maximum double O limite de escala superior


para uma janela de indicador
separada

indicator_labelN string Define o rótulo para a N-ésima


série gráfica exibida na Janela
de Dados. Para séries gráficas
que requerem múltiplos
buffers de indicador
(DR AW_CANDLES,

© 2000-2018, MetaQuotes Software Corp.


240 Elementos Básicos da Linguagem

DRAW_FILLING e outros), os
nomes de rótulos são definidos
por meio do separador ';'.

indicator_colorN color A cor de exibição da linha N,


onde N é o número da série
gráfica; numeração
começando em 1

indicator_widthN int Espessura de linha na série


gráfica, onde N - número da
série gráfica, numeração
começando em 1

indicator_styleN int Estilo da linha na série


gráfica, especificado a partir
dos valores de
ENUM _L INE_S TYLE. N -
número de séries gráficas,
numeração começando em 1

indicator_typeN int T ipo de plotagem gráfica,


especificado a partir de
valores de ENUM _DR AW_TYPE.
N - número de séries gráficas,
numeração começando em 1

indicator_levelN double Nível horizontal de N em uma


janela de indicador separada

indicator_levelcolor color Cor do níveis horizontais do


indicador

indicator_levelwidth int Espessura dos níveis


horizontais do indicador
indicator_levelstyle int Estilo dos níveis horizontais do
indicador

script_s how_confirm Exibe uma janela de


confirmação antes de executar
o script

script_s how_inputs Exibe uma janela com as


propriedades antes de
executar o script e desabilita
esta janela de confirmação

tester_indicator string Nome de um indicador


customizado no formato de
"nome_indicador.ex5".
Indicadores que requeiram
teste são definidos
automaticamente a partir da

© 2000-2018, MetaQuotes Software Corp.


241 Elementos Básicos da Linguagem

função iCustom(), se o
correspondente parâmetro é
definido através de uma string
constante. Para todos os
demais casos (uso da função
IndicatorCreate() ou uso de
uma string não-constante no
parâmetro que define o nome
do indicador) esta propriedade
é requerida

tester_file string Nome de arquivo para um


testador com a indicação de
extensão, entre aspas duplas
(como uma string constante).
O arquivo especificado será
passado para o T estador de
Estratégias. Arquivos de
entrada para serem testados,
se forem necessários, devem
sempre ser especificados.

tester_library string Nome da biblioteca (library)


com a extensão, entre aspas
duplas. Uma biblioteca pode
ter extensão dll ou ex5.
Bibliotecas que requeiram
teste são definidos
automaticamente. Contudo, se
alguma biblioteca for usada
por um indicador customizado,
esta propriedade é requerida

tester_set string Nome de arquivo set com


valores e o step dos
parâmetros de entrada. O
arquivo especificado será
transferido para testador
antes do teste ou optimização.
O nome do arquivo deve ser
especificado com a extensão e
usando aspas como uma string
constante.

Se, no nome do arquivo set,


você especificar o nome do
expert e o número de versão
"<expert_name>_<number>.se
t" , ele será automaticamente
adicionado ao menu para
carregar as versões dos

© 2000-2018, MetaQuotes Software Corp.


242 Elementos Básicos da Linguagem

parâmetros de acordo com o


número de versão <number>.
Por exemplo, o nome " MACD
Sample_4.set" indica que se
trata de um arquivo set para o
expert " MACD Sample.mq5"
com um número de versão
igual 4.

Para estudar formato é


recomendado salvar
manualmente as configurações
de teste/otimização no
testador de estratégias, e, em
seguida, abrir o arquivo set
criado dessa maneira.

Exemplo de Descrição e Número de Versão


#property version "3.70" // Versão corrente do Expert Advisor
#property description "ZigZag universal com Pesavento Patterns"
#property description "No momento no indicador vários ZigZags com diferentes algorismos estão inclu
#property description "É possível embutir um grande número de outros indicadores exibindo os picos
#property description "fundos e automaticamente construir a partir destes topos e fundos várias fer

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

© 2000-2018, MetaQuotes Software Corp.


243 Elementos Básicos da Linguagem

#property indicator_type1 DRAW_CANDLES


#property indicator_width1 3
#property indicator_label1 "C open;C high;C low;C close"

© 2000-2018, MetaQuotes Software Corp.


244 Elementos Básicos da Linguagem

Incluindo Arquivos (#include)


A linha de comando #include pode ser colocada em qualquer lugar no programa, mas geralmente todas
as inclusões são colocadas no começo do código fonte. Formato da chamada:

#include <file_name>
#include "file_name"

Exemplos:
#include <WinUser32.mqh>
#include "mylib.mqh"

O preprocessador substitui a linha #include <file_name> com o conteúdo do arquivo W inUser32.mqh.


Colchetes angulares ("<>" ) indicam que o arquivo W inUser32.mqh file será obtido a partir do diretório
padrão (geralmente terminal_installation_directory\MQL5\Include). O diretório corrente não é vis ível.

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

© 2000-2018, MetaQuotes Software Corp.


245 Elementos Básicos da Linguagem

Importando Funções (#import)


Funções são importadas a partir de módulos MQL5 compilados (arquivos *.ex5) e a partir de módulos
do sistema operacional (arquivos *.dll). O nome do módulo é especificado na diretiva #import. Para
que o compilador formate corretamente a chamada da função importada e organize a correta
transferência de parâmetros, é necessária uma descrição completa das funções. Descrições de função
sucedem imediatamente à diretiva #import "nome do módulo". O novo comando #import (pode-se sem
parâmetros) completa o bloco da descrição das funções importadas.

#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.

A ordem de pesquisa do arquivo especificado após a palavra-chave #import é descrita na seção


Chamada de Funções Importadas.

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.

Nas funções importadas, você não pode usar como parâmetros :


· pointers (*);

· link s de objetos que contenham arrays dinâmicos e/ou ponteiros.

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);

© 2000-2018, MetaQuotes Software Corp.


246 Elementos Básicos da Linguagem

#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);
}

© 2000-2018, MetaQuotes Software Corp.


247 Elementos Básicos da Linguagem

Veja Também
Incluindo Arquivos

© 2000-2018, MetaQuotes Software Corp.


248 Elementos Básicos da Linguagem

Conditional Compilation (#ifdef, #ifndef, #else, #endif)


As diretivas do pré-processador são usadas ​pelo do compilador para pré-processamento do código
fonte antes de sua compilação. A diretiva sempre começa com o # (jogo da velha), por isso o
compilador proíbe o uso deste s ímbolo nos nomes das variáveis, funções, etc.

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.

As diretrizes de compilação condicional do pré-processador permitem compilar ou pular uma parte do


programa dependendo do cumprimento de uma determinada condição.

Essa condição pode assumir uma das seguintes formas.

#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
}

Dependendo do tipo de programa e do modo de compilação, os padrões macros são definidos da


seguinte forma:

__MQL5__ macro é definido ao compilar o arquivo *.mq5, __MQL4__ macro é definido ao compilar o
*.mq4.

© 2000-2018, MetaQuotes Software Corp.


249 Elementos Básicos da Linguagem

_DEBUG macro é definido ao compilar o modo de depuração.


_RELEASE macro É definido ao compilar no modo de liberação.

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
}

© 2000-2018, MetaQuotes Software Corp.


250 Elementos Básicos da Linguagem

Programação Orientada a Objetos


Programação orientada a objetos (OOP) é programar basicamente focada em dados, enquanto dados e
comportamento estão inseparavelmente ligados. Juntos, dados e comportamento, constituem uma
classe, enquanto objetos são instâncias de classe.

Os componentes da abordagem orientada a objetos são:

· Encapsulamento e extensibilidade de tipo

· H erança
· Polimorfismo
· Sobrecarga

· Funções virtuais
OOP considera computação como modelagem de comportamento. O item modelado é o objeto
representado pelas abstrações computacionais. Suponha que nós quiséssemos escrever "T etris " , um
jogo bem conhecido. Para fazer isso, nós devemos aprender como modelar a aparência de uma forma
aleatórias compostas de quatro quadrados ligados nas bordas. T ambém nós precisaríamos regular a
velocidade de queda das figuras e definir operações de rotação e deslocamento. A movimentação das
formas na tela é limitada pelas bordas da peça, este requerimento também deve ser modelado. Além
disso, linhas preenchidas de cubos devem ser destruídas e pontos conseguidos devem ser contados.

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.

© 2000-2018, MetaQuotes Software Corp.


251 Elementos Básicos da Linguagem

O conceito de OOP tem um conjunto de conceitos relacionados, incluindo o seguinte:

· Simulação de ações do mundo real

· T ipos de dados definidos pelo usuário


· Ocultamente de detalhes de implementação

· Possibilidade de reutilização de código através de herança


· I nterpretação de chamadas de função durante execução

Alguns destes conceitos são bastante vagos, alguns são abstratos, outros são gerais.

© 2000-2018, MetaQuotes Software Corp.


252 Elementos Básicos da Linguagem

Encapsulamento e Extensibilidade de Tipo


OOP é uma abordagem balanceada para escrever software. Dados e comportamento são empacotados
juntos. Este encapsulamento cria tipos de dados definidos pelo usuário, estendendo os tipos de dados
da linguagem e interagindo com eles. Extensibilidade de tipos é uma oportunidade de adicionar à
linguagem tipos de dados definidos pelo usuário, que são também fáceis de usar, tanto quanto os
tipos básicos.

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.

Encapsulamento é a habilidade de ocultar os detalhes de implementação quando a interface aberta


para o tipo definido pelo usuário é fornecida. Em MQL5, assim como em in C++, definições de classe e
estrutura (class e struct) são usadas para as provisões de encapsulamento em combinação com as
palavras-chave de acesso private, protected e public.

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
};

© 2000-2018, MetaQuotes Software Corp.


253 Elementos Básicos da Linguagem

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);
}

string CPerson::GetFirstName(string full_name)


{
int pos=StringFind(full_name," ");
if(pos>0) StringSetCharacter(full_name,pos,0);
return(full_name);
}

string CPerson::GetLastName(string full_name)


{
string ret_string;
int pos=StringFind(full_name," ");
if(pos>0) ret_string=StringSubstr(full_name,pos+1);
else ret_string=full_name;
return(ret_string);

© 2000-2018, MetaQuotes Software Corp.


254 Elementos Básicos da Linguagem

Também Veja
T ipos de Dados

© 2000-2018, MetaQuotes Software Corp.


255 Elementos Básicos da Linguagem

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.

Considere um exemplo de herança de formas geométricas. Para descrever a completa variedade de


formas simples (círculos, triângulos, retângulos, quadrados, etc.), a melhor forma é criar uma classe
base (ADT ), que é o predecessor de todas as classes derivadas.

Vamos criar uma classe base CS hape, 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 CS hape, serão declaradas como se segue:

© 2000-2018, MetaQuotes Software Corp.


256 Elementos Básicos da Linguagem

//--- A classe derivada círculo (Circle)


class CCircle : public CShape // Depois de um dois pontos, nós definimos a classe base
{ // a partir da qual a herança é feita
private:
int m_radius; // raio do círculo

public:
CCircle(){m_type=1;}// construtor, tipo 1
};

Para a classe do Quadrado, a declaração é semelhante:

//--- a classe derivada quadrado (Square)


class CSquare : public CShape // Depois de um dois pontos, nós definimos a classe base
{ // a partir da qual a herança é feita
private:
int m_square_side; // lado do quadrado

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
};

Um dos aspectos da classe derivada é a visibilidade (abertura) de seus sucessores membros


(herdeiros). As palavras-chave public, protected e private são usadas para indicar quão disponíveis os
membros da classe base estarão disponíveis para a classe derivada. A palavra-chave public após um
dois pontos no cabeçalho de uma classe derivada indica que os membros protegidos e públicos da
classe base CS hape devem ser herdados como membros protegidos e públicos da classe derivada
CCircle.

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 CS hapes. Isto é, o Quadrado
(CSquare) é uma Forma (CS hape), mas a Forma não necessariamente tem que ser um Quadrado.

© 2000-2018, MetaQuotes Software Corp.


257 Elementos Básicos da Linguagem

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:

#property copyright "Copyright 2011, MetaQuotes Software Corp."


#property link "https://www.mql5.com"
#property version "1.00"
//+------------------------------------------------------------------+
//| Exemplo de classe com alguns tipos de acesso  |
//+------------------------------------------------------------------+
class CBaseClass
{
private: //--- O membro privado não é disponível a partir de classe derivada
int m_member;
protected: //--- O método protegido é disponível a partir da classe base e suas classes d
int Member(){return(m_member);}
public: // O construtor de classe é disponível para todos os membros
CBaseClass(){m_member=5;return;};
private: //--- Um método particular para atribuir um valor para m_member
void Member(int value) { m_member=value;};

};
//+------------------------------------------------------------------+
//| 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

© 2000-2018, MetaQuotes Software Corp.


258 Elementos Básicos da Linguagem

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);

© 2000-2018, MetaQuotes Software Corp.


259 Elementos Básicos da Linguagem

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.

MQL5 não tem herança múltipla.

Também Veja
Estruturas e Classes

© 2000-2018, MetaQuotes Software Corp.


260 Elementos Básicos da Linguagem

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 CS hape, 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 (s hape) 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 CS hape, 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.

//--- A classe derivada Circle


class CCircle : public CShape // Depois do dois pontos definimos a classe base
{ // a partir do qual a herança é feita
private:
double m_radius; // raio do círculo

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
};

Para a classe Square, a declaração é a mesma:

//--- A classe derivada Square

© 2000-2018, MetaQuotes Software Corp.


261 Elementos Básicos da Linguagem

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 CS hape são
usados em nosso programa. Polimorfismo permite criar um array de objetos da classe base CS hape,
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 CS hape, 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

//--- Aqui preenchemos o array com objetos derivados


//--- Declaramos um ponteiro para o objeto de tipo CCircle
CCircle *circle=new CCircle();
//--- Definimos propriedades do objeto usando o ponteiro do círculo
circle.SetRadius(2.5);
//--- Colocamos o valor do ponteiro em shapes[0]
shapes[0]=circle;

//--- Criamos um outro objeto CCircle e escrevemos seu ponteiro em shapes[1]


circle=new CCircle();
shapes[1]=circle;
circle.SetRadius(5);

//--- Aqui nós intencionalmente "esquecemos" de definir um valor para shapes[2]


//circle=new CCircle();

© 2000-2018, MetaQuotes Software Corp.


262 Elementos Básicos da Linguagem

//circle.SetRadius(10);
//shapes[2]=circle;

//--- Definimos NULL para o elemento que não é usado


shapes[2]=NULL;

//--- Criamos um objeto CSquare e escrevemos seu ponteiro em shapes[3]


CSquare *square=new CSquare();
square.SetSide(5);
shapes[3]=square;

//--- Criamos um objeto CSquare e escrevemos seu ponteiro em shapes[4]


square=new CSquare();
square.SetSide(10);
shapes[4]=square;

//--- Temos um array de ponteiros, obtemos seu tamanho


int total=ArraySize(shapes);
//--- Passamos em um loop através de todos os ponteiros no array
for(int i=0; i<5;i++)
{
//--- Se o ponteiro no índice especificado é válido
if(CheckPointer(shapes[i])!=POINTER_INVALID)
{
//--- Imprimi o tipo e área da forma
PrintFormat("O objeto do tipo %d tem a área %G",
shapes[i].GetType(),
shapes[i].GetArea());
}
//--- Se o ponteiro tem o tipo POINTER_INVALID
else
{
//--- Notificamos um erro
PrintFormat("Objeto shapes[%d] não foi inicializado! Seu ponteiro pe %s",
i,EnumToString(CheckPointer(shapes[i])));
}
}

//--- Devemos excluir todos os objetos criados dinamicamente


for(int i=0;i<total;i++)
{
//--- Nós podemos excluir somente objetos com ponteiros do tipo POINTER_DYNAMIC
if(CheckPointer(shapes[i])==POINTER_DYNAMIC)
{
//--- Notificação de exclusão
PrintFormat("Excluindo shapes[%d]",i);
//--- Excluímos um objeto por meio de seu ponteiro
delete shapes[i];
}

© 2000-2018, MetaQuotes Software Corp.


263 Elementos Básicos da Linguagem

}
}

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.

Além da redefinição de funções durante herança, o polimorfismo também inclui a implementação de


uma mesma função com diferentes conjuntos de parâmetros dentro de uma classe. Isso significa que a
classe pode ter várias funções com o mesmo nome, mas com um tipo e/ou conjunto de parâmetros
diferentes. Neste caso, o polimorfismo é implementado através de sobrecarga de função.

Também Veja
Standard Library

© 2000-2018, MetaQuotes Software Corp.


264 Elementos Básicos da Linguagem

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.

Sobrecarga de método é uma forma de realização de polimorfismo. Sobrecarga de métodos é realizado


em concordância com as mesmas regras da sobrecarga de função.

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:

1. busca dentre os métodos da classe;


2. busca dentre os métodos da classe base, consistentemente a partir do ancestral mais próximo até
o mais distante.
3. busca entre outras funções.
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
Recarregando Funções

© 2000-2018, MetaQuotes Software Corp.


265 Elementos Básicos da Linguagem

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 etrisS hape com a função virtual de desenhar é definjida na inclusão do arquivo
M T 5_T etisS hape.mqh.

//+------------------------------------------------------------------+
class CTetrisShape
{
protected:
int m_type;
int m_xpos;
int m_ypos;
int m_xsize;
int m_ysize;
int m_prev_turn;
int m_turn;
int m_right_border;
public:
void CTetrisShape();
void SetRightBorder(int border) { m_right_border=border; }
void SetYPos(int ypos) { m_ypos=ypos; }
void SetXPos(int xpos) { m_xpos=xpos; }
int GetYPos() { return(m_ypos); }
int GetXPos() { return(m_xpos); }
int GetYSize() { return(m_ysize); }
int GetXSize() { return(m_xsize); }
int GetType() { return(m_type); }
void Left() { m_xpos-=SHAPE_SIZE; }
void Right() { m_xpos+=SHAPE_SIZE; }

© 2000-2018, MetaQuotes Software Corp.


266 Elementos Básicos da Linguagem

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[]);
};

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 etrisS hape1 tem sua implementação própria
da função Draw():

class CTetrisShape1 : public CTetrisShape


{
public:
//--- desenhando formato
virtual void Draw()
{
int i;
string name;
//---
if(m_turn==0 || m_turn==2)
{
//--- horizontal
for(i=0; i<4; i++)
{
name=SHAPE_NAME+(string)i;
ObjectSetInteger(0,name,OBJPROP_XDISTANCE,m_xpos+i*SHAPE_SIZE);
ObjectSetInteger(0,name,OBJPROP_YDISTANCE,m_ypos);
}
}
else
{
//--- vertical
for(i=0; i<4; i++)
{
name=SHAPE_NAME+(string)i;
ObjectSetInteger(0,name,OBJPROP_XDISTANCE,m_xpos);
ObjectSetInteger(0,name,OBJPROP_YDISTANCE,m_ypos+i*SHAPE_SIZE);
}
}
}
}

A forma Quadrado é descrita por meio da classe CT etrisS hape6 e tem sua implementação própria do
método Draw():

class CTetrisShape6 : public CTetrisShape


{
public:
//--- desenhando formato

© 2000-2018, MetaQuotes Software Corp.


267 Elementos Básicos da Linguagem

virtual void Draw()


{
int i;
string name;
//---
for(i=0; i<2; i++)
{
name=SHAPE_NAME+(string)i;
ObjectSetInteger(0,name,OBJPROP_XDISTANCE,m_xpos+i*SHAPE_SIZE);
ObjectSetInteger(0,name,OBJPROP_YDISTANCE,m_ypos);
}
for(i=2; i<4; i++)
{
name=SHAPE_NAME+(string)i;
ObjectSetInteger(0,name,OBJPROP_XDISTANCE,m_xpos+(i-2)*SHAPE_SIZE);
ObjectSetInteger(0,name,OBJPROP_YDISTANCE,m_ypos+SHAPE_SIZE);
}
}
};

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:

© 2000-2018, MetaQuotes Software Corp.


268 Elementos Básicos da Linguagem

class CFoo
{
void virtual func(int x) const { }
};

A seguir, o método é substituído na classe que está sendo herdada:

class CBar : public CFoo


{
void func(short x) { }
};

No entanto, no caso de haver um erro, o tipo de argumento é alterado de int para s hort. 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.

class CBar : public CFoo


{
void func(short x) override { }
};

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 { }
};

class CBar : public CFoo


{
void func(int) { }
};

Como no exemplo acima, ao tentar substituir o método usando o modificador final, o compilador irá
emitir um erro:

'CFoo::func' method declared as 'final' cannot be overridden by 'CBar::func'


see declaration of 'CFoo::func'

Veja Também
Standard Library

© 2000-2018, MetaQuotes Software Corp.


269 Elementos Básicos da Linguagem

Membros Estáticos de uma Classe/Estrutura


Membros Estáticos
Os membros de uma classe podem ser declarados usando o modificador de classe de armazenamento
static. Esses membros de dados são compartilhados por todos as instâncias desta classe e são
armazenados em um lugar. Membros de dados não estáticos são criados para cada variável de objeto
de classe.

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

onde class_name é o nome da classe, e variable é o nome do membro da classe.

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;

© 2000-2018, MetaQuotes Software Corp.


270 Elementos Básicos da Linguagem

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
};

//--- Inicialização da constante estática da classe CStack


const int CStack::s_max_length=1000;

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);

© 2000-2018, MetaQuotes Software Corp.


271 Elementos Básicos da Linguagem

}
//--- 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  |

© 2000-2018, MetaQuotes Software Corp.


272 Elementos Básicos da Linguagem

//+------------------------------------------------------------------+
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, Referências. Modificador & e Palavra-chave this

© 2000-2018, MetaQuotes Software Corp.


273 Elementos Básicos da Linguagem

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 :
· para especificar os tipos de argumentos da função,

· para especificar o tipo de valor de retorno da função,

· para declarar as variáveis dentro da definição da função

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):

© 2000-2018, MetaQuotes Software Corp.


274 Elementos Básicos da Linguagem

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:

//--- criar array


double array[];
int size=50;
ArrayResize(array,size);
//--- preenche com valores aleatórios
for(int i=0;i<size;i++)
{
array[i]=MathRand();
}

//--- encontra a posição do valor mais alto no array


int max_position=ArrayMaximum(array);
//--- agora, obtém o valor mais alto propriamente no array
double max=array[max_position];
//--- exibe o valor encontrado
Print("Valor max = ",max);

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 :

//--- encontra a posição do valor mais alto no array


int max_position=ArrayMaximum(array);
//--- agora, receber o valor mais alto propriamente no array
double max=array[max_position];

nós podemos usar somente uma linha, cujo resultado retornado tem o mesmo tipo que o array passado
para a função:

//--- encontra o valor mais alto


double max=ArrayMax(array);

Neste caso, o tipo do resultado retornado pela função ArrayMax() corresponderá automaticamente ao
tipo do array.

© 2000-2018, MetaQuotes Software Corp.


275 Elementos Básicos da Linguagem

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));
}

© 2000-2018, MetaQuotes Software Corp.


276 Elementos Básicos da Linguagem

Os templates de função não deve ser declarados com as palavras-chave export, virtual e #import.

Sobrecarga de funções de modelo


Em alguns casos, pode ser necessário sobrecarregar uma função de modelo. Por exemplo, temos uma
função de modelo que grava, no primeiro parâmetro, o valor do segundo parâmetro com ajuda da
conversão explícita de tipos. Na linguagem MQL5, é proibida a conversão do tipo string para o tipo
bool, nós podemos fazer isto sozinhos, para tal fim, criamos a sobrecarga da função de modelo. Por
exemplo:

//+------------------------------------------------------------------+
//| 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

© 2000-2018, MetaQuotes Software Corp.


277 Elementos Básicos da Linguagem

Qual é a melhor coisa sobre os modelos?


Os modelos das funções são usados quando é necessário realizar as mesmas operações com diferentes
tipos de dados, por exemplo, localizar o elemento máximo na matriz. A principal vantagem da
utilização de modelos é que o programador não necessita escrever uma sobrecarga separada para cada
tipo. Ou seja, em vez de várias declarações do conjunto de sobrecargas para cada tipo

double ArrayMax(double array[])


{
...
}
int ArrayMax(int array[])
{
...
}
uint ArrayMax(uint array[])
{
...
}
long ArrayMax(long array[])
{
...
}
datetime ArrayMax(datetime array[])
{
...
}

basta escrever uma função de modelo

template<typename T>
T ArrayMax(T array[])
{
if(ArraySize()==0)
return(0);
uint max_index=ArrayMaximum(array);
return(array[max_index]);
}

e, em seguida, usá-la em seu código:

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.

© 2000-2018, MetaQuotes Software Corp.


278 Elementos Básicos da Linguagem

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 :

#define TOSTR(x) #x+" " // macro para exibir o nome do objeto


//+------------------------------------------------------------------+
//| Classe vector para armazenar elementos do tipo T |
//+------------------------------------------------------------------+
template <typename T>
class TArray
{
protected:
T m_array[];
public:
//--- por padrão, o construtor cria uma matriz de 10 elementos
void TArray(void){ArrayResize(m_array,10);}
//--- construtor para criar um vetor com o tamanho definido da matriz
void TArray(int size){ArrayResize(m_array,size);}
//--- retorna o tipo e número de dados que são armazenados no objeto do tipo TArray
string Type(void){return(typename(m_array[0])+":"+(string)ArraySize(m_array));};
};

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);
}

Resultado do script:

double_array (double:10)
int_array (int:15)
string_array (string:20)

© 2000-2018, MetaQuotes Software Corp.


279 Elementos Básicos da Linguagem

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]);

© 2000-2018, MetaQuotes Software Corp.


280 Elementos Básicos da Linguagem

}
//+------------------------------------------------------------------+
//| 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[])

© 2000-2018, MetaQuotes Software Corp.


281 Elementos Básicos da Linguagem

{
...
}

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":

template<typename Key, template Value>


class TMap
{
...
}

Veja também
Modelos de funções, Sobrecarga

© 2000-2018, MetaQuotes Software Corp.


282 Elementos Básicos da Linguagem

Classes abstratas e funções meramente virtuais (puras)


As classes abstratas estão projetadas para criar entidades generalizadas, cuja base, no futuro, prevê
a criação de classes derivadas mais específicas. Uma classe abstrata é uma classe que pode ser
utilizada apenas como classe base para alguma outra classe, por isso é imposs ível criar um objeto do
tipo classe abstrata

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
};

//--- exemplos de utilização incorreta


new CAnimal; // erro 'CAnimal' - compilador выдаст ошибку "não é possível instanciar classe
CAnimal some_animal; // ошибка 'CAnimal' - компилятор выдаст ошибку "não é possível instanciar clas

//--- exemplos de utilização correta


new CCat; // sem erros - a classe CCat não é abstrata
CCat cat; // sem erros - a classe CCat não é abstrata

© 2000-2018, MetaQuotes Software Corp.


283 Elementos Básicos da Linguagem

Restrições sobre o uso de classes abstratas


Quando você chamar, com o construtor, uma função virtual pura (direta ou indiretamente), o
resultado será incerto.

//+------------------------------------------------------------------+
//| 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"
}
};

No entanto, os construtores e destruidores de classes abstratas podem chamar outras funções


membro.

© 2000-2018, MetaQuotes Software Corp.


284 Constantes, Enumeradores e Estruturas

Constantes, Enumeradores e Estruturas


Para simplificar a escrita do programa e tornar os textos do programa mais convenientes para
percepção, a linguagem MQL5 fornece constantes e enumeradores padrões pré-definidos. Além disso,
estruturas de serviço são usados para armazenar informação.

Constantes padrão são similares a macros e são do tipo int.

As constantes são agrupadas por seus propósitos :

· 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 do estado do ambiente descrevem propriedades do programa MQL5, mostram


informações sobre o terminal do cliente, instrumentos financeiros e conta corrente;
· Constantes de negociação permite especificar uma variedade de informações no decorrer da
negociação;
· Constantes nomeadas são constantes da linguagem MQL5;

· Estruturas de dados descrevem formatos de armazenamento de dados utilizados ;

· Códigos de erros e avisos descrevem mensagens do compilador e respostas do servidor de


negociação a solicitações de negociação;
· Constantes de entrada/saída são projetados para trabalhar com funções de arquivo e exibir de
mensagens na tela através da função MessageBox().

© 2000-2018, MetaQuotes Software Corp.


285 Constantes, Enumeradores e Estruturas

Constantes de Gráfico
As constantes descrevendo várias propriedades de gráficos são agrupadas na seguinte forma:

· T ipos de eventos – eventos que ocorrem quando se trabalha com gráficos ;


· Janelas de tempo (timeframes) de gráfico – períodos incorporados padrão;
· Propriedades de gráfico – identificadores que são usados como parâmetros de funções de gráfico;
· Constantes de posicionamento - valor de um parâmetro da função ChartNavigate();

· Exibição de gráficos - definição da aparência do gráfico.

© 2000-2018, MetaQuotes Software Corp.


286 Constantes, Enumeradores e Estruturas

Tipos de Eventos de Gráficos


Existem 11 tipos de eventos que podem ser processados usando a função pré-definida OnChartEvent().
Para eventos customizados 65535 identificadores são fornecidos na faixa de CH ART EVENT_CUS T OM a
CH ART EVENT_CUS T OM _LAS T inclusive. Para gerar um evento customizado, a função
EventChartCustom() deve ser usada.

ENUM_CHART_EVENT

ID Descrição
CH ART EVENT_KEYDOWN T eclada
CH ART EVENT_MOUSE_MOVE Movimento de mouse, cliques de mouse (se
CH ART_EVENT_MOUSE_MOVE=true é definido
para o gráfico)

CH ART EVENT_MOUSE_WH EEL Pressionada o rodada a roda do mouse (se


definida a propriedade para o gráfico
CH ART_EVENT_MOUSE_WH EEL =true)

CH ART EVENT_OBJECT_CR EAT E Objeto gráfico criado (se


CH ART_EVENT_OBJECT_CR EAT E=true é definido
para o gráfico)

CH ART EVENT_OBJECT_CH ANGE Propriedade do objeto gráfico alterada via


janela de diálogo de propriedades

CH ART EVENT_OBJECT_DELET E Objeto gráficoexcluído (se


CH ART_EVENT_OBJECT_DELET E=true é definido
para o gráfico)

CH ART EVENT_CL ICK Dar um clique em um gráfico


CH ART EVENT_OBJECT_CL ICK Dar um clique em um objeto gráfico
CH ART EVENT_OBJECT_DR AG Arrastar e soltar um objeto gráfico

CH ART EVENT_OBJECT_ENDEDIT Fim de edição de texto no objeto gráfico Edit


CH ART EVENT_CH ART_CH ANGE Alteração do tamanho do gráfico ou modificação
das propriedades do gráfico através da janela de
Propriedades
CH ART EVENT_CUS T OM O número inicial de um evento de uma faixa de
eventos customizados

CH ART EVENT_CUS T OM _LAS T O número final de um evento de uma faixa de


eventos customizados

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.

© 2000-2018, MetaQuotes Software Corp.


287 Constantes, Enumeradores e Estruturas

Evento Valor do Valor do Valor do Valor do


parâmetro id parâmetro parâmetro parâmetro
lparam dparam sparam
Evento de uma CH ART EVENT_KE código de uma Repita a O valor da string
teclada YDOWN tecla pressionada contagem (o de uma pequena
número de vezes máscara de
que a tecla é descrever o
repetida como estado de botões
um resultado de do teclado
que o usuário
pressiona a
tecla)

Eventos de CH ART EVENT_MO a coordenada X a coordenada Y O valor de string


mouse(se USE_MOVE de uma máscara
CH ART_EVENT_ de bites
MOUSE_MOVE=tr descrevendo o
ue é definido estado de botões
para o gráfico) de mouse

Evento da roda CH ART EVENT_MO Sinalizadores de Valor Delta de —


do mouse (se, USE_WH EEL estados de teclas rolagem de roda
para o gráfico, e botões do de mouse
definida a mouse,
propriedade coordenadas X e
CH ART_EVENT_ Y do mouse. A
MOUSE_WH EEL = descrição é feita
true) no exemplo
abaixo

Evento de CH ART EVENT_OB — — Nome do objeto


criação de JECT_CREAT E gráfico criado
objeto gráfico(se
CH ART_EVENT_O
BJECT_CREAT E=t
rue é definido
para o gráfico)

Evento de CH ART EVENT_OB — — Nome do objeto


mudança de uma JECT_CH ANGE gráfico
propriedade de modificado
objeto via janela
de diálogo de
propriedades

Evento de CH ART EVENT_OB — — Nome do objeto


exclusão de JECT_DELET E gráfico excluído
objeto gráfico
(se
CH ART_EVENT_O
BJECT_DELET E=t

© 2000-2018, MetaQuotes Software Corp.


288 Constantes, Enumeradores e Estruturas

rue está definido


para o gráfico)

Evento de um CH ART EVENT_C a coordenada X a coordenada Y —


click de mouse L I CK
no gráfico

Evento de um CH ART EVENT_OB a coordenada X a coordenada Y Nome do objeto


click de mouse JECT_CLICK gráfico, na qual
num objeto o evento ocorreu
gráfico
pertencente ao
gráfico

Evento de um CH ART EVENT_OB — — Nome do objeto


objeto gráfico JECT_DRAG gráfico movido
arrastado usando
o mouse

Evento da edição CH ART EVENT_OB — — Nome do objeto


de texto JECT_ENDEDIT gráfico
finalizada na LabelEdit, cuja
caixa de entrada edição de texto
do objeto gráfico foi concluída
LabelEdit

Evento de CH ART EVENT_C — — —


alteração do H ART_CH ANGE
tamanho do
gráfico ou
modificação das
propriedades do
gráfico através
da janela de
Propriedades
ID do evento de CH ART EVENT_CU Valor definido Valor definido Valor definido
usuário sob N S T OM +N pela função pela função pela função
número EventChartCusto EventChartCusto EventChartCusto
m() m() m()

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

© 2000-2018, MetaQuotes Software Corp.


289 Constantes, Enumeradores e Estruturas

//+------------------------------------------------------------------+
//| 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;

© 2000-2018, MetaQuotes Software Corp.


290 Constantes, Enumeradores e Estruturas

case KEY_NUMLOCK_5: Print("O KEY_NUMLOCK_5 foi pressionado"); break;


default: Print("Algumas teclas não listadas foram pressionadas");
}
ChartRedraw();
}
//--- o objeto foi excluído
if(id==CHARTEVENT_OBJECT_DELETE)
{
Print("O objeto com o nome ",sparam," foi excluído");
}
//--- o objeto foi criado
if(id==CHARTEVENT_OBJECT_CREATE)
{
Print("O objeto com o nome ",sparam," foi criado");
}
//--- o objeto foi movido ou suas coordenadas de ponto de ancoragem foram alteradas
if(id==CHARTEVENT_OBJECT_DRAG)
{
Print("O ponto de ancoragem das coordenadas do objeto com o nome ",sparam," foi alterado");
}
//--- o texto na Edição do objeto foi alterado
if(id==CHARTEVENT_OBJECT_ENDEDIT)
{
Print("O texto no campo da Edição do objeto com o nome ",sparam," foi alterado");
}
}

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

2 Estado do botão direito do mouse

3 Estado do botão S HIFT

4 Estado do botão CTR L

5 Estado do botão do meio do mouse

6 Estado do primeiro botão extra do mouse

7 Estado do segundo botão extra do mouse

Exemplo:
//+------------------------------------------------------------------+
//| Função de inicialização do Expert  |
//+------------------------------------------------------------------+
void OnInit()

© 2000-2018, MetaQuotes Software Corp.


291 Constantes, Enumeradores e Estruturas

{
//--- habilitar mensagens do CHART_EVENT_MOUSE_MOVE
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 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.

Exemplo de processamento de evento CH ARTEVENT_MOUSE_WH EEL:


//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
init OnInit()
{
//--- ativação da mensagem de rolagem de roda do mouse
ChartSetInteger(0,CHART_EVENT_MOUSE_WHEEL,1);
//--- a atualização forçada das propriedades do gráfico garante a prontidão para o processamento de
ChartRedraw();
//---
return(INIT_SUCCEEDED);

© 2000-2018, MetaQuotes Software Corp.


292 Constantes, Enumeradores e Estruturas

}
//+------------------------------------------------------------------+
//| 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

© 2000-2018, MetaQuotes Software Corp.


293 Constantes, Enumeradores e Estruturas

Janela temporal de Gráfico


T odas as janelas de tempo (timeframes) pré-definidas de gráficos têm identificadores únicos. O
identificador PERIOD_CURR ENT significa o período corrente de um gráfico, no qual um programa MQL5
está rodando.

ENUM_TIMEFRAMES

ID Descrição
PERIOD_CURRENT 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

© 2000-2018, MetaQuotes Software Corp.


294 Constantes, Enumeradores e Estruturas

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 ig hest() e iLowest(). Pode ser um dos valores
da enumeração

ENUM_SERIESMODE

Identificador Descrição
MODE_OPEN Preço de abertura
MODE_LOW Preço mínimo
MODE_HIGH Preço máximo
MODE_CLOSE Preço de fechamento
MODE_VOLUME Volume de tick s
MODE_R EAL _VOLUME Volume real
MODE_S PR EAD Spread

Veja Também
PeriodSeconds, Period, Data e H ora, Visibilidade de objetos

© 2000-2018, MetaQuotes Software Corp.


295 Constantes, Enumeradores e Estruturas

Propriedades de Gráfico
Identificadores de enumeradores ENUM _CH ART_PROPERTY 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.

Para funções ChartSetInteger() e ChartGetInteger()

ENUM_CHART_PROPERTY_INTEGER

ID Descrição Tipo de Propriedade


CH ART_S H OW Plotagem do gráfico de preços. bool
Se estiver definido o valor
false, será desativada a
plotagem de quaisquer
atributos do gráfico de preços
e serão excluídos todos os
recuos das bordas do gráfico,
isto é: escalas de tempo e
preço, barra de navegação
rápida, eventos de Calendário,
rótulos de transações, dicas de
indicadores e barras, sub-
janela de indicadores,
histogramas de volumes, etc.
A desativação da plotagem é
uma solução ideal para criar
uma interface personalizada de
programa com utilização de
recursos gráficos.
Os objetos gráficos são
plotados sempre
independentemente do valor
definido da propriedade
CH ART_S H OW .

CH ART_IS _OBJECT Identificado objeto de bool r/o


"Gráfico" (OBJ_CH ART ) -

© 2000-2018, MetaQuotes Software Corp.


296 Constantes, Enumeradores e Estruturas

retorna true para um objeto


gráfico. R etorna false para um
gráfico real

CH ART_BRING_T O_T OP Exibe o gráfico no topo de bool w/o


outros gráficos

CH ART_CONT EXT_MENU H abilitar/desabilitar o acesso bool (valor por padrão true)


ao menu de contexto
pressionando o botão direito do
mouse.
O valor
CH ART_CONT EXT_MENU=false
desativa apenas o menu de
contexto do gráfico, ao
acontecer isto, o menu de
contexto, para objetos no
gráfico, fica disponível.

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_MOUSE_SCR OLL Rolagem do gráfico bool


horizontalmente usando o
botão esquerdo do mouse.
Rolagem vertical também está
disponível se for definido como
true o valor de todas as
seguintes propriedades :
CH ART_SCALEFIX,
CH ART_SCALEFIX_11 ou
CH ART_SCALE_PT_PER_BAR
Se
CH ART_MOUSE_SCR OLL =false,
a rolagem do gráfico através
da roda do mouse estará
indisponível.

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_EVENT_MOUSE_MOVE Eventos bool


CH ART EVENT_MOUSE_MOVE)
envia notificações de
movimento de mouse e clique
de mouse a todos os programas
MQL5 num gráfico

© 2000-2018, MetaQuotes Software Corp.


297 Constantes, Enumeradores e Estruturas

CH ART_EVENT_OBJECT_CR EAT Envia uma notificação de um bool


E evento de criação de novo
objeto
(CH ART EVENT_OBJECT_CR EAT
E) para todos os programas
MQL5 em um gráfico

CH ART_EVENT_OBJECT_DELET Envia uma notificação de um bool


E evento de exclusão de objeto
(CH ART EVENT_OBJECT_DELET E
) para todos os programas
MQL5 em um gráfico

CH ART_MODE T ipo de gráfico (candles, enum ENUM _CH ART_MODE


barras ou linha)

CH ART_FOR EGR OUND Gráfico de preços no primeiro bool


plano

CH ART_S HIFT Modo de encaixe do gráfico de bool


preço a partir da borda direita

CH ART_AUT OSCR OLL Modo de movimentação bool


automática para a borda
direita do gráfico

CH ART_KEYBOARD_CONTR OL Autorização para controlar o bool


gráfico usando as teclas
("H ome" , " End" , "PageUp" , "+" ,
" -" , " Seta para cima" , etc.).
Após definir
CH ART_KEYBOARD_CONTR OL =f
alse, é poss ível desativar o
enrolamento e o ajuste de
escala do gráfico, no entanto,
ao fazer isto, mantem-se a
possibilidade de receber
eventos, ao clicar essas teclas,
em OnChartEvent().

CH ART_QUICK_NAVIGATION Permite ao gráfico interceptar bool


as teclas Space e Enter para
ativar a barra de navegação. A
barra de navegação rápida é
exibida automaticamente
abaixo do gráfico, ao clicar
duas vezes ou pressionar as
teclas Space/Enter. Desse
modo, é poss ível alterar
rapidamente o s ímbolo,
timeframe e data da primeira
barra vis ível.

© 2000-2018, MetaQuotes Software Corp.


298 Constantes, Enumeradores e Estruturas

CH ART_SCALE Escala int de 0 a 5

CH ART_SCALEFIX Modo de escala fixo bool

CH ART_SCALEFIX_11 Modo de escala 1:1 bool

CH ART_SCALE_PT_PER_BAR Escala para ser especificada bool


em pontos por barra

CH ART_S H OW_OH LC Exibe valores OH LC no canto bool


superior esquerdo

CH ART_S H OW_BID_L INE Exibe valores de preço de bool


venda como uma linha
horizontal em um gráfico
CH ART_S H OW_AS K_L INE Exibe valores de preço de bool
compra como uma linha
horizontal em um gráfico
CH ART_S H OW_LAS T_L INE Exibe valores de último preço bool
como uma linha horizontal em
um gráfico

CH ART_S H OW_PERIOD_SEP Exibe separadores verticais bool


entre períodos adjacentes

CH ART_S H OW_GRID Exibe grade no gráfico bool

CH ART_S H OW_VOLUMES Exibe volume no gráfico enum


ENUM _CH ART_VOLUME_MODE

CH ART_S H OW_OBJECT_DESCR Descrições pop-up de objetos bool


gráficos

CH ART_VIS IBLE_BAR S O número de barras no gráfico int r/o


que podem ser exibidas

CH ART_WINDOW S _T OT AL O número total de janelas de int r/o


gráficos, incluindo sub-janelas
de indicadores

CH ART_WINDOW_IS _VIS IBLE Visibilidade de sub-janelas bool r/o modificador - número


de sub-janela

CH ART_WINDOW_H ANDLE Manuseio da janela do gráfico int r/o


(HWND)

CH ART_WINDOW_YDIS T ANCE A distância entre a moldura int r/o modificador - número


superior da sub-janela do de sub-janela
indicador e a moldura superior
da janela do gráfico principal,
ao longo do eixo Y vertical, in
pixels. No caso de um evento
de mouse, as coordenadas do
cursor são passadas em termos

© 2000-2018, MetaQuotes Software Corp.


299 Constantes, Enumeradores e Estruturas

das coordenadas da janela do


gráfico principal, enquanto que
as coordenadas de objetos
gráficos em uma sub-janela do
indicador são definidas em
relação ao canto superior
esquerdo da sub-janela.
O valor é requerido para
converter as coordenadas
absolutas do gráfico principal
em coordenadas locais da sub-
janela para correto trabalho
com os objetos gráficos, cujas
coordenadas são definidas em
relação ao canto superior
esquerdo da moldura da sub-
janela.

CH ART_FIR S T_VIS IBLE_BAR Número das primeiras barras int r/o


vis íveis no gráfico. A
indexação de barras é a mesma
para séries de tempo.

CH ART_WIDTH_IN_BAR S Largura de gráfico em barras int r/o

CH ART_WIDTH_IN_PIXELS Largura de gráfico em pixels int r/o

CH ART_H EIGHT_IN_PIXELS Altura de gráfico em pixels int modificador - número de


sub-janela

CH ART_COLOR_BACKGR OUND Cor de fundo do gráfico color

CH ART_COLOR_FOR EGR OUND Cor dos eixos, escalas e linha color


OH LC

CH ART_COLOR_GRID Cor da grade color

CH ART_COLOR_VOLUME Cor dos volumes e níveis de color


abertura de posição

CH ART_COLOR_CH ART_UP Cor para a barra de alta, color


sombras e bordas de candles de
alta

CH ART_COLOR_CH ART_DOWN Cor para a barra de baixa, color


sombras e bordas de candles de
baixa

CH ART_COLOR_CH ART_L INE Cor de gráfico de linha e cor de color


candles "Doji" japoneses

CH ART_COLOR_CANDLE_BULL Cor de corpo de um candle de color


alta

© 2000-2018, MetaQuotes Software Corp.


300 Constantes, Enumeradores e Estruturas

CH ART_COLOR_CANDLE_BEAR Cor de corpo de um candle de color


baixa

CH ART_COLOR_BID Cor de nível de preço de venda color

CH ART_COLOR_AS K Cor de nível de preço de color


compra

CH ART_COLOR_LAS T Cor de linha do último preço de color


operação executada

CH ART_COLOR_S T OP_LEVEL Cor de níveis de ordem de stop color


(Stop Loss e T ak e Profit)

CH ART_S H OW_TR ADE_LEVELS Exibição de níveis de bool


negociação no gráfico (níveis
de abertura de posição, Stop
Loss, T ak e Profit e ordens
pendentes

CH ART_DR AG_TR ADE_LEVELS Permissão para arrastar os bool


níveis de negociação num
gráfico com um mouse. O
modo de arrastar é ativado
pelo padrão (valor true)

CH ART_S H OW_DAT E_SCALE Exibição da escala de tempo bool


em um gráfico

CH ART_S H OW_PRICE_SCALE Exibição da escala de preço em bool


um gráfico

CH ART_S H OW_ONE_CL ICK S howing the " One click trading " bool
panel on a chart

CH ART_IS _MAXIM IZED Janela de gráfico maximizada bool

CH ART_IS _M INIM IZED Janela de gráfico minimizada bool

CH ART_IS _DOCKED A janela do gráfico é fixa. Se bool


for definido o valor false, o
gráfico pode ser arrastado para
fora do terminal

CH ART_FLOAT_LEFT Coordenada esquerda do int


gráfico desacoplado em relação
à tela virtual
CH ART_FLOAT_T OP Coordenada superior do gráfico int
desacoplado em relação à tela
virtual

CH ART_FLOAT_RIGHT Coordenada direita do gráfico int


desacoplado em relação à tela
virtual

© 2000-2018, MetaQuotes Software Corp.


301 Constantes, Enumeradores e Estruturas

CH ART_FLOAT_BOTT OM Coordenada inferior do gráfico int


desacoplado em relação à tela
virtual

Para funções ChartSetDouble() e ChartGetDouble()

ENUM_CHART_PROPERTY_DOUBLE

ID Descrição Tipo de Propriedade


CH ART_S HIFT_S IZE O tamanho da barra zero double (de 10 to 50 porcento)
encaixada a partir da borda
direita em porcentagens

CH ART_FIXED_POS ITION Posição fixa do gráfico a partir double


da borda esquerda em valor
percentual. A posição fixa do
gráfico é marcada por um
pequeno triângulo cinza no eixo
do tempo horizontal. Ele é
exibido somente se a rolagem
automática do gráfico para a
direita na chegada de um tick
(preço novo) estiver
desabilitada (veja a
propriedade
CH ART_AUT OSCR OLL). A barra
em uma posição fixa
permanece no mesmo lugar ao
se ampliar e reduzir o gráfico.

CH ART_FIXED_MAX Máximo fixo do gráfico double

CH ART_FIXED_M IN M ínimo fixo do gráfico double

CH ART_POINT S _PER_BAR Escala em pontos por barra double

CH ART_PRICE_M IN M ínimo do gráfico double r/o modificador -


número de sub-janela

CH ART_PRICE_MAX Máximo do gráfico double r/o modificador -


número de sub-janela

Para funções ChartSetString() e ChartGetString()

ENUM_CHART_PROPERTY_STRING

ID Descrição Tipo de Propriedade


CH ART_COMMENT T exto de um comentário em string
um gráfico

CH ART_EXPERT_NAME Nome do conselheiro executado string


no gráfico com chart_id

© 2000-2018, MetaQuotes Software Corp.


302 Constantes, Enumeradores e Estruturas

especificado

CHART_SCRIPT_NAME Nome do script executado no string


gráfico com chart_id
especificado

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

© 2000-2018, MetaQuotes Software Corp.


303 Constantes, Enumeradores e Estruturas

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)

CH ART_CURR ENT_POS Posição corrente


CH ART_END Final do gráfico (os preços mais recentes)

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();
}

© 2000-2018, MetaQuotes Software Corp.


304 Constantes, Enumeradores e Estruturas

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.

A maneira específica de exibir o gráfico de preço é definida definida pela função


ChartSetInteger(chart_handle,CH ART_MODE, chart_mode), onde chart_mode é um dos valores da
enumeração ENUM _CH ART_MODE.

ENUM_CHART_MODE

ID Descrição
CH ART_BAR S Exibe como uma seqüência de barras

CH ART_CANDLES Exibe como candles japoneses

CH ART_L INE Exibe como uma linha desenha por preços de


fechamento

Para especificar o modo de exibição de volumes em um gráfico de preços a função


ChartSetInteger(chart_handle, CH ART_S H OW_VOLUMES, volume_mode) é usada, onde volume_mode é
um dos valores da enumeração ENUM _CH ART_VOLUME_MODE.

ENUM_CHART_VOLUME_MODE

ID Descrição
CH ART_VOLUME_HIDE Volumes não são exibidos
CH ART_VOLUME_TICK Volumes de tick (mudança de preço)
CH ART_VOLUME_R EAL Volume de negociação

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

© 2000-2018, MetaQuotes Software Corp.


305 Constantes, Enumeradores e Estruturas

ChartSetInteger(handle,CHART_SHOW_VOLUMES,CHART_VOLUME_TICK);
}

Também Veja
ChartOpen, ChartID

© 2000-2018, MetaQuotes Software Corp.


306 Constantes, Enumeradores e Estruturas

Exemplos de como trabalhar com um gráfico


Exemplos de como trabalhar com propriedades do gráfico. Uma ou duas funções completas são
exibidas para cada propriedade. Estas funções permitem configurar/receber o valor da propriedade.
Essas funções podem ser utilizadas " como estão" em aplicativos personalizados MQL5.

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.

O código fonte do painel está localizado abaixo.

Propriedades do Gráfico e Exemplos de Funções para Trabalhar


com Eles
· CHART_IS_OBJECT define se um objeto é um gráfico real ou um objeto gráfico.
//+-------------------------------------------------------------------------+
//| Definir se um objeto é um gráfico. Se ele for  |
//| um objeto gráfico, o resultado é verdadeiro. Se ele for um gráfico real |
//| o resultado da variável foi o valor falso. |
//+-------------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


307 Constantes, Enumeradores e Estruturas

bool ChartIsObject(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();
//--- obter a propriedade do gráfico
if(!ChartGetInteger(chart_ID,CHART_IS_OBJECT,0,value))
{
//--- exibe uma mensagem para o diário Experts
Print(__FUNCTION__+", Código de erro = ",GetLastError());
//--- retorna false
return(false);
}
//--- armazenar o valor da propriedade do gráfico na memória
result=value;
//--- sucesso na execução
return(true);
}

· CHART_BRING_TO_TOP exibe o gráfico no topo de outros gráficos.


//+-------------------------------------------------------------------------+
//| Enviar comando para o terminal para exibir o gráfico acima dos outros. |
//+-------------------------------------------------------------------------+
bool ChartBringToTop(const long chart_ID=0)
{
//--- redefine o valor de erro
ResetLastError();
//--- exibe o gráfico no topo de outros gráficos
if(!ChartSetInteger(chart_ID,CHART_BRING_TO_TOP,0,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_MOUSE_SCROLL é uma propriedade para rolagem do gráfico usando botão esquerdo do


mouse.

//+--------------------------------------------------------------------------+
//| A função define se a rolagem do gráfico usando o botão esquerdo do mouse |
//| está habilitado. |
//+--------------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


308 Constantes, Enumeradores e Estruturas

bool ChartMouseScrollGet(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_MOUSE_SCROLL,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 a rolagem do gráfico usando botão  |
//| esquerdo do mouse. |
//+--------------------------------------------------------------------+
bool ChartMouseScrollSet(const bool value,const long chart_ID=0)
{
//--- redefine o valor de erro
ResetLastError();
//--- define valor de propriedade
if(!ChartSetInteger(chart_ID,CHART_MOUSE_SCROLL,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_EVENT_MOUSE_MOVE é uma propriedade de enviar mensagens sobre mudança de eventos


e cliques de mouse para aplicações MQL5 CH ART EVENT_MOUSE_MOVE).

//+------------------------------------------------------------------+
//| 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;

© 2000-2018, MetaQuotes Software Corp.


309 Constantes, Enumeradores e Estruturas

//--- redefine o valor de erro


ResetLastError();
//--- receber o valor da propriedade
if(!ChartGetInteger(chart_ID,CHART_EVENT_MOUSE_MOVE,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 mudança  |
//| de eventos e cliques de mouse para aplicações no  |
//| gráfico. |
//+------------------------------------------------------------------------------+
bool ChartEventMouseMoveSet(const bool value,const long chart_ID=0)
{
//--- redefine o valor de erro
ResetLastError();
//--- define valor de propriedade
if(!ChartSetInteger(chart_ID,CHART_EVENT_MOUSE_MOVE,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_EVENT_OBJECT_CREATE é uma propriedade de enviar mensagens sobre o evento da


criação do objeto gráfico para aplicações MQL5 (CH ART EVENT_OBJECT_CR EAT E).

//+---------------------------------------------------------------------+
//| 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

© 2000-2018, MetaQuotes Software Corp.


310 Constantes, Enumeradores e Estruturas

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);
}

· CHART_EVENT_OBJECT_DELETE é uma propriedade de enviar mensagens sobre o evento da


exclusão do objeto gráfico para aplicações MQL5 (CH ART EVENT_OBJECT_DELET E).

//+---------------------------------------------------------------------+
//| 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

© 2000-2018, MetaQuotes Software Corp.


311 Constantes, Enumeradores e Estruturas

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 exclusão do objeto gráfico para aplicações mql5 no  |
//| gráfico. |
//+--------------------------------------------------------------------------+
bool ChartEventObjectDeleteSet(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_DELETE,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_MODE – tipo de gráfico (candles, barras ou linha).


//+------------------------------------------------------------------+
//| Obter tipo de gráfico (candles, barras ou  |
//| linha). |
//+------------------------------------------------------------------+
ENUM_CHART_MODE ChartModeGet(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_MODE,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_MODE)result);

© 2000-2018, MetaQuotes Software Corp.


312 Constantes, Enumeradores e Estruturas

}
//+------------------------------------------------------------------+
//| 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);
}

· CHART_FOREGROUND é uma propriedade de exibição do gráfico de preço no primeiro plano.


//+------------------------------------------------------------------+
//| A função define se um gráfico de preço é exibido no  |
//| primeiro plano. |
//+------------------------------------------------------------------+
bool ChartForegroundGet(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_FOREGROUND,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 do gráfico de preço no  |
//| primeiro plano. |
//+---------------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


313 Constantes, Enumeradores e Estruturas

bool ChartForegroundSet(const bool value,const long chart_ID=0)


{
//--- redefine o valor de erro
ResetLastError();
//--- define valor de propriedade
if(!ChartSetInteger(chart_ID,CHART_FOREGROUND,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_SHIFT – modo de encaixe do gráfico de preço a partir da borda direita.


//+------------------------------------------------------------------------------------+
//| A função define se o modo de deslocamento do gráfico de preço do limite direito  |
//| está habilitado. |
//+------------------------------------------------------------------------------------+
bool ChartShiftGet(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_SHIFT,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 do gráfico de preço com  |
//| deslocamento do limite direito. |
//+--------------------------------------------------------------------------+
bool ChartShiftSet(const bool value,const long chart_ID=0)
{
//--- redefine o valor de erro
ResetLastError();
//--- define valor de propriedade

© 2000-2018, MetaQuotes Software Corp.


314 Constantes, Enumeradores e Estruturas

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);
}

· CHART_AUTOSCROLL – modo de movimentação automática para a borda direita do gráfico.


//+---------------------------------------------------------------------+
//| A função define o modo de auto-rolamento do gráfico  |
//| para a direita no caso de chegada de novos ticks estar habilitado.  |
//+---------------------------------------------------------------------+
bool ChartAutoscrollGet(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_AUTOSCROLL,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 auto-rolamento do gráfico |
//| para a direita no caso da chegada de novos ticks.  |
//+------------------------------------------------------------------+
bool ChartAutoscrollSet(const bool value,const long chart_ID=0)
{
//--- redefine o valor de erro
ResetLastError();
//--- define valor de propriedade
if(!ChartSetInteger(chart_ID,CHART_AUTOSCROLL,0,value))
{
//--- exibe uma mensagem para o diário Experts
Print(__FUNCTION__+", Código de erro = ",GetLastError());
return(false);

© 2000-2018, MetaQuotes Software Corp.


315 Constantes, Enumeradores e Estruturas

}
//--- sucesso na execução
return(true);
}

· CHART_SCALE – chart scale property.


//+------------------------------------------------------------------+
//| Obter escala do gráfico (de 0 a 5). |
//+------------------------------------------------------------------+
int ChartScaleGet(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_SCALE,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);
}
//+------------------------------------------------------------------+
//| Definir escala do gráfico (de 0 a 5). |
//+------------------------------------------------------------------+
bool ChartScaleSet(const long value,const long chart_ID=0)
{
//--- redefine o valor de erro
ResetLastError();
//--- define valor de propriedade
if(!ChartSetInteger(chart_ID,CHART_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);
}

· CHART_SCALEFIX – o modo de especificar a escala do gráfico em pontos por barra.


//+------------------------------------------------------------------+
//| A função define se o modo de fixar a escala está habilitado. |

© 2000-2018, MetaQuotes Software Corp.


316 Constantes, Enumeradores e Estruturas

//+------------------------------------------------------------------+
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);
}

· CHART_SCALEFIX_11 – modo de escala 1:1.


//+------------------------------------------------------------------+
//| A função define se a escala "1:1" está habilitada. |
//+------------------------------------------------------------------+
bool ChartScaleFix11Get(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();

© 2000-2018, MetaQuotes Software Corp.


317 Constantes, Enumeradores e Estruturas

//--- receber o valor da propriedade


if(!ChartGetInteger(chart_ID,CHART_SCALEFIX_11,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 escala "1:1"  |
//+------------------------------------------------------------------+
bool ChartScaleFix11Set(const bool value,const long chart_ID=0)
{
//--- redefine o valor de erro
ResetLastError();
//--- define valor de propriedade
if(!ChartSetInteger(chart_ID,CHART_SCALEFIX_11,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_SCALE_PT_PER_BAR – o modo de especificar a escala do gráfico em pontos por barra.


//+------------------------------------------------------------------------------+
//| A função define se o modo de especificar a escala do gráfico é por pontos  |
//| barra está habilitada. |
//+------------------------------------------------------------------------------+
bool ChartScalePerBarGet(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_SCALE_PT_PER_BAR,0,value))
{
//--- exibe uma mensagem para o diário Experts
Print(__FUNCTION__+", Código de erro = ",GetLastError());
return(false);

© 2000-2018, MetaQuotes Software Corp.


318 Constantes, Enumeradores e Estruturas

}
//--- 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);
}

· CHART_SHOW_OHLC – propriedade de exibe valores OH LC no canto superior esquerdo.


//+------------------------------------------------------------------+
//| A função define se o modo de exibição dos valores OHLC  |
//| no canto superior esquerdo está habilitado. |
//+------------------------------------------------------------------+
bool ChartShowOHLCGet(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_OHLC,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);

© 2000-2018, MetaQuotes Software Corp.


319 Constantes, Enumeradores e Estruturas

}
//+--------------------------------------------------------------------------+
//| 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. |
//+--------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


320 Constantes, Enumeradores e Estruturas

bool ChartShowBidLineSet(const bool value,const long chart_ID=0)


{
//--- redefine o valor de erro
ResetLastError();
//--- define valor de propriedade
if(!ChartSetInteger(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);
}
//--- sucesso na execução
return(true);
}

· CHART_SHOW_ASK_LINE – a propriedade de mostrar o valor As k como uma linha horizontal 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();

© 2000-2018, MetaQuotes Software Corp.


321 Constantes, Enumeradores e Estruturas

//--- define valor de propriedade


if(!ChartSetInteger(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);
}
//--- sucesso na execução
return(true);
}

· CHART_SHOW_LAST_LINE – a propriedade de exibir último valor como uma linha horizontal no


gráfico.

//+---------------------------------------------------------------------------------+
//| 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

© 2000-2018, MetaQuotes Software Corp.


322 Constantes, Enumeradores e Estruturas

Print(__FUNCTION__+", Código de erro = ",GetLastError());


return(false);
}
//--- sucesso na execução
return(true);
}

· CHART_SHOW_PERIOD_SEP – a propriedade de exibir separadores verticais entre os períodos


adjacentes.

//+------------------------------------------------------------------+
//| 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

© 2000-2018, MetaQuotes Software Corp.


323 Constantes, Enumeradores e Estruturas

return(true);
}

· CHART_SHOW_GRID – a propriedade de mostrar a grade do gráfico.


//+------------------------------------------------------------------+
//| A função define se a grade do gráfico é exibida.  |
//+------------------------------------------------------------------+
bool ChartShowGridGet(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_GRID,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 a grade do gráfico. |
//+------------------------------------------------------------------+
bool ChartShowGridSet(const bool value,const long chart_ID=0)
{
//--- redefine o valor de erro
ResetLastError();
//--- definir o valor da propriedade
if(!ChartSetInteger(chart_ID,CHART_SHOW_GRID,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_VOLUMES – a propriedade de mostrar os volumes num gráfico.


//+------------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


324 Constantes, Enumeradores e Estruturas

//| 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_SHOW_OBJECT_DESCR – a propriedade mostrar descrições pop-up do objeto gráfico.


//+-------------------------------------------------------------------+
//| A função define se descrições pop-up de objetos gráficos são  |
//| exibidas quando colocado o cursor do mouse sobre eles.  |
//+-------------------------------------------------------------------+
bool ChartShowObjectDescriptionGet(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();

© 2000-2018, MetaQuotes Software Corp.


325 Constantes, Enumeradores e Estruturas

//--- receber o valor da propriedade


if(!ChartGetInteger(chart_ID,CHART_SHOW_OBJECT_DESCR,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 de descrições pop-up  |
//| de objetos gráficos quando colocado o cursor do mouse sobre eles. |
//+--------------------------------------------------------------------------+
bool ChartShowObjectDescriptionSet(const bool value,const long chart_ID=0)
{
//--- redefine o valor de erro
ResetLastError();
//--- define valor de propriedade
if(!ChartSetInteger(chart_ID,CHART_SHOW_OBJECT_DESCR,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_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());

© 2000-2018, MetaQuotes Software Corp.


326 Constantes, Enumeradores e Estruturas

}
//--- 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_IS_VISIBLE define a visibilidade da sub-janela.


//+------------------------------------------------------------------+
//| A função define se a atual janela do gráfico ou sub-janela  |
//| está visível. |
//+------------------------------------------------------------------+
bool ChartWindowsIsVisible(bool &result,const long chart_ID=0,const int sub_window=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_WINDOW_IS_VISIBLE,sub_window,value))
{
//--- exibe uma mensagem para o diário Experts
Print(__FUNCTION__+", Código de erro = ",GetLastError());
return(false);
}

© 2000-2018, MetaQuotes Software Corp.


327 Constantes, Enumeradores e Estruturas

//--- armazenar o valor da propriedade do gráfico na memória


result=value;
//--- sucesso na execução
return(true);
}

· CHART_W INDOW_HANDLE retorna o manipulador do gráfico.


//+------------------------------------------------------------------+
//| A função obtém o manipulador do gráfico  |
//+------------------------------------------------------------------+
int ChartWindowsHandle(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_WINDOW_HANDLE,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

© 2000-2018, MetaQuotes Software Corp.


328 Constantes, Enumeradores e Estruturas

return((int)result);
}

· CHART_FIRST_VISIBLE_BAR retorna o número da primeira barra vis ível no gráfico (barra de


indexação que corresponde a série temporal).

//+---------------------------------------------------------------------------------------+
//| 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);
}

· CHART_W IDTH_IN_BARS retorna a largura do gráfico de barras.


//+------------------------------------------------------------------+
//| A função recebe a largura do gráfico de barras. |
//+------------------------------------------------------------------+
int ChartWidthInBars(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_WIDTH_IN_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);
}

© 2000-2018, MetaQuotes Software Corp.


329 Constantes, Enumeradores e Estruturas

· CHART_W IDTH_IN_PIX ELS retorna a largura da do gráfico em pixels.


//+------------------------------------------------------------------+
//| A função recebe a largura da do gráfico em pixels. |
//+------------------------------------------------------------------+
int ChartWidthInPixels(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_WIDTH_IN_PIXELS,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_HEIGHT_IN_PIX ELS – propriedade em pixels da altura do gráfico.


//+------------------------------------------------------------------+
//| A função recebe o valor da altura do gráfico em pixels. |
//+------------------------------------------------------------------+
int ChartHeightInPixelsGet(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_HEIGHT_IN_PIXELS,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 define o valor da altura do gráfico em pixels. |
//+------------------------------------------------------------------+
bool ChartHeightInPixelsSet(const int value,const long chart_ID=0,const int sub_window=0)
{

© 2000-2018, MetaQuotes Software Corp.


330 Constantes, Enumeradores e Estruturas

//--- redefine o valor de erro


ResetLastError();
//--- define valor de propriedade
if(!ChartSetInteger(chart_ID,CHART_HEIGHT_IN_PIXELS,sub_window,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_COLOR_BACKGROUND - cor do fundo do gráfico.


//+------------------------------------------------------------------+
//| A função recebe a cor do fundo do gráfico.  |
//+------------------------------------------------------------------+
color ChartBackColorGet(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 fundo do gráfico
if(!ChartGetInteger(chart_ID,CHART_COLOR_BACKGROUND,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 define a cor de fundo do gráfico. |
//+------------------------------------------------------------------+
bool ChartBackColorSet(const color clr,const long chart_ID=0)
{
//--- redefine o valor de erro
ResetLastError();
//--- definir a cor do fundo do gráfico
if(!ChartSetInteger(chart_ID,CHART_COLOR_BACKGROUND,clr))
{
//--- exibe uma mensagem para o diário Experts
Print(__FUNCTION__+", Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução

© 2000-2018, MetaQuotes Software Corp.


331 Constantes, Enumeradores e Estruturas

return(true);
}

· CHART_COLOR_FOREGROUND – Cor dos eixos, escala e linha OH LC.


//+------------------------------------------------------------------+
//| A função recebe a cor dos eixos, da escala e da linha OHLC.  |
//+------------------------------------------------------------------+
color ChartForeColorGet(const long chart_ID=0)
{
//--- preparar a variável para receber a cor
long result=clrNONE;
//--- redefine o valor de erro
ResetLastError();
//--- receber cor dos eixos, escala e linha OHLC
if(!ChartGetInteger(chart_ID,CHART_COLOR_FOREGROUND,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 dos eixos, da escala e da linha OHLC. |
//+------------------------------------------------------------------+
bool ChartForeColorSet(const color clr,const long chart_ID=0)
{
//--- redefine o valor de erro
ResetLastError();
//--- definir cor dos eixos, escala e linha OHLC
if(!ChartSetInteger(chart_ID,CHART_COLOR_FOREGROUND,clr))
{
//--- exibe uma mensagem para o diário Experts
Print(__FUNCTION__+", Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}

· CHART_COLOR_GRID – cor da grade do gráfico.


//+------------------------------------------------------------------+
//| A função recebe a cor da grade do gráfico. |
//+------------------------------------------------------------------+
color ChartGridColorGet(const long chart_ID=0)

© 2000-2018, MetaQuotes Software Corp.


332 Constantes, Enumeradores e Estruturas

{
//--- 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);
}

· CHART_COLOR_VOLUME - cor dos volumes e níveis de abertura de posição.


//+------------------------------------------------------------------+
//| A função recebe cor de volumes e níveis de entrada  |
//| no mercado. |
//+------------------------------------------------------------------+
color ChartVolumeColorGet(const long chart_ID=0)
{
//--- preparar a variável para receber a cor
long result=clrNONE;
//--- redefine o valor de erro
ResetLastError();
//--- recebe cor de volumes e níveis de entrada no mercado
if(!ChartGetInteger(chart_ID,CHART_COLOR_VOLUME,0,result))
{
//--- exibe uma mensagem para o diário Experts

© 2000-2018, MetaQuotes Software Corp.


333 Constantes, Enumeradores e Estruturas

Print(__FUNCTION__+", Código de erro = ",GetLastError());


}
//--- retorna o valor da propriedade do gráfico
return((color)result);
}
//+------------------------------------------------------------------+
//| A função configura a cor de volumes e entrada  |
//| no mercado. |
//+------------------------------------------------------------------+
bool ChartVolumeColorSet(const color clr,const long chart_ID=0)
{
//--- redefine o valor de erro
ResetLastError();
//--- configurar cor de volumes e níveis de entrada no mercado
if(!ChartSetInteger(chart_ID,CHART_COLOR_VOLUME,clr))
{
//--- exibe uma mensagem para o diário Experts
Print(__FUNCTION__+", Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}

· CHART_COLOR_CHART_UP – cor da barra de alta, sombra e borda da barra de alta (também


denominado como castiçal ou vela de alta).

//+------------------------------------------------------------------+
//| 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  |

© 2000-2018, MetaQuotes Software Corp.


334 Constantes, Enumeradores e Estruturas

//| o limite do corpo do candlestick de alta. |


//+------------------------------------------------------------------+
bool ChartUpColorSet(const color clr,const long chart_ID=0)
{
//--- redefine o valor de erro
ResetLastError();
//--- configurar a cor da barra de alta, a sua sombra e o limite do corpo do candlestick de alta
if(!ChartSetInteger(chart_ID,CHART_COLOR_CHART_UP,clr))
{
//--- exibe uma mensagem para o diário Experts
Print(__FUNCTION__+", Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}

· CHART_COLOR_CHART_DOW N – cor da barra de baixa, a sua sombra e limite do corpo do


candlestick de baixa.

//+------------------------------------------------------------------+
//| 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

© 2000-2018, MetaQuotes Software Corp.


335 Constantes, Enumeradores e Estruturas

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);
}

· CHART_COLOR_CHART_LINE – Cor da linha do gráfico e barra Doji (também denominado como


castiçal ou vela Doji).

//+------------------------------------------------------------------------+
//| 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);

© 2000-2018, MetaQuotes Software Corp.


336 Constantes, Enumeradores e Estruturas

· CHART_COLOR_CANDLE_BULL – cor do corpo da barra de alta (também denominado como castiçal


ou vela de alta).

//+------------------------------------------------------------------+
//| 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);
}

· CHART_COLOR_CANDLE_BEAR – cor do corpo da barra de baixa (também denominado como castiçal


ou vela de baixa).

//+------------------------------------------------------------------+
//| A função recebe a cor do corpo do candlestick de baixa.  |
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


337 Constantes, Enumeradores e Estruturas

color ChartBearColorGet(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 baixa
if(!ChartGetInteger(chart_ID,CHART_COLOR_CANDLE_BEAR,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 baixa. |
//+------------------------------------------------------------------+
bool ChartBearColorSet(const color clr,const long chart_ID=0)
{
//--- redefine o valor de erro
ResetLastError();
//--- configurar a cor do corpo do candlestick de baixa
if(!ChartSetInteger(chart_ID,CHART_COLOR_CANDLE_BEAR,clr))
{
//--- exibe uma mensagem para o diário Experts
Print(__FUNCTION__+", Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}

· CHART_COLOR_BID – Cor de linha de preço de venda.


//+------------------------------------------------------------------+
//| A função recebe a cor da linha Bid.  |
//+------------------------------------------------------------------+
color ChartBidColorGet(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 da linha Bid
if(!ChartGetInteger(chart_ID,CHART_COLOR_BID,0,result))
{
//--- exibe uma mensagem para o diário Experts

© 2000-2018, MetaQuotes Software Corp.


338 Constantes, Enumeradores e Estruturas

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 Bid.  |
//+------------------------------------------------------------------+
bool ChartBidColorSet(const color clr,const long chart_ID=0)
{
//--- redefine o valor de erro
ResetLastError();
//--- configurar a cor da linha Bid.
if(!ChartSetInteger(chart_ID,CHART_COLOR_BID,clr))
{
//--- exibe uma mensagem para o diário Experts
Print(__FUNCTION__+", Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}

· CHART_COLOR_ASK – Cor de linha de preço de compra.


//+------------------------------------------------------------------+
//| A função recebe a cor da linha Ask.  |
//+------------------------------------------------------------------+
color ChartAskColorGet(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 da linha Ask
if(!ChartGetInteger(chart_ID,CHART_COLOR_ASK,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 Ask.  |
//+------------------------------------------------------------------+
bool ChartAskColorSet(const color clr,const long chart_ID=0)
{

© 2000-2018, MetaQuotes Software Corp.


339 Constantes, Enumeradores e Estruturas

//--- redefine o valor de erro


ResetLastError();
//--- configurar a cor da linha Ask
if(!ChartSetInteger(chart_ID,CHART_COLOR_ASK,clr))
{
//--- exibe uma mensagem para o diário Experts
Print(__FUNCTION__+", Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}

· CHART_COLOR_LAST – cor de linha do último preço de operação executada.


//+----------------------------------------------------------------------+
//| A função recebe a cor da linha do preço do último negócio realizado. |
//+----------------------------------------------------------------------+
color ChartLastColorGet(const long chart_ID=0)
{
//--- preparar a variável para receber a cor
long result=clrNONE;
//--- redefine o valor de erro
ResetLastError();
//--- receber cor de linha do último preço de operação executada.
if(!ChartGetInteger(chart_ID,CHART_COLOR_LAST,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 preço do último negócio realizado  |
//| linha. |
//+------------------------------------------------------------------+
bool ChartLastColorSet(const color clr,const long chart_ID=0)
{
//--- redefine o valor de erro
ResetLastError();
//--- configurar a cor da linha do preço do último negócio realizado (Last)
if(!ChartSetInteger(chart_ID,CHART_COLOR_LAST,clr))
{
//--- exibe uma mensagem para o diário Experts
Print(__FUNCTION__+", Código de erro = ",GetLastError());
return(false);
}

© 2000-2018, MetaQuotes Software Corp.


340 Constantes, Enumeradores e Estruturas

//--- sucesso na execução


return(true);
}

· CHART_COLOR_STOP_LEVEL – cor de níveis de ordem de stop (Stop Loss e Take Profit).


//+--------------------------------------------------------------------+
//| A função recebe as cores dos níveis de Stop Loss e Take Profit.  |
//+--------------------------------------------------------------------+
color ChartStopLevelColorGet(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 de níveis de ordem de stop (Stop Loss e Take Profit)
if(!ChartGetInteger(chart_ID,CHART_COLOR_STOP_LEVEL,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 cores dos níveis de Stop Loss e Take Profit. |
//+------------------------------------------------------------------+
bool ChartStopLevelColorSet(const color clr,const long chart_ID=0)
{
//--- redefine o valor de erro
ResetLastError();
//--- definir a cor de níveis de ordem de stop (Stop Loss e Take Profit)
if(!ChartSetInteger(chart_ID,CHART_COLOR_STOP_LEVEL,clr))
{
//--- 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_TRADE_LEVELS – propriedade de exibição de níveis de negociação no gráfico (níveis


de abertura de posição, Stop Loss, T ak e Profit e ordens pendentes.

//+---------------------------------------------------------------------+
//| A função define se níveis de negociação são exibidos no gráfico.  |

© 2000-2018, MetaQuotes Software Corp.


341 Constantes, Enumeradores e Estruturas

//+---------------------------------------------------------------------+
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);
}

· CHART_DRAG_TRADE_LEVELS – propriedade de habilitar a capacidade de arrastar os níveis de


negociação no gráfico usando o mouse.

//+---------------------------------------------------------------------------+
//| 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;

© 2000-2018, MetaQuotes Software Corp.


342 Constantes, Enumeradores e Estruturas

//--- redefine o valor de erro


ResetLastError();
//--- receber o valor da propriedade
if(!ChartGetInteger(chart_ID,CHART_DRAG_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);
}
//+------------------------------------------------------------------+
//| Função habilita/desabilita o modo arrastar os níveis de negócios |
//| no gráfico usando o mouse. |
//+------------------------------------------------------------------+
bool ChartDragTradeLevelsSet(const bool value,const long chart_ID=0)
{
//--- redefine o valor de erro
ResetLastError();
//--- define valor de propriedade
if(!ChartSetInteger(chart_ID,CHART_DRAG_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);
}

· CHART_SHOW_DATE_SCALE – propriedade de exibição da escala de tempo em um gráfico.


//+--------------------------------------------------------------------+
//| A função configura se a escala de tempo é exibida no gráfico.  |
//+--------------------------------------------------------------------+
bool ChartShowDateScaleGet(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_DATE_SCALE,0,value))
{
//--- exibe uma mensagem para o diário Experts

© 2000-2018, MetaQuotes Software Corp.


343 Constantes, Enumeradores e Estruturas

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 exibir a escala de tempo no |
//| gráfico. |
//+--------------------------------------------------------------------+
bool ChartShowDateScaleSet(const bool value,const long chart_ID=0)
{
//--- redefine o valor de erro
ResetLastError();
//--- define valor de propriedade
if(!ChartSetInteger(chart_ID,CHART_SHOW_DATE_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);
}

· CHART_SHOW_PRICE_SCALE – propriedade de mostrar a escala de preços no gráfico.


//+--------------------------------------------------------------------+
//| A função define se a escala de preços é exibida no gráfico.  |
//+--------------------------------------------------------------------+
bool ChartShowPriceScaleGet(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_PRICE_SCALE,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

© 2000-2018, MetaQuotes Software Corp.


344 Constantes, Enumeradores e Estruturas

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);
}

· CHART_SHOW_ONE_CLICK – Propriedade de exibição do painel " negociar à um clique" num gráfico.


//+------------------------------------------------------------------+
//| Verifique se o painel "negociar à um clique" é exibido no gráfico|
//+------------------------------------------------------------------+
bool ChartShowOneClickPanelGet(bool &result,const long chart_ID=0)
{
//--- Preparar a variável para obter o valor da propriedade
long value;
//--- Redefinir o valor de erro
ResetLastError();
//--- Receber o valor da propriedade
if(!ChartGetInteger(chart_ID,CHART_SHOW_ONE_CLICK,0,value))
{
//--- Exibir a mensagem de erro no diário de Experts
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- Armazenar o valor da propriedade gráfica na memória
result=value;
//--- Execução bem-sucedida
return(true);
}
//+------------------------------------------------------------------+
//| Ativa/desativa a exibição do painel "Negociar à um clique" |
//| no gráfico |
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


345 Constantes, Enumeradores e Estruturas

bool ChartShowOneClickPanelSet(const bool value,const long chart_ID=0)


{
//--- Redefinir o valor de erro
ResetLastError();
//--- definir o vaolr da propriedade
if(!ChartSetInteger(chart_ID,CHART_SHOW_ONE_CLICK,0,value))
{
//--- Exibir a mensagem de erro no diário de Experts
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- Execução bem-sucedida
return(true);
}

· CHART_SHIFT_SIZE – o tamanho da barra zero encaixada a partir da borda direita em porcentagens.


//+---------------------------------------------------------------------------+
//| A função recebe a tamanho do deslocamento da barra zero do limite direito |
//| do gráfico em valores percentuais (de 10% até 50%).  |
//+---------------------------------------------------------------------------+
double ChartShiftSizeGet(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_SHIFT_SIZE,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);
}
//+--------------------------------------------------------------------------------------+
//| A função configura o tamanho do deslocamento da barra zero da direita  |
//| limite do gráfico em valores percentuais (de 10% até 50%).  |
//| Para habilitar o deslocamento modo, valor da propriedade CHART_SHIFT |
//| será configurada para true. |
//+--------------------------------------------------------------------------------------+
bool ChartShiftSizeSet(const double value,const long chart_ID=0)
{
//--- redefine o valor de erro
ResetLastError();
//--- define valor de propriedade
if(!ChartSetDouble(chart_ID,CHART_SHIFT_SIZE,value))

© 2000-2018, MetaQuotes Software Corp.


346 Constantes, Enumeradores e Estruturas

{
//--- 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

© 2000-2018, MetaQuotes Software Corp.


347 Constantes, Enumeradores e Estruturas

return(true);
}

· CHART_FIX ED_MAX – propriedade para fixação máxima do gráfico.


//+------------------------------------------------------------------+
//| A função recebe o valor de fixação máxima do gráfico.  |
//+------------------------------------------------------------------+
double ChartFixedMaxGet(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_MAX,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);
}
//+------------------------------------------------------------------+
//| A função configura o valor de fixação máxima do gráfico. |
//| Para alterar o valor da propriedade, valor da propriedade  |
//| CHART_SCALEFIX será preliminarmente definida para  |
//| true. |
//+------------------------------------------------------------------+
bool ChartFixedMaxSet(const double value,const long chart_ID=0)
{
//--- redefine o valor de erro
ResetLastError();
//--- define valor de propriedade
if(!ChartSetDouble(chart_ID,CHART_FIXED_MAX,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_FIX ED_MIN – propriedade para fixação mínima do gráfico.


//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


348 Constantes, Enumeradores e Estruturas

//| A função recebe o valor de fixação mínima do gráfico.  |


//+------------------------------------------------------------------+
double ChartFixedMinGet(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_MIN,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);
}
//+------------------------------------------------------------------+
//| A função configura o valor de fixação mínima do gráfico. |
//| Para alterar o valor da propriedade, valor da propriedade  |
//| CHART_SCALEFIX será preliminarmente definida para  |
//| true. |
//+------------------------------------------------------------------+
bool ChartFixedMinSet(const double value,const long chart_ID=0)
{
//--- redefine o valor de erro
ResetLastError();
//--- define valor de propriedade
if(!ChartSetDouble(chart_ID,CHART_FIXED_MIN,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_POINTS_PER_BAR – valor da escala em pontos por barra.


//+---------------------------------------------------------------------------+
//| A função recebe a o valor da escala do gráfico em pontos por barra.  |
//+---------------------------------------------------------------------------+
double ChartPointsPerBarGet(const long chart_ID=0)
{
//--- preparar a variável para obter o resultado
double result=EMPTY_VALUE;
//--- redefine o valor de erro

© 2000-2018, MetaQuotes Software Corp.


349 Constantes, Enumeradores e Estruturas

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);
}

· CHART_PRICE_MIN retorna o valor do mínimo do gráfico.


//+---------------------------------------------------------------------------------+
//| A função recebe a o valor mínimo do gráfico na janela principal, ou numa  |
//| subjanela. |
//+---------------------------------------------------------------------------------+
double ChartPriceMin(const long chart_ID=0,const int sub_window=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_PRICE_MIN,sub_window,result))
{
//--- exibe uma mensagem para o diário Experts
Print(__FUNCTION__+", Código de erro = ",GetLastError());

© 2000-2018, MetaQuotes Software Corp.


350 Constantes, Enumeradores e Estruturas

}
//--- retorna o valor da propriedade do gráfico
return(result);
}

· CHART_PRICE_MAX retorna o valor do máximo do gráfico.


//+--------------------------------------------------------------------------------+
//| A função recebe a o valor máximo gráfico na janela principal, ou numa  |
//| subjanela. |
//+--------------------------------------------------------------------------------+
double ChartPriceMax(const long chart_ID=0,const int sub_window=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_PRICE_MAX,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(result);
}

· CHART_COMMENT – comentar sobre o gráfico.


//+----------------------------------------------------------------------+
//| A função recebe comentário no canto superior esquerdo do gráfico.  |
//+----------------------------------------------------------------------+
bool ChartCommentGet(string &result,const long chart_ID=0)
{
//--- redefine o valor de erro
ResetLastError();
//--- receber o valor da propriedade
if(!ChartGetString(chart_ID,CHART_COMMENT,result))
{
//--- exibe uma mensagem para o diário Experts
Print(__FUNCTION__+", Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


351 Constantes, Enumeradores e Estruturas

//| A função configura comentário no canto superior esquerda do  |


//| gráfico. |
//+------------------------------------------------------------------+
bool ChartCommentSet(const string str,const long chart_ID=0)
{
//--- redefine o valor de erro
ResetLastError();
//--- define valor de propriedade
if(!ChartSetString(chart_ID,CHART_COMMENT,str))
{
//--- exibe uma mensagem para o diário Experts
Print(__FUNCTION__+", Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}

· CHART_IS_MAX IMIZED – janela do gráfico maximizada


//+------------------------------------------------------------------+
//| A função determina se a janela do gráfica está maximizada |
//+------------------------------------------------------------------+
bool ChartWindowsIsMaximized(bool &result,const long chart_ID=0)
{
//--- preparamos a variável para o valor da propriedade
long value;
//--- restauramos o valor de erro
ResetLastError();
//--- obtemos o valor da propriedade
if(!ChartGetInteger(chart_ID,CHART_IS_MAXIMIZED))
{
//--- 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);
}

· CHART_IS_MINIMIZED – janela de gráfico minimizada

© 2000-2018, MetaQuotes Software Corp.


352 Constantes, Enumeradores e Estruturas

//+------------------------------------------------------------------+
//| 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);
}

Painel para propriedades do gráfico


//--- conectar a biblioteca de elementos de controle
#include <ChartObjects\ChartObjectsTxtControls.mqh>
//--- constantes predefinidas
#define X_PROPERTY_NAME_1 10 // x coordenadas do nome da propriedade na primeira coluna
#define X_PROPERTY_VALUE_1 225 // x coordenadas do valor da propriedade na primeira coluna
#define X_PROPERTY_NAME_2 345 // x coordenadas do nome da propriedade na segunda e terceira colu
#define X_PROPERTY_VALUE_2 550 // x coordenadas do valor da propriedade na segunda e terceira col
#define X_BUTTON_1 285 // x coordenadas do botão na primeira coluna
#define X_BUTTON_2 700 // x coordenadas do botão na segunda coluna
#define Y_PROPERTY_1 30 // y coordenadas do do início da primeira e segunda coluna
#define Y_PROPERTY_2 286 // y coordenadas do início da terceira coluna
#define Y_DISTANCE 16 // eixo y da distância entre as linhas
#define LAST_PROPERTY_NUMBER 111 // número da última propriedade gráfica
//--- parâmetros de entrada
input color InpFirstColor=clrDodgerBlue; // Cor de linhas ímpares
input color InpSecondColor=clrGoldenrod; // Cor de linhas pares
//--- variáveis ​e arrays
CChartObjectLabel ExtLabelsName[]; // etiquetas para exibir nomes das propriedades
CChartObjectLabel ExtLabelsValue[]; // etiquetas para exibição dos valores da propriedade
CChartObjectButton ExtButtons[]; // botões
int ExtNumbers[]; // índices das propriedades
string ExtNames[]; // nomes das propriedades
uchar ExtDataTypes[]; // tipos de dados de propriedade (integer, double, string)
uint ExtGroupTypes[]; // array que armazena os dados de propriedades pertencente a u
uchar ExtDrawTypes[]; // array que armazena os dados sobre o tipo de exibição da pro
double ExtMaxValue[]; // valores máximos possíveis das propriedades para se trabalha
double ExtMinValue[]; // valores mínimos possíveis das propriedades para se trabalha

© 2000-2018, MetaQuotes Software Corp.


353 Constantes, Enumeradores e Estruturas

double ExtStep[]; // passos para alterar as propriedades


int ExtCount; // número total de todas as propriedades
color ExtColors[2]; // array de cores para exibição das linhas
string ExtComments[2]; // array de comentários (para propriedade CHART_COMMENT)
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado  |
//+------------------------------------------------------------------+
int OnInit()
{
//--- exibir a comentário no gráfico
Comment("SomeComment");
//--- armazenam cores no array para alternarem entre eles mais tarde
ExtColors[0]=InpFirstColor;
ExtColors[1]=InpSecondColor;
//--- armazenam comentários no array para alternarem entre eles mais tarde
ExtComments[0]="FirstComment";
ExtComments[1]="SecondComment";
//--- preparar e exibir o painel de controle para o gerenciamento das propriedades do gráfico
if(!PrepareControls())
return(INIT_FAILED);
//--- sucesso na execução
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de finalização do expert  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- remover o comentário no gráfico
Comment("");
}
//+------------------------------------------------------------------+
//| Manipular eventos de um gráfico  |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
const long &lparam,
const double &dparam,
const string &sparam)
{
//--- verificar o evento clicando no objeto do gráfico
if(id==CHARTEVENT_OBJECT_CLICK)
{
//--- divide o nome do objeto pelo separador
string obj_name[];
StringSplit(sparam,'_',obj_name);
//--- verifica se o objeto é um botão
if(obj_name[0]=="Button")
{
//--- receber índice de botão

© 2000-2018, MetaQuotes Software Corp.


354 Constantes, Enumeradores e Estruturas

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);
}
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


355 Constantes, Enumeradores e Estruturas

//| Alterar a propriedade string do gráfico  |


//+------------------------------------------------------------------+
void ChangeStringProperty(const int index)
{
//--- variável estática para comutação dentro do array ExtComments
static uint comment_index=1;
//--- alterar o índice para receber outro comentário
comment_index=1-comment_index;
//--- definir o novo valor de propriedade
ChartSetString(0,(ENUM_CHART_PROPERTY_STRING)ExtNumbers[index],ExtComments[comment_index]);
}
//+------------------------------------------------------------------+
//| Definir o próximos valor da propriedade  |
//+------------------------------------------------------------------+
double GetNextValue(const double value,const int index)
{
if(value+ExtStep[index]<=ExtMaxValue[index])
return(value+ExtStep[index]);
else
return(ExtMinValue[index]);
}
//+------------------------------------------------------------------+
//| Receber a próxima cor para a propriedade tipo color  |
//+------------------------------------------------------------------+
color GetNextColor(const color clr)
{
//--- retornar o seguinte valor de cor
switch(clr)
{
case clrWhite: return(clrRed);
case clrRed: return(clrGreen);
case clrGreen: return(clrBlue);
case clrBlue: return(clrBlack);
default: return(clrWhite);
}
}
//+------------------------------------------------------------------+
//| Re-desenhar valores de propriedades  |
//+------------------------------------------------------------------+
void RedrawProperties(void)
{
//--- texto de valor da propriedade
string text;
long value;
//--- loop do número de propriedades
for(int i=0;i<ExtCount;i++)
{
text="";
switch(ExtDataTypes[i])

© 2000-2018, MetaQuotes Software Corp.


356 Constantes, Enumeradores e Estruturas

{
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

© 2000-2018, MetaQuotes Software Corp.


357 Constantes, Enumeradores e Estruturas

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++;
}
}

© 2000-2018, MetaQuotes Software Corp.


358 Constantes, Enumeradores e Estruturas

//--- liberar a memória não usada pelos arrays


MemoryAllocation(ExtCount);
//--- re-desenhar valores de propriedades
RedrawProperties();
ChartRedraw();
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Alocar memória para os arrays  |
//+------------------------------------------------------------------+
void MemoryAllocation(const int size)
{
ArrayResize(ExtLabelsName,size);
ArrayResize(ExtLabelsValue,size);
ArrayResize(ExtButtons,size);
ArrayResize(ExtNumbers,size);
ArrayResize(ExtNames,size);
ArrayResize(ExtDataTypes,size);
ArrayResize(ExtGroupTypes,size);
ArrayResize(ExtDrawTypes,size);
ArrayResize(ExtMaxValue,size);
ArrayResize(ExtMinValue,size);
ArrayResize(ExtStep,size);
}
//+------------------------------------------------------------------+
//| Verificar se o índice de propriedade pertence a um de  |
//| enumerador ENUM_CHART_PROPERTIES  |
//+------------------------------------------------------------------+
bool CheckNumber(const int ind,string &name,uchar &data_type,uint &group_type,uchar &draw_type)
{
//--- verificar se a propriedade é do tipo integer
ResetLastError();
name=EnumToString((ENUM_CHART_PROPERTY_INTEGER)ind);
if(_LastError==0)
{
data_type='I'; // propriedade do enumerador ENUM_CHART_PROPERTY_INTEGER
GetTypes(ind,group_type,draw_type); // definir parâmetros da propriedade display
return(true);
}
//--- verificar se a propriedade é do tipo double
ResetLastError();
name=EnumToString((ENUM_CHART_PROPERTY_DOUBLE)ind);
if(_LastError==0)
{
data_type='D'; // propriedade do enumerador ENUM_CHART_PROPERTY_DOUBLE
GetTypes(ind,group_type,draw_type); // definir parâmetros da propriedade display
return(true);
}

© 2000-2018, MetaQuotes Software Corp.


359 Constantes, Enumeradores e Estruturas

//--- verificar se a proprieade é do tipo string


ResetLastError();
name=EnumToString((ENUM_CHART_PROPERTY_STRING)ind);
if(_LastError==0)
{
data_type='S'; // propriedade do enumerador ENUM_CHART_PROPERTY_STRING
GetTypes(ind,group_type,draw_type); // definir parâmetros da propriedade display
return(true);
}
//--- propriedade não pertence a qualquer enumeração
return(false);
}
//+------------------------------------------------------------------+
//| Definir o grupo que a propriedade será armazenada em  |
//| bem como seu tipo de exibição  |
//+------------------------------------------------------------------+
void GetTypes(const int property_number,uint &group_type,uchar &draw_type)
{
//--- verificar se a propriedade pertence ao terceiro grupo
//--- propriedades terceiro grupo são apresentados na segunda coluna, a partir de CHART_BRING_TO_TO
if(CheckThirdGroup(property_number,group_type,draw_type))
return;
//--- verificar se a propriedade pertence ao segundo grupo
//--- propriedades segundo grupo são apresentados no início da segunda coluna
if(CheckSecondGroup(property_number,group_type,draw_type))
return;
//--- se você está aqui, a propriedade pertence ao primeiro grupo (primeira coluna)
CheckFirstGroup(property_number,group_type,draw_type);
}
//+----------------------------------------------------------------------+
//| A função verifica se a propriedade pertence ao terceiro grupo e  |
//| define o seu tipo display no caso de uma resposta positiva  |
//+----------------------------------------------------------------------+
bool CheckThirdGroup(const int property_number,uint &group_type,uchar &draw_type)
{
//--- verificar se a propriedade pertence ao terceiro grupo
switch(property_number)
{
//--- propriedades boolean
case CHART_IS_OBJECT:
case CHART_WINDOW_IS_VISIBLE:
draw_type='B';
break;
//--- propriedades inteiro
case CHART_VISIBLE_BARS:
case CHART_WINDOWS_TOTAL:
case CHART_WINDOW_HANDLE:
case CHART_WINDOW_YDISTANCE:
case CHART_FIRST_VISIBLE_BAR:

© 2000-2018, MetaQuotes Software Corp.


360 Constantes, Enumeradores e Estruturas

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:

© 2000-2018, MetaQuotes Software Corp.


361 Constantes, Enumeradores e Estruturas

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;
}
}

© 2000-2018, MetaQuotes Software Corp.


362 Constantes, Enumeradores e Estruturas

//+------------------------------------------------------------------+
//| 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);
}
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


363 Constantes, Enumeradores e Estruturas

//| Definir o máximo e o mínimo do valor e da etapa propriedade  |


//+------------------------------------------------------------------+
void GetMaxMinStep(const int property_number,double &max,double &min,double &step)
{
double value;
//--- definir os valores dependendo do tipo de propriedade
switch(property_number)
{
case CHART_SCALE:
max=5;
min=0;
step=1;
break;
case CHART_MODE:
case CHART_SHOW_VOLUMES:
max=2;
min=0;
step=1;
break;
case CHART_SHIFT_SIZE:
max=50;
min=10;
step=2.5;
break;
case CHART_FIXED_POSITION:
max=90;
min=0;
step=15;
break;
case CHART_POINTS_PER_BAR:
max=19;
min=1;
step=3;
break;
case CHART_FIXED_MAX:
value=ChartGetDouble(0,CHART_FIXED_MAX);
max=value*1.25;
min=value;
step=value/32;
break;
case CHART_FIXED_MIN:
value=ChartGetDouble(0,CHART_FIXED_MIN);
max=value;
min=value*0.75;
step=value/32;
break;
case CHART_HEIGHT_IN_PIXELS:
max=700;
min=520;

© 2000-2018, MetaQuotes Software Corp.


364 Constantes, Enumeradores e Estruturas

step=30;
break;
//--- valores padrão
default:
max=1;
min=0;
step=1;
}
}

© 2000-2018, MetaQuotes Software Corp.


365 Constantes, Enumeradores e Estruturas

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 :

· T ipos de Objetos – Identificadores de objetos gráficos ;


· Propriedades de objeto – atribuição e obtenção de propriedades de objetos gráficos ;
· Métodos de vinculação de objeto – constantes de posicionamento no gráfico;
· Canto de vinculação – uma indicação do ângulo da tabela, que está posicionada sobre o objeto;
· Visibilidade de objetos – definição de janelas de tempo em que um objeto é vis ível;
· Níveis de Ondas de Elliott – marcação de gradação de onda;
· Objetos Gann – constantes de tendência para ventilador de Gann e grade de Gann;
· Cores W eb – constantes de cores W eb pré-definidos ;
· W ingdings – códigos de caracteres da fonte W ingdings.

© 2000-2018, MetaQuotes Software Corp.


366 Constantes, Enumeradores e Estruturas

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_H L INE Linha H orizontal

OBJ_TR END Linha de T endência

OBJ_TR ENDBYANGLE Linha de T endência por Ângulo

OBJ_CYCLES Linhas de Ciclo

OBJ_ARR OW ED_L INE Linha de Seta

OBJ_CH ANNEL Canal Eqüidistante

OBJ_S TDDEVCH ANNEL Canal de Desvio Padrão

OBJ_R EGR ESS ION Canal de R egressão Linear

OBJ_PIT CHFORK Forquilha de Andrews


OBJ_GANNL INE Linha Gann

OBJ_GANNFAN Ventilador Gann


OBJ_GANNGRID Grade Gann
OBJ_FIBO Retração de Fibonacci
OBJ_FIBOTIMES Fusos H orários de Fibonacci
OBJ_FIBOFAN Fibonacci Fan
OBJ_FIBOAR C Arcos de Fibonacci

OBJ_FIBOCH ANNEL Canal de Fibonacci

OBJ_EXPANS ION Expansão de Fibonacci

OBJ_ELL IOTW AVE5 Onda Motriz de Elliott

OBJ_ELL IOTW AVE3 Onde de Correção de Elliott

OBJ_R ECT ANGLE Retângulo


OBJ_TRIANGLE T riângulo
OBJ_ELL IPSE Elipse

OBJ_ARR OW_TH UM B_UP Polegares para cima

© 2000-2018, MetaQuotes Software Corp.


367 Constantes, Enumeradores e Estruturas

OBJ_ARR OW_TH UM B_DOWN Polegar para Baixo


OBJ_ARR OW_UP Seta para cima

OBJ_ARR OW_DOWN Seta para baixo

OBJ_ARR OW_S T OP Sinal Stop

OBJ_ARR OW_CH ECK Conferido

OBJ_ARR OW_LEFT_PRICE Etiqueta de Preço à Esquerda

OBJ_ARR OW_RIGHT_PRICE Rótulo de Preço Direito


OBJ_ARR OW_BUY Comprar

OBJ_ARR OW_SELL Vender


OBJ_ARR OW Seta

OBJ_T EXT T exto


OBJ_LABEL Rótulo
OBJ_BUTT ON Botão
OBJ_CH ART Gráfico
OBJ_BIT MAP Bitmap
OBJ_BIT MAP_LABEL Rótulo Bitmap
OBJ_EDIT Edição

OBJ_EVENT O objeto " Evento"


correspondendo a um evento
no calendário econômico

OBJ_R ECT ANGLE_LABEL O objeto "R ótulo de R etângulo"


para criação e design de
interface gráfico customizada.

© 2000-2018, MetaQuotes Software Corp.


368 Constantes, Enumeradores e Estruturas

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

© 2000-2018, MetaQuotes Software Corp.


369 Constantes, Enumeradores e Estruturas

input bool InpHidden=true; // Ocultar na lista de objeto


input long InpZOrder=0; // Prioridade para clicar no mouse
//+------------------------------------------------------------------+
//| Criar a linha vertical  |
//+------------------------------------------------------------------+
bool VLineCreate(const long chart_ID=0, // ID do gráfico
const string name="VLine", // nome da linha
const int sub_window=0, // índice da sub-janela
datetime time=0, // tempo da linha
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, // destaque para mover
const bool ray=true, // continuação da linha para baixo
const bool hidden=true, //ocultar na lista de objetos
const long z_order=0) // prioridade para clique do mouse
{
//--- se o tempo de linha não está definido, desenhá-lo através da última barra
if(!time)
time=TimeCurrent();
//--- redefine o valor de erro
ResetLastError();
//--- criar uma linha vertical
if(!ObjectCreate(chart_ID,name,OBJ_VLINE,sub_window,time,0))
{
Print(__FUNCTION__,
": falha ao criar uma linha vertical! 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);
//--- habilitar (verdadeiro) ou desabilitar (falso) o modo de exibição da linha no gráfico sub-jane
ObjectSetInteger(chart_ID,name,OBJPROP_RAY,ray);
//--- 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

© 2000-2018, MetaQuotes Software Corp.


370 Constantes, Enumeradores e Estruturas

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()
{

© 2000-2018, MetaQuotes Software Corp.


371 Constantes, Enumeradores e Estruturas

//--- 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 desenhar a linha
int d=InpDate*(bars-1)/100;
//--- criar uma linha vertical
if(!VLineCreate(0,InpName,0,date[d],InpColor,InpStyle,InpWidth,InpBack,
InpSelection,InpRay,InpHidden,InpZOrder))
return;
//--- redesenhar o gráfico e esperar por um segundo
ChartRedraw();
Sleep(1000);
//--- agora, mover a linha
//--- contador de loop
int h_steps=bars/2;
//--- mover a linha
for(int i=0;i<h_steps;i++)
{
//--- usar o seguinte valor
if(d<bars-1)
d+=1;
//--- mover o ponto
if(!VLineMove(0,InpName,date[d]))
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);
}

© 2000-2018, MetaQuotes Software Corp.


372 Constantes, Enumeradores e Estruturas

//--- 1 segundo de atraso


Sleep(1000);
//--- excluir o canal do gráfico
VLineDelete(0,InpName);
ChartRedraw();
//--- 1 segundo de atraso
Sleep(1000);
//---
}

© 2000-2018, MetaQuotes Software Corp.


373 Constantes, Enumeradores e Estruturas

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  |
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


374 Constantes, Enumeradores e Estruturas

bool HLineCreate(const long chart_ID=0, // ID de gráfico


const string name="HLine", // nome da linha
const int sub_window=0, // índice da sub-janela
double price=0, // line price
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, // destaque para mover
const bool hidden=true, //ocultar na lista de objetos
const long z_order=0) // prioridade para clique do mouse
{
//--- se o preço não está definido, defina-o no atual nível de preço Bid
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- redefine o valor de erro
ResetLastError();
//--- criar um linha horizontal
if(!ObjectCreate(chart_ID,name,OBJ_HLINE,sub_window,0,price))
{
Print(__FUNCTION__,
": falha ao criar um linha horizontal! 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 linha horizontal  |
//+------------------------------------------------------------------+
bool HLineMove(const long chart_ID=0, // ID do gráfico

© 2000-2018, MetaQuotes Software Corp.


375 Constantes, Enumeradores e Estruturas

const string name="HLine", // nome da linha


double price=0) // preço da linha
{
//--- se o preço não está definido, defina-o no atual nível de preço Bid
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- redefine o valor de erro
ResetLastError();
//--- mover um linha horizontal
if(!ObjectMove(chart_ID,name,0,0,price))
{
Print(__FUNCTION__,
": falha ao mover um linha horizontal! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Excluir uma linha horizontal  |
//+------------------------------------------------------------------+
bool HLineDelete(const long chart_ID=0, // ID do gráfico
const string name="HLine") // nome da linha
{
//--- redefine o valor de erro
ResetLastError();
//--- excluir uma linha horizontal
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": falha ao Excluir um linha horizontal! 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(InpPrice<0 || InpPrice>100)
{
Print("Erro! Valores incorretos dos parâmetros de entrada!");
return;
}
//--- tamanho do array de preço
int accuracy=1000;

© 2000-2018, MetaQuotes Software Corp.


376 Constantes, Enumeradores e Estruturas

//--- array para armazenar data de valores a serem utilizados


//--- para definir e alterar as coordenadas de pontos de ancoragem
double price[];
//--- alocação de memória
ArrayResize(price,accuracy);
//--- 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 p=InpPrice*(accuracy-1)/100;
//--- criar um linha horizontal
if(!HLineCreate(0,InpName,0,price[p],InpColor,InpStyle,InpWidth,InpBack,
InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- redesenhar o gráfico e esperar por um segundo
ChartRedraw();
Sleep(1000);
//--- agora, mover a linha
//--- contador de loop
int v_steps=accuracy/2;
//--- mover a linha
for(int i=0;i<v_steps;i++)
{
//--- usar o seguinte valor
if(p<accuracy-1)
p+=1;
//--- mover o ponto
if(!HLineMove(0,InpName,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 partir do gráfico
HLineDelete(0,InpName);
ChartRedraw();
//--- 1 segundo de atraso
Sleep(1000);

© 2000-2018, MetaQuotes Software Corp.


377 Constantes, Enumeradores e Estruturas

//---
}

© 2000-2018, MetaQuotes Software Corp.


378 Constantes, Enumeradores e Estruturas

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

© 2000-2018, MetaQuotes Software Corp.


379 Constantes, Enumeradores e Estruturas

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 InpRayLeft=false; // Continuação da Linha para a esquerda
input bool InpRayRight=false; // Continuação da Linha para a direita
input bool InpHidden=true; // Ocultar na lista de objeto
input long InpZOrder=0; // Prioridade para clicar no mouse
//+------------------------------------------------------------------+
//| Criar uma linha de tendência pelas coordenadas fornecidas  |
//+------------------------------------------------------------------+
bool TrendCreate(const long chart_ID=0, // ID do gráfico
const string name="TrendLine", // 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, // destaque para mover
const bool ray_left=false, // continuação da linha para a esquerda
const bool ray_right=false, // continuação da linha para a direita
const bool hidden=true, //ocultar na lista de objetos
const long z_order=0) // prioridade para clique do mouse
{
//--- definir coordenadas de pontos de ancoragem, se eles não estão definidos
ChangeTrendEmptyPoints(time1,price1,time2,price2);
//--- redefine o valor de erro
ResetLastError();
//--- criar uma linha de tendência pelas coordenadas fornecidas
if(!ObjectCreate(chart_ID,name,OBJ_TREND,sub_window,time1,price1,time2,price2))
{
Print(__FUNCTION__,
": falha ao criar uma linha de tendência! 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

© 2000-2018, MetaQuotes Software Corp.


380 Constantes, Enumeradores e Estruturas

//--- 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();

© 2000-2018, MetaQuotes Software Corp.


381 Constantes, Enumeradores e Estruturas

//--- excluir uma linha de tendência


if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": falha ao excluir uma linha de tendência! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Verifique os valores de pontos de ancoragem da linha de tendência|
//| e definir padrões valores padrão para aqueles vazios  |
//+------------------------------------------------------------------+
void ChangeTrendEmptyPoints(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

© 2000-2018, MetaQuotes Software Corp.


382 Constantes, Enumeradores e Estruturas

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

© 2000-2018, MetaQuotes Software Corp.


383 Constantes, Enumeradores e Estruturas

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

© 2000-2018, MetaQuotes Software Corp.


384 Constantes, Enumeradores e Estruturas

Sleep(1000);
//--- excluir uma linha de tendência
TrendDelete(0,InpName);
ChartRedraw();
//--- 1 segundo de atraso
Sleep(1000);
//---
}

© 2000-2018, MetaQuotes Software Corp.


385 Constantes, Enumeradores e Estruturas

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

© 2000-2018, MetaQuotes Software Corp.


386 Constantes, Enumeradores e Estruturas

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 InpRayLeft=false; // Continuação da Linha para a esquerda
input bool InpRayRight=true; // Continuação da Linha para a direita
input bool InpHidden=true; // Ocultar na lista de objeto
input long InpZOrder=0; // Prioridade para clicar no mouse
//+------------------------------------------------------------------+
//| Criar uma linha de tendência por ângulo  |
//+------------------------------------------------------------------+
bool TrendByAngleCreate(const long chart_ID=0, // ID do gráfico
const string name="TrendLine", // nome da linha
const int sub_window=0, // índice da sub-janela
datetime time=0, // tempo do ponto
double price=0, // preço do ponto
const double angle=45.0, // ângulo de inclinaçã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, // destaque para mover
const bool ray_left=false, // continuação da linha para a esq
const bool ray_right=true, // continuação da linha para a dir
const bool hidden=true, // ocultar na lista de objetos
const long z_order=0) // prioridade para clique do mouse
{
//--- criar o segundo ponto para facilitar, arrastando a linha de tendência com o mouse
datetime time2=0;
double price2=0;
//--- definir coordenadas de pontos de ancoragem, se eles não estão definidos
ChangeTrendEmptyPoints(time,price,time2,price2);
//--- redefine o valor de erro
ResetLastError();
//--- criar uma linha de tendência usando dois pontos
if(!ObjectCreate(chart_ID,name,OBJ_TRENDBYANGLE,sub_window,time,price,time2,price2))
{
Print(__FUNCTION__,
": falha ao criar uma linha de tendência! Código de erro = ",GetLastError());
return(false);
}
//--- alterar o ângulo de inclinação da linha de tendência, quando se muda o ângulo, as coordenadas
//--- ponto da linha são redefinidos automaticamente de acordo com o novo valor do ângulo
ObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,angle);
//--- definir cor da linha
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- definir estilo de linha
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);

© 2000-2018, MetaQuotes Software Corp.


387 Constantes, Enumeradores e Estruturas

//--- 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);
//--- 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);
}
//+------------------------------------------------------------------+
//| Alterar ponto de ancoragem das coordenadas da linha de tendência |
//+------------------------------------------------------------------+
bool TrendPointChange(const long chart_ID=0, // ID do gráfico
const string name="TrendLine", // nome da linha
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,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);
}
//+------------------------------------------------------------------+
//| Mudar o ângulo de inclinação da linha de tendência  |
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


388 Constantes, Enumeradores e Estruturas

bool TrendAngleChange(const long chart_ID=0, // ID do grafico


const string name="TrendLine", // nome da linha de tendência
const double angle=45) // inclinação do ângulo da linha de tendência
{
//--- redefine o valor de erro
ResetLastError();
//--- mudar o ângulo de inclinação da linha de tendência
if(!ObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,angle))
{
Print(__FUNCTION__,
": falha ao mudar a inclinação da linha! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Excluir a linha de tendência  |
//+------------------------------------------------------------------+
bool TrendDelete(const long chart_ID=0, // ID do gráfico
const string name="TrendLine") // nome da linha
{
//--- redefine o valor de erro
ResetLastError();
//--- excluir uma linha de tendência
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": falha ao excluir uma linha de tendência! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Verifique os valores de pontos de ancoragem da linha de tendência|
//| e definir padrões valores padrão para aqueles vazios  |
//+------------------------------------------------------------------+
void ChangeTrendEmptyPoints(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);
//--- coordenadas do segundo ponto auxiliar
//--- o segundo ponto será 9 barras a esquerda e tendo o mesmo preço

© 2000-2018, MetaQuotes Software Corp.


389 Constantes, Enumeradores e Estruturas

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))
{

© 2000-2018, MetaQuotes Software Corp.


390 Constantes, Enumeradores e Estruturas

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);
//---
}

© 2000-2018, MetaQuotes Software Corp.


391 Constantes, Enumeradores e Estruturas

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

© 2000-2018, MetaQuotes Software Corp.


392 Constantes, Enumeradores e Estruturas

input int InpWidth=1; // Largura das linhas cycle


input bool InpBack=false; // Objeto 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
//+------------------------------------------------------------------+
//| Criação das linhas cycle  |
//+------------------------------------------------------------------+
bool CyclesCreate(const long chart_ID=0, // ID de gráfico
const string name="Cycles", // nome do objeto
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 das linhas cycle
const ENUM_LINE_STYLE style=STYLE_SOLID, // estilo das linhas cycle
const int width=1, // largura das linhas cycle
const bool back=false, // no fundo
const bool selection=true, // destaque para mover
const bool hidden=true, // ocultar na lista de objetot
const long z_order=0) // prioridade para clicar no mouse
{
//--- definir coordenadas de pontos de ancoragem, se eles não estão definidos
ChangeCyclesEmptyPoints(time1,price1,time2,price2);
//--- redefine o valor de erro
ResetLastError();
//--- criar linhas cycle pelas coordenadas dadas
if(!ObjectCreate(chart_ID,name,OBJ_CYCLES,sub_window,time1,price1,time2,price2))
{
Print(__FUNCTION__,
": falha ao criar linhas cycle! Código de erro = ",GetLastError());
return(false);
}
//--- definir a cor das linhas
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- definir a exibição do estilo das linhas
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- definir a largura das linhas
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- exibir em primeiro plano (false) ou fundo (true)
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- permitir (true) ou desabilitar (false) o modo de movimento das linhas 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

© 2000-2018, MetaQuotes Software Corp.


393 Constantes, Enumeradores e Estruturas

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);

© 2000-2018, MetaQuotes Software Corp.


394 Constantes, Enumeradores e Estruturas

}
//+-----------------------------------------------------------------------+
//| 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);

© 2000-2018, MetaQuotes Software Corp.


395 Constantes, Enumeradores e Estruturas

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);

© 2000-2018, MetaQuotes Software Corp.


396 Constantes, Enumeradores e Estruturas

}
//--- 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);
//---
}

© 2000-2018, MetaQuotes Software Corp.


397 Constantes, Enumeradores e Estruturas

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

© 2000-2018, MetaQuotes Software Corp.


398 Constantes, Enumeradores e Estruturas

//+------------------------------------------------------------------+
//| 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);

© 2000-2018, MetaQuotes Software Corp.


399 Constantes, Enumeradores e Estruturas

}
//+------------------------------------------------------------------+
//| 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  |
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


400 Constantes, Enumeradores e Estruturas

void ChangeArrowedLineEmptyPoints(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 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)
{

© 2000-2018, MetaQuotes Software Corp.


401 Constantes, Enumeradores e Estruturas

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 seta
if(!ArrowedLineCreate(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 da linha
//--- contador de loop
int v_steps=accuracy/5;
//--- 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(!ArrowedLinePointChange(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();
}
//--- mover o primeiro ponto de ancoragem vertical
for(int i=0;i<v_steps;i++)
{
//--- usar o seguinte valor
if(p1>1)
p1-=1;

© 2000-2018, MetaQuotes Software Corp.


402 Constantes, Enumeradores e Estruturas

//--- mover o ponto


if(!ArrowedLinePointChange(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);
//--- 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(!ArrowedLinePointChange(0,InpName,0,date[d1],price[p1]))
return;
if(!ArrowedLinePointChange(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);
//--- deletar uma linha de seta
ArrowedLineDelete(0,InpName);
ChartRedraw();
//--- 1 segundo de atraso
Sleep(1000);
//---
}

© 2000-2018, MetaQuotes Software Corp.


403 Constantes, Enumeradores e Estruturas

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, %

© 2000-2018, MetaQuotes Software Corp.


404 Constantes, Enumeradores e Estruturas

input int InpPrice3=40; // Preço do 3º 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 da linha do canal
input bool InpBack=false; // Canal de Fundo
input bool InpFill=false; // Preenchendo o canal com cor
input bool InpSelection=true; // Destaque para mover
input bool InpRayLeft=false; // Continuação do canal para a esquerda
input bool InpRayRight=false; // Continuação do canal para a direita
input bool InpHidden=true; // Ocultar na lista de objeto
input long InpZOrder=0; // Prioridade para clicar no mouse
//+------------------------------------------------------------------+
//| Criar um canal eqüidistante pelas coordenadas dadas  |
//+------------------------------------------------------------------+
bool ChannelCreate(const long chart_ID=0, // ID de gráfico
const string name="Channel", // nome do canal
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
datetime time3=0, // terceiro ponto de tempo
double price3=0, // terceiro ponto de preço
const color clr=clrRed, // cor do sinal
const ENUM_LINE_STYLE style=STYLE_SOLID, // estilo das linhas do canal
const int width=1, // largura das linhas do canal
const bool fill=false, // preenchendo o canal cor
const bool back=false, // no fundo
const bool selection=true, // destaque para mover
const bool ray_left=false, // continuação do canal para a esquerda
const bool ray_right=false, // continuação do canal para a direita
const bool hidden=true, // ocultar na lista de objetos
const long z_order=0) // prioridade para clique do mouse
{
//--- definir coordenadas de pontos de ancoragem, se eles não estão definidos
ChangeChannelEmptyPoints(time1,price1,time2,price2,time3,price3);
//--- redefine o valor de erro
ResetLastError();
//--- criar um canal pelas coordenadas dadas
if(!ObjectCreate(chart_ID,name,OBJ_CHANNEL,sub_window,time1,price1,time2,price2,time3,price3))
{
Print(__FUNCTION__,
": falha ao criar um canal eqüidistante! Código de erro = ",GetLastError());
return(false);
}
//--- definir a cor do canal
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- definir o estilo de linha do canal
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);

© 2000-2018, MetaQuotes Software Corp.


405 Constantes, Enumeradores e Estruturas

//--- definir a largura da linha do canal


ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- habilitar (true) ou desabilitar (false) o modo de preenchimento 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 ChannelPointChange(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 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);
}

© 2000-2018, MetaQuotes Software Corp.


406 Constantes, Enumeradores e Estruturas

//+------------------------------------------------------------------+
//| 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;

© 2000-2018, MetaQuotes Software Corp.


407 Constantes, Enumeradores e Estruturas

}
//+------------------------------------------------------------------+
//| 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,

© 2000-2018, MetaQuotes Software Corp.


408 Constantes, Enumeradores e Estruturas

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

© 2000-2018, MetaQuotes Software Corp.


409 Constantes, Enumeradores e Estruturas

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);
//---
}

© 2000-2018, MetaQuotes Software Corp.


410 Constantes, Enumeradores e Estruturas

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.

Propriedade OBJPROP_DEVIATION é usada para alterar o valor do desvio do canal.

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

© 2000-2018, MetaQuotes Software Corp.


411 Constantes, Enumeradores e Estruturas

input ENUM_LINE_STYLE InpStyle=STYLE_DASHDOTDOT; // Estilo de linhas do canal


input int InpWidth=2; // Largura das linhas do canal
input bool InpFill=false; // Preenchendo o canal com cor
input bool InpBack=false; // Canal de Fundo
input bool InpSelection=true; // Destaque para mover
input bool InpRayLeft=false; // Continuação do Canal para a esquerda
input bool InpRayRight=false; // Continuação do Canal para a direita
input bool InpHidden=true; // Ocultar na lista de objeto
input long InpZOrder=0; // Prioridade para clicar no mouse
//+------------------------------------------------------------------+
//| Criar Regressão Linear do Canal pelas coordenadas dadas  |
//+------------------------------------------------------------------+
bool StdDevChannelCreate(const long chart_ID=0, // ID do gráfico
const string name="Channel", // nome do canal
const int sub_window=0, // índice da sub-janela
datetime time1=0, // primeiro ponto de tempo
datetime time2=0, // segundo ponto de tempo
const double deviation=1.0, // desvio
const color clr=clrRed, // cor do canal
const ENUM_LINE_STYLE style=STYLE_SOLID, // estilo das linhas do canal
const int width=1, // largura das linhas do canal
const bool fill=false, // preenchendo o canal cor
const bool back=false, // no fundo
const bool selection=true, // destaque para mover
const bool ray_left=false, // continuação do canal para a es
const bool ray_right=false, // continuação do canal para a di
const bool hidden=true, // ocultar na lista de objetos
const long z_order=0) // prioridade para clique do mous
{
//--- definir coordenadas de pontos de ancoragem, se eles não estão definidos
ChangeChannelEmptyPoints(time1,time2);
//--- redefine o valor de erro
ResetLastError();
//--- criar um canal pelas coordenadas dadas
if(!ObjectCreate(chart_ID,name,OBJ_STDDEVCHANNEL,sub_window,time1,0,time2,0))
{
Print(__FUNCTION__,
": falha ao criar o desvio padrão do canal! Código de erro = ",GetLastError());
return(false);
}
//--- definir o valor de desvio que afeta a largura do canal
ObjectSetDouble(chart_ID,name,OBJPROP_DEVIATION,deviation);
//--- definir a cor do canal
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- definir o estilo de linha do canal
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- definir a largura da linha do canal
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- habilitar (true) ou desabilitar (false) o modo de preenchimento do canal

© 2000-2018, MetaQuotes Software Corp.


412 Constantes, Enumeradores e Estruturas

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

© 2000-2018, MetaQuotes Software Corp.


413 Constantes, Enumeradores e Estruturas

{
//--- 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];
}

© 2000-2018, MetaQuotes Software Corp.


414 Constantes, Enumeradores e Estruturas

}
//+------------------------------------------------------------------+
//| 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

© 2000-2018, MetaQuotes Software Corp.


415 Constantes, Enumeradores e Estruturas

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);
//---

© 2000-2018, MetaQuotes Software Corp.


416 Constantes, Enumeradores e Estruturas

© 2000-2018, MetaQuotes Software Corp.


417 Constantes, Enumeradores e Estruturas

OBJ_REGRESSION
Regressão Linear do Canal.

Observação
Para Regressã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

© 2000-2018, MetaQuotes Software Corp.


418 Constantes, Enumeradores e Estruturas

input bool InpFill=false; // Preenchendo o canal com cor


input bool InpBack=false; // Canal de fundo
input bool InpSelection=true; // Destaque para mover
input bool InpRayLeft=false; // Continuação do canal para a esquerda
input bool InpRayRight=false; // Continuação do canal para a direita
input bool InpHidden=true; // Ocultar na lista de objeto
input long InpZOrder=0; // Prioridade para clicar no mouse
//+------------------------------------------------------------------+
//| Criar Regressão Linear do Canal pelas coordenadas dadas  |
//+------------------------------------------------------------------+
bool RegressionCreate(const long chart_ID=0, // ID do gráfico
const string name="Regression", // nome do canal
const int sub_window=0, // índice da sub-janela
datetime time1=0, // primeiro ponto de tempo
datetime time2=0, // segundo ponto de tempo
const color clr=clrRed, // cor do canal
const ENUM_LINE_STYLE style=STYLE_SOLID, // estilo das linhas do canal
const int width=1, // largura das linhas do canal
const bool fill=false, /// preenchendo o canal com cor
const bool back=false, // no fundo
const bool selection=true, // destaque para mover
const bool ray_left=false, // continuação do canal para a esque
const bool ray_right=false, // continuação do canal para a direi
const bool hidden=true, // ocultar na lista de objetos
const long z_order=0) // prioridade para clique do mouse
{
//--- definir coordenadas de pontos de ancoragem, se eles não estão definidos
ChangeRegressionEmptyPoints(time1,time2);
//--- redefine o valor de erro
ResetLastError();
//--- criar um canal pelas coordenadas dadas
if(!ObjectCreate(chart_ID,name,OBJ_REGRESSION,sub_window,time1,0,time2,0))
{
Print(__FUNCTION__,
": falha ao criar a regressão linear do canal! Código de erro = ",GetLastError());
return(false);
}
//--- definir a cor do canal
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- definir o estilo de linha do canal
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- definir a largura da linha do canal
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- habilitar (true) ou desabilitar (false) o modo de preenchimento 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

© 2000-2018, MetaQuotes Software Corp.


419 Constantes, Enumeradores e Estruturas

//--- 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))
{

© 2000-2018, MetaQuotes Software Corp.


420 Constantes, Enumeradores e Estruturas

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);

© 2000-2018, MetaQuotes Software Corp.


421 Constantes, Enumeradores e Estruturas

//--- 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 regressão linear do canal
if(!RegressionCreate(0,InpName,0,date[d1],date[d2],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
//--- 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(!RegressionPointChange(0,InpName,0,date[d1]))
return;
if(!RegressionPointChange(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

© 2000-2018, MetaQuotes Software Corp.


422 Constantes, Enumeradores e Estruturas

Sleep(50);
}
//--- 1 segundo de atraso
Sleep(1000);
//--- excluir o canal do gráfico
RegressionDelete(0,InpName);
ChartRedraw();
//--- 1 segundo de atraso
Sleep(1000);
//---
}

© 2000-2018, MetaQuotes Software Corp.


423 Constantes, Enumeradores e Estruturas

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, %

© 2000-2018, MetaQuotes Software Corp.


424 Constantes, Enumeradores e Estruturas

input color InpColor=clrRed; // Cor do tridente


input ENUM_LINE_STYLE InpStyle=STYLE_SOLID; // Estilo de linhas do tridente
input int InpWidth=1; // Largura das linhas do tridente
input bool InpBack=false; // Tridente de fundo
input bool InpSelection=true; // Destaque para mover
input bool InpRayLeft=false; // Continuação do Tridente para a esquerda
input bool InpRayRight=false; // Continuação do Tridente para a direita
input bool InpHidden=true; // Ocultar na lista de objeto
input long InpZOrder=0; // Prioridade para clicar no mouse
//+------------------------------------------------------------------+
//| Criar Tridente Andrews pelas coordenadas fornecidas  |
//+------------------------------------------------------------------+
bool PitchforkCreate(const long chart_ID=0, // ID de gráfico
const string name="Pitchfork", // nome do tridente
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
datetime time3=0, // terceiro ponto de tempo
double price3=0, // terceiro ponto de preço
const color clr=clrRed, // cor das linhas do tridente
const ENUM_LINE_STYLE style=STYLE_SOLID, // estilo das linhas do tridente
const int width=1, // largura das linhas do tridente
const bool back=false, // no fundo
const bool selection=true, // destaque para mover
const bool ray_left=false, // continuação do tridente para a esq
const bool ray_right=false, // continuação do tridente para a dir
const bool hidden=true, // ocultar na lista de objetos
const long z_order=0) // prioridade para clique do mouse
{
//--- definir coordenadas de pontos de ancoragem, se eles não estão definidos
ChangeChannelEmptyPoints(time1,price1,time2,price2,time3,price3);
//--- redefine o valor de erro
ResetLastError();
//--- criar tridente Andrews pelas coordenadas fornecidas
if(!ObjectCreate(chart_ID,name,OBJ_PITCHFORK,sub_window,time1,price1,time2,price2,time3,price3))
{
Print(__FUNCTION__,
": falha ao criar \" Tridente Andrews\"! Código de erro = ",GetLastError());
return(false);
}
//--- definir cor
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- definir o estilo da linha
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- definir a largura das linhas
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- exibir em primeiro plano (false) ou fundo (true)

© 2000-2018, MetaQuotes Software Corp.


425 Constantes, Enumeradores e Estruturas

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]);

© 2000-2018, MetaQuotes Software Corp.


426 Constantes, Enumeradores e Estruturas

//--- descrição de nível


ObjectSetString(chart_ID,name,OBJPROP_LEVELTEXT,i,DoubleToString(100*values[i],1));
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Movimentar ponto de ancoragem do Tridente Andrews  |
//+------------------------------------------------------------------+
bool PitchforkPointChange(const long chart_ID=0, // ID do gráfico
const string name="Pitchfork", // nome do canal
const int point_index=0, // índice do ponto de ancoragem
datetime time=0, // coordenada do ponto de ancoragem de tem
double price=0) // coordenada do ponto de ancoragem de pre
{
//--- 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 Tridente Andrews  |
//+------------------------------------------------------------------+
bool PitchforkDelete(const long chart_ID=0, // ID do gráfico
const string name="Pitchfork") // nome do canal
{
//--- redefine o valor de erro
ResetLastError();
//--- excluir o canal
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": falha ao excluir \" Tridente Andrews\"! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);

© 2000-2018, MetaQuotes Software Corp.


427 Constantes, Enumeradores e Estruturas

}
//+----------------------------------------------------------------------+
//| 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

© 2000-2018, MetaQuotes Software Corp.


428 Constantes, Enumeradores e Estruturas

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

© 2000-2018, MetaQuotes Software Corp.


429 Constantes, Enumeradores e Estruturas

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();

© 2000-2018, MetaQuotes Software Corp.


430 Constantes, Enumeradores e Estruturas

}
//--- 1 segundo de atraso
Sleep(1000);
//--- excluir a tridente do gráfico
PitchforkDelete(0,InpName);
ChartRedraw();
//--- 1 segundo de atraso
Sleep(1000);
//---
}

© 2000-2018, MetaQuotes Software Corp.


431 Constantes, Enumeradores e Estruturas

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

© 2000-2018, MetaQuotes Software Corp.


432 Constantes, Enumeradores e Estruturas

input double InpScale=1.0; // Escala


input color InpColor=clrRed; // Cor da linha
input ENUM_LINE_STYLE InpStyle=STYLE_DASHDOTDOT; // 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 InpRayLeft=false; // Continuação da Linha para a esquerda
input bool InpRayRight=true; // Continuação da Linha para a direita
input bool InpHidden=true; // Ocultar na lista de objeto
input long InpZOrder=0; // Prioridade para clicar no mouse
//+------------------------------------------------------------------+
//| Criar Linha Gann pelas coordenadas, ângulo e escala  |
//+------------------------------------------------------------------+
bool GannLineCreate(const long chart_ID=0, // ID de gráfico
const string name="GannLine", // 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
const double angle=1.0, // angulo Gann
const double scale=1.0, // escala
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, // destaque para mover
const bool ray_left=false, // continuação da linha para a esquerd
const bool ray_right=true, // continuação da linha para a direita
const bool hidden=true, // ocultar na lista de objetos
const long z_order=0) // prioridade para o clique do mouse
{
//--- definir coordenadas de pontos de ancoragem, se eles não estão definidos
ChangeGannLineEmptyPoints(time1,price1,time2);
//--- redefine o valor de erro
ResetLastError();
//--- criar Linha Gann pelas coordenadas fornecidas
//--- corretas coordenadas do segundo ponto de ancoragem são redefinida
//--- automaticamente após o angulo Gann e/ou as mudanças de escala,
if(!ObjectCreate(chart_ID,name,OBJ_GANNLINE,sub_window,time1,price1,time2,0))
{
Print(__FUNCTION__,
": falha ao criar \"Linha Gann\"! Código de erro = ",GetLastError());
return(false);
}
//--- alterar angulo Gann
ObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,angle);
//--- alterar a escala (número de pips por barra)
ObjectSetDouble(chart_ID,name,OBJPROP_SCALE,scale);
//--- definir cor da linha

© 2000-2018, MetaQuotes Software Corp.


433 Constantes, Enumeradores e Estruturas

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);

© 2000-2018, MetaQuotes Software Corp.


434 Constantes, Enumeradores e Estruturas

}
//+------------------------------------------------------------------+
//| 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))

© 2000-2018, MetaQuotes Software Corp.


435 Constantes, Enumeradores e Estruturas

{
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[];

© 2000-2018, MetaQuotes Software Corp.


436 Constantes, Enumeradores e Estruturas

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();

© 2000-2018, MetaQuotes Software Corp.


437 Constantes, Enumeradores e Estruturas

}
//--- 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);
//---
}

© 2000-2018, MetaQuotes Software Corp.


438 Constantes, Enumeradores e Estruturas

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

© 2000-2018, MetaQuotes Software Corp.


439 Constantes, Enumeradores e Estruturas

input color InpColor=clrRed; // Cor da linha fan


input ENUM_LINE_STYLE InpStyle=STYLE_DASHDOTDOT; // Estilo de linhas fan
input int InpWidth=1; // Largura das linhas fan
input bool InpBack=false; // Canal 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 Gann Fan  |
//+------------------------------------------------------------------+
bool GannFanCreate(const long chart_ID=0, // ID de gráfico
const string name="GannFan", // nome do fan
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
const double scale=1.0, // escala
const bool direction=true, // direção da tendência
const color clr=clrRed, // cor da linha fan
const ENUM_LINE_STYLE style=STYLE_SOLID, // estilo das linhas fan
const int width=1, // largura das linhas fan
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 clique do mouse
{
//--- definir coordenadas de pontos de ancoragem, se eles não estão definidos
ChangeGannFanEmptyPoints(time1,price1,time2);
//--- redefine o valor de erro
ResetLastError();
//--- criar Gann Fan pelas coordenadas fornecidas
if(!ObjectCreate(chart_ID,name,OBJ_GANNFAN,sub_window,time1,price1,time2,0))
{
Print(__FUNCTION__,
": falha ao criar \"Gann Fan\"! Código de erro = ",GetLastError());
return(false);
}
//--- alterar a escala (número de pips por barra)
ObjectSetDouble(chart_ID,name,OBJPROP_SCALE,scale);
//--- mudar a direção de tendência Gann Fan (true - descendente, false - ascendente)
ObjectSetInteger(chart_ID,name,OBJPROP_DIRECTION,direction);
//--- definir cor do fan
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- definir a exibição do estilo das linhas fan
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- definir a largura da linha do fan
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- exibir em primeiro plano (false) ou fundo (true)
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);

© 2000-2018, MetaQuotes Software Corp.


440 Constantes, Enumeradores e Estruturas

//--- 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)

© 2000-2018, MetaQuotes Software Corp.


441 Constantes, Enumeradores e Estruturas

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  |

© 2000-2018, MetaQuotes Software Corp.


442 Constantes, Enumeradores e Estruturas

//+------------------------------------------------------------------+
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;
}

© 2000-2018, MetaQuotes Software Corp.


443 Constantes, Enumeradores e Estruturas

//--- 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 Gann Fan
int d1=InpDate1*(bars-1)/100;
int d2=InpDate2*(bars-1)/100;
int p1=InpPrice1*(accuracy-1)/100;
//--- criar Gann Fan
if(!GannFanCreate(0,InpName,0,date[d1],price[p1],date[d2],InpScale,InpDirection,
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 vertical
for(int i=0;i<v_steps;i++)
{
//--- usar o seguinte valor
if(p1<accuracy-1)
p1+=1;
//--- mover o ponto
if(!GannFanPointChange(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);
//--- alterar a direção tendência do fan para um descendente
GannFanDirectionChange(0,InpName,true);
//--- redesenhar o gráfico
ChartRedraw();
//--- 1 segundo de atraso
Sleep(1000);
//--- excluir o fan do gráfico
GannFanDelete(0,InpName);

© 2000-2018, MetaQuotes Software Corp.


444 Constantes, Enumeradores e Estruturas

ChartRedraw();
//--- 1 segundo de atraso
Sleep(1000);
//---
}

© 2000-2018, MetaQuotes Software Corp.


445 Constantes, Enumeradores e Estruturas

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

© 2000-2018, MetaQuotes Software Corp.


446 Constantes, Enumeradores e Estruturas

input color InpColor=clrRed; // Cor do grade


input ENUM_LINE_STYLE InpStyle=STYLE_DASHDOTDOT; // Estilo de linhas do grade
input int InpWidth=1; // Largura das linhas fan
input bool InpBack=false; // Grade 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 Grade Gann  |
//+------------------------------------------------------------------+
bool GannGridCreate(const long chart_ID=0, // ID de gráfico
const string name="GannGrid", // nome do grade
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
const double scale=1.0, // escala
const bool direction=true, // direção da tendência
const color clr=clrRed, // cor do grade
const ENUM_LINE_STYLE style=STYLE_SOLID, // estilo das linhas grade
const int width=1, // largura das linhas grade
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 o clique do mouse
{
//--- definir coordenadas de pontos de ancoragem, se eles não estão definidos
ChangeGannGridEmptyPoints(time1,price1,time2);
//--- redefine o valor de erro
ResetLastError();
//--- Criar Grade Gann pelas coordenadas fornecidas
if(!ObjectCreate(chart_ID,name,OBJ_GANNGRID,sub_window,time1,price1,time2,0))
{
Print(__FUNCTION__,
": falha ao criar \"Grade Gann\"! Código de erro = ",GetLastError());
return(false);
}
//--- alterar a escala (número de pips por barra)
ObjectSetDouble(chart_ID,name,OBJPROP_SCALE,scale);
//--- mudar a direção de tendência Gann Fan (true - descendente, false - ascendente)
ObjectSetInteger(chart_ID,name,OBJPROP_DIRECTION,direction);
//--- definir cor do grade
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- definir a exibição do estilo das linhas grade
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- definir a largura da linha do grade
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- exibir em primeiro plano (false) ou fundo (true)
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);

© 2000-2018, MetaQuotes Software Corp.


447 Constantes, Enumeradores e Estruturas

//--- 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)

© 2000-2018, MetaQuotes Software Corp.


448 Constantes, Enumeradores e Estruturas

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  |

© 2000-2018, MetaQuotes Software Corp.


449 Constantes, Enumeradores e Estruturas

//+------------------------------------------------------------------+
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;
}

© 2000-2018, MetaQuotes Software Corp.


450 Constantes, Enumeradores e Estruturas

//--- 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 Grade Gann
int d1=InpDate1*(bars-1)/100;
int d2=InpDate2*(bars-1)/100;
int p1=InpPrice1*(accuracy-1)/100;
//--- criar Grade Gann
if(!GannGridCreate(0,InpName,0,date[d1],price[p1],date[d2],InpScale,InpDirection,
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 grade
//--- contador de loop
int v_steps=accuracy/4;
//--- mover o primeiro ponto de ancoragem vertical
for(int i=0;i<v_steps;i++)
{
//--- usar o seguinte valor
if(p1<accuracy-1)
p1+=1;
if(!GannGridPointChange(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 vertical
for(int i=0;i<h_steps;i++)
{
//--- usar o seguinte valor
if(d2<bars-1)
d2+=1;
if(!GannGridPointChange(0,InpName,1,date[d2],0))

© 2000-2018, MetaQuotes Software Corp.


451 Constantes, Enumeradores e Estruturas

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);
//---
}

© 2000-2018, MetaQuotes Software Corp.


452 Constantes, Enumeradores e Estruturas

OBJ_FIBO
Retração Fibonacci.

Observação
Para "Retraçã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, %

© 2000-2018, MetaQuotes Software Corp.


453 Constantes, Enumeradores e Estruturas

input color InpColor=clrRed; // Cor do objeto


input ENUM_LINE_STYLE InpStyle=STYLE_DASHDOTDOT; // Estilo da linha
input int InpWidth=2; // Largura da linha
input bool InpBack=false; // Objeto de fundo
input bool InpSelection=true; // Destaque para mover
input bool InpRayLeft=false; // Continuação do objeto para a esquerda
input bool InpRayRight=false; // Continuação do objeto para a direita
input bool InpHidden=true; // Ocultar na lista de objeto
input long InpZOrder=0; // Prioridade para clicar no mouse
//+------------------------------------------------------------------+
//| Criar Retração Fibonacci pelas coordenadas fornecidas  |
//+------------------------------------------------------------------+
bool FiboLevelsCreate(const long chart_ID=0, // ID de gráfico
const string name="FiboLevels", // nome do objeto
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 do objeto
const ENUM_LINE_STYLE style=STYLE_SOLID, // estilo de linha do objeto
const int width=1, // largura da linha do objeto
const bool back=false, // no fundo
const bool selection=true, // destaque para mover
const bool ray_left=false, // continuação do objeto para a esqu
const bool ray_right=false, // continuação do objeto para a dire
const bool hidden=true, // ocultar na lista de objetos
const long z_order=0) // prioridade para clique do mouse
{
//--- definir coordenadas de pontos de ancoragem, se eles não estão definidos
ChangeFiboLevelsEmptyPoints(time1,price1,time2,price2);
//--- redefine o valor de erro
ResetLastError();
//--- Criar Retração Fibonacci pelas coordenadas fornecidas
if(!ObjectCreate(chart_ID,name,OBJ_FIBO,sub_window,time1,price1,time2,price2))
{
Print(__FUNCTION__,
": falha para criar \"Retração Fibonacci\"! Código de erro = ",GetLastError());
return(false);
}
//--- definir cor
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- definir estilo de 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 preenchimento do canal

© 2000-2018, MetaQuotes Software Corp.


454 Constantes, Enumeradores e Estruturas

//--- 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));

© 2000-2018, MetaQuotes Software Corp.


455 Constantes, Enumeradores e Estruturas

}
//--- 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);
}
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


456 Constantes, Enumeradores e Estruturas

//|Vê valores dos pontos de ancoragem da Retração Fibonacci e  |


//| definir os valores padrões estabelecidos para os pontos vazio  |
//+------------------------------------------------------------------+
void ChangeFiboLevelsEmptyPoints(datetime &time1,double &price1,
datetime &time2,double &price2)
{
//--- se o tempo do primeiro ponto 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 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 Retração Fibonacci
datetime date[];
double price[];
//--- alocação de memória
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- preencher o array das datas

© 2000-2018, MetaQuotes Software Corp.


457 Constantes, Enumeradores e Estruturas

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

© 2000-2018, MetaQuotes Software Corp.


458 Constantes, Enumeradores e Estruturas

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);
//---
}

© 2000-2018, MetaQuotes Software Corp.


459 Constantes, Enumeradores e Estruturas

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

© 2000-2018, MetaQuotes Software Corp.


460 Constantes, Enumeradores e Estruturas

input bool InpBack=false; // Objeto 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 Fibonacci Zonas de Tempo pelas coordenadas fornecidas  |
//+------------------------------------------------------------------+
bool FiboTimesCreate(const long chart_ID=0, // ID de gráfico
const string name="FiboTimes", // nome do objeto
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 do objeto
const ENUM_LINE_STYLE style=STYLE_SOLID, // estilo de linha do objeto
const int width=1, // largura da linha do objeto
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 clique do mouse
{
//--- definir coordenadas de pontos de ancoragem, se eles não estão definidos
ChangeFiboTimesEmptyPoints(time1,price1,time2,price2);
//--- redefine o valor de erro
ResetLastError();
//--- criar Fibonacci Zonas de Tempo pelas coordenadas fornecidas
if(!ObjectCreate(chart_ID,name,OBJ_FIBOTIMES,sub_window,time1,price1,time2,price2))
{
Print(__FUNCTION__,
": falha ao criar \"Fibonacci Zonas de Tempo\"! Código de erro = ",GetLastError());
return(false);
}
//--- definir cor
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- definir estilo de 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 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);
//--- ocultar (true) ou exibir (false) o nome do objeto gráfico na lista de objeto
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);

© 2000-2018, MetaQuotes Software Corp.


461 Constantes, Enumeradores e Estruturas

//--- 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

© 2000-2018, MetaQuotes Software Corp.


462 Constantes, Enumeradores e Estruturas

double price=0) // coordenada do ponto de ancoragem de pre


{
//--- 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 Fibonacci Zonas de Tempo  |
//+------------------------------------------------------------------+
bool FiboTimesDelete(const long chart_ID=0, // ID gráfico
const string name="FiboTimes") // nome do objeto
{
//--- redefine o valor de erro
ResetLastError();
//--- excluir o objeto
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": falha ao excluir \"Fibonacci Zonas de Tempo\"! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Verificar os valores da Fibonacci Zonas de Tempo e  |
//| definir os valores padrões estabelecidos para aqueles vazios  |
//+------------------------------------------------------------------+
void ChangeFiboTimesEmptyPoints(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)

© 2000-2018, MetaQuotes Software Corp.


463 Constantes, Enumeradores e Estruturas

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

© 2000-2018, MetaQuotes Software Corp.


464 Constantes, Enumeradores e Estruturas

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]))

© 2000-2018, MetaQuotes Software Corp.


465 Constantes, Enumeradores e Estruturas

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);
//---
}

© 2000-2018, MetaQuotes Software Corp.


466 Constantes, Enumeradores e Estruturas

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

© 2000-2018, MetaQuotes Software Corp.


467 Constantes, Enumeradores e Estruturas

input bool InpBack=false; // Objeto 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 Fibonacci Fan pelas coordenadas fornecidas  |
//+------------------------------------------------------------------+
bool FiboFanCreate(const long chart_ID=0, // ID de gráfico
const string name="FiboFan", // nome do fan
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 fan
const ENUM_LINE_STYLE style=STYLE_SOLID, // estilo de linha fan
const int width=1, // largura da linha fan
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 clique do mouse
{
//--- definir coordenadas de pontos de ancoragem, se eles não estão definidos
ChangeFiboFanEmptyPoints(time1,price1,time2,price2);
//--- redefine o valor de erro
ResetLastError();
//--- criar Fibonacci Fan pelas coordenadas fornecidas
if(!ObjectCreate(chart_ID,name,OBJ_FIBOFAN,sub_window,time1,price1,time2,price2))
{
Print(__FUNCTION__,
": falha para criar \" Fibonacci Fan\"! Código de erro = ",GetLastError());
return(false);
}
//--- definir cor
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- definir estilo de 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 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);

© 2000-2018, MetaQuotes Software Corp.


468 Constantes, Enumeradores e Estruturas

//--- 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

© 2000-2018, MetaQuotes Software Corp.


469 Constantes, Enumeradores e Estruturas

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 nome da Fibo  |
//+------------------------------------------------------------------+
bool FiboFanDelete(const long chart_ID=0, // ID do gráfico
const string name="FiboFan") // nome do fan
{
//--- redefine o valor de erro
ResetLastError();
//--- excluir Gann Fan
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": falha ao excluir \" Fibonacci Fan\"! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Ver valores dos pontos de ancoragem Fibonacci Fan e  |
//| definir os valores padrões estabelecidos para os pontos vazio  |
//+------------------------------------------------------------------+
void ChangeFiboFanEmptyPoints(datetime &time1,double &price1,
datetime &time2,double &price2)
{
//--- se o tempo do primeiro ponto 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)

© 2000-2018, MetaQuotes Software Corp.


470 Constantes, Enumeradores e Estruturas

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

© 2000-2018, MetaQuotes Software Corp.


471 Constantes, Enumeradores e Estruturas

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

© 2000-2018, MetaQuotes Software Corp.


472 Constantes, Enumeradores e Estruturas

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);
//---
}

© 2000-2018, MetaQuotes Software Corp.


473 Constantes, Enumeradores e Estruturas

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

© 2000-2018, MetaQuotes Software Corp.


474 Constantes, Enumeradores e Estruturas

input bool InpFullEllipse=true; // Formas dos arcos


input color InpColor=clrRed; // Cor da linha
input ENUM_LINE_STYLE InpStyle=STYLE_DASHDOTDOT; // Estilo da linha
input int InpWidth=2; // Largura da linha
input bool InpBack=false; // Objeto 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 Arcos Fibonacci pelas coordenadas fornecidas  |
//+------------------------------------------------------------------+
bool FiboArcCreate(const long chart_ID=0, // ID do gráfico
const string name="FiboArc", // nome do objeto
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 double scale=1.0, // escala
const bool full_ellipse=false, // forma dos arcos
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
ChangeFiboArcEmptyPoints(time1,price1,time2,price2);
//--- redefine o valor de erro
ResetLastError();
//--- criar Arcos Fibonacci pelas coordenadas fornecidas
if(!ObjectCreate(chart_ID,name,OBJ_FIBOARC,sub_window,time1,price1,time2,price2))
{
Print(__FUNCTION__,
": falha ao criar \"Arcos Fibonacci\"! Código de erro = ",GetLastError());
return(false);
}
//--- definir a escala
ObjectSetDouble(chart_ID,name,OBJPROP_SCALE,scale);
//--- definir visualização dos arcos como uma elipse completa (true) ou a metade dela (false)
ObjectSetInteger(chart_ID,name,OBJPROP_ELLIPSE,full_ellipse);
//--- definir cor
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- definir estilo de linha
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- definir a largura da linha
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);

© 2000-2018, MetaQuotes Software Corp.


475 Constantes, Enumeradores e Estruturas

//--- 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 os arcos
//--- 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);
}
//+------------------------------------------------------------------+
//| Definir o número de níveis e seus parâmetros  |
//+------------------------------------------------------------------+
bool FiboArcLevelsSet(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="FiboArc") // 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));
}

© 2000-2018, MetaQuotes Software Corp.


476 Constantes, Enumeradores e Estruturas

//--- sucesso na execução


return(true);
}
//+------------------------------------------------------------------+
//| Mover ponto de ancoragem dos Arcos Fibonacci  |
//+------------------------------------------------------------------+
bool FiboArcPointChange(const long chart_ID=0, // ID do gráfico
const string name="FiboArc", // nome do objeto
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 Arcos Fibonacci  |
//+------------------------------------------------------------------+
bool FiboArcDelete(const long chart_ID=0, // ID do gráfico
const string name="FiboArc") // nome do objeto
{
//--- redefine o valor de erro
ResetLastError();
//--- excluir o objeto
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": falha ao excluir\"Arcos Fibonacci\"! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Ver valores dos pontos de ancoragem dos Arcos Fibonacci e definir|

© 2000-2018, MetaQuotes Software Corp.


477 Constantes, Enumeradores e Estruturas

//| valores padrão para aqueles vazios  |


//+------------------------------------------------------------------+
void ChangeFiboArcEmptyPoints(datetime &time1,double &price1,
datetime &time2,double &price2)
{
//--- se o tempo do primeiro ponto 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 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 300 pontos a mais do que o segundo
if(!price1)
price1=price2-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 dos pontos de ancoragem dos Arcos Fibonacci
datetime date[];
double price[];
//--- alocação de memória
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- preencher o array das datas
ResetLastError();

© 2000-2018, MetaQuotes Software Corp.


478 Constantes, Enumeradores e Estruturas

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;

© 2000-2018, MetaQuotes Software Corp.


479 Constantes, Enumeradores e Estruturas

//--- 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(!FiboArcPointChange(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
FiboArcDelete(0,InpName);
ChartRedraw();
//--- 1 segundo de atraso
Sleep(1000);
//---
}

© 2000-2018, MetaQuotes Software Corp.


480 Constantes, Enumeradores e Estruturas

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, %

© 2000-2018, MetaQuotes Software Corp.


481 Constantes, Enumeradores e Estruturas

input int InpPrice3=25; // Preço do 3º ponto, %


input color InpColor=clrRed; // Cor do canal
input ENUM_LINE_STYLE InpStyle=STYLE_DASHDOTDOT; // Estilo de linhas do canal
input int InpWidth=2; // Largura das linhas do canal
input bool InpBack=false; // Canal de Fundo
input bool InpSelection=true; // Destaque para mover
input bool InpRayLeft=false; // Continuação do Canal para a esquerda
input bool InpRayRight=false; // Continuação do Canal para a direita
input bool InpHidden=true; // Ocultar na lista de objeto
input long InpZOrder=0; // Prioridade para clicar no mouse
//+------------------------------------------------------------------+
//| Criar Canal Fibonacci pelas coordenadas fornecidas  |
//+------------------------------------------------------------------+
bool FiboChannelCreate(const long chart_ID=0, // ID do gráfico
const string name="FiboChannel", // nome do canal
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
datetime time3=0, // terceiro ponto de tempo
double price3=0, // terceiro ponto de preço
const color clr=clrRed, // cor do sinal
const ENUM_LINE_STYLE style=STYLE_SOLID, // estilo das linhas do canal
const int width=1, // largura das linhas do canal
const bool back=false, // no fundo
const bool selection=true, // destacar para mover
const bool ray_left=false, // continuação do canal para a esq
const bool ray_right=false, // continuação do canal para a dir
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
ChangeFiboChannelEmptyPoints(time1,price1,time2,price2,time3,price3);
//--- redefine o valor de erro
ResetLastError();
//--- criar um canal pelas coordenadas dadas
if(!ObjectCreate(chart_ID,name,OBJ_FIBOCHANNEL,sub_window,time1,price1,time2,price2,time3,price3
{
Print(__FUNCTION__,
": falha ao criar \"Canal Fibonacci\"! Código de erro = ",GetLastError());
return(false);
}
//--- definir a cor do canal
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- definir o estilo de linha do canal
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- definir a largura da linha do canal
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);

© 2000-2018, MetaQuotes Software Corp.


482 Constantes, Enumeradores e Estruturas

//--- 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);
}
//+------------------------------------------------------------------+
//| Definir o número de níveis e seus parâmetros  |
//+------------------------------------------------------------------+
bool FiboChannelLevelsSet(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="FiboChannel") // 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

© 2000-2018, MetaQuotes Software Corp.


483 Constantes, Enumeradores e Estruturas

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

© 2000-2018, MetaQuotes Software Corp.


484 Constantes, Enumeradores e Estruturas

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);

© 2000-2018, MetaQuotes Software Corp.


485 Constantes, Enumeradores e Estruturas

//--- 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 Canal Fibonacci
if(!FiboChannelCreate(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 canal
//--- contador de loop
int h_steps=bars/10;
//--- mover o primeiro ponto de ancoragem
for(int i=0;i<h_steps;i++)
{
//--- usar o seguinte valor
if(d1>1)
d1-=1;

© 2000-2018, MetaQuotes Software Corp.


486 Constantes, Enumeradores e Estruturas

//--- mover o ponto


if(!FiboChannelPointChange(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 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(!FiboChannelPointChange(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
v_steps=accuracy/15;
//--- 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(!FiboChannelPointChange(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();
}

© 2000-2018, MetaQuotes Software Corp.


487 Constantes, Enumeradores e Estruturas

//--- 1 segundo de atraso


Sleep(1000);
//--- excluir o canal do gráfico
FiboChannelDelete(0,InpName);
ChartRedraw();
//--- 1 segundo de atraso
Sleep(1000);
//---
}

© 2000-2018, MetaQuotes Software Corp.


488 Constantes, Enumeradores e Estruturas

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, %

© 2000-2018, MetaQuotes Software Corp.


489 Constantes, Enumeradores e Estruturas

input int InpDate3=80; // Data do 3º ponto, %


input int InpPrice3=75; // Preço do 3º ponto, %
input color InpColor=clrRed; // Cor do objeto
input ENUM_LINE_STYLE InpStyle=STYLE_DASHDOTDOT; // Estilo de linhas
input int InpWidth=2; // Largura das linha
input bool InpBack=false; // Objeto de fundo
input bool InpSelection=true; // Destaque para mover
input bool InpRayLeft=false; // Continuação do objeto para a esquerda
input bool InpRayRight=false; // Continuação do objeto para a direita
input bool InpHidden=true; // Ocultar na lista de objeto
input long InpZOrder=0; // Prioridade para clicar no mouse
//+------------------------------------------------------------------+
//| Criar Extensão Fibonacci pelas coordenadas fornecidas  |
//+------------------------------------------------------------------+
bool FiboExpansionCreate(const long chart_ID=0, // ID de gráfico
const string name="FiboExpansion", // nome do canal
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
datetime time3=0, // terceiro ponto de tempo
double price3=0, // terceiro ponto de preço
const color clr=clrRed, // cor do objeto
const ENUM_LINE_STYLE style=STYLE_SOLID, // estilo das linhas
const int width=1, // largura das linhas
const bool back=false, // no fundo
const bool selection=true, // destaque para mover
const bool ray_left=false, // continuação do objeto para
const bool ray_right=false, // continuação do objeto para
const bool hidden=true, // ocultar na lista de objetos
const long z_order=0) // prioridade para clicar no m
{
//--- definir coordenadas de pontos de ancoragem, se eles não estão definidos
ChangeFiboExpansionEmptyPoints(time1,price1,time2,price2,time3,price3);
//--- redefine o valor de erro
ResetLastError();
//--- Criar Extensão Fibonacci pelas coordenadas fornecidas
if(!ObjectCreate(chart_ID,name,OBJ_EXPANSION,sub_window,time1,price1,time2,price2,time3,price3))
{
Print(__FUNCTION__,
": falha para criar \"Extensão Fibonacci\"! Código de erro = ",GetLastError());
return(false);
}
//--- definir cor do objeto
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- definir o estilo da linha
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- definir a largura das linhas

© 2000-2018, MetaQuotes Software Corp.


490 Constantes, Enumeradores e Estruturas

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]);

© 2000-2018, MetaQuotes Software Corp.


491 Constantes, Enumeradores e Estruturas

//--- 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,"FE "+DoubleToString(100*values[i],1));
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Mover ponto de ancoragem da Expansão Fibonacci  |
//+------------------------------------------------------------------+
bool FiboExpansionPointChange(const long chart_ID=0, // ID do gráfico
const string name="FiboExpansion", // nome do objeto
const int point_index=0, // índice do ponto de ancoragem
datetime time=0, // coordenada do ponto de ancorage
double price=0) // coordenada do ponto de ancorage
{
//--- 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 Expansão Fibonacci  |
//+------------------------------------------------------------------+
bool FiboExpansionDelete(const long chart_ID=0, // ID do gráfico
const string name="FiboExpansion") // nome do objeto
{
//--- redefine o valor de erro
ResetLastError();
//--- excluir o objeto
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": falha ao excluir \"Expansão Fibonacci\"! Código de erro = ",GetLastError());
return(false);
}

© 2000-2018, MetaQuotes Software Corp.


492 Constantes, Enumeradores e Estruturas

//--- sucesso na execução


return(true);
}
//+------------------------------------------------------------------+
//| Vê valores dos pontos de ancoragem da Expansão Fibonacci e  |
//| definir os valores padrões estabelecidos para os pontos vazio  |
//+------------------------------------------------------------------+
void ChangeFiboExpansionEmptyPoints(datetime &time1,double &price1,datetime &time2,
double &price2,datetime &time3,double &price3)
{
//--- se o tempo do terceiro ponto (a direita)não está definido, será na barra atual
if(!time3)
time3=TimeCurrent();
//--- se o preço do terceiro ponto não está definido, ele terá valor Bid
if(!price3)
price3=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- se o tempo do primeiro ponto (a esquerda) não está definido, ele está localizado 9 barras a e
//--- array para receber o tempo de abertura das últimas 10 barras
datetime temp[];
ArrayResize(temp,10);
if(!time1)
{
CopyTime(Symbol(),Period(),time3,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, é igual ao terceiro ponto
if(!price1)
price1=price3;
//--- se o tempo do segundo ponto não está definido, está localizado a 7 barras deixadas a partir d
if(!time2)
time2=temp[2];
//--- se o preço do primeiro ponto não está definido, mover 250 pontos a mais do que o primeiro
if(!price2)
price2=price1-250*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;
}

© 2000-2018, MetaQuotes Software Corp.


493 Constantes, Enumeradores e Estruturas

//--- 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 Expansão Fibonacci
int d1=InpDate1*(bars-1)/100;
int d2=InpDate2*(bars-1)/100;
int d3=InpDate3*(bars-1)/100;
int p1=InpPrice1*(accuracy-1)/100;
int p2=InpPrice2*(accuracy-1)/100;
int p3=InpPrice3*(accuracy-1)/100;
//--- criar Expansão Fibonacci
if(!FiboExpansionCreate(0,InpName,0,date[d1],price[p1],date[d2],price[p2],date[d3],price[p3],
InpColor,InpStyle,InpWidth,InpBack,InpSelection,InpRayLeft,InpRayRight,InpHidden,InpZOrder))
{
return;
}
//--- 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/10;
//--- mover o primeiro ponto de ancoragem
for(int i=0;i<v_steps;i++)
{
//--- usar o seguinte valor

© 2000-2018, MetaQuotes Software Corp.


494 Constantes, Enumeradores e Estruturas

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();
}

© 2000-2018, MetaQuotes Software Corp.


495 Constantes, Enumeradores e Estruturas

//--- 1 segundo de atraso


Sleep(1000);
//--- excluir a etiqueta do gráfico
FiboExpansionDelete(0,InpName);
ChartRedraw();
//--- 1 segundo de atraso
Sleep(1000);
//---
}

© 2000-2018, MetaQuotes Software Corp.


496 Constantes, Enumeradores e Estruturas

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, %

© 2000-2018, MetaQuotes Software Corp.


497 Constantes, Enumeradores e Estruturas

input int InpPrice3=60; // Preço do 3º ponto, %


input int InpDate4=40; // Data do 4º ponto, %
input int InpPrice4=10; // Preço do 4º ponto, %
input int InpDate5=60; // Data do 5º ponto, %
input int InpPrice5=40; // Preço do 5º ponto, %
input ENUM_ELLIOT_WAVE_DEGREE InpDegree=ELLIOTT_MINOR; // Nível
input bool InpDrawLines=true; // Exibindo as linhas
input color InpColor=clrRed; // Cor das linhas
input ENUM_LINE_STYLE InpStyle=STYLE_DASH; // Estilo das linhas
input int InpWidth=2; // Largura das linha
input bool InpBack=false; // Objeto de fundo
input bool InpSelection=true; // Destaque para mover
input bool InpHidden=true; // Ocultar na lista de objetos
input long InpZOrder=0; // Prioridade para clique do mouse
//+------------------------------------------------------------------+
//| Criar "Onda Móvel Elliott" pelas coordenadas fornecidas  |
//+------------------------------------------------------------------+
bool ElliotWave5Create(const long chart_ID=0, // ID do gráfico
const string name="ElliotWave3", // nome da onda
const int sub_window=0, // índice da sub-jane
datetime time1=0, // primeiro ponto de
double price1=0, //primeiro ponto de p
datetime time2=0, // segundo ponto de t
double price2=0, // segundo ponto de p
datetime time3=0, // terceiro ponto de
double price3=0, // terceiro ponto de
datetime time4=0, // quarto ponto de te
double price4=0, // quarto ponto de pr
datetime time5=0, // quinto ponto de te
double price5=0, // quinto ponto de pr
const ENUM_ELLIOT_WAVE_DEGREE degree=ELLIOTT_MINUETTE, // grau
const bool draw_lines=true, // exibindo as linhas
const color clr=clrRed, // cor do objeto
const ENUM_LINE_STYLE style=STYLE_SOLID, // estilo das linhas
const int width=1, // largura das linhas
const bool back=false, // no fundo
const bool selection=true, // destacar para move
const bool hidden=true, // ocultar na lista d
const long z_order=0) // prioridade para cl
{
//--- definir coordenadas de pontos de ancoragem, se eles não estão definidos
ChangeElliotWave5EmptyPoints(time1,price1,time2,price2,time3,price3,time4,price4,time5,price5);
//--- redefine o valor de erro
ResetLastError();
//--- Criar "Onda Móvel Elliott" pelas coordenadas fornecidas
if(!ObjectCreate(chart_ID,name,OBJ_ELLIOTWAVE5,sub_window,time1,price1,time2,price2,time3,
price3,time4,price4,time5,price5))
{
Print(__FUNCTION__,

© 2000-2018, MetaQuotes Software Corp.


498 Constantes, Enumeradores e Estruturas

": falha ao criar \""Onda Móvel Elliott"\"! Código de erro = ",GetLastError());


return(false);
}
//--- definir grau (tamanho da onda)
ObjectSetInteger(chart_ID,name,OBJPROP_DEGREE,degree);
//--- habilitar (true) ou desabilitar (false) o modo de exibição das linhas
ObjectSetInteger(chart_ID,name,OBJPROP_DRAWLINES,draw_lines);
//--- definir cor do objeto
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- definir o estilo da linha
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- definir a largura das linhas
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);
//--- 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);
}
//+------------------------------------------------------------------+
//| Move o ponto de ancoragem da Onda Móvel Elliott  |
//+------------------------------------------------------------------+
bool ElliotWave5PointChange(const long chart_ID=0, // ID do gráfico
const string name="ElliotWave5", // nome do objeto
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());

© 2000-2018, MetaQuotes Software Corp.


499 Constantes, Enumeradores e Estruturas

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];

© 2000-2018, MetaQuotes Software Corp.


500 Constantes, Enumeradores e Estruturas

//--- 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

© 2000-2018, MetaQuotes Software Corp.


501 Constantes, Enumeradores e Estruturas

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())

© 2000-2018, MetaQuotes Software Corp.


502 Constantes, Enumeradores e Estruturas

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();

© 2000-2018, MetaQuotes Software Corp.


503 Constantes, Enumeradores e Estruturas

}
//--- 1 segundo de atraso
Sleep(1000);
//--- excluir a etiqueta do gráfico
ElliotWave5Delete(0,InpName);
ChartRedraw();
//--- 1 segundo de atraso
Sleep(1000);
//---
}

© 2000-2018, MetaQuotes Software Corp.


504 Constantes, Enumeradores e Estruturas

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, %

© 2000-2018, MetaQuotes Software Corp.


505 Constantes, Enumeradores e Estruturas

input int InpPrice3=40; // Preço do 3º ponto, %


input ENUM_ELLIOT_WAVE_DEGREE InpDegree=ELLIOTT_MINOR; // Nível
input bool InpDrawLines=true; // Exibindo as linhas
input color InpColor=clrRed; // Cor das linhas
input ENUM_LINE_STYLE InpStyle=STYLE_DASH; // Estilo das linhas
input int InpWidth=2; // Largura das linha
input bool InpBack=false; // Objeto de fundo
input bool InpSelection=true; // Destaque para mover
input bool InpHidden=true; // Ocultar na lista de objetos
input long InpZOrder=0; // Prioridade para clique do mouse
//+------------------------------------------------------------------+
//| Criar "Correção da Onda Elliott" pelas coordenadas fornecidas  |
//+------------------------------------------------------------------+
bool ElliotWave3Create(const long chart_ID=0, // ID do gráfico
const string name="ElliotWave3", // nome da onda
const int sub_window=0, // índice da sub-jane
datetime time1=0, // primeiro ponto de
double price1=0, //primeiro ponto de p
datetime time2=0, // segundo ponto de t
double price2=0, // segundo ponto de p
datetime time3=0, // terceiro ponto de
double price3=0, // terceiro ponto de
const ENUM_ELLIOT_WAVE_DEGREE degree=ELLIOTT_MINUETTE, // grau
const bool draw_lines=true, // exibindo as linhas
const color clr=clrRed, // cor do objeto
const ENUM_LINE_STYLE style=STYLE_SOLID, // estilo das linhas
const int width=1, // largura das linhas
const bool back=false, // no fundo
const bool selection=true, // destacar para move
const bool hidden=true, // ocultar na lista d
const long z_order=0) // prioridade para cl
{
//--- definir coordenadas de pontos de ancoragem, se eles não estão definidos
ChangeElliotWave3EmptyPoints(time1,price1,time2,price2,time3,price3);
//--- redefine o valor de erro
ResetLastError();
//--- Criar "Correção da Onda Elliott" pelas coordenadas fornecidas
if(!ObjectCreate(chart_ID,name,OBJ_ELLIOTWAVE3,sub_window,time1,price1,time2,price2,time3,price3
{
Print(__FUNCTION__,
": falha ao criar \""Correção da Onda Elliott"\"! Código de erro = ",GetLastError());
return(false);
}
//--- definir grau (tamanho da onda)
ObjectSetInteger(chart_ID,name,OBJPROP_DEGREE,degree);
//--- habilitar (true) ou desabilitar (false) o modo de exibição das linhas
ObjectSetInteger(chart_ID,name,OBJPROP_DRAWLINES,draw_lines);
//--- definir cor do objeto
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);

© 2000-2018, MetaQuotes Software Corp.


506 Constantes, Enumeradores e Estruturas

//--- definir o estilo da linha


ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- definir a largura das linhas
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);
//--- 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);
}
//+------------------------------------------------------------------+
//| Move o ponto de ancoragem de Correção da Elliott  |
//+------------------------------------------------------------------+
bool ElliotWave3PointChange(const long chart_ID=0, // ID do gráfico
const string name="ElliotWave3", // nome do objeto
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 Correção da Onda Elliott  |
//+------------------------------------------------------------------+
bool ElliotWave3Delete(const long chart_ID=0, // ID do gráfico

© 2000-2018, MetaQuotes Software Corp.


507 Constantes, Enumeradores e Estruturas

const string name="ElliotWave3") // nome do objeto


{
//--- redefine o valor de erro
ResetLastError();
//--- excluir o objeto
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": falha ao excluir \""Correção da Onda Elliott"\"! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Verificar valores de pontos de ancoragem da Correção Onda Elliott|
//| e os valores padrão estabelecidos para os pontos vazios  |
//+------------------------------------------------------------------+
void ChangeElliotWave3EmptyPoints(datetime &time1,double &price1,
datetime &time2,double &price2,
datetime &time3,double &price3)
{
//--- 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 5 barras a esquerda a partir da última
if(!time2)
time2=temp[4];
//--- 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á uma barra a esquerda a partir da última
if(!time3)
time3=temp[8];
//--- 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*point;
}
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


508 Constantes, Enumeradores e Estruturas

//| 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
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 Correção da Onda Elliott
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 Correção da Onda Elliott
if(!ElliotWave3Create(0,InpName,0,date[d1],price[p1],date[d2],price[p2],date[d3],price[p3],
InpDegree,InpDrawLines,InpColor,InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{

© 2000-2018, MetaQuotes Software Corp.


509 Constantes, Enumeradores e Estruturas

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

© 2000-2018, MetaQuotes Software Corp.


510 Constantes, Enumeradores e Estruturas

ElliotWave3Delete(0,InpName);
ChartRedraw();
//--- 1 segundo de atraso
Sleep(1000);
//---
}

© 2000-2018, MetaQuotes Software Corp.


511 Constantes, Enumeradores e Estruturas

OBJ_RECTANGLE
Retâ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

© 2000-2018, MetaQuotes Software Corp.


512 Constantes, Enumeradores e Estruturas

input int InpWidth=2; // Largura das linhas do retângulo


input bool InpFill=true; // Preenchendo o retângulo com cor
input bool InpBack=false; // Retângulo 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 retângulo pelas coordenadas fornecidas  |
//+------------------------------------------------------------------+
bool RectangleCreate(const long chart_ID=0, // ID do gráfico
const string name="Rectangle", // nome do retângulo
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 do retângulo
const ENUM_LINE_STYLE style=STYLE_SOLID, // estilo das linhas do retângulo
const int width=1, // largura das linhas do retângulo
const bool fill=false, // preenchimento do retângulo com cor
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 clique do mouse
{
//--- definir coordenadas de pontos de ancoragem, se eles não estão definidos
ChangeRectangleEmptyPoints(time1,price1,time2,price2);
//--- redefine o valor de erro
ResetLastError();
//--- criar um retângulo pelas coordenadas dadas
if(!ObjectCreate(chart_ID,name,OBJ_RECTANGLE,sub_window,time1,price1,time2,price2))
{
Print(__FUNCTION__,
": falha ao criar um retângulo! Código de erro = ",GetLastError());
return(false);
}
//--- definir a cor do retângulo
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- definir o estilo de linhas do retângulo
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- definir a largura das linhas do retângulo
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- habilitar (true) ou desabilitar (false) o modo de preenchimento do retângulo
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 destaque para mover o retângulo
//--- 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

© 2000-2018, MetaQuotes Software Corp.


513 Constantes, Enumeradores e Estruturas

//--- é 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 retângulo  |
//+------------------------------------------------------------------+
bool RectanglePointChange(const long chart_ID=0, // ID do gráfico
const string name="Rectangle", // nome do retângulo
const int point_index=0, // índice do ponto de ancoragem
datetime time=0, // coordenada do ponto de ancoragem de tem
double price=0) // coordenada do ponto de ancoragem de pre
{
//--- 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 retângulo  |
//+------------------------------------------------------------------+
bool RectangleDelete(const long chart_ID=0, // ID do gráfico
const string name="Rectangle") // nome do retângulo
{
//--- redefine o valor de erro
ResetLastError();
//--- excluir o retângulo
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": falha ao excluir o retângulo! Código de erro = ",GetLastError());

© 2000-2018, MetaQuotes Software Corp.


514 Constantes, Enumeradores e Estruturas

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

© 2000-2018, MetaQuotes Software Corp.


515 Constantes, Enumeradores e Estruturas

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]))

© 2000-2018, MetaQuotes Software Corp.


516 Constantes, Enumeradores e Estruturas

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);
//---
}

© 2000-2018, MetaQuotes Software Corp.


517 Constantes, Enumeradores e Estruturas

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, %

© 2000-2018, MetaQuotes Software Corp.


518 Constantes, Enumeradores e Estruturas

input color InpColor=clrRed; // Cor do triângulo


input ENUM_LINE_STYLE InpStyle=STYLE_DASHDOTDOT; // Estilo das linhas triangulo
input int InpWidth=2; // Largura das linhas do triângulo
input bool InpFill=false; // Preenchendo triângulos com cor
input bool InpBack=false; // Triângulo 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 triângulo pelas coordenadas determinadas  |
//+------------------------------------------------------------------+
bool TriangleCreate(const long chart_ID=0, // ID do gráfico
const string name="Triangle", // nome do triângulo
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
datetime time3=0, // terceiro ponto de tempo
double price3=0, // terceiro ponto de preço
const color clr=clrRed, // cor do triângulo
const ENUM_LINE_STYLE style=STYLE_SOLID, // estilo das linhas do triângulo
const int width=1, // largura das linhas do triângulo
const bool fill=false, // preenchendo triângulo com cor
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 o clique do mouse
{
//--- definir coordenadas de pontos de ancoragem, se eles não estão definidos
ChangeTriangleEmptyPoints(time1,price1,time2,price2,time3,price3);
//--- redefine o valor de erro
ResetLastError();
//--- criar triângulo pelas coordenadas determinadas
if(!ObjectCreate(chart_ID,name,OBJ_TRIANGLE,sub_window,time1,price1,time2,price2,time3,price3))
{
Print(__FUNCTION__,
": falha ao criar triângulo! Código de erro = ",GetLastError());
return(false);
}
//--- definir a cor do triângulo
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- definir o estilo das linhas do triângulo
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- definir a largura da linha dos triângulos
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- habilitar (true) ou desabilitar (false) o modo de preencher o triângulo
ObjectSetInteger(chart_ID,name,OBJPROP_FILL,fill);
//--- exibir em primeiro plano (false) ou fundo (true)

© 2000-2018, MetaQuotes Software Corp.


519 Constantes, Enumeradores e Estruturas

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

© 2000-2018, MetaQuotes Software Corp.


520 Constantes, Enumeradores e Estruturas

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 ||

© 2000-2018, MetaQuotes Software Corp.


521 Constantes, Enumeradores e Estruturas

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 triâ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 os pontos para desenhar o triângulo
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 um triângulo
if(!TriangleCreate(0,InpName,0,date[d1],price[p1],date[d2],price[p2],date[d3],price[p3],
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 da triângulo

© 2000-2018, MetaQuotes Software Corp.


522 Constantes, Enumeradores e Estruturas

//--- contador de loop


int v_steps=accuracy*3/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(!TrianglePointChange(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*9/20-1;
//--- mover o segundo ponto de ancoragem
for(int i=0;i<h_steps;i++)
{
//--- usar o seguinte valor
if(d2>1)
d2-=1;
//--- mover o ponto
if(!TrianglePointChange(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
v_steps=accuracy/4;
//--- 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

© 2000-2018, MetaQuotes Software Corp.


523 Constantes, Enumeradores e Estruturas

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);
//---
}

© 2000-2018, MetaQuotes Software Corp.


524 Constantes, Enumeradores e Estruturas

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

© 2000-2018, MetaQuotes Software Corp.


525 Constantes, Enumeradores e Estruturas

input ENUM_LINE_STYLE InpStyle=STYLE_DASHDOTDOT; // Estilo de linhas da elipse


input int InpWidth=2; // Largura das linhas da elipse
input bool InpFill=false; // Preenchendo elipse com cor
input bool InpBack=false; // Elipse 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 elipse pelas coordenadas fornecidas  |
//+------------------------------------------------------------------+
bool EllipseCreate(const long chart_ID=0, // ID de gráfico
const string name="Ellipse", // nome da elipse
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
datetime time3=0, // terceiro ponto de tempo
double price3=0, // terceiro ponto de preço
const color clr=clrRed, // cor da elipse
const ENUM_LINE_STYLE style=STYLE_SOLID, // estilo das linhas da elipse
const int width=1, // largura das linhas da elipse
const bool fill=false, // preenchimento da elipse com cor
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 clique do mouse
{
//--- definir coordenadas de pontos de ancoragem, se eles não estão definidos
ChangeEllipseEmptyPoints(time1,price1,time2,price2,time3,price3);
//--- redefine o valor de erro
ResetLastError();
//--- criar uma elipse pelas coordenadas fornecidas
if(!ObjectCreate(chart_ID,name,OBJ_ELLIPSE,sub_window,time1,price1,time2,price2,time3,price3))
{
Print(__FUNCTION__,
": falha ao criar uma elipse! Código de erro = ",GetLastError());
return(false);
}
//--- definir uma cor de elipse
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- definir o estilo de linhas da elipse
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- definir a largura das linhas da elipse
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- habilitar (true) ou desabilitar (false) o modo de preenchimento da elipse
ObjectSetInteger(chart_ID,name,OBJPROP_FILL,fill);
//--- exibir em primeiro plano (false) ou fundo (true)
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);

© 2000-2018, MetaQuotes Software Corp.


526 Constantes, Enumeradores e Estruturas

//--- 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))

© 2000-2018, MetaQuotes Software Corp.


527 Constantes, Enumeradores e Estruturas

{
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 ||

© 2000-2018, MetaQuotes Software Corp.


528 Constantes, Enumeradores e Estruturas

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 da elipse
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 elipse
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 uma elipse
if(!EllipseCreate(0,InpName,0,date[d1],price[p1],date[d2],price[p2],date[d3],price[p3],
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 da elipse
//--- contador de loop

© 2000-2018, MetaQuotes Software Corp.


529 Constantes, Enumeradores e Estruturas

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);
//---

© 2000-2018, MetaQuotes Software Corp.


530 Constantes, Enumeradores e Estruturas

© 2000-2018, MetaQuotes Software Corp.


531 Constantes, Enumeradores e Estruturas

OBJ_ARROW_THUMB_UP
Sinal Thumbs 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 Thumbs 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

© 2000-2018, MetaQuotes Software Corp.


532 Constantes, Enumeradores e Estruturas

input ENUM_LINE_STYLE InpStyle=STYLE_DOT; // Estilo da linha da borda


input int InpWidth=5; // Tamanho do sinal
input bool InpBack=false; // Sinal do fundo
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 sinal Thumbs Up  |
//+------------------------------------------------------------------+
bool ArrowThumbUpCreate(const long chart_ID=0, // ID do gráfico
const string name="ThumbUp", // nome do sinal
const int sub_window=0, // índice da sub-janela
datetime time=0, // ponto de ancoragem do temp
double price=0, // ponto de ancoragem do preç
const ENUM_ARROW_ANCHOR anchor=ANCHOR_BOTTOM, // tipo de ancoragem
const color clr=clrRed, // cor do sinal
const ENUM_LINE_STYLE style=STYLE_SOLID, // estilo de linha da borda
const int width=3, // tamanho do sinal
const bool back=false, // no fundo
const bool selection=true, // destaque para mover
const bool hidden=true, // ocultar na lista de objeto
const long z_order=0) // prioridade para clicar no
{
//--- definir as coordenadas de pontos de ancoragem, se eles não estão definidos
ChangeArrowEmptyPoint(time,price);
//--- redefine o valor de erro
ResetLastError();
//--- criar o sinal
if(!ObjectCreate(chart_ID,name,OBJ_ARROW_THUMB_UP,sub_window,time,price))
{
Print(__FUNCTION__,
": falha ao criar sinal \"Thumbs Up\"! Código de erro = ",GetLastError());
return(false);
}
//--- tipo de definição de ancoragem
ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);
//--- definir uma cor de sinal
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- definir o estilo da linha da borda
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- tamanho da definição do sinal
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- exibir em primeiro plano (false) ou fundo (true)
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- permitir (true) ou desabilitar (false) o modo de movimento do sinal 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);

© 2000-2018, MetaQuotes Software Corp.


533 Constantes, Enumeradores e Estruturas

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);
}

© 2000-2018, MetaQuotes Software Corp.


534 Constantes, Enumeradores e Estruturas

//--- sucesso na execução


return(true);
}
//+------------------------------------------------------------------+
//| Excluir sinal Thumbs Up  |
//+------------------------------------------------------------------+
bool ArrowThumbUpDelete(const long chart_ID=0, // ID do gráfico
const string name="ThumbUp") // 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 Up\"! 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;

© 2000-2018, MetaQuotes Software Corp.


535 Constantes, Enumeradores e Estruturas

//--- 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;

© 2000-2018, MetaQuotes Software Corp.


536 Constantes, Enumeradores e Estruturas

//--- 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<accuracy-1)
p+=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;
//--- redesenhar o gráfico
ChartRedraw();
}
//--- alterar a localização do ponto de ancoragem relativa ao sinal
ArrowThumbUpAnchorChange(0,InpName,ANCHOR_BOTTOM);
//--- redesenhar o gráfico
ChartRedraw();
//--- 1 segundo de atraso
Sleep(1000);
//--- deletar o sinal do gráfico
ArrowThumbUpDelete(0,InpName);
ChartRedraw();
//--- 1 segundo de atraso
Sleep(1000);
//---
}

© 2000-2018, MetaQuotes Software Corp.


537 Constantes, Enumeradores e Estruturas

OBJ_ARROW_THUMB_DOW N
Sinal Thumbs 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 Thumbs 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

© 2000-2018, MetaQuotes Software Corp.


538 Constantes, Enumeradores e Estruturas

input color InpColor=clrRed; // Cor do sinal


input ENUM_LINE_STYLE InpStyle=STYLE_DOT; // Estilo de linha da borda
input int InpWidth=5; // Tamanho do Sinal
input bool InpBack=false; // Fundo do sinal
input bool InpSelection=true; // Destaque para mover
input bool InpHidden=true; // Ocultar na lista de objetos
input long InpZOrder=0; // Prioridade para clique do mouse
//+------------------------------------------------------------------+
//| Criar sinal Thumbs Down  |
//+------------------------------------------------------------------+
bool ArrowThumbDownCreate(const long chart_ID=0, // ID do gráfico
const string name="ThumbDown", // nome do sinal
const int sub_window=0, // índice de sub-janela
datetime time=0, // ponto de ancoragem do te
double price=0, // ponto de ancoragem do pr
const ENUM_ARROW_ANCHOR anchor=ANCHOR_BOTTOM, // tipo de ancoragem
const color clr=clrRed, // cor do sinal
const ENUM_LINE_STYLE style=STYLE_SOLID, // estilo de linha da borda
const int width=3, // tamanho do sinal
const bool back=false, // no fundo
const bool selection=true, // destaque para mover
const bool hidden=true, // ocultar na lista de obje
const long z_order=0) // prioridade para clicar n
{
//--- definir as coordenadas de pontos de ancoragem, se eles não estão definidos
ChangeArrowEmptyPoint(time,price);
//--- redefine o valor de erro
ResetLastError();
//--- criar o sinal
if(!ObjectCreate(chart_ID,name,OBJ_ARROW_THUMB_DOWN,sub_window,time,price))
{
Print(__FUNCTION__,
": falha ao criar sinal \"Thumbs Down\"! Código de erro = ",GetLastError());
return(false);
}
//--- tipo de definição de ancoragem
ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);
//--- definir uma cor de sinal
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- definir o estilo da linha da borda
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- tamanho da definição do sinal
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- exibir em primeiro plano (false) ou fundo (true)
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- permitir (true) ou desabilitar (false) o modo de movimento do sinal 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

© 2000-2018, MetaQuotes Software Corp.


539 Constantes, Enumeradores e Estruturas

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);

© 2000-2018, MetaQuotes Software Corp.


540 Constantes, Enumeradores e Estruturas

}
//--- 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

© 2000-2018, MetaQuotes Software Corp.


541 Constantes, Enumeradores e Estruturas

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())

© 2000-2018, MetaQuotes Software Corp.


542 Constantes, Enumeradores e Estruturas

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);
//---
}

© 2000-2018, MetaQuotes Software Corp.


543 Constantes, Enumeradores e Estruturas

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

© 2000-2018, MetaQuotes Software Corp.


544 Constantes, Enumeradores e Estruturas

input ENUM_LINE_STYLE InpStyle=STYLE_DOT; // Estilo da linha da borda


input int InpWidth=5; // Tamanho do sinal
input bool InpBack=false; // Sinal do fundo
input bool InpSelection=false; // Destaque para mover
input bool InpHidden=true; // Ocultar na lista de objetos
input long InpZOrder=0; // Prioridade para clicar no mouse
//+------------------------------------------------------------------+
//| Criar sinal Arrow Up  |
//+------------------------------------------------------------------+
bool ArrowUpCreate(const long chart_ID=0, // ID do gráfico
const string name="ArrowUp", // 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 ENUM_ARROW_ANCHOR anchor=ANCHOR_BOTTOM, // tipo de ancoragem
const color clr=clrRed, // cor do sinal
const ENUM_LINE_STYLE style=STYLE_SOLID, // estilo de linha da borda
const int width=3, // tamanho do sinal
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 mouse
{
//--- definir as coordenadas de pontos de ancoragem, se eles não estão definidos
ChangeArrowEmptyPoint(time,price);
//--- redefine o valor de erro
ResetLastError();
//--- criar o sinal
if(!ObjectCreate(chart_ID,name,OBJ_ARROW_UP,sub_window,time,price))
{
Print(__FUNCTION__,
": falha ao criar o sinal \"Arrow Up\"! Código de erro = ",GetLastError());
return(false);
}
//--- tipo de definição de ancoragem
ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);
//--- definir uma cor de sinal
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- definir o estilo da linha da borda
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- tamanho da definição do sinal
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- exibir em primeiro plano (false) ou fundo (true)
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- permitir (true) ou desabilitar (false) o modo de movimento do sinal 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);

© 2000-2018, MetaQuotes Software Corp.


545 Constantes, Enumeradores e Estruturas

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);
}

© 2000-2018, MetaQuotes Software Corp.


546 Constantes, Enumeradores e Estruturas

//--- sucesso na execução


return(true);
}
//+------------------------------------------------------------------+
//| Excluir sinal Arrow Up  |
//+------------------------------------------------------------------+
bool ArrowUpDelete(const long chart_ID=0, // ID do gráfico
const string name="ArrowUp") // nome sinal
{
//--- redefine o valor de erro
ResetLastError();
//--- excluir o sinal
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": falha ao excluir o sinal \"Arrow Up\"! 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;

© 2000-2018, MetaQuotes Software Corp.


547 Constantes, Enumeradores e Estruturas

//--- 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;

© 2000-2018, MetaQuotes Software Corp.


548 Constantes, Enumeradores e Estruturas

//--- redesenhar o gráfico


ChartRedraw();
}
//--- 1 segundo de atraso
Sleep(1000);
//--- alterar a localização do ponto de ancoragem relativa ao sinal
ArrowUpAnchorChange(0,InpName,ANCHOR_BOTTOM);
//--- redesenhar o gráfico
ChartRedraw();
//--- 1 segundo de atraso
Sleep(1000);
//--- deletar o sinal do gráfico
ArrowUpDelete(0,InpName);
ChartRedraw();
//--- 1 segundo de atraso
Sleep(1000);
//---
}

© 2000-2018, MetaQuotes Software Corp.


549 Constantes, Enumeradores e Estruturas

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

© 2000-2018, MetaQuotes Software Corp.


550 Constantes, Enumeradores e Estruturas

input int InpWidth=5; // Tamanho do Sinal


input bool InpBack=false; // Fundo do sinal
input bool InpSelection=false; // Destaque para mover
input bool InpHidden=true; // Ocultar na lista de objetos
input long InpZOrder=0; // Prioridade para clique do mouse
//+------------------------------------------------------------------+
//| Criar sinal Arrow Down  |
//+------------------------------------------------------------------+
bool ArrowDownCreate(const long chart_ID=0, // ID do gráfico
const string name="ArrowDown", // 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 ENUM_ARROW_ANCHOR anchor=ANCHOR_BOTTOM, // tipo de ancoragem
const color clr=clrRed, // cor do sinal
const ENUM_LINE_STYLE style=STYLE_SOLID, // estilo da linha da borda
const int width=3, // tamanho do sinal
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 o sinal
if(!ObjectCreate(chart_ID,name,OBJ_ARROW_DOWN,sub_window,time,price))
{
Print(__FUNCTION__,
": falha ao criar o sinal \"Arrow Down\"! Código de erro = ",GetLastError());
return(false);
}
//--- tipo de ancoragem
ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);
//--- definir uma cor de sinal
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- definir o estilo da linha da borda
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- tamanho da definição do sinal
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- exibir em primeiro plano (false) ou fundo (true)
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- permitir (true) ou desabilitar (false) o modo de movimento do sinal 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);

© 2000-2018, MetaQuotes Software Corp.


551 Constantes, Enumeradores e Estruturas

//--- 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

© 2000-2018, MetaQuotes Software Corp.


552 Constantes, Enumeradores e Estruturas

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

© 2000-2018, MetaQuotes Software Corp.


553 Constantes, Enumeradores e Estruturas

//--- 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 Arrow Down no gráfico
if(!ArrowDownCreate(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>1)
p-=1;
//--- mover o ponto
if(!ArrowDownMove(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

© 2000-2018, MetaQuotes Software Corp.


554 Constantes, Enumeradores e Estruturas

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);
//---
}

© 2000-2018, MetaQuotes Software Corp.


555 Constantes, Enumeradores e Estruturas

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

© 2000-2018, MetaQuotes Software Corp.


556 Constantes, Enumeradores e Estruturas

input ENUM_LINE_STYLE InpStyle=STYLE_DOT; // Estilo de linha da borda


input int InpWidth=5; // Tamanho do Sinal
input bool InpBack=false; // Fundo do sinal
input bool InpSelection=false; // Destaque para mover
input bool InpHidden=true; // Ocultar na lista de objetos
input long InpZOrder=0; // Prioridade para clique do mouse
//+------------------------------------------------------------------+
//| Criar sinal Stop  |
//+------------------------------------------------------------------+
bool ArrowStopCreate(const long chart_ID=0, // ID do gráfico
const string name="ArrowStop", // 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 ENUM_ARROW_ANCHOR anchor=ANCHOR_BOTTOM, // tipo de ancoragem
const color clr=clrRed, // cor do sinal
const ENUM_LINE_STYLE style=STYLE_SOLID, // estilo da linha da borda
const int width=3, // tamanho do sinal
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 o sinal
if(!ObjectCreate(chart_ID,name,OBJ_ARROW_STOP,sub_window,time,price))
{
Print(__FUNCTION__,
": falha ao criar o sinal\"Stop\"! Código de erro = ",GetLastError());
return(false);
}
//--- tipo de definição de ancoragem
ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);
//--- definir uma cor de sinal
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- definir o estilo da linha da borda
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- tamanho da definição do sinal
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- exibir em primeiro plano (false) ou fundo (true)
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- permitir (true) ou desabilitar (false) o modo de movimento do sinal 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);

© 2000-2018, MetaQuotes Software Corp.


557 Constantes, Enumeradores e Estruturas

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);
}

© 2000-2018, MetaQuotes Software Corp.


558 Constantes, Enumeradores e Estruturas

//--- sucesso na execução


return(true);
}
//+------------------------------------------------------------------+
//| Excluir sinal Stop  |
//+------------------------------------------------------------------+
bool ArrowStopDelete(const long chart_ID=0, // ID do gráfico
const string name="ArrowStop") // nome da etiqueta
{
//--- redefine o valor de erro
ResetLastError();
//--- excluir o sinal
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": falha ao excluir o sinal \"Stop\"! 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;

© 2000-2018, MetaQuotes Software Corp.


559 Constantes, Enumeradores e Estruturas

//--- 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;

© 2000-2018, MetaQuotes Software Corp.


560 Constantes, Enumeradores e Estruturas

//--- redesenhar o gráfico


ChartRedraw();
// 0.025 segundos de atraso
Sleep(25);
}
//--- alterar a localização do ponto de ancoragem relativa ao sinal
ArrowStopAnchorChange(0,InpName,ANCHOR_TOP);
//--- redesenhar o gráfico
ChartRedraw();
//--- contador de loop
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;
//--- redesenhar o gráfico
ChartRedraw();
// 0.025 segundos de atraso
Sleep(25);
}
//--- 1 segundo de atraso
Sleep(1000);
//--- deletar o sinal do gráfico
ArrowStopDelete(0,InpName);
ChartRedraw();
//--- 1 segundo de atraso
Sleep(1000);
//---
}

© 2000-2018, MetaQuotes Software Corp.


561 Constantes, Enumeradores e Estruturas

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

© 2000-2018, MetaQuotes Software Corp.


562 Constantes, Enumeradores e Estruturas

input ENUM_LINE_STYLE InpStyle=STYLE_DOT; // Estilo da linha da borda


input int InpWidth=5; // Tamanho do sinal
input bool InpBack=false; // Sinal do fundo
input bool InpSelection=false; // Destaque para mover
input bool InpHidden=true; // Ocultar na lista de objetos
input long InpZOrder=0; // Prioridade para clicar no mouse
//+------------------------------------------------------------------+
//| Criar sinal Check  |
//+------------------------------------------------------------------+
bool ArrowCheckCreate(const long chart_ID=0, // ID do gráfico
const string name="ArrowCheck", // nome do sinal
const int sub_window=0, // índice da sub-janela
datetime time=0, // ponto de ancoragem de tempo
double price=0, // ponto de ancoragem de preço
const ENUM_ARROW_ANCHOR anchor=ANCHOR_BOTTOM, // tipo de ancoragem
const color clr=clrRed, // cor do sinal
const ENUM_LINE_STYLE style=STYLE_SOLID, // estilo a linha da borda
const int width=3, // tamanho do sinal
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 clique do 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 o sinal
if(!ObjectCreate(chart_ID,name,OBJ_ARROW_CHECK,sub_window,time,price))
{
Print(__FUNCTION__,
": falha ao criar o sinal\"Check\"! Código de erro = ",GetLastError());
return(false);
}
//--- tipo de definição de ancoragem
ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);
//--- definir uma cor de sinal
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- definir o estilo da linha da borda
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- tamanho da definição do sinal
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- exibir em primeiro plano (false) ou fundo (true)
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- permitir (true) ou desabilitar (false) o modo de movimento do sinal 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);

© 2000-2018, MetaQuotes Software Corp.


563 Constantes, Enumeradores e Estruturas

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);
}

© 2000-2018, MetaQuotes Software Corp.


564 Constantes, Enumeradores e Estruturas

//--- sucesso na execução


return(true);
}
//+------------------------------------------------------------------+
//| Excluir os sinal Check  |
//+------------------------------------------------------------------+
bool ArrowCheckDelete(const long chart_ID=0, // ID do gráfico
const string name="ArrowCheck") // nome do sinal
{
//--- redefine o valor de erro
ResetLastError();
//--- excluir o sinal
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": falha ao excluir o sinal \"Check\"! 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;

© 2000-2018, MetaQuotes Software Corp.


565 Constantes, Enumeradores e Estruturas

//--- 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;

© 2000-2018, MetaQuotes Software Corp.


566 Constantes, Enumeradores e Estruturas

//--- redesenhar o gráfico


ChartRedraw();
// 0.025 segundos de atraso
Sleep(25);
}
//--- alterar a localização do ponto de ancoragem relativa ao sinal
ArrowCheckAnchorChange(0,InpName,ANCHOR_BOTTOM);
//--- redesenhar o gráfico
ChartRedraw();
//--- contador de loop
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;
//--- redesenhar o gráfico
ChartRedraw();
// 0.025 segundos de atraso
Sleep(25);
}
//--- 1 segundo de atraso
Sleep(1000);
//--- deletar o sinal do gráfico
ArrowCheckDelete(0,InpName);
ChartRedraw();
//--- 1 segundo de atraso
Sleep(1000);
//---
}

© 2000-2018, MetaQuotes Software Corp.


567 Constantes, Enumeradores e Estruturas

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  |

© 2000-2018, MetaQuotes Software Corp.


568 Constantes, Enumeradores e Estruturas

//+------------------------------------------------------------------+
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  |
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


569 Constantes, Enumeradores e Estruturas

bool ArrowLeftPriceMove(const long chart_ID=0, // ID do gráfico


const string name="LeftPrice", // nome da etiqueta
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);
}
//+------------------------------------------------------------------+
//| Excluir a etiqueta preço lado esquerdo do gráfico  |
//+------------------------------------------------------------------+
bool ArrowLeftPriceDelete(const long chart_ID=0, // ID gráfico
const string name="LeftPrice") // nome etiqueta
{
//--- redefine o valor de erro
ResetLastError();
//--- excluir a etiqueta
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": falha ao excluir a etiqueta preço lado esquerda! 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();

© 2000-2018, MetaQuotes Software Corp.


570 Constantes, Enumeradores e Estruturas

//--- 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;

© 2000-2018, MetaQuotes Software Corp.


571 Constantes, Enumeradores e Estruturas

}
//--- 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);
//---
}

© 2000-2018, MetaQuotes Software Corp.


572 Constantes, Enumeradores e Estruturas

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  |

© 2000-2018, MetaQuotes Software Corp.


573 Constantes, Enumeradores e Estruturas

//+------------------------------------------------------------------+
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  |
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


574 Constantes, Enumeradores e Estruturas

bool ArrowRightPriceMove(const long chart_ID=0, // ID do gráfico


const string name="RightPrice", // nome da etiqueta
datetime time=0, // coordenada do ponto de ancoragem de tem
double price=0) // coordenada do ponto de ancoragem de pre
{
//--- 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);
}
//+------------------------------------------------------------------+
//| Excluir a etiqueta de preço lado direito do gráfico  |
//+------------------------------------------------------------------+
bool ArrowRightPriceDelete(const long chart_ID=0, // ID Gráfico
const string name="RightPrice") // nome da etiqueta
{
//--- redefine o valor de erro
ResetLastError();
//--- excluir a etiqueta
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": falha ao excluir a etiqueta de preço lado direito! 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();

© 2000-2018, MetaQuotes Software Corp.


575 Constantes, Enumeradores e Estruturas

//--- 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;

© 2000-2018, MetaQuotes Software Corp.


576 Constantes, Enumeradores e Estruturas

}
//--- 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);
//---
}

© 2000-2018, MetaQuotes Software Corp.


577 Constantes, Enumeradores e Estruturas

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

© 2000-2018, MetaQuotes Software Corp.


578 Constantes, Enumeradores e Estruturas

const bool hidden=true, // ocultar na lista de objetos


const long z_order=0) // prioridade para o clique do mouse
{
//--- definir as coordenadas de pontos de ancoragem, se eles não estão definidos
ChangeArrowEmptyPoint(time,price);
//--- redefine o valor de erro
ResetLastError();
//--- criar o sinal
if(!ObjectCreate(chart_ID,name,OBJ_ARROW_BUY,sub_window,time,price))
{
Print(__FUNCTION__,
": falha ao criar sinal \"Buy\"! Código de erro = ",GetLastError());
return(false);
}
//--- definir uma cor de sinal
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- definir um estilo de linha (quando destacado)
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- definir um tamanho de linha (quando destacado)
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- exibir em primeiro plano (false) ou fundo (true)
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- permitir (true) ou desabilitar (false) o modo de movimento do sinal 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 ponto de ancoragem  |
//+------------------------------------------------------------------+
bool ArrowBuyMove(const long chart_ID=0, // ID do gráfico
const string name="ArrowBuy", // nome do objeto
datetime time=0, // coordenar o ponto de ancoragem do tempo
double price=0) // coordenar o 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))

© 2000-2018, MetaQuotes Software Corp.


579 Constantes, Enumeradores e Estruturas

{
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);

© 2000-2018, MetaQuotes Software Corp.


580 Constantes, Enumeradores e Estruturas

//--- 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;
}
//--- criar sinais Buy de ponto de baixa para cada barra visível
for(int i=0;i<bars;i++)
{
if(!ArrowBuyCreate(0,"ArrowBuy_"+(string)i,0,date[i],low[i],InpColor))
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);
}
//--- mover sinal Buy de ponto alto para cada barra visível
for(int i=0;i<bars;i++)
{
if(!ArrowBuyMove(0,"ArrowBuy_"+(string)i,date[i],high[i]))
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);
}

© 2000-2018, MetaQuotes Software Corp.


581 Constantes, Enumeradores e Estruturas

//--- excluir sinais Buy


for(int i=0;i<bars;i++)
{
if(!ArrowBuyDelete(0,"ArrowBuy_"+(string)i))
return;
//--- redesenhar o gráfico
ChartRedraw();
// 0.05 segundos de atraso
Sleep(50);
}
//---
}

© 2000-2018, MetaQuotes Software Corp.


582 Constantes, Enumeradores e Estruturas

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

© 2000-2018, MetaQuotes Software Corp.


583 Constantes, Enumeradores e Estruturas

const bool hidden=true, // ocultar na lista de objetos


const long z_order=0) // prioridade para clique do mouse
{
//--- definir as coordenadas de pontos de ancoragem, se eles não estão definidos
ChangeArrowEmptyPoint(time,price);
//--- redefine o valor de erro
ResetLastError();
//--- criar o sinal
if(!ObjectCreate(chart_ID,name,OBJ_ARROW_SELL,sub_window,time,price))
{
Print(__FUNCTION__,
": falha ao criar sinal \"Sell\"! Código de erro = ",GetLastError());
return(false);
}
//--- definir uma cor de sinal
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- definir um estilo de linha (quando destacado)
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- definir um tamanho de linha (quando destacado)
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- exibir em primeiro plano (false) ou fundo (true)
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- permitir (true) ou desabilitar (false) o modo de movimento do sinal 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 ponto de ancoragem  |
//+------------------------------------------------------------------+
bool ArrowSellMove(const long chart_ID=0, // ID do gráfico
const string name="ArrowSell", // 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))

© 2000-2018, MetaQuotes Software Corp.


584 Constantes, Enumeradores e Estruturas

{
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);

© 2000-2018, MetaQuotes Software Corp.


585 Constantes, Enumeradores e Estruturas

//--- 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;
}
//--- criar sinais Sell no ponto Alto para cada barra visível
for(int i=0;i<bars;i++)
{
if(!ArrowSellCreate(0,"ArrowSell_"+(string)i,0,date[i],high[i],InpColor))
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);
}
//--- mover sinais Sell para ponto Baixo em cada barra visível
for(int i=0;i<bars;i++)
{
if(!ArrowSellMove(0,"ArrowSell_"+(string)i,date[i],low[i]))
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);
}

© 2000-2018, MetaQuotes Software Corp.


586 Constantes, Enumeradores e Estruturas

//--- excluir sinal Sell


for(int i=0;i<bars;i++)
{
if(!ArrowSellDelete(0,"ArrowSell_"+(string)i))
return;
//--- redesenhar o gráfico
ChartRedraw();
// 0.05 segundos de atraso
Sleep(50);
}
//---
}

© 2000-2018, MetaQuotes Software Corp.


587 Constantes, Enumeradores e Estruturas

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 %

© 2000-2018, MetaQuotes Software Corp.


588 Constantes, Enumeradores e Estruturas

input int InpPrice=50; // Ponto de ancoragem do preço em %


input ENUM_ARROW_ANCHOR InpAnchor=ANCHOR_TOP; // Tipo de ancoragem
input color InpColor=clrDodgerBlue; // Cor da seta
input ENUM_LINE_STYLE InpStyle=STYLE_SOLID; // Estilo de linha da borda
input int InpWidth=10; // Tamanho da seta
input bool InpBack=false; // Seta do fundo
input bool InpSelection=false; // Destaque para mover
input bool InpHidden=true; // Ocultar na lista de objeto
input long InpZOrder=0; // Prioridade para clicar no mouse
//+------------------------------------------------------------------+
//| Criar a seta  |
//+------------------------------------------------------------------+
bool ArrowCreate(const long chart_ID=0, // ID do gráfico
const string name="Arrow", // nome da seta
const int sub_window=0, // índice da sub-janela
datetime time=0, // ponto de ancoragem do tmepo
double price=0, // ponto de ancoragem do preço
const uchar arrow_code=252, // código da seta
const ENUM_ARROW_ANCHOR anchor=ANCHOR_BOTTOM, // posição do ponto de ancoragem
const color clr=clrRed, // cor da seta
const ENUM_LINE_STYLE style=STYLE_SOLID, // estilo da linha da borda
const int width=3, // tamanho da seta
const bool back=false, // no fundo
const bool selection=true, // destaque para mover
const bool hidden=true, // ocultar na lista de objeto
const long z_order=0) // prioridade para clicar no mouse
{
//--- 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 seta
if(!ObjectCreate(chart_ID,name,OBJ_ARROW,sub_window,time,price))
{
Print(__FUNCTION__,
": falha ao criar uma seta! Código de erro = ",GetLastError());
return(false);
}
//--- definir o código da seta
ObjectSetInteger(chart_ID,name,OBJPROP_ARROWCODE,arrow_code);
//--- tipo de definição de ancoragem
ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);
//--- definir a cor da seta
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 seta
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- exibir em primeiro plano (false) ou fundo (true)

© 2000-2018, MetaQuotes Software Corp.


589 Constantes, Enumeradores e Estruturas

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

© 2000-2018, MetaQuotes Software Corp.


590 Constantes, Enumeradores e Estruturas

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  |

© 2000-2018, MetaQuotes Software Corp.


591 Constantes, Enumeradores e Estruturas

//+------------------------------------------------------------------+
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;

© 2000-2018, MetaQuotes Software Corp.


592 Constantes, Enumeradores e Estruturas

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);
//---
}

© 2000-2018, MetaQuotes Software Corp.


593 Constantes, Enumeradores e Estruturas

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

© 2000-2018, MetaQuotes Software Corp.


594 Constantes, Enumeradores e Estruturas

input long InpZOrder=0; // Prioridade para clique do mouse


//+------------------------------------------------------------------+
//| Criando objeto Texto  |
//+------------------------------------------------------------------+
bool TextCreate(const long chart_ID=0, // ID do gráfico
const string name="Text", // nome do objeto
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 string text="Text", // o próprio texto
const string font="Arial", // fonte
const int font_size=10, // tamanho da fonte
const color clr=clrRed, // cor
const double angle=0.0, // inclinação do texto
const ENUM_ANCHOR_POINT anchor=ANCHOR_LEFT_UPPER, // tipo de ancoragem
const bool back=false, / no fundo
const bool selection=false, // destaque para mover
const bool hidden=true, // ocultar na lista de objetos
const long z_order=0) // prioridade para clicar no mous
{
//--- definir as coordenadas de pontos de ancoragem, se eles não estão definidos
ChangeTextEmptyPoint(time,price);
//--- redefine o valor de erro
ResetLastError();
//--- criar objeto Texto
if(!ObjectCreate(chart_ID,name,OBJ_TEXT,sub_window,time,price))
{
Print(__FUNCTION__,
": falha ao criar objeto \"Texto\"! Código de erro = ",GetLastError());
return(false);
}
//--- definir o texto
ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);
//--- definir o texto fonte
ObjectSetString(chart_ID,name,OBJPROP_FONT,font);
//--- definir tamanho da fonte
ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size);
//--- definir o ângulo de inclinação do texto
ObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,angle);
//--- tipo de definição de ancoragem
ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);
//--- definir cor
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- exibir em primeiro plano (false) ou fundo (true)
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- habilitar (true) ou desabilitar (false) o modo de mover o objeto 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

© 2000-2018, MetaQuotes Software Corp.


595 Constantes, Enumeradores e Estruturas

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);

© 2000-2018, MetaQuotes Software Corp.


596 Constantes, Enumeradores e Estruturas

}
//+------------------------------------------------------------------+
//| 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)

© 2000-2018, MetaQuotes Software Corp.


597 Constantes, Enumeradores e Estruturas

{
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;
}

© 2000-2018, MetaQuotes Software Corp.


598 Constantes, Enumeradores e Estruturas

//--- 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 os textos
for(int i=0;i<bars;i+=step)
{
if(!TextDelete(0,"TextHigh_"+(string)i))
return;
if(!TextDelete(0,"TextLow_"+(string)i))
return;
//--- redesenhar o gráfico
ChartRedraw();
// 0.05 segundos de atraso
Sleep(50);
}
//---
}

© 2000-2018, MetaQuotes Software Corp.


599 Constantes, Enumeradores e Estruturas

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

© 2000-2018, MetaQuotes Software Corp.


600 Constantes, Enumeradores e Estruturas

input ENUM_ANCHOR_POINT InpAnchor=ANCHOR_CENTER; // Tipo de ancoragem


input bool InpBack=false; // Objeto de fundo
input bool InpSelection=true; // Destaque para mover
input bool InpHidden=true; // Ocultar na lista de objetos
input long InpZOrder=0; // Prioridade para clique do mouse
//+------------------------------------------------------------------+
//| Criar um a etiqueta de texto  |
//+------------------------------------------------------------------+
bool LabelCreate(const long chart_ID=0, // ID do gráfico
const string name="Label", // nome da etiqueta
const int sub_window=0, // índice da sub-janela
const int x=0, // coordenada X
const int y=0, // coordenada Y
const ENUM_BASE_CORNER corner=CORNER_LEFT_UPPER, // canto do gráfico para ancorag
const string text="Label", // texto
const string font="Arial", // fonte
const int font_size=10, // tamanho da fonte
const color clr=clrRed, // cor
const double angle=0.0, // inclinação do texto
const ENUM_ANCHOR_POINT anchor=ANCHOR_LEFT_UPPER, // tipo de ancoragem
const bool back=false, // no fundo
const bool selection=false, // destaque para mover
const bool hidden=true, // ocultar na lista de objetos
const long z_order=0) // prioridade para clicar no mou
{
//--- redefine o valor de erro
ResetLastError();
//--- criar um a etiqueta de texto
if(!ObjectCreate(chart_ID,name,OBJ_LABEL,sub_window,0,0))
{
Print(__FUNCTION__,
": falha ao criar uma etiqueta de texto! 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);
//--- determinar o canto do gráfico onde as coordenadas do ponto são definidas
ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);
//--- definir o texto
ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);
//--- definir o texto fonte
ObjectSetString(chart_ID,name,OBJPROP_FONT,font);
//--- definir tamanho da fonte
ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size);
//--- definir o ângulo de inclinação do texto
ObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,angle);
//--- tipo de definição de ancoragem
ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);

© 2000-2018, MetaQuotes Software Corp.


601 Constantes, Enumeradores e Estruturas

//--- definir cor


ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- 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 de texto  |
//+------------------------------------------------------------------+
bool LabelMove(const long chart_ID=0, // ID do gráfico
const string name="Label", // nome da etiqueta
const int x=0, // coordenada X
const int y=0) // coordenada Y
{
//--- redefine o valor de erro
ResetLastError();
//--- mover a etiqueta de texto
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 canto do gráfico para vinculação da etiqueta  |
//+------------------------------------------------------------------+
bool LabelChangeCorner(const long chart_ID=0, // ID do gráfico
const string name="Label", // nome da etiqueta
const ENUM_BASE_CORNER corner=CORNER_LEFT_UPPER) // canto do gráfico para an
{
//--- redefine o valor de erro
ResetLastError();

© 2000-2018, MetaQuotes Software Corp.


602 Constantes, Enumeradores e Estruturas

//--- alterar canto de ancoragem


if(!ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner))
{
Print(__FUNCTION__,
": falha ao alterar canto de ancoragem! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Alterar o texto do objeto  |
//+------------------------------------------------------------------+
bool LabelTextChange(const long chart_ID=0, // ID do gráfico
const string name="Label", // 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);
}
//+------------------------------------------------------------------+
//| Apagar uma etiqueta de texto  |
//+------------------------------------------------------------------+
bool LabelDelete(const long chart_ID=0, // ID do gráfico
const string name="Label") // nome da etiqueta
{
//--- redefine o valor de erro
ResetLastError();
//--- excluir a etiqueta
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": falha ao excluir a etiqueta de texto! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar)  |

© 2000-2018, MetaQuotes Software Corp.


603 Constantes, Enumeradores e Estruturas

//+------------------------------------------------------------------+
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: ");

© 2000-2018, MetaQuotes Software Corp.


604 Constantes, Enumeradores e Estruturas

}
//--- 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);

© 2000-2018, MetaQuotes Software Corp.


605 Constantes, Enumeradores e Estruturas

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();

© 2000-2018, MetaQuotes Software Corp.


606 Constantes, Enumeradores e Estruturas

// 0.01 segundos de atraso


Sleep(10);
//--- sair da função
return(true);
}

© 2000-2018, MetaQuotes Software Corp.


607 Constantes, Enumeradores e Estruturas

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

© 2000-2018, MetaQuotes Software Corp.


608 Constantes, Enumeradores e Estruturas

input bool InpHidden=true; // Ocultar na lista de objeto


input long InpZOrder=0; // Prioridade para clique do mouse
//+------------------------------------------------------------------+
//| Criar o botão  |
//+------------------------------------------------------------------+
bool ButtonCreate(const long chart_ID=0, // ID do gráfico
const string name="Button", // nome do botão
const int sub_window=0, // índice da sub-janela
const int x=0, // coordenada X
const int y=0, // coordenada Y
const int width=50, // largura do botão
const int height=18, // altura do botão
const ENUM_BASE_CORNER corner=CORNER_LEFT_UPPER, // canto do gráfico para ancora
const string text="Button", // texto
const string font="Arial", // fonte
const int font_size=10, // tamanho da fonte
const color clr=clrBlack, // cor do texto
const color back_clr=C'236,233,216', // cor do fundo
const color border_clr=clrNONE, // cor da borda
const bool state=false, // pressionada/liberada
const bool back=false, // no fundo
const bool selection=false, // destaque para mover
const bool hidden=true, // ocultar na lista de objeto
const long z_order=0) // prioridade para clicar no mo
{
//--- redefine o valor de erro
ResetLastError();
//--- criar o botão
if(!ObjectCreate(chart_ID,name,OBJ_BUTTON,sub_window,0,0))
{
Print(__FUNCTION__,
": falha ao criar o botão! Código de erro = ",GetLastError());
return(false);
}
//--- definir coordenadas do botão
ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x);
ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);
//--- definir tamanho do botão
ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width);
ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height);
//--- determinar o canto do gráfico onde as coordenadas do ponto são definidas
ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);
//--- definir o texto
ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);
//--- definir o texto fonte
ObjectSetString(chart_ID,name,OBJPROP_FONT,font);
//--- definir tamanho da fonte
ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size);
//--- definir a cor do texto

© 2000-2018, MetaQuotes Software Corp.


609 Constantes, Enumeradores e Estruturas

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

© 2000-2018, MetaQuotes Software Corp.


610 Constantes, Enumeradores e Estruturas

const string name="Button", // nome do botão


const int width=50, // largura do botão
const int height=18) // altura do botão
{
//--- redefine o valor de erro
ResetLastError();
//--- alterar o tamanho do botão
if(!ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width))
{
Print(__FUNCTION__,
": falha ao alterar a largura do botão! Código de erro = ",GetLastError());
return(false);
}
if(!ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height))
{
Print(__FUNCTION__,
": falha ao alterar a altura do botão! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Alterar canto do gráfico para vinculação do botão  |
//+------------------------------------------------------------------+
bool ButtonChangeCorner(const long chart_ID=0, // ID do gráfico
const string name="Button", // nome do botão
const ENUM_BASE_CORNER corner=CORNER_LEFT_UPPER) // canto do gráfico para a
{
//--- redefine o valor de erro
ResetLastError();
//--- alterar canto de ancoragem
if(!ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner))
{
Print(__FUNCTION__,
": falha ao alterar canto de ancoragem! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Alterar texto do botão  |
//+------------------------------------------------------------------+
bool ButtonTextChange(const long chart_ID=0, // ID do gráfico
const string name="Button", // nome do botão
const string text="Text") // texto
{
//--- redefine o valor de erro

© 2000-2018, MetaQuotes Software Corp.


611 Constantes, Enumeradores e Estruturas

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

© 2000-2018, MetaQuotes Software Corp.


612 Constantes, Enumeradores e Estruturas

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();

© 2000-2018, MetaQuotes Software Corp.


613 Constantes, Enumeradores e Estruturas

//--- esperar por um segundo


Sleep(1000);
//---
}

© 2000-2018, MetaQuotes Software Corp.


614 Constantes, Enumeradores e Estruturas

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

© 2000-2018, MetaQuotes Software Corp.


615 Constantes, Enumeradores e Estruturas

input color InpColor=clrRed; // Cor da borda quando destacada


input ENUM_LINE_STYLE InpStyle=STYLE_DASHDOTDOT; // Estilo da linha quando destacada
input int InpPointWidth=1; // Tamanho do ponto para movimento
input bool InpBack=false; // Objeto de Fundo
input bool InpSelection=true; // Destaque para mover
input bool InpHidden=true; // Ocultar na lista de objeto
input long InpZOrder=0; // Prioridade para clique do mouse
//+------------------------------------------------------------------+
//| Criando objeto Chart  |
//+------------------------------------------------------------------+
bool ObjectChartCreate(const long chart_ID=0, // ID do gráfico
const string name="Chart", // nome do objeto
const int sub_window=0, // índice da sub-janela
const string symbol="EURUSD", // símbolo
const ENUM_TIMEFRAMES period=PERIOD_H1, // período
const int x=0, // coordenada X
const int y=0, // coordenada Y
const int width=300, // largura
const int height=200, // altura
const ENUM_BASE_CORNER corner=CORNER_LEFT_UPPER, // canto de ancoragem
const int scale=2, // escala
const bool date_scale=true, // exibição escala de temp
const bool price_scale=true, // exibição escala de preç
const color clr=clrRed, // a cor da borda quando d
const ENUM_LINE_STYLE style=STYLE_SOLID, // estilo da linha quando
const int point_width=1, // mover tamanho do ponto
const bool back=false, // no fundo
const bool selection=false, // destaque para mover
const bool hidden=true, // ocultar na lista de obj
const long z_order=0) // prioridade para clicar
{
//--- redefine o valor de erro
ResetLastError();
//--- criar objeto Chart
if(!ObjectCreate(chart_ID,name,OBJ_CHART,sub_window,0,0))
{
Print(__FUNCTION__,
": falha ao criar objeto \"Chart\"! Código de erro = ",GetLastError());
return(false);
}
//--- definir coordenadas do objeto
ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x);
ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);
//--- definir tamanho do objeto
ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width);
ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height);
//--- determinar o canto do gráfico onde as coordenadas do ponto são definidas
ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);
//--- definir o símbolo

© 2000-2018, MetaQuotes Software Corp.


616 Constantes, Enumeradores e Estruturas

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);

© 2000-2018, MetaQuotes Software Corp.


617 Constantes, Enumeradores e Estruturas

}
//--- 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))
{

© 2000-2018, MetaQuotes Software Corp.


618 Constantes, Enumeradores e Estruturas

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()
{

© 2000-2018, MetaQuotes Software Corp.


619 Constantes, Enumeradores e Estruturas

//--- obter o número de símbolos na Observação do Mercado


int symbols=SymbolsTotal(true);
//--- verificar se o símbolo com um nome especifico está presente na lista de símbolo
bool exist=false;
for(int i=0;i<symbols;i++)
if(InpSymbol==SymbolName(i,true))
{
exist=true;
break;
}
if(!exist)
{
Print("Erro! ",InpSymbol," símbolo não está presente na \"Observação do Mercado\"!");
return;
}
//--- verificar a validade dos parâmetros de entrada
if(InpScale<0 || InpScale>5)
{
Print("Erro! Valores incorretos dos parâmetros de entrada!");
return;
}

//--- 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 as coordenadas do objeto gráfico e seu tamanho
int x=(int)x_distance/16;
int y=(int)y_distance/16;
int x_size=(int)x_distance*7/16;
int y_size=(int)y_distance*7/16;
//--- criar objeto Chart
if(!ObjectChartCreate(0,InpName,0,InpSymbol,InpPeriod,x,y,x_size,y_size,InpCorner,InpScale,InpDa
InpPriceScale,InpColor,InpStyle,InpPointWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- redesenhar o gráfico e esperar por um segundo
ChartRedraw();

© 2000-2018, MetaQuotes Software Corp.


620 Constantes, Enumeradores e Estruturas

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);
//---
}

© 2000-2018, MetaQuotes Software Corp.


621 Constantes, Enumeradores e Estruturas

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

© 2000-2018, MetaQuotes Software Corp.


622 Constantes, Enumeradores e Estruturas

input bool InpHidden=true; // Ocultar na lista de objeto


input long InpZOrder=0; // Prioridade para clicar no mouse
//+------------------------------------------------------------------+
//| Criar um bitmap na janela do gráfico  |
//+------------------------------------------------------------------+
bool BitmapCreate(const long chart_ID=0, // ID do gráfico
const string name="Bitmap", // nome do bitmap
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 string file="", // nome do arquivo bitmap
const int width=10, // coordenada X do escopo de visibilidad
const int height=10, // coordenada Y do escopo de visibilidad
const int x_offset=0, // escopo de visibilidade deslocado pelo
const int y_offset=0, // escopo de visibilidade deslocado pelo
const color clr=clrRed, // cor da borda quando destacada
const ENUM_LINE_STYLE style=STYLE_SOLID, // estilo de linha quando destacada
const int point_width=1, // mover tamanho do ponto
const bool back=false, // no fundo
const bool selection=false, // destaque para mover
const bool hidden=true, // ocultar na lista de objetot
const long z_order=0) // prioridade para clicar no mouse
{
//--- definir as coordenadas de pontos de ancoragem, se eles não estão definidos
ChangeBitmapEmptyPoint(time,price);
//--- redefine o valor de erro
ResetLastError();
//--- criar um bitmap
if(!ObjectCreate(chart_ID,name,OBJ_BITMAP,sub_window,time,price))
{
Print(__FUNCTION__,
": falha ao criar um bitmap na janela do gráfico! Código de erro = ",GetLastError());
return(false);
}
//--- 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);
}
//--- 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

© 2000-2018, MetaQuotes Software Corp.


623 Constantes, Enumeradores e Estruturas

//--- 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

© 2000-2018, MetaQuotes Software Corp.


624 Constantes, Enumeradores e Estruturas

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

© 2000-2018, MetaQuotes Software Corp.


625 Constantes, Enumeradores e Estruturas

{
//--- 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);

© 2000-2018, MetaQuotes Software Corp.


626 Constantes, Enumeradores e Estruturas

}
//+------------------------------------------------------------------+
//| 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;

© 2000-2018, MetaQuotes Software Corp.


627 Constantes, Enumeradores e Estruturas

}
//--- 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);
}
//---
}

© 2000-2018, MetaQuotes Software Corp.


628 Constantes, Enumeradores e Estruturas

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

© 2000-2018, MetaQuotes Software Corp.


629 Constantes, Enumeradores e Estruturas

input color InpColor=clrRed; // A cor da borda quando destacada


input ENUM_LINE_STYLE InpStyle=STYLE_SOLID; // Estilo da linha quando destacada
input int InpPointWidth=1; // Tamanho do ponto para mover
input bool InpBack=false; // Objeto de fundo
input bool InpSelection=false; // Destaque para mover
input bool InpHidden=true; // Ocultar na lista de objeto
input long InpZOrder=0; // Prioridade para clicar no mouse
//+------------------------------------------------------------------+
//| Criar objeto Etiqueta Bitmap  |
//+------------------------------------------------------------------+
bool BitmapLabelCreate(const long chart_ID=0, // ID do gráfico
const string name="BmpLabel", // nome da etiqueta
const int sub_window=0, // índice da sub-janela
const int x=0, // coordenada X
const int y=0, // coordenada Y
const string file_on="", // imagem em modo On
const string file_off="", // imagem em modo Off
const int width=0, // coordenada X do escopo
const int height=0, // coordenada Y do escopo
const int x_offset=10, // escopo de visibilidade
const int y_offset=10, // escopo de visibilidade
const bool state=false, // pressionada/liberada
const ENUM_BASE_CORNER corner=CORNER_LEFT_UPPER, // canto do gráfico para a
const ENUM_ANCHOR_POINT anchor=ANCHOR_LEFT_UPPER, // tipo de ancoragem
const color clr=clrRed, // a cor da borda quando d
const ENUM_LINE_STYLE style=STYLE_SOLID, // estilo da linha quando
const int point_width=1, // mover tamanho do ponto
const bool back=false, // no fundo
const bool selection=false, // destaque para mover
const bool hidden=true, // ocultar na lista de obj
const long z_order=0) // prioridade para clicar
{
//--- redefine o valor de erro
ResetLastError();
//--- criar uma etiqueta bitmap
if(!ObjectCreate(chart_ID,name,OBJ_BITMAP_LABEL,sub_window,0,0))
{
Print(__FUNCTION__,
": falha ao criar objeto \"Etiqueta Bitmap\"! Código de erro = ",GetLastError());
return(false);
}
//--- definir as imagens para os modos ligar (On) e desligar (Off)
if(!ObjectSetString(chart_ID,name,OBJPROP_BMPFILE,0,file_on))
{
Print(__FUNCTION__,
": falha para carregar a imagem para o modo On! Código de erro = ",GetLastError());
return(false);
}
if(!ObjectSetString(chart_ID,name,OBJPROP_BMPFILE,1,file_off))

© 2000-2018, MetaQuotes Software Corp.


630 Constantes, Enumeradores e Estruturas

{
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)

© 2000-2018, MetaQuotes Software Corp.


631 Constantes, Enumeradores e Estruturas

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,on_off,file))
{
Print(__FUNCTION__,
": falha para carregar a imagem! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Mover objeto Etiqueta Bitmap  |
//+------------------------------------------------------------------+
bool BitmapLabelMove(const long chart_ID=0, // ID do gráfico
const string name="BmpLabel", // nome da etiqueta
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 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 Y do objeto! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Alterar tamanho do escopo de visibilidade (objeto)  |
//+------------------------------------------------------------------+
bool BitmapLabelChangeSize(const long chart_ID=0, // ID do gráfico
const string name="BmpLabel", // nome da etiqueta
const int width=0, // largura da etiqueta
const int height=0) // altura da etiqueta
{
//--- redefine o valor de erro

© 2000-2018, MetaQuotes Software Corp.


632 Constantes, Enumeradores e Estruturas

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
{

© 2000-2018, MetaQuotes Software Corp.


633 Constantes, Enumeradores e Estruturas

//--- redefine o valor de erro


ResetLastError();
//--- excluir a etiqueta
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": falha ao excluir objeto \"Bitmap label\"! 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 coordenadas da etiqueta bitmap
int x=(int)x_distance/2;
int y=(int)y_distance/2;
//--- definir o tamanho da etiqueta e a coordenada do escopo de visibilidade
int width=32;
int height=32;
int x_offset=0;
int y_offset=0;
//--- local da etiqueta bitmap no centro da janela
if(!BitmapLabelCreate(0,InpName,0,x,y,InpFileOn,InpFileOff,width,height,x_offset,y_offset,InpSta
InpCorner,InpAnchor,InpColor,InpStyle,InpPointWidth,InpBack,InpSelection,InpHidden,InpZOrder)
{
return;
}
//--- redesenhar o gráfico e esperar um segundo
ChartRedraw();
Sleep(1000);
//--- alterar tamanho do escopo de visibilidade da etiqueta em loop

© 2000-2018, MetaQuotes Software Corp.


634 Constantes, Enumeradores e Estruturas

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);
//---
}

© 2000-2018, MetaQuotes Software Corp.


635 Constantes, Enumeradores e Estruturas

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

© 2000-2018, MetaQuotes Software Corp.


636 Constantes, Enumeradores e Estruturas

input color InpBackColor=clrWhite; // Fundo da cor


input color InpBorderColor=clrBlack; // Cor da borda
input bool InpBack=false; // Objeto de Fundo
input bool InpSelection=false; // Destaque para mover
input bool InpHidden=true; // Ocultar na lista de objeto
input long InpZOrder=0; // Prioridade para clique do mouse
//+------------------------------------------------------------------+
//| Criar o objeto Edit  |
//+------------------------------------------------------------------+
bool EditCreate(const long chart_ID=0, // ID do gráfico
const string name="Edit", // nome do objeto
const int sub_window=0, // índice da sub-janela
const int x=0, // coordenada X
const int y=0, // coordenada Y
const int width=50, // largura
const int height=18, // altura
const string text="Text", // texto
const string font="Arial", // fonte
const int font_size=10, // tamanho da fonte
const ENUM_ALIGN_MODE align=ALIGN_CENTER, // tipo de alinhamento
const bool read_only=false, // habilidade para editar
const ENUM_BASE_CORNER corner=CORNER_LEFT_UPPER, // canto do gráfico para ancoragem
const color clr=clrBlack, // cor do texto
const color back_clr=clrWhite, // cor do fundo
const color border_clr=clrNONE, // cor da borda
const bool back=false, // no fundo
const bool selection=false, // destaque para mover
const bool hidden=true, // ocultar na lista de objeto
const long z_order=0) // prioridade para clicar no mouse
{
//--- redefine o valor de erro
ResetLastError();
//--- criar campo de edição
if(!ObjectCreate(chart_ID,name,OBJ_EDIT,sub_window,0,0))
{
Print(__FUNCTION__,
": falha ao criar objeto \"Edit\"! Código de erro = ",GetLastError());
return(false);
}
//--- definir coordenadas do objeto
ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x);
ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);
//--- definir tamanho do objeto
ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width);
ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height);
//--- definir o texto
ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);
//--- definir o texto fonte
ObjectSetString(chart_ID,name,OBJPROP_FONT,font);

© 2000-2018, MetaQuotes Software Corp.


637 Constantes, Enumeradores e Estruturas

//--- definir tamanho da fonte


ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size);
//--- definir o tipo de alinhamento do texto no objeto
ObjectSetInteger(chart_ID,name,OBJPROP_ALIGN,align);
//--- habilitar (true) ou cancelar (false) modo de somente leitura
ObjectSetInteger(chart_ID,name,OBJPROP_READONLY,read_only);
//--- definir o canto do gráfico onde as coordenadas do objeto são definidas
ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);
//--- definir a cor do texto
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);
//--- 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 objeto Edit  |
//+------------------------------------------------------------------+
bool EditMove(const long chart_ID=0, // ID do gráfico
const string name="Edit", // 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 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 Y do objeto! Código de erro = ",GetLastError());
return(false);
}

© 2000-2018, MetaQuotes Software Corp.


638 Constantes, Enumeradores e Estruturas

//--- sucesso na execução


return(true);
}
//+------------------------------------------------------------------+
//| Redimensionar objeto Edit  |
//+------------------------------------------------------------------+
bool EditChangeSize(const long chart_ID=0, // ID do gráfico
const string name="Edit", // nome do objeto
const int width=0, // largura
const int height=0) // 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! 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);
}
//+------------------------------------------------------------------+
//| Alterar texto do objeto Edit  |
//+------------------------------------------------------------------+
bool EditTextChange(const long chart_ID=0, // ID do gráfico
const string name="Edit", // 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);
}
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


639 Constantes, Enumeradores e Estruturas

//| Retornar texto de objeto  |


//+------------------------------------------------------------------+
bool EditTextGet(string &text, // texto
const long chart_ID=0, // ID do gráfico
const string name="Edit") // nome do objeto
{
//--- redefine o valor de erro
ResetLastError();
//--- obter texto do objeto
if(!ObjectGetString(chart_ID,name,OBJPROP_TEXT,0,text))
{
Print(__FUNCTION__,
": falha ao obter o texto! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Excluir objeto Edit  |
//+------------------------------------------------------------------+
bool EditDelete(const long chart_ID=0, // ID do gráfico
const string name="Edit") // nome do objeto
{
//--- redefine o valor de erro
ResetLastError();
//--- excluir a etiqueta
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": falha ao deletar objeto \"Edit\"! 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;

© 2000-2018, MetaQuotes Software Corp.


640 Constantes, Enumeradores e Estruturas

}
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())

© 2000-2018, MetaQuotes Software Corp.


641 Constantes, Enumeradores e Estruturas

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);
//---
}

© 2000-2018, MetaQuotes Software Corp.


642 Constantes, Enumeradores e Estruturas

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

© 2000-2018, MetaQuotes Software Corp.


643 Constantes, Enumeradores e Estruturas

input long InpZOrder=0; // Prioridade para clicar no mouse


//+------------------------------------------------------------------+
//| Create objeto Evento no gráfico |
//+------------------------------------------------------------------+
bool EventCreate(const long chart_ID=0, // ID de gráfico
const string name="Event", // nome do evento
const int sub_window=0, // índice da sub-janela
const string text="Text", // texto do evento
datetime time=0, // tempo
const color clr=clrRed, // cor
const int width=1, // largura do ponto quando em destaque
const bool back=false, // no fundo
const bool selection=false, // destaque para mover
const bool hidden=true, // ocultar na lista de objetos
const long z_order=0) // prioridade para clique do mouse
{
//--- se o tempo não estiver definido, criar o objeto no último bar
if(!time)
time=TimeCurrent();
//--- redefine o valor de erro
ResetLastError();
//--- criar objeto Evento
if(!ObjectCreate(chart_ID,name,OBJ_EVENT,sub_window,time,0))
{
Print(__FUNCTION__,
": falha ao criar objeto \"Evento\"! Código de erro = ",GetLastError());
return(false);
}
//--- definir texto do evento
ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);
//--- definir cor
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- definir a largura de ponto de ancoragem se o objeto é destacado
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- exibir em primeiro plano (false) ou fundo (true)
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- permitir (true) ou desabilitar (false) o modo de movimento do evento 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);
}
//+------------------------------------------------------------------+
//| Alterar o texto do objeto Evento  |
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


644 Constantes, Enumeradores e Estruturas

bool EventTextChange(const long chart_ID=0, // ID do gráfico


const string name="Event", // nome do evento
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);
}
//+------------------------------------------------------------------+
//| Mover objeto Evento  |
//+------------------------------------------------------------------+
bool EventMove(const long chart_ID=0, // ID do gráfico
const string name="Event", // nome do evento
datetime time=0) // tempo
{
//--- se o tempo não estiver definido, mover evento até o último bar
if(!time)
time=TimeCurrent();
//--- redefine o valor de erro
ResetLastError();
//--- mover o objeto
if(!ObjectMove(chart_ID,name,0,time,0))
{
Print(__FUNCTION__,
": falha ao mover objeto \"Evento\"! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Excluir objeto Evento  |
//+------------------------------------------------------------------+
bool EventDelete(const long chart_ID=0, // ID do gráfico
const string name="Event") // nome do evento
{
//--- redefine o valor de erro
ResetLastError();
//--- excluir o objeto
if(!ObjectDelete(chart_ID,name))
{

© 2000-2018, MetaQuotes Software Corp.


645 Constantes, Enumeradores e Estruturas

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++)
{

© 2000-2018, MetaQuotes Software Corp.


646 Constantes, Enumeradores e Estruturas

//--- usar o seguinte valor


if(d<bars-1)
d+=1;
//--- mover o ponto
if(!EventMove(0,InpName,date[d]))
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 o canal do gráfico
EventDelete(0,InpName);
ChartRedraw();
//--- 1 segundo de atraso
Sleep(1000);
//---
}

© 2000-2018, MetaQuotes Software Corp.


647 Constantes, Enumeradores e Estruturas

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.

O objeto é usado para criar e projetar a interface gráfica personalizada.

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)

© 2000-2018, MetaQuotes Software Corp.


648 Constantes, Enumeradores e Estruturas

input bool InpBack=false; // Objeto de Fundo


input bool InpSelection=true; // Destaque para mover
input bool InpHidden=true; // Ocultar na lista de objeto
input long InpZOrder=0; // Prioridade para clique do mouse
//+------------------------------------------------------------------+
//| Criar etiqueta retangular  |
//+------------------------------------------------------------------+
bool RectLabelCreate(const long chart_ID=0, // ID do gráfico
const string name="RectLabel", // nome da etiqueta
const int sub_window=0, // índice da sub-janela
const int x=0, // coordenada X
const int y=0, // coordenada Y
const int width=50, // largura
const int height=18, // altura
const color back_clr=C'236,233,216', // cor do fundo
const ENUM_BORDER_TYPE border=BORDER_SUNKEN, // tipo de borda
const ENUM_BASE_CORNER corner=CORNER_LEFT_UPPER, // canto do gráfico para anco
const color clr=clrRed, // cor da borda plana (Flat)
const ENUM_LINE_STYLE style=STYLE_SOLID, // estilo da borda plana
const int line_width=1, // largura da borda plana
const bool back=false, // no fundo
const bool selection=false, // destaque para mover
const bool hidden=true, // ocultar na lista de objeto
const long z_order=0) // prioridade para clicar no
{
//--- redefine o valor de erro
ResetLastError();
//--- criar uma etiqueta retangular
if(!ObjectCreate(chart_ID,name,OBJ_RECTANGLE_LABEL,sub_window,0,0))
{
Print(__FUNCTION__,
": falha ao criar uma etiqueta retangular! 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 tamanho da etiqueta
ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width);
ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height);
//--- definir a cor de fundo
ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,back_clr);
//--- definir o tipo de borda
ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_TYPE,border);
//--- determinar o canto do gráfico onde as coordenadas do ponto são definidas
ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);
//--- definir a cor da borda plana (no modo Flat)
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- definir o estilo da linha da borda plana

© 2000-2018, MetaQuotes Software Corp.


649 Constantes, Enumeradores e Estruturas

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
{

© 2000-2018, MetaQuotes Software Corp.


650 Constantes, Enumeradores e Estruturas

//--- redefine o valor de erro


ResetLastError();
//--- alterar tamanho da etiqueta
if(!ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width))
{
Print(__FUNCTION__,
": falha ao alterar a largura da etiqueta! Código de erro = ",GetLastError());
return(false);
}
if(!ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height))
{
Print(__FUNCTION__,
": falha ao alterar a altura da etiqueta! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Alterar o tipo de borda da etiqueta retangular  |
//+------------------------------------------------------------------+
bool RectLabelChangeBorderType(const long chart_ID=0, // ID do gráfico
const string name="RectLabel", // nome da etiqueta
const ENUM_BORDER_TYPE border=BORDER_SUNKEN) // tipo de borda
{
//--- redefine o valor de erro
ResetLastError();
//--- alterar tipo de borda
if(!ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_TYPE,border))
{
Print(__FUNCTION__,
": falha ao alterar tipo de borda! Código de erro = ",GetLastError());
return(false);
}
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Excluir etiqueta retangular  |
//+------------------------------------------------------------------+
bool RectLabelDelete(const long chart_ID=0, // ID do gráfico
const string name="RectLabel") // nome da etiqueta
{
//--- redefine o valor de erro
ResetLastError();
//--- excluir a etiqueta
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,

© 2000-2018, MetaQuotes Software Corp.


651 Constantes, Enumeradores e Estruturas

": falha ao excluir a etiqueta retangular! 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 as coordenadas da etiqueta retangular
int x=(int)x_distance/4;
int y=(int)y_distance/4;
//--- definir tamanho da etiqueta
int width=(int)x_distance/4;
int height=(int)y_distance/4;
//--- criar uma etiqueta retangular
if(!RectLabelCreate(0,InpName,0,x,y,width,height,InpBackColor,InpBorder,InpCorner,
InpColor,InpStyle,InpLineWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- redesenhar o gráfico e esperar um segundo
ChartRedraw();
Sleep(1000);
//--- alterar o tamanho da etiqueta retangular
int steps=(int)MathMin(x_distance/4,y_distance/4);
for(int i=0;i<steps;i++)
{
//--- redimensionar
width+=1;
height+=1;
if(!RectLabelChangeSize(0,InpName,width,height))
return;

© 2000-2018, MetaQuotes Software Corp.


652 Constantes, Enumeradores e Estruturas

//--- 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);
}
//--- 1 segundo de atraso
Sleep(1000);
//--- alterar tipo de borda
if(!RectLabelChangeBorderType(0,InpName,BORDER_RAISED))
return;
//--- redesenhar o gráfico e esperar por um segundo
ChartRedraw();
Sleep(1000);
//--- alterar tipo de borda
if(!RectLabelChangeBorderType(0,InpName,BORDER_SUNKEN))
return;
//--- redesenhar o gráfico e esperar por um segundo
ChartRedraw();
Sleep(1000);
//--- excluir a etiqueta
RectLabelDelete(0,InpName);
ChartRedraw();
//--- esperar por um segundo
Sleep(1000);
//---
}

© 2000-2018, MetaQuotes Software Corp.


653 Constantes, Enumeradores e Estruturas

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):

Objeto Identifi X/Y W idth/ Date/Pr OBJPR OBJPR OBJPR


cador Height ice OP_CO OP_AN OP_AN
RNER CHOR GLE

T ext OBJ_T EXT — — Sim — Sim Sim

Label OBJ_LABE Sim Sim — Sim Sim Sim


L (apenas
leitura)

Button OBJ_BUTT Sim Sim — Sim — —


ON

Bitmap OBJ_BIT M — Sim Sim — Sim —


AP (apenas
leitura)

Bitmap OBJ_BIT M Sim Sim — Sim Sim —


Label AP_LABEL (apenas
leitura)

Edit OBJ_EDIT Sim Sim — Sim — —


Rectangle OBJ_R ECT Sim Sim — Sim — —
Label ANGLE_L
ABEL

Na tabela são utilizadas as seguintes denominações :


· 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.

© 2000-2018, MetaQuotes Software Corp.


654 Constantes, Enumeradores e Estruturas

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.

Para funções ChartSetDouble() e ChartGetDouble()

ENUM_OBJECT_PROPERTY_INTEGER

Identificador Descrição Tipo de Propriedade


OBJPR OP_COLOR Cor color

OBJPR OP_S TYLE Estilo ENUM _L INE_S TYLE

OBJPR OP_WIDTH Espessura de linha int

OBJPR OP_BACK Objeto no pano de fundo bool

OBJPR OP_ZORDER Prioridade de um objeto long


gráfico para receber eventos
de clicagem em um gráfico
(CH ART EVENT_CL ICK). O valor
zero default é definido ao se
criar um objeto; a prioridade
pode ser aumentada se
necessário. Ao colocar objetos
um sobre o outro, somente
aquele com a maior prioridade
receberá o evento
CH ART EVENT_CL ICK.

OBJPR OP_FILL Preenche um objeto com cor bool


(para OBJ_R ECT ANGLE,
OBJ_TRIANGLE, OBJ_ELL IPSE,
OBJ_CH ANNEL,
OBJ_S TDDEVCH ANNEL,
OBJ_R EGR ESS ION)

OBJPR OP_HIDDEN Proíbe exibir o nome de um bool


objeto gráfico na lista de
objetos do menu do terminal
"Gráficos " - " Objetos " - " Lista
de objetos " . O valor true
permite ocultar um objeto da
lista. Por default, true é
definido para os objetos que
exibem eventos de calendário,

© 2000-2018, MetaQuotes Software Corp.


655 Constantes, Enumeradores e Estruturas

histórico de negociação e para


objetos criados a partir de
programas MQL5. Para ver tais
objetos gráficos e acessar suas
propriedades, clique no botão
"T ODOS " na janela " Lista de
objetos " .

OBJPR OP_SELECT ED Objeto é selecionado bool

OBJPR OP_R EADONL Y Capacidade de editar texto no bool


objeto Edit

OBJPR OP_TYPE T ipo de objeto ENUM _OBJECT r/o

OBJPR OP_TIME Coordenada de tempo datetime modificador=número


do ponto de ancoragem

OBJPR OP_SELECT ABLE Disponibilidade de objeto bool

OBJPR OP_CR EAT ETIME H ora de criação do objeto datetime r/o

OBJPR OP_LEVELS Número de níveis int

OBJPR OP_LEVELCOLOR Cor das linhas de nível color modificador=número de


nível

OBJPR OP_LEVELS TYLE Estilo da linha de nível ENUM _L INE_S TYLE


modificador=número de nível

OBJPR OP_LEVEL WIDTH Espessura do nível de linha int modificador=número de


nível

OBJPR OP_AL IGN Alinhamento de texto ENUM _AL IGN_MODE


horizontal no objeto
" Edit" (OBJ_EDIT )
OBJPR OP_FONT S IZE T amanho de fonte int

OBJPR OP_R AY_LEFT Raios indo para esquerda bool

OBJPR OP_R AY_RIGHT Raios indo para direita bool

OBJPR OP_R AY Uma linha vertical indo através bool


de todas as janelas de um
gráfico

OBJPR OP_ELL IPSE Exibição da elipse completa do bool


objeto Arco de Fibonacci
(OBJ_FIBOAR C)

OBJPR OP_ARR OW CODE Código de seta para o objeto char


Seta

OBJPR OP_TIMEFR AMES Visibilidade de um objeto nas conjunto de flags


janelas de tempo

© 2000-2018, MetaQuotes Software Corp.


656 Constantes, Enumeradores e Estruturas

OBJPR OP_ANCH OR Localização do ponto de ENUM _ARR OW_ANCH OR (for


ancoragem de um objeto OBJ_ARR OW ),
gráfico ENUM _ANCH OR_POINT (for
OBJ_LABEL,
OBJ_BIT MAP_LABEL and
OBJ_T EXT )

OBJPR OP_XDIS T ANCE A distância em pixels ao longo int


do eixo X a partir do canto de
vinculação (see note)

OBJPR OP_YDIS T ANCE A distância em pixels ao longo int


do eixo Y a partir do canto de
vinculação (see note)

OBJPR OP_DIR ECTION T endência do objeto Gann ENUM _GANN_DIR ECTION

OBJPR OP_DEGR EE Nível de marcação da Onda de ENUM _ELL IOT_W AVE_DEGR EE


Elliott

OBJPR OP_DR AW L INES Exibição de linhas para bool


marcação da Onda de Elliott

OBJPR OP_S T AT E Estado do botão (pressionado / bool


não pressionado)

OBJPR OP_CH ART_ID ID do objeto long r/o


" Chart" (OBJ_CH ART ). Permite
trabalhar com as propriedades
deste objeto como um gráfico
normal usando as funções
descritas em Operações de
Gráfico, mas existem algumas
exceções.

OBJPR OP_XS IZE O tamanho do objeto Chart ao int


longo do eixo X (largura em
pixels) é especificado para
objetos OBJ_LABEL (read only),
OBJ_BUTT ON, OBJ_CH ART ,
OBJ_BIT MAP,
OBJ_BIT MAP_LABEL, OBJ_EDIT ,
OBJ_R ECT ANGLE_LABEL.

OBJPR OP_YS IZE O tamanho do objeto Chart ao int


longo do eixo X (largura em
pixels) é especificado para
objetos OBJ_LABEL (read only),
OBJ_BUTT ON, OBJ_CH ART ,
OBJ_BIT MAP,
OBJ_BIT MAP_LABEL, OBJ_EDIT ,
OBJ_R ECT ANGLE_LABEL.

OBJPR OP_XOFFSET A coordenada X do canto int


superior esquerdo da área

© 2000-2018, MetaQuotes Software Corp.


657 Constantes, Enumeradores e Estruturas

vis ível retangular nos objetos


gráficos "Bitmap Label" e
"Bitmap" (OBJ_BIT MAP_LABEL
e OBJ_BIT MAP). O valor é
definido em pixels em relação
ao canto superior esquerdo da
imagem original.

OBJPR OP_YOFFSET A coordenada X do canto int


superior esquerdo da área
vis ível retangular nos objetos
gráficos "Bitmap Label" e
"Bitmap" (OBJ_BIT MAP_LABEL
e OBJ_BIT MAP). O valor é
definido em pixels em relação
ao canto superior esquerdo da
imagem original.

OBJPR OP_PERIOD Janela de tempo para o objeto ENUM _TIMEFR AMES


Chart

OBJPR OP_DAT E_SCALE Exibição da escala de tempo bool


para o objeto Chart

OBJPR OP_PRICE_SCALE Exibição da escala de preço bool


para o objeto Chart

OBJPR OP_CH ART_SCALE A escala para o objeto Chart int valor na faixa de 0–5

OBJPR OP_BGCOLOR A cor de fundo para OBJ_EDIT , color


OBJ_BUTT ON,
OBJ_R ECT ANGLE_LABEL

OBJPR OP_CORNER O canto do gráfico para link ar ENUM _BASE_CORNER


um objeto gráfico

OBJPR OP_BORDER_TYPE T ipo de borda para o objeto ENUM _BORDER_TYPE


"Rectangle label"
OBJPR OP_BORDER_COLOR Cor de borda para os objetos color
OBJ_EDIT e OBJ_BUTT ON

Ao usar operações de gráfico para o objeto " Chart" (OBJ_CH ART ), as seguintes limitações são
impostas :

· Ele não pode ser fechado usando ChartClose();

· Ativo/período não podem ser alterados usando a função ChartSetS ymbolPeriod();

· As seguintes propriedades são sem efeito: CH ART_SCALE, CH ART_BRING_T O_T OP,


CH ART_S H OW_DAT E_SCALE e CH ART_S H OW_PRICE_SCALE (ENUM _CH ART_PR OPERTY_INT EGER ).

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

© 2000-2018, MetaQuotes Software Corp.


658 Constantes, Enumeradores e Estruturas

á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_RECT 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.

Para as funções ObjectSetDouble() e ObjectGetDouble()

ENUM_OBJECT_PROPERTY_DOUBLE

Identificador Descrição Tipo de Propriedade


OBJPR OP_PRICE Coordenada de Preço double modificador=número
do ponto de ancoragem

OBJPR OP_LEVEL VALUE Valor de nível double modificador=número


de nível

OBJPR OP_SCALE Escala (propriedades de double


objetos Gann e Arcos de
Fibonnacci)
OBJPR OP_ANGLE Ângulo. Para os objetos sem double
ângulo especificado, criado a
partir de um programa, o valor
é igual a EM PTY_VALUE

OBJPR OP_DEVIATION Desvio para o Canal de Desvio double


Padrão

Para as funções ObjectSetString() e ObjectGetString()

ENUM_OBJECT_PROPERTY_STRING

Identificador Descrição Tipo de Propriedade


OBJPR OP_NAME Nome de objeto string

OBJPR OP_T EXT Descrição do objeto (o texto string


contido no objeto)

OBJPR OP_T OOL TIP O texto de um " tooltip" (dica). string


Se a propriedade não é
definida, então o " tooltip"
gerado automaticamente pelo
terminal é exibido. Um

© 2000-2018, MetaQuotes Software Corp.


659 Constantes, Enumeradores e Estruturas

" tooltip" pode ser desabilitado


através da atribuição do valor
"\n" (quebra de linha) a ele
OBJPR OP_LEVEL T EXT Nível de descrição string modificador=número
de nível

OBJPR OP_FONT Font string

OBJPR OP_BM PFILE O nome do arquivo BM P para string modificador: 0-estado


rótulo Bitmap. Veja também Ligado, 1-estado Desligado
Recursos
OBJPR OP_S YM BOL Ativo para o objeto Chart string

Para o objeto OBJ_RECT ANGLE_LABEL ("Rótulo de Retâ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
BORDER_RAISED Forma em relevo
BORDER_SUNKEN Forma cavada

Para o objeto OBJ_EDIT (" Edit" ) e para a função ChartScreenS hot(), 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

AL IGN_CENT ER Centrado (somente para o objeto Edit)

AL IGN_RIGHT Alinhamento a direita

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)

© 2000-2018, MetaQuotes Software Corp.


660 Constantes, Enumeradores e Estruturas

{
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);
}
}

© 2000-2018, MetaQuotes Software Corp.


661 Constantes, Enumeradores e Estruturas

Métodos de Vinculação de Objeto


Os objetos de gráficos T ext, Label, Bitmap e Bitmap Label (OBJ_T EXT , OBJ_LABEL, OBJ_BIT MAP e
OBJ_BIT MAP_LABEL) podem ter uma de 9 maneiras diferentes de vincular suas coordenadas, as quais
foram especificadas pela propriedade OBJPR OP_ANCH OR .

Objeto Identifi X/Y Largur Data/Pr OBJPR OBJPR OBJPR


cador a/Altur eço OP_CO OP_AN OP_AN
a RNER CHOR GLE

Texto OBJ_T EXT — — Sim — Sim Sim

etiqueta OBJ_LABE Sim Sim — Sim Sim Sim


L (apenas
leitura)

Botão OBJ_BUTT Sim Sim — Sim — —


ON

Bitmap OBJ_BIT M — Sim Sim — Sim —


AP (apenas
leitura)

Bitmap OBJ_BIT M Sim Sim — Sim Sim —


Label AP_LABEL (apenas
leitura)

Edit OBJ_EDIT Sim Sim — Sim — —


etiqueta OBJ_R ECT Sim Sim — Sim — —
retangular ANGLE_L
ABEL

Na tabela são utilizadas as seguintes denominações :


· 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

© 2000-2018, MetaQuotes Software Corp.


662 Constantes, Enumeradores e Estruturas

ID Descrição
ANCH OR_LEFT_UPPER Ponto de ancoragem no canto superior esquerdo
ANCH OR_LEFT Ponto de ancoragem para a esquerda no centro
ANCH OR_LEFT_LOW ER Ponto de ancoragem no canto inferior esquerdo
ANCH OR_LOW ER Ponto de ancoragem abaixo no centro
ANCH OR_RIGHT_LOW ER Ponto de ancoragem no canto inferior direito
ANCH OR_RIGHT Ponto de ancoragem para a direita no centro
ANCH OR_RIGHT_UPPER Ponto de ancoragem no canto superior direito
ANCH OR_UPPER Ponto de ancoragem acima no centro
ANCH OR_CENT ER Ponto de ancoragem rigorosamente no centro
do objeto

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);
}

© 2000-2018, MetaQuotes Software Corp.


663 Constantes, Enumeradores e Estruturas

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

ANCH OR_BOTT OM Ancoragem no lado de baixo

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");

© 2000-2018, MetaQuotes Software Corp.


664 Constantes, Enumeradores e Estruturas

return;
}

int upcounter=0,downcounter=0; // conta o número de setas


bool created;// recebe o resultado das tentativas de criar um objeto
for(int i=2;i<copied;i++)// Passa pelos valores do indicador iFractals
{
if(Ups[i]!=EMPTY_VALUE)// Encontrado o fractal de cima
{
if(upcounter<10)// Não cria mais que 10 setas "Up"
{
//--- Tenta criar um objeto "Up"
created=ObjectCreate(0,string(Time[i]),OBJ_ARROW_THUMB_UP,0,Time[i],Ups[i]);
if(created)// Se construído - vamos fazer ajuste nele
{
//--- Ponto de ancoragem é em baixo, a fim de não cobrir a barra
ObjectSetInteger(0,string(Time[i]),OBJPROP_ANCHOR,ANCHOR_BOTTOM);
//--- Toque final - colorido
ObjectSetInteger(0,string(Time[i]),OBJPROP_COLOR,clrBlue);
upcounter++;
}
}
}
if(Downs[i]!=EMPTY_VALUE)// Encontrado o menor fractal
{
if(downcounter<10)// Não cria mais que 10 setas "Down"
{
//--- Tenta criar um objeto "Down"
created=ObjectCreate(0,string(Time[i]),OBJ_ARROW_THUMB_DOWN,0,Time[i],Downs[i]);
if(created)// Se construído - vamos fazer ajuste nele
{
//--- Ponto de ancoragem é em acima, a fim de não cobrir a barra
ObjectSetInteger(0,string(Time[i]),OBJPROP_ANCHOR,ANCHOR_TOP);
//--- Toque final - colorido
ObjectSetInteger(0,string(Time[i]),OBJPROP_COLOR,clrRed);
downcounter++;
}
}
}
}
}

Após a execução do script o gráfico se parecerá com esta figura.

© 2000-2018, MetaQuotes Software Corp.


665 Constantes, Enumeradores e Estruturas

© 2000-2018, MetaQuotes Software Corp.


666 Constantes, Enumeradores e Estruturas

O Canto do Gráfico no Qual um Objeto Fica Ligado


Existe uma série de objetos gráficos, para os quais você pode definir o ângulo, que especifica as
coordenadas do ponto de âncora. Esses são os seguintes tipos de objetos (os identificadores de tipo
de objeto estão entre parênteses):

· Label (OBJ_LABEL); Rótulo do texto


· Button (OBJ_BUTT ON); Botão
· Bitmap Label (OBJ_BIT MAP_LABEL); Rótulo do gráfico
· Edit (OBJ_EDIT ); Campo de entrada

· Rectangle Label (OBJ_RECT ANGLE_LABEL). Rótulo retangular

Objeto Identifi X/Y W idth/ Date/Pr OBJPR OBJPR OBJPR


cador Height ice OP_CO OP_AN OP_AN
RNER CHOR GLE

T ext OBJ_T EXT — — Sim — Sim Sim

Label OBJ_LABE Sim Sim — Sim Sim Sim


L (apenas
leitura)

Button OBJ_BUTT Sim Sim — Sim — —


ON

Bitmap OBJ_BIT M — Sim Sim — Sim —


AP (apenas
leitura)

Bitmap OBJ_BIT M Sim Sim — Sim Sim —


Label AP_LABEL (apenas
leitura)

Edit OBJ_EDIT Sim Sim — Sim — —


Rectangle OBJ_RECT Sim Sim — Sim — —
Label ANGLE_L
ABEL

Na tabela são utilizadas as seguintes denominações :


· 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 ;

© 2000-2018, MetaQuotes Software Corp.


667 Constantes, Enumeradores e Estruturas

· OBJPROP_ANGLE – define o ângulo de rotação do objeto no sentido anti-horário.


A fim de especificar o canto do gráfico, a partir do qual as coordenadas X e Y serão medidas em
pixels, use ObjectSetInteger(chartID, name, OBJPR OP_CORNER , chart_corner ), onde:

· chartID - identificador do gráfico;

· name – nome de um objeto gráfico;


· OBJPR OP_CORNER – propriedade ID para especificar o canto para vinculação;
· chart_corner – o canto desejado do gráfico, pode ser um dos valores da enumeração
ENUM _BASE_CORNER .

ENUM_BASE_CORNER

ID Descrição
CORNER_LEFT_UPPER Centro de coordenadas está no canto superior
esquerdo do gráfico

CORNER_LEFT_LOW ER Centro de coordenadas está no canto inferior


esquerdo do gráfico

CORNER_RIGHT_LOW ER Centro de coordenadas está no canto inferior


direito do gráfico

CORNER_RIGHT_UPPER Centro de coordenadas está no canto superior


direito 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 |
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


668 Constantes, Enumeradores e Estruturas

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);
}

© 2000-2018, MetaQuotes Software Corp.


669 Constantes, Enumeradores e Estruturas

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

OBJ_PERIOD_M 1 0x 00000001 O objeto é desenhado em


gráficos de 1 minuto

OBJ_PERIOD_M 2 0x 00000002 O objeto é desenhado em


gráficos de 2 minutos

OBJ_PERIOD_M 3 0x 00000004 O objeto é desenhado em


gráficos de 3 minutos

OBJ_PERIOD_M 4 0x 00000008 O objeto é desenhado em


gráficos de 4 minutos

OBJ_PERIOD_M5 0x 00000010 O objeto é desenhado em


gráficos de 5 minutos

OBJ_PERIOD_M 6 0x 00000020 O objeto é desenhado em


gráficos de 6 minutos

OBJ_PERIOD_M 10 0x 00000040 O objeto é desenhado em


gráficos de 10 minutos

OBJ_PERIOD_M 12 0x 00000080 O objeto é desenhado em


gráficos de 12 minutos

OBJ_PERIOD_M 15 0x 00000100 O objeto é desenhado em


gráficos de 15 minutos

OBJ_PERIOD_M 20 0x 00000200 O objeto é desenhado em


gráficos de 20 minutos

OBJ_PERIOD_M 30 0x 00000400 O objeto é desenhado em


gráficos de 30 minutos

OBJ_PERIOD_H1 0x 00000800 O objeto é desenhado em


gráficos de 1 hora

OBJ_PERIOD_H2 0x 00001000 O objeto é desenhado em


gráficos de 2 horas

OBJ_PERIOD_H3 0x 00002000 O objeto é desenhado em


gráficos de 3 horas

OBJ_PERIOD_H4 0x 00004000 O objeto é desenhado em


gráficos de 4 horas

© 2000-2018, MetaQuotes Software Corp.


670 Constantes, Enumeradores e Estruturas

OBJ_PERIOD_H6 0x 00008000 O objeto é desenhado em


gráficos de 6 horas

OBJ_PERIOD_H8 0x 00010000 O objeto é desenhado em


gráficos de 8 horas

OBJ_PERIOD_H12 0x 00020000 O objeto é desenhado em


gráficos de 12 horas

OBJ_PERIOD_D1 0x 00040000 O objeto é desenhado em


gráficos diários

OBJ_PERIOD_W1 0x 00080000 O objeto é desenhado em


gráficos semanais

OBJ_PERIOD_M N1 0x 00100000 O objeto é desenhado em


gráficos mensais

OBJ_ALL _PERIODS 0x 001fffff O objeto é desenhado em


todas das janelas 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

//--- redefine o código de erro


ResetLastError();
//--- Obtém os 2 últimos valores de Máximo na janela de tempo diária
int highsgot=CopyHigh(Symbol(),PERIOD_D1,0,2,highs);
if(highsgot>0) // Se cópia foi bem sucedida
{
Print("Os preços em alta dos últimos dois dias foram obtidos com sucesso");
prevHigh=highs[0]; // O Máximo do dia anterior
Print("prevHigh = ",prevHigh);
if(ObjectFind(0,highlevel)<0) // Objeto com o mesmo highlevel não encontrado
{
ObjectCreate(0,highlevel,OBJ_HLINE,0,0,0); // Cria o objeto de linha Horizontal
}
//--- Define valor para nível de preço para a linha highlevel
ObjectSetDouble(0,highlevel,OBJPROP_PRICE,0,prevHigh);
//--- Define a visibilidade apenas para PERIOD_M10 e PERIOD_H4

© 2000-2018, MetaQuotes Software Corp.


671 Constantes, Enumeradores e Estruturas

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());
}

//--- redefine o código de erro


ResetLastError();
//--- Obtém os 2 últimos valores de Mínimo na janela de tempo diária
int lowsgot=CopyLow(Symbol(),PERIOD_D1,0,2,lows);
if(lowsgot>0) // Se cópia foi bem sucedida
{
Print("Os preços em baixa dos últimos dois dias foram obtidos com sucesso");
prevLow=lows[0]; // O Mínimo do dia anterior
Print("prevLow = ",prevLow);
if(ObjectFind(0,lowlevel)<0) // Objeto com o mesmo lowlevel não encontrado
{
ObjectCreate(0,lowlevel,OBJ_HLINE,0,0,0); // Cria o objeto linha Horizontal
}
//--- Define valor para o nível de preço para a linha lowlevel
ObjectSetDouble(0,lowlevel,OBJPROP_PRICE,0,prevLow);
//--- Define a visibilidade apenas para PERIOD_M10 e PERIOD_H4
ObjectSetInteger(0,lowlevel,OBJPROP_TIMEFRAMES,OBJ_PERIOD_M10|OBJ_PERIOD_H4);
}
else Print("Não foi possível obter preços em baixa nos últimos dois dias, Erro = ",GetLastError(

ChartRedraw(0); // redesenha o gráfico de forma forçada


}

Também Veja
PeriodSeconds, Period, Janela de T empo de Gráfico, Data e H ora

© 2000-2018, MetaQuotes Software Corp.


672 Constantes, Enumeradores e Estruturas

Níveis de Onda de Elliott


Ondas de Elliott são representadas por dois objetos gráficos do tipo OBJ_ELL IOTW AVE5 e
OBJ_ELL IOTW AVE3. Para definir o tamanho da onda (método de rotulação de onda), a propriedade
OBJPR OP_DEGR EE é usada, para a qual os valores da enumeração ENUM _ELL IOT_W AVE_DEGR EE
podem ser atribuídos.

ENUM_ELLIOT_W AVE_DEGREE

ID Descrição
ELL IOTT_GR AND_SUPER CYCLE Grande Super-ciclo
ELL IOTT_SUPER CYCLE Super-ciclo

ELL IOTT_CYCLE Ciclo

ELL IOTT_PRIMARY Primário


ELL IOTT_INT ER MEDIAT E Intermediário
ELL IOTT_M INOR Menor

ELL IOTT_M INUT E Minuto

ELL IOTT_M INUETT E Minuette

ELL IOTT_SUBM INUETT E Subminuette

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");
}
}

© 2000-2018, MetaQuotes Software Corp.


673 Constantes, Enumeradores e Estruturas

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_TREND Linha correspondente à tendência de alta

GANN_DOWN_TREND Linha correspondente à tendência de baixa

Para definir a escala da linha principal como 1x 1, use a função ObjectSetDouble(chart_handle,


gann_object_name, OBJPR OP_SCALE, scale), onde:

· chart_handle – janela do gráfico onde o objeto está localizado;


· gann_object_name – nome do objeto;
· OBJPR OP_SCALE – identificador da propriedade " Escala";
· scale – escala requerida em unidades de Pips /Barra.

Exemplo de criação de um Ventilador Gann:


void OnStart()
{
//---
string my_gann="OBJ_GANNFAN object";
if(ObjectFind(0,my_gann)<0)// Objeto não encontrado
{
//--- Informe sobre a falha
Print("Objeto ",my_gann," 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);
//--- Obtém o preço mínimo do gráfico
double chart_min_price=ChartGetDouble(0,CHART_PRICE_MIN,0);
//--- Quantas barras estão exibidas no gráfico

© 2000-2018, MetaQuotes Software Corp.


674 Constantes, Enumeradores e Estruturas

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

//--- Índice da barra central no gráfico


int center_bar=bars_on_chart/2;
//--- Equador do gráfico - entre o máximo e mínimo
double mean=(chart_max_price+chart_min_price)/2.0;
//--- Define as coordenadas do primeiro ponto de ancoragem para o centro
ObjectCreate(0,my_gann,OBJ_GANNFAN,0,Time[center_bar],mean,
//--- Segundo ponto de ancoragem para a direita
Time[center_bar/2],(mean+chart_min_price)/2.0);
Print("Time[center_bar] = "+(string)Time[center_bar]+" Time[center_bar/2] = "+(string)Time[c
//Print("Time[center_bar]/="+Time[center_bar]+" Time[center_bar/2]="+Time[center_bar/2]);
//--- Define a escala em unidades de Pips / Barra
ObjectSetDouble(0,my_gann,OBJPROP_SCALE,10);
//--- Define a tendência da linha
ObjectSetInteger(0,my_gann,OBJPROP_DIRECTION,GANN_UP_TREND);
//--- Define a largura da linha
ObjectSetInteger(0,my_gann,OBJPROP_WIDTH,1);
//--- Define o estilo da linha
ObjectSetInteger(0,my_gann,OBJPROP_STYLE,STYLE_DASHDOT);
//--- Define a cor da linha
ObjectSetInteger(0,my_gann,OBJPROP_COLOR,clrYellowGreen);
//--- Permite ao usuário selecionar um objeto
ObjectSetInteger(0,my_gann,OBJPROP_SELECTABLE,true);
//--- Seleciona ele você mesmo
ObjectSetInteger(0,my_gann,OBJPROP_SELECTED,true);
//--- Desenha ele no gráfico
ChartRedraw(0);
}
}

© 2000-2018, MetaQuotes Software Corp.


675 Constantes, Enumeradores e Estruturas

Cores W eb
As seguintes contantes de cor são definidas para o tipo color:

clrBlac k clrDarkGre clrDarkSlat clrOlive clrGreen clrTeal clrNavy clrPurple


en e Gray
clrM aroon clrIndigo clrM idnigh clrDarkBlu clrDarkOliv clrSaddle B clrForestG clrOlive Dra
tBlue e e Green rown reen b
clrSeaGre clrDarkGol clrDarkSlat clrSienna clrM edium clrBrown clrDarkTur clrDimGray
en denrod e Blue Blue quoise
clrLigh tSe clrDarkViol clrFire Bric clrM edium clrM edium clrCh ocola clrCrimson clrSteelBlu
aGreen et k VioletRed SeaGreen te e
clrGoldenr clrM edium clrLawn Gr clrCadetBl clrDarkOrc clrYellowG clrLime Gre clrOrange
od SpringGre een ue h id reen en Red
en
clrDarkOra clrOrange clrGold clrYellow clrCh artre clrLime clrSpringG clrAqua
nge use reen
clrDeepSk clrBlue clrM agent clrRed clrGray clrSlate Gra clrPeru clrBlue Viol
yBlue a y et
clrLigh tSla clrDeepPin clrM edium clrDodgerB clrTurquoi clrRo yalBlu clrSlate Blu clrDarkKh a
te Gray k Turquoise lue se e e ki
clrIndian R clrM edium clrGreen Y clrM edium clrDarkSea clrTomato clrRosyBro clrOrc h id
ed Orc h id ellow Aquamarin Green wn
e
clrM edium clrPale Viol clrCoral clrCornflo clrDarkGra clrSandyBr clrM edium clrTan
Purple etRed werBlue y own Slate Blue
clrDarkSal clrBurlyWo clrHotPin k clrSalmon clrViolet clrLigh tCor clrSkyBlue clrLigh tSal
mon od al mon
clrPlum clrKh aki clrLigh tGr clrAquama clrSilver clrLigh tSky clrLigh tSte clrLigh tBlu
een rine Blue elBlue e
clrPale Gre clrTh istle clrPowder clrPale Gol clrPale Tur clrLigh tGra clrWh eat clrNavajo W
en Blue denrod quoise y h ite
clrM occasi clrLigh tPin clrGainsbo clrPeac hP clrPin k clrBisque clrLigh tGol clrBlanc h e
n k ro uff denrod dAlmond
clrLemonC clrBeige clrAntique clrPapaya clrCornsilk clrLigh tYel clrLigh tCya clrLinen
h iffon Wh ite Wh ip low n
clrLavende clrM istyRo clrOldLace clrWh iteS clrSeash ell clrIvory clrHone yd clrAlice Blu
r se mo ke ew e

clrLavend clrM intCre clrSnow clrWh ite


erBlus h am

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().

© 2000-2018, MetaQuotes Software Corp.


676 Constantes, Enumeradores e Estruturas

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

© 2000-2018, MetaQuotes Software Corp.


677 Constantes, Enumeradores e Estruturas

W ingdings
Caracteres de W ingdings usados com o objeto OBJ_ARR OW:

Um caractere necessário pode ser definido usando a função ObjectSetInteger().

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!");
}

© 2000-2018, MetaQuotes Software Corp.


678 Constantes, Enumeradores e Estruturas

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;
· Métodos de suavização – métodos de suavização internos usados em indicadores ;
· Linhas de indicador – identificadores de buffers do indicador ao acessar valores do indicador usando
CopyBuffer();
· Estilos de desenho – para indicar um dos 18 tipos de desenhos e configurações de estilo de desenho
da linha;
· Propriedades de indicadores customizados são usados em funções para trabalhar com indicadores
customizados ;
· T ipos de indicadores são usados para especificar o tipo de indicador técnico ao criar um handle
usando IndicatorCreate();
· I dentificadores de tipos de dado são usados para especificar o tipo de dado passado em um array do
tipo MqlParam para dentro de uma função IndicatorCreate().

© 2000-2018, MetaQuotes Software Corp.


679 Constantes, Enumeradores e Estruturas

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
PRICE_OPEN Preço de Abertura
PRICE_HIGH O preço máximo para o período

PRICE_LOW O preço mínimo para o período

PRICE_MEDIAN O preço mediano, (máximo + mínimo)/2

PRICE_TYPICAL Preço típico, (máximo + mínimo +


fechamento)/3

PRICE_W EIGHT ED Preço médio, (máximo + mínimo + fechamento +


fechamento)/4

Caso o volume seja usado nos cálculos, é necessário especificar um dos dois valores a partir da
enumeração ENUM _APPL IED_VOLUME.

ENUM_APPLIED_VOLUME

ID Descrição
VOLUME_TICK Volume de T ick
VOLUME_REAL Volume de negociação

O indicador técnico iStochastic() pode ser calculado de duas formas usando:

· ou somente preços de Fechamento;

· ou preços de Máximo e M ínimo.

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

S T O_CLOSECLOSE Cálculo é baseado em preços


Fechamento/Fechamento

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

© 2000-2018, MetaQuotes Software Corp.


680 Constantes, Enumeradores e Estruturas

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,

© 2000-2018, MetaQuotes Software Corp.


681 Constantes, Enumeradores e Estruturas

const double &price[]


)

{
//--- 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);
}

© 2000-2018, MetaQuotes Software Corp.


682 Constantes, Enumeradores e Estruturas

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

MODE_EMA Média exponencial

MODE_SMMA Média suavizada

MODE_L W MA Média linear-ponderada

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);

© 2000-2018, MetaQuotes Software Corp.


683 Constantes, Enumeradores e Estruturas

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.

Identificadores de linhas de indicador permitidos ao copiar valores de iMACD(), iRVI() e iStochastic().

Constante Valor Descrição


MAIN_L INE 0 Linha principal

S IGNAL _L INE 1 Linha de sinal

Identificadores de linhas de indicador permitidos ao copiar valores de ADX() e ADXW ().

Constante Valor Descrição


MAIN_L INE 0 Linha principal

PLUS DI_LINE 1 Linha +DI

M INUS DI_L INE 2 Linha –DI

Identificadores de linhas de indicador permitidos ao copiar valores de iBands().

Constante Valor Descrição


BASE_LINE 0 Linha principal

UPPER_BAND 1 Limite superior

LOW ER_BAND 2 Limite inferior

Identificadores de linhas de indicador permitidos ao copiar valores de iEnvelopes() e iFractals().

Constante Valor Descrição


UPPER_L INE 0 Linha de cima

LOW ER_L INE 1 Linha de baixo

Identificadores de linhas de indicador permitidos ao copiar valores de iGator()

Constante Valor Descrição


UPPER_HIS T OGR AM 0 H istograma superior
LOW ER_HIS T OGR AM 2 H istograma inferior

Identificadores de linhas de indicador permitidos ao copiar valores de iAlligator().

Constante Valor Descrição

© 2000-2018, MetaQuotes Software Corp.


684 Constantes, Enumeradores e Estruturas

GAT ORJAW_LINE 0 Linha Jaw

GAT ORT EETH_LINE 1 Linha T eeth

GAT ORLIPS _LINE 2 Linha Lips

Identificadores de linhas de indicador permitidos ao copiar valores de iIchimok u().

Constante Valor Descrição


T ENKANSEN_LINE 0 Linha T enk an-sen

KIJUNSEN_LINE 1 Linha Kijun-sen

SENKOUS PANA_L INE 2 Linha Senk ou Span A

SENKOUS PANB_L INE 3 Linha Senk ou Span B

CHIKOUS PAN_L INE 4 Linha Chik ou Span

© 2000-2018, MetaQuotes Software Corp.


685 Constantes, Enumeradores e Estruturas

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.

Em um indicador customizado, é permitido usar quaisquer tipos de indicador construído/desenho.


Cada tipo de construção requer especificação de um a cinco arrays globais para armazenar dados
necessários para o desenho. Estes arrays de dados devem ser associados com buffers de indicador
usando a função SetIndex Buffer(). O tipo de dados de ENUM _INDEXBUFFER_TYPE deve ser especificado
para cada buffer.

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

ID Descrição Estruturas de Dados Buffers de cor


DRAW_NONE Não desenhado 1 0
DRAW_LINE Linha 1 0
DRAW_SECTION Seção 1 0
DRAW_HIS T OGRAM H istograma a partir da 1 0
linha zero

DRAW_HIS T OGRAM 2 H istograma de dois 2 0


buffers do indicador

DRAW_ARROW Desenha setas 1 0


DRAW_ZIGZAG Estilo Zigzag permite 2 0
divisão vertical na
barra

DRAW_FILLING Preenchimento de cor 2 0


entre dos dois níveis

DRAW_BARS Exibe como uma 4 0


seqüência de barras

DRAW_CANDLES Exibe como um 4 0


seqüência de candles

DRAW_COLOR_LINE Linha Multicolorida 1 1


DRAW_COLOR_SECTIO Divisão Multicolorida 1 1
N
DRAW_COLOR_HIS T O H istograma 1 1
GRAM multicolorida a partir

© 2000-2018, MetaQuotes Software Corp.


686 Constantes, Enumeradores e Estruturas

da linha zero

DRAW_COLOR_HIS T O H istograma 2 1
GRAM 2 multicolorido dos dois
buffers do indicador

DRAW_COLOR_ARRO Desenho de setas 1 1


W multicoloridas

DRAW_COLOR_ZIGZAG Zig Zag Multicolorido 2 1


DRAW_COLOR_BARS Barras multicoloridas 4 1
DRAW_COLOR_CANDL Candles multicoloridos 4 1
ES

Para refinar a exibição dos tipos de desenho selecionados, identificadores listados em


ENUM _PLOT_PR OPERTY são usados.

Para funções PlotIndexSetInteger() e PlotIndex GetInteger()

ENUM_PLOT_PROPERTY_INTEGER

ID Descrição Tipo da Propriedade


PLOT_ARROW Código de seta para estilo uchar
DRAW_ARROW
PLOT_ARROW_S HIFT Deslocamento vertical de setas int
para estilo DR AW_ARR OW

PLOT_DRAW_BEGIN Número de barras iniciais sem int


desenho e valores na Janela de
Dados
PLOT_DRAW_TYPE T ipo de construção gráfica ENUM _DR AW_TYPE

PLOT_S H OW_DAT A Sinal de exibição de valores de bool


construção na Janela de Dados

PLOT_S HIFT Deslocamento da plotagem do int


indicador ao longo do eixo
tempo em barras

PLOT_LINE_S TYLE Estilo de linha de desenho ENUM _L INE_S TYLE

PLOT_LINE_WIDTH A espessura da linha de int


desenho

PLOT_COLOR_INDEXES O número de cores int

PLOT_LINE_COLOR O índice de um buffer contendo color modificador = número


a cor de desenho de índice de cores

Para a função PlotIndexSetDouble()

© 2000-2018, MetaQuotes Software Corp.


687 Constantes, Enumeradores e Estruturas

ENUM_PLOT_PROPERTY_DOUBLE

ID Descrição Tipo da Propriedade


PLOT_EM PTY_VALUE Um valor vazio para plotagem, double
para a qual não há desenho

Para a função PlotIndexSetString()

ENUM_PLOT_PROPERTY_STRING

ID Descrição Tipo da Propriedade


PLOT_LABEL O nome da série gráfica do string
indicador para exibir na Janela
de Dados Ao trabalhar com
estilos gráficos complexos
exigindo vários buffers de
indicador para a exposição, os
nomes para cada buffer pode
ser especificado utilizando ";"
como separador. O código de
exemplo é mostrado na
DRAW_CANDLES

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

S TYLE_DAS H Linha tracejada

S TYLE_DOT Linha pontilhada

S TYLE_DAS HDOT Linha traço-ponto

S TYLE_DAS HDOTDOT T raço - dois pontos

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[];
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


688 Constantes, Enumeradores e Estruturas

//| Função de inicialização do indicador customizado  |


//+------------------------------------------------------------------+
void OnInit()
{
//--- Associa o array ao buffer do indicador com índice 0
SetIndexBuffer(0,MABuffer,INDICATOR_DATA);
//--- Define o desenho da linha
PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_LINE);
//--- Define o estilo da linha
PlotIndexSetInteger(0,PLOT_LINE_STYLE,STYLE_DOT);
//--- Define cor de linha
PlotIndexSetInteger(0,PLOT_LINE_COLOR,clrRed);
//--- Define espessura de linha
PlotIndexSetInteger(0,PLOT_LINE_WIDTH,1);
//--- Define rótulos para a linha
PlotIndexSetString(0,PLOT_LABEL,"Moving Average");
//---
}
//+------------------------------------------------------------------+
//| 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[])
{
//---
for(int i=prev_calculated;i<rates_total;i++)
{
MABuffer[i]=close[i];
}
//--- valor retorno de prev_calculated para a próxima chamada
return(rates_total);
}

© 2000-2018, MetaQuotes Software Corp.


689 Constantes, Enumeradores e Estruturas

Propriedades de Indicador Customizado


O número de buffers de indicador que podem ser usados em um indicador customizado é ilimitado.
Mas para cada array que é designado como um buffer de indicador usando a função SetIndex Buffer(), é
necessário especificar o tipo de dado que ele armazenará. Este pode ser um dos valores da
enumeração ENUM _INDEXBUFFER_TYPE.

ENUM_INDEX BUFFER_TY PE

ID Descrição
INDICAT OR_DAT A Dados para desenho
INDICAT OR_COLOR_INDEX Cor

INDICAT OR_CALCULATIONS Buffers auxiliares para cálculos intermediários

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

ID Descrição Tipo da Propriedade


INDICAT OR_DIGIT S Acuracidade de desenho de int
valores de indicador

INDICAT OR_H EIGHT Altura fixa da janela do int


indicador (o comando de pré-
processador #property
indicator_heig ht)

INDICAT OR_LEVELS Número de níveis na janela do int


indicador

INDICAT OR_LEVELCOLOR Cor da linha de nível color modificador


= número de nível
INDICAT OR_LEVELS TYLE Estilo da linha de nível ENUM _L INE_S TYLE
modificador = número de nível

INDICAT OR_LEVELWIDTH Espessura da linha de nível int modificador


= número de nível

ENUM_CUSTOMIND_PROPERTY_DOUBLE

ID Descrição Tipo da Propriedade


INDICAT OR_M INIMUM M ínimo da janela do indicador double

INDICAT OR_MAXIMUM Máximo da janela do indicador double

INDICAT OR_LEVELVALUE Valor de nível double


modificador = número de nível

© 2000-2018, MetaQuotes Software Corp.


690 Constantes, Enumeradores e Estruturas

ENUM_CUSTOMIND_PROPERTY_STRING

ID Descrição Tipo da Propriedade


INDICAT OR_S H ORTNAME Nome do indicador abreviado string

INDICAT OR_LEVELT EXT Nível de descrição string modificador


= número de nível

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);

© 2000-2018, MetaQuotes Software Corp.


691 Constantes, Enumeradores e Estruturas

//--- define estilo STYLE_DOT para a segunda linha


PlotIndexSetInteger(1,PLOT_LINE_STYLE,STYLE_DOT);
//--- nome para Janela de Dados e rótulo da sub-janela do indicador
IndicatorSetString(INDICATOR_SHORTNAME,"Stoch("+KPeriod+","+DPeriod+","+Slowing+")");
PlotIndexSetString(0,PLOT_LABEL,"Main");
PlotIndexSetString(1,PLOT_LABEL,"Signal");
//--- define valor vazio para linha de desenho
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0.0);
//--- inicialização concluída
}

© 2000-2018, MetaQuotes Software Corp.


692 Constantes, Enumeradores e Estruturas

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_ADX Average Directional Index

IND_ADXW ADX by W elles W ilder

IND_ALLIGAT OR Alligator

IND_AMA Adaptive Moving Average

IND_AO Awesome Oscillator

IND_ATR Average T rue R ange

IND_BANDS Bollinger Bands ®


IND_BEARS Bears Power
IND_BULLS Bulls Power
IND_BW M FI Mark et Facilitation Index

IND_CCI Commodity Channel Index

IND_CH AIKIN Chaik in Oscillator

IND_CUS T OM Custom indicator

IND_DEMA Double Exponential Moving Average


IND_DEMARKER DeMark er
IND_ENVELOPES Envelopes

IND_FORCE Force Index


IND_FRACT ALS Fractals
IND_FRAMA Fractal Adaptive Moving Average

© 2000-2018, MetaQuotes Software Corp.


693 Constantes, Enumeradores e Estruturas

IND_GAT OR Gator Oscillator


IND_ICHIMOKU Ichimok u Kink o Hyo
IND_MA Moving Average

IND_MACD MACD

IND_M FI Money Flow Index

IND_MOMENT UM Momentum

IND_OBV On Balance Volume

IND_OSMA OsMA

IND_RS I Relative Strength Index


IND_RVI Relative Vigor Index
IND_SAR Parabolic SAR
IND_S TDDEV Standard Deviation

IND_S T OCH AS TIC Stochastic Oscillator

IND_T EMA T riple Exponential Moving Average


IND_TRIX T riple Exponential Moving Averages Oscillator
IND_VIDYA Variable Index Dynamic Average
IND_VOLUMES Volumes
IND_WPR W illiams ' Percent Range

© 2000-2018, MetaQuotes Software Corp.


694 Constantes, Enumeradores e Estruturas

Identificadores de Tipo de Dados


Quando criar um indicador usando a função IndicatorCreate(), um array de tipo MqlParam deve ser
especificado como o último parâmetro. Por sua vez, a estrutura MqlParam, descrevendo o indicador,
contém um tipo de campo especial. Este campo contém informação sobre o tipo de dado (real, integer
pi string type) que é passado por um elemento específico do array. O valor deste campo da estrutura
MqlParam pode ser um dos valores ENUM _DAT ATYPE.

ENUM_DATATY PE

Identificador Tipo de dado


TYPE_BOOL bool

TYPE_CH AR char

TYPE_UCH AR uchar

TYPE_S H ORT s hort

TYPE_US H ORT us hort

TYPE_COLOR color

TYPE_INT int

TYPE_UINT uint

TYPE_DAT ETIME datetime

TYPE_LONG long

TYPE_ULONG ulong

TYPE_FLOAT float

TYPE_DOUBLE double

TYPE_S TRING string

Cada elemento do array descreve o correspondente parâmetro de entrada de um indicador técnico


criado, assim o tipo e a ordem dos elementos no array devem ser rigorosamente mantidos em
concordância com a descrição.

© 2000-2018, MetaQuotes Software Corp.


695 Constantes, Enumeradores e Estruturas

Estado de Ambiente
As constantes que descrevem o ambiente de execução corrente de um programa MQL5 estão divididas
em grupos :

· Propriedades do terminal cliente – informações sobre o terminal cliente;


· Propriedades do programa-MQL5 executado – propriedades do programa MQL5, que ajuda a
controlar sua execução;
· Propriedades do ativo – obtenção de informações sobre um ativo;
· Propriedades da conta – informações sobre a conta atual;
· Estatísticas de teste – resultados de teste de um Expert Advisor.

© 2000-2018, MetaQuotes Software Corp.


696 Constantes, Enumeradores e Estruturas

Propriedades do Terminal Cliente


Informações sobre o terminal cliente podem ser obtidos através de duas funções :
T erminalInfoInteger() e T erminalInfoString(). Por parâmetros, estas funções aceitam valores do
ENUM _T ER M INAL _INFO_INT EGER e ENUM _T ER M INAL _INFO_S TRING respectivamente.

ENUM_TERMINAL_INFO_INTEGER

Identificador Descrição Tipo


T ERM INAL_BUILD O número de compilação (build) int
do terminal cliente

T ERM INAL_COMMUNITY_ACCO A flag indica a presença de int


UNT dados autorizados do
MQL5.community no terminal

T ERM INAL_COMMUNITY_CONNE Conexão com MQL5.community bool


CTION

T ERM INAL_CONNECT ED Conexão com um servidor de bool


negociação

T ERM INAL_DLLS _ALLOW ED Permissão para usar DLL bool

T ERM INAL_TRADE_ALLOW ED Permissão para negociar bool

T ERM INAL_EMAIL_ENABLED Permissão para enviar e-mails bool


usando servidor-SM TP e login,
especificado nas configurações
do terminal

T ERM INAL_FTP_ENABLED Permissão para enviar bool


relatórios usando servidor-FTP
e login, especificado nas
configurações do terminal

T ERM INAL_NOTIFICATIONS _EN Permissão para enviar bool


ABLED notificações ao smartphone

T ERM INAL_MAXBARS A quantidade máxima de int


barras no gráfico

T ERM INAL_MQID O sinalizador indica a presença bool


de dados de ID do MetaQuotes
para enviar notificações Pus h

T ERM INAL_CODEPAGE Número do código de página da int


linguagem instalado no
terminal cliente

T ERM INAL_CPU_CORES O número de núcleos de CPU no int


sistema

T ERM INAL_DIS K_S PACE Espaço livre de disco para a int


pasta MQL5\Files do terminal

© 2000-2018, MetaQuotes Software Corp.


697 Constantes, Enumeradores e Estruturas

(agente), M B

T ERM INAL_MEMORY_PHYS ICAL Memória física no sistema, M B int

T ERM INAL_MEMORY_T OT AL Memória disponível para o int


processo do terminal (agente),
MB

T ERM INAL_MEMORY_AVAILABL Memória livre do processo do int


E terminal (agente), M B

T ERM INAL_MEMORY_USED Memória usada pelo terminal int


(agente), M B

T ERM INAL_X64 Indicação do " terminal 64-bit" bool

T ERM INAL_OPENCL_SUPPORT A versão do OpenCL suportado int


no formato 0x 00010002 = 1.2.
"0" significa que OpenCL não é
suportado

T ERM INAL_SCREEN_DPI A qualidade de resolução ao int


exibir informações no ecrã é
medida pelo número de pontos
por polegada linear da
superfície (DPI).
O conhecimento desse
parâmetro permite que você
especifique as dimensões dos
objetos gráficos de modo que
pareçam iguais em monitores
com uma resolução diferente.

T ERM INAL_SCREEN_LEFT Coordenada esquerda da tela int


virtual. A tela virtual é o
retângulo que cobre todos os
monitores. Se o sistema tiver
dois monitores e sua ordem for
definida da direita para a
esquerda, a coordenada
esquerda da tela virtual poderá
estar na borda de dois
monitores.

T ERM INAL_SCREEN_T OP Coordenada superior da tela int


virtual

T ERM INAL_SCREEN_WIDTH Largura do terminal int

T ERM INAL_SCREEN_H EIGHT Altura do terminal int

T ERM INAL_LEFT Coordenada esquerda do int


terminal em relação à tela
virtual

© 2000-2018, MetaQuotes Software Corp.


698 Constantes, Enumeradores e Estruturas

T ERM INAL_T OP Coordenada direita do terminal int


em relação à tela virtual

T ERM INAL_RIGHT Coordenada superior do int


terminal em relação à tela
virtual

T ERM INAL_BOTT OM Coordenada inferior do int


terminal em relação à tela
virtual

T ERM INAL_PING_LAS T Último valor conhecidodo ping int


até ao servidor de negociação
em microssegundos. Em um
segundo existe um milhão de
microssegundos

Identificador de tecla Descrição


T ERM INAL_KEYS T AT E_LEFT Status da tecla " Seta para a int
esquerda"

T ERM INAL_KEYS T AT E_UP Status da tecla " Seta para int


cima"

T ERM INAL_KEYS T AT E_RIGHT Status da tecla " Seta para a int


direita"

T ERM INAL_KEYS T AT E_DOWN Status da tecla " Seta para int


baixo"

T ERM INAL_KEYS T AT E_S HIFT Status da tecla " S hift" int

T ERM INAL_KEYS T AT E_CONTRO Status da tecla " Ctrl" int


L

T ERM INAL_KEYS T AT E_MENU Status da tecla "W indows " int

T ERM INAL_KEYS T AT E_CAPSLO Status da tecla " CapsLock" int


CK

T ERM INAL_KEYS T AT E_NUMLOC Status da tecla "NumLock" int


K
T ERM INAL_KEYS T AT E_SCRLOC Status da tecla " ScrollLock" int
K
T ERM INAL_KEYS T AT E_ENT ER Status da tecla " Enter" int

T ERM INAL_KEYS T AT E_INSERT Status da tecla "Insert" int

T ERM INAL_KEYS T AT E_DELET E Status da tecla "Delete" int

T ERM INAL_KEYS T AT E_H OME Status da tecla "H ome" int

T ERM INAL_KEYS T AT E_END Status da tecla " End" int

T ERM INAL_KEYS T AT E_T AB Status da tecla "T ab" int

© 2000-2018, MetaQuotes Software Corp.


699 Constantes, Enumeradores e Estruturas

T ERM INAL_KEYS T AT E_PAGEUP Status da tecla "PageUp" int

T ERM INAL_KEYS T AT E_PAGEDO Status da tecla "PageDown" int


WN
T ERM INAL_KEYS T AT E_ESCAPE Status da tecla " Escape" int

A chamada de T erminalInfoInteger(T ER M INAL _KEYS T AT E_XXX) retorna o mesmo código de status de


tecla como a função GetKeyState() a partir de MS DN.

Exemplo de como calcular o coeficiente da escala:


//--- criamos um botão de 1.5 polegadas de largura no ecrã
int screen_dpi = TerminalInfoInteger(TERMINAL_SCREEN_DPI); // obtemos o DPI do monitor do usuário
int base_width = 144; // largura básica em pixels para monitor
int width = (button_width * screen_dpi) / 96; // calculamos a largura do botão para o
...

//--- cálculo do coeficiente da escala em porcentagens


int scale_factor=(TerminalInfoInteger(TERMINAL_SCREEN_DPI) * 100) / 96;
//--- uso do coeficiente de escala
width=(base_width * scale_factor) / 100;

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

Identifier Descrição tipo


T ERM INAL_COMMUNITY_BALAN Saldo no MQL5.community double
CE

T ERM INAL_RETRANSM ISS ION Porcentagem de pacotes de double


rede re-enviados no protocolo
T CP/IP para todos os
aplicativos e serviços
executados no computador. A
perda de pacotes ocorre
mesmo em redes rápidas e
configuradas corretamente.
Quando ela ocorre, não há
confirmação da entrega de
pacotes entre o receptor e o
remetente. Por conseguinte,
pacotes " perdidos " são
reenviados.

© 2000-2018, MetaQuotes Software Corp.


700 Constantes, Enumeradores e Estruturas

Ele não é uma indicação da


qualidade da conexão entre um
terminal particular e um
servidor de negociação, uma
vez que a porcentagem é
calculada para toda a atividade
da rede, incluindo a de sistema
e de fundo.

O valor
T ERM INAL_TRESSM 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 ERM INAL_COMMONDAT A_PATH .

ENUM_TERMINAL_INFO_STRING

Identificador Descrição Tipo


T ERM INAL_LANGUAGE Linguagem do terminal string

T ERM INAL_COM PANY Nome da empresa string

T ERM INAL_NAME Nome do terminal string

T ERM INAL_PATH Pasta a partir da qual o string


terminal foi iniciado

T ERM INAL_DAT A_PATH Pasta na qual dados do string


terminal são armazenados

T ERM INAL_COMMONDAT A_PAT Caminho comum para todos os string


H terminais instalados em um
computador

Para um melhor entendimento dos caminhos armazenados nas propriedades dos parâmetros
T ERM INAL_PATH , T ERM INAL_DAT A_PATH e T ERM INAL_COMMONDAT A_PATH , é recomendado executar
o script, que retornará estes valores para a cópia corrente do terminal cliente, instalado em seu
computador.

Example: Script retorna informações sobre os caminhos do terminal cliente


//+----------´--------------------------------------------------------+
//| Check_TerminalPaths.mq5 |
//| Copyright 2009, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+----------´--------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


701 Constantes, Enumeradores e Estruturas

#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 :

© 2000-2018, MetaQuotes Software Corp.


702 Constantes, Enumeradores e Estruturas

Propriedades do Programa MQL5 em Execução


Para obter informações sobre o programa mql5 em execução no momento, as constantes
ENUM _MQL _INFO_INT EGER e ENUM _MQL _INFO_S TRING são usadas.

Para a função MQLInfoInteger

ENUM_MQL_INFO_INTEGER

Identificador Descrição Tipo


MQL _MEMORY_L IM IT Quantidade máxima poss ível int
de memória dinâmica para o
programa MQL5 em M B

MQL _MEMORY_USED O tamanho de memória usado int


pelo programa MQL5 em M B

MQL _PR OGR AM _TYPE T ipo do programa MQL5 ENUM _PR OGR AM _TYPE

MQL _DLLS _ALLOW ED A permissão para usar DLL bool


para o dado programa
executado
MQL _TR ADE_ALLOW ED A permissão para negociar bool
para o dado programa
executado
MQL _S IGNALS _ALLOW ED A permissão para modificar os bool
Sinais para o determinado
programa executado
MQL _DEBUG O flag, que indica o modo de bool
depuração

MQL _PR OFILER O flag, que indica que o bool


programa está operando em
modo de profiling de código

MQL _T ES T ER O flag, que indica o processo bool


do testador

MQL _OPTIM IZATION O flag, que indica o processo bool


de otimização

MQL _VISUAL _MODE O flag, que indica o processo bool


de testador visual

MQL _FR AME_MODE O sinalizador, indicando que o bool


Expert Advisor está operando
na coleta de resultado no modo
de otimização dos quadros

MQL _L ICENSE_TYPE T ipo de licença do módulo EX5. ENUM _L ICENSE_TYPE


A licença refere-se ao módulo
EX5, a partir do qual é feita

© 2000-2018, MetaQuotes Software Corp.


703 Constantes, Enumeradores e Estruturas

uma solicitação usando


MQL InfoInteger(MQL _L ICENSE_
TYPE).

Para a função MQLInfoString

ENUM_MQL_INFO_STRING

Identificador Descrição Tipo


MQL _PR OGR AM _NAME Nome do programa MQL5 string
executado

MQL _PR OGR AM _PATH Caminho para o dado string


programa executado

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
PROGRAM _SCRIPT Script

PROGRAM _EXPERT Expert

PROGRAM _INDICAT OR Indicador

ENUM_LICENSE_TY PE

Identificador Descrição
L ICENSE_FR EE Um versão gratuita ilimitada

L ICENSE_DEMO Um versão trial de um produto pago do Mark et.


Funciona somente no Provador de Estratégia
L ICENSE_FULL Uma versão licenciada adquirida permite pelo
menos 5 ativações. O vendedor pode aumentar
o número permitido de ativações.

L ICENSE_TIME Uma versão com termo de licença limitada

Exemplo:
ENUM_PROGRAM_TYPE mql_program=(ENUM_PROGRAM_TYPE)MQLInfoInteger(MQL_PROGRAM_TYPE);
switch(mql_program)
{
case PROGRAM_SCRIPT:
{
Print(__FILE__+" é um script");

© 2000-2018, MetaQuotes Software Corp.


704 Constantes, Enumeradores e Estruturas

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);
}

© 2000-2018, MetaQuotes Software Corp.


705 Constantes, Enumeradores e Estruturas

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 de ENUM _S YM BOL _INFO_INT EGER ,
ENUM _S YM BOL _INFO_DOUBLE e ENUM _S YM BOL _INFO_S TRING.

Para a função S ymbolInfoInteger()

ENUM_SY MBOL_INFO_INTEGER

Identificador Descrição Tipo


S YM BOL _CUS T OM Indica que o ativo é bool
personalizado, em outras
palavras, criado artificialmente
com base noutros s ímbolos da
janela Observação de mercado
ou/e fontes de dados externas

S YM BOL _BACKGR OUND_COLOR Cor de fundo que destaca o um color


s ímbolo na Observação de
mercado

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 _SELECT O ativo (s ímbolo) é selecionado bool


na janela Observação de
Mercado

S YM BOL _VIS IBLE Indica que o s ímbolo bool


selecionado é exibido na
Observação de Mercado.

Alguns s ímbolos (normalmente,


taxas transversais necessárias
para o cálculo de requisitos de
margem e lucro na moeda
depósito) são selecionados
automaticamente, mas, neste
caso, não podem ser mostrados
na Observação de Mercado.
Para serem exibidos, esses
s ímbolos devem ser
selecionados explicitamente.

S YM BOL _SESS ION_DEALS Número de operações (deals) long


na sessão atual

S YM BOL _SESS ION_BUY_ORDER S Número de ordens de Compra long


no momento

© 2000-2018, MetaQuotes Software Corp.


706 Constantes, Enumeradores e Estruturas

S YM BOL _SESS ION_SELL _ORDER Número de ordens de Venda no long


S momento

S YM BOL _VOLUME Volume da última operação long


(deal)

S YM BOL _VOLUMEHIGH Volume diário máximo long

S YM BOL _VOLUMELOW Volume diário mínimo long

S YM BOL _TIME H ora da última cotação datetime

S YM BOL _DIGIT S Dígitos após um ponto decimal int

S YM BOL _S PR EAD_FLOAT Indicação de um spread bool


flutuante

S YM BOL _S PR EAD Valor do spread em pontos int

S YM BOL _TICKS _BOOKDEPTH Número máximo de solicitações int


exibidas na Profundidade do
Mercado. Para ativos que não
tem fila de solicitações, o valor
é igual a zero.

S YM BOL _TR ADE_CALC_MODE Modo de cálculo de preço de ENUM _S YM BOL _CALC_MODE


contrato

S YM BOL _TR ADE_MODE T ipo de execução de ordem ENUM _S YM BOL _TR ADE_MODE

S YM BOL _S T ART_TIME Data do início de negociação do datetime


ativo (geralmente usado para
futuros)

S YM BOL _EXPIR ATION_TIME Data do fim de negociação do datetime


ativo (geralmente usado para
futuros)

S YM BOL _TR ADE_S T OPS _LEVEL M ínima distância em pontos a int


partir do preço de fechamento
atual para colocar ordens de
Stop

S YM BOL _TR ADE_FR EEZE_LEVEL Distância para congelar int


operações de negociação em
pontos

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_MODE Modelo de cálculo de Swap ENUM _S YM BOL _S W AP_MODE

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 _MARGIN_H EDGED_USE Modo de cálculo de margem de bool


_LEG cobertura de acordo com o lado
maior - leg - (Buy ou Sell)

© 2000-2018, MetaQuotes Software Corp.


707 Constantes, Enumeradores e Estruturas

S YM BOL _EXPIR ATION_MODE Flags de modos de expiração int


de ordens permitidas

S YM BOL _FILL ING_MODE Flags de modos de int


preenchimento de ordens
permitidas

S YM BOL _ORDER_MODE Flags de modos de int


preenchimento de ordens
permitidas

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)

S YM BOL _OPTION_MODE T ipo de opção ENUM _S YM BOL _OPTION_MODE

S YM BOL _OPTION_RIGHT Opção direita (Call/Put) ENUM _S YM BOL _OPTION_MODE

Para a função S ymbolInfoDouble()

ENUM_SY MBOL_INFO_DOUBLE

Identificador Descrição Tipo


S YM BOL _BID Preço de Venda (Bid) - melhor double
oferta de venda

S YM BOL _BIDHIGH Máximo Preço de Venda do dia double

S YM BOL _BIDLOW M ínimo Preço de Venda do dia double

S YM BOL _AS K Preço de Compra (As k ) - double


melhor oferta de compra

S YM BOL _AS KHIGH Máximo Preço de Compra do double


dia

S YM BOL _AS KLOW M ínimo Preço de Compra do dia double

S YM BOL _LAS T Preço da último operação (deal) double

S YM BOL _LAS THIGH Máximo dos preços negociados double


do dia

S YM BOL _LAS T LOW M ínimo dos preços negociados double


do dia

S YM BOL _OPTION_S TRIKE O preço do strik e de uma double


opção. O preço que um
comprador de opções pode
comprar (numa opção de
compra) ou vender (numa
opção de venda) o ativo
subjacente e o vendedor de

© 2000-2018, MetaQuotes Software Corp.


708 Constantes, Enumeradores e Estruturas

opções é obrigado a vender ou


a comprar a quantia adequada
do ativo subjacente.

S YM BOL _POINT Valor de um ponto do ativo double

S YM BOL _TR ADE_TICK_VALUE Valor do double


S YM BOL _TR ADE_TICK_VALUE_P
ROFIT
S YM BOL _TR ADE_TICK_VALUE_P Preço de tick calculado para double
ROFIT uma posição lucrativa

S YM BOL _TR ADE_TICK_VALUE_L Preço de tick calculado para um double


OSS posição perdedora

S YM BOL _TR ADE_TICK_S IZE M ínima mudança de preço double

S YM BOL _TR ADE_CONTR ACT_S I T amanho do contrato de double


ZE negociação

S YM BOL _TR ADE_ACCR UED_INT Os Juros acumuladossão uma double


ER ES T parte dos juros dos títulos e é
calculado proporcionalmente ao
número de dias a partir da data
de emissão do cupom ou da
data de pagamento do juro
anterior.

S YM BOL _TR ADE_FACE_VALUE O valor nominal é o valor inicial double


- de um título - definido pelo
emissor

S YM BOL _TR ADE_L IQUIDITY_R A O índice de liquidez é a double


TE proporção do valor do ativo que
pode ser usada como garantia.

S YM BOL _VOLUME_M IN M ínimo volume para uma double


operação (deal)

S YM BOL _VOLUME_MAX Máximo volume para uma double


operação (deal)

S YM BOL _VOLUME_S T EP M ínimo passo de mudança de double


volume para execução de uma
operação (deal)

S YM BOL _VOLUME_L IM IT Máximo volume agregado double


permitido de uma posição
aberta e ordens pendentes em
uma direção (compra ou venda)
para um ativo. Por exemplo,
com a limitação de 5 lotes,
você pode ter uma posição
comprada aberta com o volume
de 5 lotes e colocar uma ordem

© 2000-2018, MetaQuotes Software Corp.


709 Constantes, Enumeradores e Estruturas

pendente de Sell Limit com o


volume de 5 lotes. Mas neste
caso você não pode colocar um
ordem pendente de Buy Limite
(já que o total de volume em
uma direção excederia o
limite) ou colocar Sell Limit
com o volume maior que 5
lotes.

S YM BOL _S W AP_LONG Valor de swap comprado double

S YM BOL _S W AP_S H ORT Valor de swap vendido double

S YM BOL _MARGIN_INITIAL Margem inicial significa a double


quantia de moeda de margem
requerida para abrir uma
posição com o volume de um
lote. É usada para verificar os
ativos de um cliente quando ele
ou ele entra no mercado.

S YM BOL _MARGIN_MAINT ENANC A margem de manutenção. Se double


E for definida, ele representa a
quantia de margem na moeda
de margem do ativo cobrada de
um lote. É usada parar
verificar os ativos de um
cliente quando o estado da
conta dele/dela muda. Se a
margem de manutenção é igual
a 0, a margem inicial é usada.

S YM BOL _SESS ION_VOLUME Volume resumo de operações double


da sessão atual

S YM BOL _SESS ION_T URNOVER Rotatividade resumo da sessão double


atual

S YM BOL _SESS ION_INT ER ES T Juros de abertura resumo double

S YM BOL _SESS ION_BUY_ORDER S Volume atual de ordens de double


_VOLUME Compra

S YM BOL _SESS ION_SELL _ORDER Volume atual de ordens de double


S _VOLUME Venda
S YM BOL _SESS ION_OPEN Preço de abertura da sessão double
atual

S YM BOL _SESS ION_CLOSE Preço de fechamento da sessão double


atual

S YM BOL _SESS ION_AW Preço médio ponderado da double


sessão atual

© 2000-2018, MetaQuotes Software Corp.


710 Constantes, Enumeradores e Estruturas

S YM BOL _SESS ION_PRICE_SETT Preço de liquidação da sessão double


LEMENT atual

S YM BOL _SESS ION_PRICE_L IM IT M ínimo preço da sessão atual double


_M IN
S YM BOL _SESS ION_PRICE_L IM IT Máximo preço da sessão atual double
_MAX
S YM BOL _MARGIN_H EDGED T amanho do contrato ou double
margem para um lote de
posições sobrepostas (posições
com várias direções segundo
um mesmo s ímbolo). H á duas
maneiras de calcular a margem
dessas posições. O método de
cálculo é determinado pela
corretora.

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).

Cálculo pela maior posição:


· O valor do
S YM BOL _MARGIN_H EDGED
não é tido em conta.
· Calcula-se o volume de todas
as posições tanto curtas
como longas segundo o
instrumento.
· Para cada lado calcula-se o
preço médio ponderado tanto
de abertura, como de

© 2000-2018, MetaQuotes Software Corp.


711 Constantes, Enumeradores e Estruturas

conversão para a moeda do


depósito.
· A seguir, segundo as
fórmulas correspondentes ao
tipo de instrumento de
negociação
(S YM BOL _TR ADE_CALC_MOD
E), calcula-se a margem para
o lado curto e longo.
· Como valor final usa-se o
maior.

Para a função S ymbolInfoString()

ENUM_SY MBOL_INFO_STRING

Identificador Descrição Tipo


S YM BOL _BAS IS O ativo subjacente de um string
derivado

S YM BOL _CURR ENCY_BASE Moeda base de um ativo string

S YM BOL _CURR ENCY_PR OFIT Moeda de lucro string

S YM BOL _CURR ENCY_MARGIN Moeda de margem string

S YM BOL _BANK Fornecedor da cotação atual string

S YM BOL _DESCRIPTION Descrição do ativo string

S YM BOL _FOR MULA Fórmula para construir o preço string


de um s ímbolo personalizado

S YM BOL _IS IN O nome de um ativo no string


sistema IS IN (International
Securities Identification
Number). O International
Securities Identification
Number é um código de 12
dígitos alfanumérico que
identifica de forma única um
ativo financeiro. A presença
desta propriedade de ativo é
determinada no lado do
servidor de negociação.

S YM BOL _PAGE Endereço de página com string


informações sobre o s ímbolo.
Esse endereço será mostrado
como um referência durante a
visualização de propriedades
do s ímbolo no terminal

S YM BOL _PATH Caminho da árvore de ativos string

© 2000-2018, MetaQuotes Software Corp.


712 Constantes, Enumeradores e Estruturas

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
S YM BOL _CH ART_MODE_LAS T Barras são construídas segundo o preço Last

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_S PECIFIED. 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_S PECIFIED for especificado para um ativo, então ao enviar uma ordem
pendente, você pode especificar até que momento esta ordem pendente é válida.

Identificador Valor Descrição


S YM BOL _EXPIR ATION_GT C 1 A ordem é válida durante um
período de tempo ilimitado,
até que ela seja explicitamente
cancelada

S YM BOL _EXPIR ATION_DAY 2 A ordem é válida até o fim do


dia

S YM BOL _EXPIR ATION_S PECIFIE 4 A hora de expiração é


D especificada na ordem

S YM BOL _EXPIR ATION_S PECIFIE 8 A data de expiração é


D_DAY especificada na ordem

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);
//--- Retorna true, se o modo exp_type é permitido
return((expiration&exp_type)==exp_type);
}

© 2000-2018, MetaQuotes Software Corp.


713 Constantes, Enumeradores e Estruturas

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 As ordens são válidas apenas dentro de um


único dia de negociação. Após a conclusão,
todos os níveis de StopLoss e T ak eProfit são
removidos, bem como ordens pendentes são
excluídas

S YM BOL _ORDER S _DAIL Y_EXCLUDING_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.

Política de Identificador Valor Descrição


Preenchimento
Fill or Kill S YM BOL _FILL ING_FOK 1 Esta política significa
que uma transação
somente pode ser
executada com o
volume especificado.
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.

Immediate or Cancel S YM BOL _FILL ING_IOC 2 Neste caso, o


investidor concorda

© 2000-2018, MetaQuotes Software Corp.


714 Constantes, Enumeradores e Estruturas

em executar uma
transação com o
volume máximo
disponível no mercado,
em que foi indicado na
ordem. No caso da
ordem não poder ser
completamente
preenchida, o volume
disponível da ordem
será executado, e o
volume remanescente
será cancelado. A
possibilidade de
utilização de ordens
"IOC" é determinado
no servidor.

retorno No identificador Esta política é


utilizada apenas para
as ordens (compra e
venda), ordens limit e
stop limit, e somente
para os ativos com
execução de Mercado
ou Exchange. No caso
de um preenchimento
parcial, uma ordem a
mercado ou do tipo
limit com volume
remanescente não é
cancelada, mas
processada
posteriormente.

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 Return é 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:
//+------------------------------------------------------------------+
//| Verifica se um modo de preenchimento específico é permitido  |
//+------------------------------------------------------------------+
bool IsFillingTypeAllowed(string symbol,int fill_type)
{
//--- Obtém o valor da propriedade que descreve os modos de preenchimento permitidos

© 2000-2018, MetaQuotes Software Corp.


715 Constantes, Enumeradores e Estruturas

int filling=(int)SymbolInfoInteger(symbol,SYMBOL_FILLING_MODE);
//--- Retorna true, se o modo fill_type é permitido
return((filling & fill_type)==fill_type);
}

Ao enviar um pedido de comércio usando a função OrderSend(), um tipo de ordem do enumerador


ENUM _ORDER_TYPE enumeration deve ser especificada para algumas operações. Nem todos os tipos
de ordens podem ser autorizadas por um s ímbolo específico. Propriedade S YM BOL _ORDER_MODE
descreve os sinalizadores dos tipos de ordens permitidas.

Identificador Valor Descrição


S YM BOL _ORDER_MARKET 1 Ordens de mercado são
permitidas (Buy e Sell)

S YM BOL _ORDER_L IM IT 2 Ordens de limite são


permitidas (Buy Limit e Sell
Limit)

S YM BOL _ORDER_S T OP 4 Ordens de parada são


permitidas (Buy Stop e Sell
Stop)

S YM BOL _ORDER_S T OP_L IM IT 8 Ordens de limite de parada são


permitidas (Buy Stop Limit e
Sell Stop Limit)

S YM BOL _ORDER_SL 16 Stop Loss é permitido

S YM BOL _ORDER_TP 32 T ak e Profit é permitido


S YM BOL _ORDER_CLOSEBY 64 Autorização para fechar a
posição usando outra oposta,
quer dizer, usando uma posição
aberta na direção oposta, no
mesmo mesmo instrumento. A
propriedade é definida para
contas com sistema de
cobertura
(ACCOUNT_MARGIN_MODE_R E
T AIL_H EDGING)

Exemplo:
//+------------------------------------------------------------------+
//| A função imprime tipos de ordens permitidas para um símbolo  |
//+------------------------------------------------------------------+
void Check_SYMBOL_ORDER_MODE(string symbol)
{
//--- receber o valor da propriedade descrevendo os tipos de ordens permitidas
int symbol_order_mode=(int)SymbolInfoInteger(symbol,SYMBOL_ORDER_MODE);
//--- verificar se há ordens de mercado (Execução de Mercado)

© 2000-2018, MetaQuotes Software Corp.


716 Constantes, Enumeradores e Estruturas

if((SYMBOL_ORDER_MARKET&symbol_order_mode)==SYMBOL_ORDER_MARKET)
Print(symbol+": Ordens de mercado são permitidas (Buy e Sell)");
//--- verificar se há ordens de Limite
if((SYMBOL_ORDER_LIMIT&symbol_order_mode)==SYMBOL_ORDER_LIMIT)
Print(symbol+": Ordens Buy Limit e Sell Limit são permitidas");
//--- verificar se há ordens de Parada
if((SYMBOL_ORDER_STOP&symbol_order_mode)==SYMBOL_ORDER_STOP)
Print(symbol+": Ordens Buy Stop e Sell Stop são permitidas");
//--- verificar se há ordens Stop Limit
if((SYMBOL_ORDER_STOP_LIMIT&symbol_order_mode)==SYMBOL_ORDER_STOP_LIMIT)
Print(symbol+": Ordens Buy Stop Limit e Sell Stop Limit são permitidas");
//--- verificar se a colocação de uma ordem Stop Loss é permitida
if((SYMBOL_ORDER_SL&symbol_order_mode)==SYMBOL_ORDER_SL)
Print(symbol+": Ordens de Stop Loss são permitidas");
//--- Verificar se a colocação de uma ordem Take Profit é permitida
if((SYMBOL_ORDER_TP&symbol_order_mode)==SYMBOL_ORDER_TP)
Print(symbol+": Ordens de Take Profit são permitidas");
//---
}

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

Identificador Descrição F órmula

S YM BOL _CALC_MODE_FOR EX Modo Forex - cálculo de lucro e Margin: Lots *


margem para Forex Contract_Size / Leverage *
Margin_R ate

Profit: (close_price -
open_price) *
Contract_Size*Lots

S YM BOL _CALC_MODE_FOR EX_ Forex No Leverage mode – Margin: Lots * Contract_Size *


NO_LEVERAGE cálculo de lucro e margem para o Margin_R ate
mercado Forex sem levar em
conta a alavancagem Profit: (close_price -
open_price) * Contract_Size *
Lots

S YM BOL _CALC_MODE_FUT UR E Modo Futuros - cálculo de Margin: Lots * InitialMargin *


S margem e lucro para futuros Margin_R ate

Profit: (close_price -
open_price) * T ickPrice /
T ick Size*Lots

© 2000-2018, MetaQuotes Software Corp.


717 Constantes, Enumeradores e Estruturas

S YM BOL _CALC_MODE_CFD Modo CFD - cálculo de margem e Margin: Lots * ContractSize *


lucro para CFD Mark etPrice * Margin_R ate

Profit: (close_price -
open_price) * Contract_Size *
Lots

S YM BOL _CALC_MODE_CFDIND Modo índice CFD - cálculo de Margin: (Lots * ContractSize *


EX margem e lucro para CFD por Mark etPrice) * T ickPrice /
índices T ick Size * Margin_Rate

Profit: (close_price -
open_price) * Contract_Size *
Lots

S YM BOL _CALC_MODE_CFDLEV Modo Alavancado CFD - cálculo Margin: (Lots * ContractSize *


ER A G E de margem e lucro para CFD em Mark etPrice) / Leverage *
negociação alavancada Margin_R ate

Profit: (close_price-
open_price) * Contract_Size *
Lots

S YM BOL _CALC_MODE_EXCH_S Modo Exchange - cálculo de Margin: Lots * ContractSize *


T OCKS margem e lucro para negociação LastPrice * Margin_R ate
de títulos na bolsa de valores
Profit: (close_price -
open_price) * Contract_Size *
Lots

S YM BOL _CALC_MODE_EXCH_F Modo Futures - cálculo da Margin: Lots * InitialMargin *


UT UR ES margem e lucro para os Margin_R ate ou Lots *
contratos futuros de negociação MaintenanceMargin *
na bolsa de valores Margin_R ate

Profit: (close_price -
open_price) * Lots *
T ickPrice / T ick Size
S YM BOL _CALC_MODE_EXCH_F Modo FORT S Futures - cálculo de Margin: Lots * InitialMargin *
UT UR ES _FORT S margem e lucro para futuros Margin_R ate ou Lots *
contratos de comercialização nos MaintenanceMargin *
FORT S. A margem pode ser Margin_R ate * Margin_R ate
reduzida pela quantidade de
desvio MarginDiscount de acordo Profit: (close_price -
com as regras seguintes : open_price) * Lots *
1. Se o preço de uma posição T ickPrice / T ick Size
long (ordem BUY) é menor do
que o preço estimado,
MarginDiscount =
Lots *((PriceSettle-PriceOrder)
*T ickPrice/T ick Size)

© 2000-2018, MetaQuotes Software Corp.


718 Constantes, Enumeradores e Estruturas

2. Se o preço de uma posição


s hort (ordem SELL) é superior ao
preço estimado, MarginDiscount
= Lots *((PriceOrder-PriceSettle)
*T ickPrice/T ick Size)
onde:
o PriceSettle – preço estimado
(limpando) da sessão
anterior;
o PriceOrder - preço médio
ponderado de posição ou
preço de abertura definido
na ordem (pedido);
o TickPrice - Preço de tick
(custo da mudança do preço
por um ponto)
o TickSize - tamanho tick
(passo de alteração de preço
mínima)

S YM BOL _CALC_MODE_SERV_C Collateral mode - a s ymbol is Margin: no


OLLAT ER AL used as a non-tradable asset on Profit: no
a trading account. The mark et
value of an open position is Mark et Value: Lots *
calculated based on the volume, ContractSize * Mark etPrice *
current mark et price, contract LiqudityR ate
size and liquidity ratio. The
value is included into Assets,
which are added to Equity. Open
positions of such s ymbols
increase the Free Margin amount
and are used as additional
margin (collateral) for open
positions of tradable
instruments.

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
S YM BOL _TR ADE_MODE_LONGONL Y Permitido somente posições compradas
S YM BOL _TR ADE_MODE_S H ORT ONL Y Permitido somente posições vendidas
S YM BOL _TR ADE_MODE_CLOSEONL Y Permitido somente operações de fechamento de
posição

© 2000-2018, MetaQuotes Software Corp.


719 Constantes, Enumeradores e Estruturas

S YM BOL _TR ADE_MODE_FULL Sem restrições de negociação

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.

ENUM_SY MBOL_TRADE_EX ECUTION

Identificador Descrição
S YM BOL _TR ADE_EXECUTION_R EQUES T Execução por solicitação

S YM BOL _TR ADE_EXECUTION_INS T ANT Execução instantânea

S YM BOL _TR ADE_EXECUTION_MARKET Execução a Mercado

S YM BOL _TR ADE_EXECUTION_EXCH ANGE Execução em um sistema de negociação externo


(Exchange)

Métodos de cálculo de swap na transferência de posição são especificados na enumeração


ENUM _S YM BOL _S W AP_MODE. O método de cálculo de swap determina a unidade de medida dos
parâmetros S YM BOL _S W AP_LONG e S YM BOL _S W AP_S H ORT . Por exemplo, se swaps são cobrados na
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.

ENUM_SY MBOL_SW AP_MODE

Identificador Descrição
S YM BOL _S W AP_MODE_DISABLED Desabilita swaps (sem swaps)
S YM BOL _S W AP_MODE_POINT S Swaps são cobrados em pontos

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_CURR ENCY_MARGIN Swaps são cobrados em dinheiro na moeda de


margem do ativo

S YM BOL _S W AP_MODE_CURR ENCY_DEPOS IT Swaps são cobrados em dinheiro na moeda de


depósito do cliente

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)

S YM BOL _S W AP_MODE_INT ER ES T_OPEN Swaps são cobradas como juro anual


especificado a partir do preço de abertura da
posição (ano bancário padrão é 360 dias)

S YM BOL _S W AP_MODE_R EOPEN_CURR ENT Swaps são cobradas através de posições


reabertas Ao final de um dia de negociação a
posição é encerrada. No dia seguinte ela é

© 2000-2018, MetaQuotes Software Corp.


720 Constantes, Enumeradores e Estruturas

reaberta através do preço de fechamento +/-


um número específico de pontos (parâmetros
S YM BOL _S W AP_LONG e S YM BOL _S W AP_S H ORT )

S YM BOL _S W AP_MODE_R EOPEN_BID Swaps são cobradas através de posições


reabertas Ao final de um dia de negociação a
posição é encerrada. No dia seguinte ela é
reaberta através do preço de Venda (Bid) atual
+/- um número específico de pontos
(parâmetros S YM BOL _S W AP_LONG e
S YM BOL _S W AP_S H ORT )

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
SUNDAY Domingo
MONDAY Segunda-feira

T UES DAY T erça-feira


W EDNES DAY Quarta-feira

TH URS DAY Quinta-feira

FRIDAY Sexta-feira

SAT URDAY Sábado

An option is a contract, which gives the rig ht, 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. The following
enumerations describe option properties, including the option type and the rig ht arising from it.

ENUM_SY MBOL_OPTION_RIGHT

Identifier Descrição
S YM BOL _OPTION_RIGHT_CALL A call option gives you the rig ht to buy an asset
at a specified price

S YM BOL _OPTION_RIGHT_PUT A put option gives you the rig ht 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,

© 2000-2018, MetaQuotes Software Corp.


721 Constantes, Enumeradores e Estruturas

data de entrega)

S YM BOL _OPTION_MODE_AMERICAN A opção americana pode ser exercida em


qualquer dia de negociação ou antes do termo.
O prazo dentro do qual o comprador pode
exercer a opção é especificado para ele

© 2000-2018, MetaQuotes Software Corp.


722 Constantes, Enumeradores e Estruturas

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.

Para a função AccountInfoInteger()

ENUM_ACCOUNT_INFO_INTEGER

Identificador Descrição Tipo


ACCOUNT_LOGIN Número da conta long

ACCOUNT_TR ADE_MODE Modo de negociação da conta ENUM _ACCOUNT_TR ADE_MODE

ACCOUNT_LEVER AGE Alavancagem da conta long

ACCOUNT_L IM IT_ORDER S Número permitido máximo de int


ordens pendentes ativas

ACCOUNT_MARGIN_SO_MODE Modo para definir a margem ENUM _ACCOUNT_S T OPOUT_MO


permitida mínima DE
ACCOUNT_TR ADE_ALLOW ED Negociação permitida para a bool
conta atual

ACCOUNT_TR ADE_EXPERT Negociação permitida para um bool


Expert Advisor

ACCOUNT_MARGIN_MODE Modo de cálculo da margem ENUM _ACCOUNT_MARGIN_MOD


E

ACCOUNT_CURR ENCY_DIGIT S Número de casas decimais, int


para a moeda da conta,
necessário para exibir com
precisão os resultados da
negociação

Para a função AccountInfoDouble()

ENUM_ACCOUNT_INFO_DOUBLE

Identificador Descrição Tipo


ACCOUNT_BALANCE Saldo da conta na moeda de double
depósito

ACCOUNT_CR EDIT Crédito da conta na moeda de double


depósito

ACCOUNT_PR OFIT Lucro atual de uma conta na double


moeda de depósito

ACCOUNT_EQUITY Saldo a mercado da conta na double


moeda de depósito

© 2000-2018, MetaQuotes Software Corp.


723 Constantes, Enumeradores e Estruturas

ACCOUNT_MARGIN Margem da conta usada na double


moeda de depósito

ACCOUNT_MARGIN_FR EE Margem livre de uma conta na double


moeda de depósito

ACCOUNT_MARGIN_LEVEL Nível de margem de conta em double


percentagem

ACCOUNT_MARGIN_SO_CALL Nível de chamada de margem. double


Dependendo da definição,
ACCOUNT_MARGIN_SO_MODE é
expresso em percentagem ou
em moeda de depósito

ACCOUNT_MARGIN_SO_SO Nível de margem de Stop Out double


(encerramento forçado).
Dependendo da definição,
ACCOUNT_MARGIN_SO_MODE é
expresso em percentagem ou
em moeda de depósito

ACCOUNT_MARGIN_INITIAL Margem inicial. O montante double


reservado numa conta para
cobrir a margem de todas as
ordens pendentes

ACCOUNT_MARGIN_MAINT ENA Margem de manutenção. O double


NCE patrimônio líquido mínimo
reservado numa conta para
cobrir o valor mínimo de todas
as posições em aberto

ACCOUNT_ASSET S Os ativos atuais de uma conta double

ACCOUNT_L IABIL ITIES As responsabilidades atuais de double


uma conta

ACCOUNT_COMM ISS ION_BLOCK O valor da comissão bloqueada double


ED atual numa conta

Para a função AccountInfoString()

ENUM_ACCOUNT_INFO_STRING

Identificador Descrição Tipo


ACCOUNT_NAME Nome do cliente string

ACCOUNT_SERVER Nome do servidor de string


negociação

ACCOUNT_CURR ENCY Moeda da conta string

ACCOUNT_COM PANY Nome de uma empresa que string


serve a conta

© 2000-2018, MetaQuotes Software Corp.


724 Constantes, Enumeradores e Estruturas

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

ACCOUNT_TR ADE_MODE_CONT ES T Conta de torneio

ACCOUNT_TR ADE_MODE_R EAL Conta real

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

ACCOUNT_S T OPOUT_MODE_MONEY Modo stop out da conta em dinheiro

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
s ímbolo pode existir apenas uma posição). O
cálculo da margem é realizado com base no tipo
de instrumento (S YM BOL _TR ADE_CALC_MODE).

ACCOUNT_MARGIN_MODE_EXCH ANGE Usa-se para o mercado de bolsa. O cálculo da


margem é realizado com base nos descontos
indicados nas configurações dos instrumentos.
Os descontos são estabelecidos pela corretora,
no entanto não podem ser inferiores aos valores
determinados pela bolsa.

ACCOUNT_MARGIN_MODE_R ET AIL _H EDGING Usa-se para o mercado de balcão ao ser


realizado o registro independente de posições
(" cobertura" , segundo um s ímbolo, podem
existir várias posições). O cálculo da margem
realiza-se com base no tipo de instrumento
(S YM BOL _TR ADE_CALC_MODE) e tendo em
conta o tamanho da margem de cobertura
(S YM BOL _MARGIN_H EDGED).

Os dados do tipo float são exibidos com 5 dígitos após o ponto decimal.

© 2000-2018, MetaQuotes Software Corp.


725 Constantes, Enumeradores e Estruturas

//+------------------------------------------------------------------+
//| 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);
}

© 2000-2018, MetaQuotes Software Corp.


726 Constantes, Enumeradores e Estruturas

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

ID Descrição do parâmetro Tipo


estatístico
S T AT_INITIAL _DEPOS IT O valor do depósito inicial double

S T AT_WITHDR AW AL Dinheiro sacado da conta double

S T AT_PR OFIT Lucro líquido após o teste, a double


soma de S T AT_GR OSS _PR OFIT
e S T AT_GR OSS _LOSS
(S T AT_GR OSS _LOSS é sempre
menor ou igual a zero)

S T AT_GR OSS _PR OFIT Lucro total, a soma de todas as double


negociações lucrativas
(positivas). O valor é maior ou
igual a zero

S T AT_GR OSS _LOSS Prejuízo total, a soma de todas double


as negociações negativas. O
valor é menor ou igual a zero

S T AT_MAX_PR OFITTR ADE Lucro máximo - o maior valor double


dentre todas as negociações
lucrativas O valor é maior ou
igual a zero

S T AT_MAX_LOSS TR ADE Prejuízo Máximo - o menor double


valor dentre todos as
negociações (trades)
perdedoras O valor é menor ou
igual a zero

S T AT_CONPR OFIT MAX Lucro máximo em uma série de double


negociações lucrativas. O valor
é maior ou igual a zero

S T AT_CONPR OFIT MAX_TR ADES O número de negociações que int


formaram
oS T AT_CONPR OFIT MAX(lucro
máximo em uma série de
negociações lucrativas)

© 2000-2018, MetaQuotes Software Corp.


727 Constantes, Enumeradores e Estruturas

S T AT_MAX_CONWINS O lucro total da mais longa double


série de negociações lucrativas

S T AT_MAX_CONPR OFIT_TR ADE O número de negociações na int


S mais longa série de
negociações
lucrativasS T AT_MAX_CONWINS

S T AT_CONLOSSMAX Prejuízo máximo em uma série double


de negociações perdedoras. O
valor é menor ou igual a zero

S T AT_CONLOSSMAX_TR ADES O número de negociações int


(trades) que formaram
oS T AT_CONLOSSMAX(máximo
prejuízo em uma série de
negociações perdedoras)

S T AT_MAX_CONLOSSES O total de prejuízo da mais double


longa série de negociações
perdedoras

S T AT_MAX_CONLOSS _TR ADES O número de negociações na int


mais longa série de
negociações perdedoras
S T AT_MAX_CONLOSSES

S T AT_BALANCEM IN Valor do saldo mínimo double

S T AT_BALANCE_DD Máxima queda de saldo em double


termos monetários Em um
processo de negociação, um
saldo pode sofrer numerosas
quedas ; aqui o maior valor é
tomado

S T AT_BALANCEDD_PER CENT Queda de saldo como uma double


percentagem que foi registrada
no momento da máxima queda
do saldo em termos monetários
(S T AT_BALANCE_DD).

S T AT_BALANCE_DDR EL _PER CE Máxima queda de saldo com double


NT uma percentagem. Em um
processo de negociação, um
saldo pode sofrer numerosas
quedas, para cada qual a valor
da queda relativa em
percentagem é calculada. O
maior valor é retornado

S T AT_BALANCE_DD_R ELATIVE Queda de saldo em termos double


monetários que foi registrada
no momento da máxima queda
do saldo como uma

© 2000-2018, MetaQuotes Software Corp.


728 Constantes, Enumeradores e Estruturas

percentagem
(S T AT_BALANCE_DDR EL _PER CE
NT ).
S T AT_EQUITYM IN M ínimo valor do saldo a double
mercado

S T AT_EQUITY_DD Máxima queda do saldo a double


mercado em termos
monetários. Em um processo
de negociação, numerosas
quedas podem ocorrer no saldo
a mercado; aqui o maior valor
é tomado

S T AT_EQUITYDD_PER CENT Queda em percentagem que foi double


registrada no momento da
máxima queda do saldo a
mercado em termos
monetários
(S T AT_EQUITY_DD).

S T AT_EQUITY_DDR EL _PER CENT Máxima queda do saldo a double


mercado como uma
percentagem. Em um processo
de negociação, um saldo a
mercado pode sofrer
numerosas quedas, para cada
qual o valor da queda relativa
em percentagem é calculado. O
maior valor é retornado

S T AT_EQUITY_DD_R ELATIVE Queda do saldo a mercado em double


termos monetários que foi
registrada no momento da
máxima queda do saldo a
mercado em percentagem
(S T AT_EQUITY_DDR EL _PER CEN
T ).
S T AT_EXPECT ED_PAYOFF Recompensa esperada double

S T AT_PR OFIT_FACT OR Fator de lucro, igual a razão de double


S T AT_GR OSS _PR OFIT/S T AT_G
ROSS _LOSS. Se
S T AT_GR OSS _LOSS =0, o fator
de lucro é igual aDBL _MAX

S T AT_R ECOVERY_FACT OR Fator de recuperação, igual a double


razão de
S T AT_PR OFIT/S T AT_BALANCE_
DD
S T AT_S H ARPE_R ATIO Razão S harpe double

© 2000-2018, MetaQuotes Software Corp.


729 Constantes, Enumeradores e Estruturas

S T AT_M IN_MARGINLEVEL Valor mínimo do nível de double


margem

S T AT_CUS T OM _ONT ES T ER O valor do critério de double


otimização customizado
calculado retornado através da
função OnT ester()

S T AT_DEALS Número de operações (deals) int

S T AT_TR ADES Número de negociações int


(trades)

S T AT_PR OFIT_TR ADES Negociações compradas int


lucrativas

S T AT_LOSS _TR ADES Negociações perdedoras int

S T AT_S H ORT_TR ADES Negociações Vendidas int

S T AT_LONG_TR ADES Negociações Compradas int

S T AT_PR OFIT_S H ORTTR ADES Negociações vendidas int


lucrativas

S T AT_PR OFIT_LONGTR ADES Negociações compradas int


lucrativas

S T AT_PR OFITTR ADES _AVGCON Comprimento médio de uma int


série de negociações lucrativas

S T AT_LOSS TR ADES _AVGCON Comprimento médio de uma int


série de negociações
perdedores

© 2000-2018, MetaQuotes Software Corp.


730 Constantes, Enumeradores e Estruturas

Constantes de Negociação (Trade)


As várias constantes usadas para programar estratégias de negociação estão divididas nos seguintes
grupos :

· Propriedades de banco de dados de histórico – recebimento de informações gerais sobre um ativo;


· Propriedades de ordem – obtenção de informações sobre ordens de negociação;
· Propriedades de posição – obtenção de informações sobre posições correntes ;
· Propriedades de uma operação (deal) – obtenção de informações sobre operações (deals);
· T ipos de operações de negociação (trade) – descrição das operações de negociação disponíveis ;
· T ipos de transação de negociação - descrição dos poss íveis tipos de transações de negociação;
· Ordens de negociação no DOM (Profundidade de Mercado) – separação de ordens de acordo com a
direção de uma operação solicitada.

© 2000-2018, MetaQuotes Software Corp.


731 Constantes, Enumeradores e Estruturas

Propriedades de uma Base Histórica de Dados


Ao acessar uma série de tempo a função Series InfoInteger() é usada para obter informações adicionais
de um ativo (s ymbol). Um identificador de uma propriedade solicitada é passada como parâmetro da
função. O identificar pode ser um dos valores do ENUM _SERIES _INFO_INT EGER .

ENUM_SERIES_INFO_INTEGER

Identificador Descrição Tipo


SERIES _BAR S _COUNT Quantidade de barras para o long
ativo-período para o momento
corrente

SERIES _FIR S TDAT E A primeira data para o ativo- datetime


período para o momento
corrente

SERIES _LAS TBAR_DAT E H ora de abertura da última datetime


barra do ativo-período

SERIES _SERVER_FIR S TDAT E A primeira data no histórico do datetime


ativo no servidor
independentemente da janela
de tempo

SERIES _T ER M INAL _FIR S TDAT E A primeira data no histórico do datetime


ativo no terminal cliente,
independentemente da janela
de tempo

SERIES _S YNCHR ONIZED Flag de sincronização de dados bool


de um ativo/período para o
momento corrente

© 2000-2018, MetaQuotes Software Corp.


732 Constantes, Enumeradores e Estruturas

Propriedades de uma Ordem


As solicitações para executar operações de negociação são formalizadas como ordens. Cada ordem
tem uma variedade de propriedades para leitura. As informações sobre elas podem ser obtidas usando
as funções OrderGet...() e H istoryOrderGet...().

Para as funções OrderGetInteger() e H istoryOrderGetInteger()

ENUM_ORDER_PROPERTY_INTEGER

Identificador Descrição Tipo


ORDER_TICKET Bilhete da ordem. Um número long
exclusivo atribuído a cada
ordem

ORDER_TIME_SET UP H ora de configuração de uma datetime


ordem

ORDER_TYPE T ipo de ordem ENUM _ORDER_TYPE

ORDER_S T AT E Estado de uma ordem ENUM _ORDER_S T AT E

ORDER_TIME_EXPIR ATION H ora de expiração de uma datetime


ordem

ORDER_TIME_DONE H ora de execução ou datetime


cancelamento de uma ordem

ORDER_TIME_SET UP_MSC O tempo para colocar uma long


ordem de execução em
milissegundos desde
01.01.1970
ORDER_TIME_DONE_MSC T empo de execução e long
cancelamento de ordens em
milissegundos desde
01.01.1970
ORDER_TYPE_FILL ING Type de preenchimento de uma ENUM _ORDER_TYPE_FILL ING
ordem

ORDER_TYPE_TIME tempo de duração de uma ENUM _ORDER_TYPE_TIME


ordem

ORDER_MAGIC ID de um Expert Advisor que long


colocou a ordem (projetado
para garantir que cada Expert
Advisor coloque seu próprio
número único)

ORDER_R EASON Razão ou origem para a ENUM _ORDER_R EASON


colocação da ordem

ORDER_POS ITION_ID Identificador de posição que é long


definido para uma ordem tão

© 2000-2018, MetaQuotes Software Corp.


733 Constantes, Enumeradores e Estruturas

logo ela é executada. Cada


ordem executada resulta em
uma operação que abre ou
modifica uma posição já
existente. O identificador
desta exata posição é atribuída
à ordem executada neste
momento.

ORDER_POS ITION_BY_ID Identificador da posição oposta long


para as ordens do tipo

Para as funções OrderGetDouble() e H istoryOrderGetDouble()

ENUM_ORDER_PROPERTY_DOUBLE

Identificador Descrição Tipo


ORDER_VOLUME_INITIAL Volume inicial de uma ordem double

ORDER_VOLUME_CURR ENT Volume corrente de uma ordem double

ORDER_PRICE_OPEN Preço especificado na ordem double

ORDER_SL Valor de Stop Loss double

ORDER_TP Valor de T ak e Profit double

ORDER_PRICE_CURR ENT O preço corrente do ativo de double


uma ordem

ORDER_PRICE_S T OPL IM IT O preço de ordem Limit para double


uma ordem StopLimit

Para as funções OrderGetString() e H istoryOrderGetString()

ENUM_ORDER_PROPERTY_STRING

Identificador Descrição Tipo


ORDER_S YM BOL Ativo (s ymbol) de uma ordem string

ORDER_COMMENT Comentário sobre a ordem 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

ORDER_TYPE_SELL Ordem de Vender a Mercado

© 2000-2018, MetaQuotes Software Corp.


734 Constantes, Enumeradores e Estruturas

ORDER_TYPE_BUY_L IM IT Ordem pendente Buy Limit

ORDER_TYPE_SELL _L IM IT Ordem pendente Sell Limit

ORDER_TYPE_BUY_S T OP Ordem pendente Buy Stop

ORDER_TYPE_SELL _S T OP Ordem pendente Sell Stop

ORDER_TYPE_BUY_S T OP_L IM IT Ao alcançar o preço da ordem, uma ordem


pendente Buy Limit é colocada no preço
StopLimit

ORDER_TYPE_SELL _S T OP_L IM IT Ao alcançar o preço da ordem, uma ordem


pendente Sell Limit é colocada no preço
StopLimit

ORDER_TYPE_CLOSE_BY Ordem de fechamento da posição oposta

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_PLACED Ordem aceita

ORDER_S T AT E_CANCELED Ordem cancelada pelo cliente

ORDER_S T AT E_PARTIAL Ordem executada parcialmente

ORDER_S T AT E_FILLED Ordem executada completamente

ORDER_S T AT E_R EJECT ED Ordem rejeitada

ORDER_S T AT E_EXPIR ED Ordem expirada

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)

Ao enviar uma solicitação de negociação usando a função OrderSend(), a política de preenchimento


pode ser atribuída para uma ordem no campo type_filling da estrutura especial MqlT radeR equest.
Valores da enumeração ENUM _ORDER_TYPE_FILLING são permitidos. Para obter o valor desta

© 2000-2018, MetaQuotes Software Corp.


735 Constantes, Enumeradores e Estruturas

propriedade, usa a função OrderGetInteger() ou H istoryOrderGetInteger() com o modificador


ORDER_TYPE_FILL ING.

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.

ORDER_FILL ING_IOC Este modo significa que um negociador concorda


em executar uma operação com o volume
máximo disponível no mercado conforme
indicado na ordem. No caso do volume integral
de uma ordem não puder ser preenchido, o
volume disponível dele será preenchido, e o
volume restante será cancelado.

ORDER_FILL ING_R ET URN Esta política é usada somente para ordens a


mercado (ORDER_TYPE_BUY e
ORDER_TYPE_SELL), ordens limit e stop limit
(ORDER_TYPE_BUY_L IM IT ,
ORDER_TYPE_SELL _L IM IT ,
ORDER_TYPE_BUY_S T OP_L IM IT e
ORDER_TYPE_SELL _S T OP_L IM IT ) e somente
para os ativos com execução a Mercado ou
execução em um sistema de negociação externo
(Exchange)***. No caso de um preenchimento
parcial, uma ordem a mercado ou do tipo limit
com volume remanescente não é cancelada, mas
processada posteriormente.
Para a ativação das ordens
ORDER_TYPE_BUY_S T OP_L IM IT e
ORDER_TYPE_SELL _S T OP_L IM IT , uma ordem
limit correspondente,
ORDER_TYPE_BUY_L IM IT/ORDER_TYPE_SELL _L I
M IT com o tipo de execução
ORDER_FILL ING_R ET URN, é criada.

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.

© 2000-2018, MetaQuotes Software Corp.


736 Constantes, Enumeradores e Estruturas

ENUM_ORDER_TY PE_TIME

Identificador Descrição
ORDER_TIME_GT C Ordem válida até cancelamento

ORDER_TIME_DAY Ordem válida até o final do dia corrente de


negociação

ORDER_TIME_S PECIFIED Ordem válida até expiração

ORDER_TIME_S PECIFIED_DAY A ordem permanecerá efetiva até 23:59:59 do


dia especificado. Se esta hora está fora de uma
sessão de negociação, a ordem expira na hora
de negociação mais próxima.

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

ORDER_R EASON_MOBILE Ordem colocada a partir de um aplicativo móvel

ORDER_R EASON_W EB Ordem colocada a partir da plataforma web

ORDER_R EASON_EXPERT Ordem colocada a partir de um programa MQL5,


Expert Advisor ou script

ORDER_R EASON_SL Ordem colocada como resultado da ativação do


Stop Loss

ORDER_R EASON_TP Ordem colocada como resultado da ativação do


T ak e Profit
ORDER_R EASON_SO Ordem colocada como resultado do evento Stop
Out

© 2000-2018, MetaQuotes Software Corp.


737 Constantes, Enumeradores e Estruturas

Propriedades de uma Posição


A execução de operações de negociação resulta na abertura de uma posição, alteração de seu volume,
e/ou direção, ou no seu desaparecimento . Operações de negociação são conduzidos baseados em
ordens, enviados pela função OrderSend() na forma de solicitações de negociação. Para cada ativo
financeiro (s ymbol) apenas uma posição em aberto é poss ível. Uma posição tem um conjunto de
propriedades disponíveis para leitura através de funções PositionGet...().

Para a função PositionGetInteger()

ENUM_POSITION_PROPERTY_INTEGER

Identificador Descrição Tipo


POS ITION_TICKET Bilhete da posição. Um número long
exclusivo atribuído a cada
posição. Geralmente, ele
corresponde ao bilhete da
ordem, segundo o qual a
posição foi aberta, exceto nos
casos em que as operações de
serviço no servidor tenham
alterado o bilhete da ordem.
Por exemplo, quando os swaps
se acumulam com a reabertura
de uma posição. Para localizar
a ordem, segundo a qual foi
aberta a posição, você deve
utilizar a propriedade
POS ITION_IDENTIFIER.
O valor da POS ITION_TICKET
corresponde a
MqlT radeR equest::position.

POS ITION_TIME H ora de abertura de uma datetime


posição

POS ITION_TIME_MSC Posição de tempo de abertura long


em milissegundos desde
01.01.1970
POS ITION_TIME_UPDAT E Posição de tempo de alteração long
em segundos desde 01.01.1970

POS ITION_TIME_UPDAT E_MSC Posição de tempo de alteração long


em milissegundo desde
01.01.1970
POS ITION_TYPE T ipo de posição ENUM _POS ITION_TYPE

POS ITION_MAGIC Número mágico de uma posição long


(veja ORDER_MAGIC)

© 2000-2018, MetaQuotes Software Corp.


738 Constantes, Enumeradores e Estruturas

POS ITION_IDENTIFIER Identificador de posição é um long


número único que é atribuído
para toda nova posição aberta
e não se altera durante todo o
tempo de vida da posição.
Movimentações de uma posição
não alteram seu identificador.

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.

Durante a reversão de uma


posição no modo de
compensação (usando uma
única transação de
saída/entrada) o identificador
de posição
POS ITION_IDENTIFIER não é
alterado. No entanto, o
POS ITION_TICKET é substituído
pelo bilhete de ordem, que
levou à reversão. No modo de
cobertura, não é fornecida a
reversão de posição.

POS ITION_REASON Razão para a abertura da ENUM _POS ITION_R EASON


posição

Para a função PositionGetDouble()

ENUM_POSITION_PROPERTY_DOUBLE

Identificador Descrição Tipo


POS ITION_VOLUME Volume de uma posição double

POS ITION_PRICE_OPEN Preço de abertura de uma double


posição

POS ITION_SL Nível de Stop Loss de uma double


posição aberta

POS ITION_TP Nível de T ak e Profit de uma double


posição aberta

POS ITION_PRICE_CURRENT Preço corrente do ativo de uma double


posição

© 2000-2018, MetaQuotes Software Corp.


739 Constantes, Enumeradores e Estruturas

POS ITION_S W AP Swap acumulativo double

POS ITION_PROFIT Lucro corrente double

Para a função PositionGetString()

ENUM_POSITION_PROPERTY_STRING

Identificador Descrição Tipo


POS ITION_S YM BOL Ativo (s ymbol) da posição string

POS ITION_COMMENT Comentário de uma posição 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

POS ITION_TYPE_SELL Venda

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_REASON_CLIENT Posição aberta como resultado da ativação de
uma ordem colocada a partir de um terminal
des k top

POS ITION_REASON_MOBILE Posição aberta como resultado da ativação de


uma ordem colocada a partir de um aplicativo
móvel

POS ITION_REASON_W EB Posição aberta como resultado da ativação de


uma ordem colocada a partir da plataforma web

POS ITION_REASON_EXPERT Posição aberta como resultado da ativação de


uma ordem colocada a partir de um programa
MQL5, Expert Advisor ou script

© 2000-2018, MetaQuotes Software Corp.


740 Constantes, Enumeradores e Estruturas

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.

Para a função PlotIndexSetDouble()

ENUM_DEAL_PROPERTY_INTEGER

Identificador Descrição Tipo


DEAL_TICKET Bilhete da transação. Um long
número exclusivo atribuído a
cada transação.

DEAL_ORDER Número da ordem da long


transação.

DEAL_TIME Propriedades da T ransação datetime

DEAL_TIME_MSC O tempo de execução de long


negociações em milissegundos
desde 01.01.1970

DEAL_TYPE T ipo de transação ENUM _DEAL _TYPE

DEAL_ENTRY Entrada de uma transação - ENUM _DEAL _ENTRY


entrada, saída, reversão

DEAL_MAGIC Número mágico de uma long


transação (veja
ORDER_MAGIC)

DEAL_REASON Razão ou origem para realizar ENUM _DEAL _R EASON


a transação

DEAL_POS ITION_ID Identificador de uma posição, long


na abertura, modificação ou
fechamento da qual esta
transação tomou parte. Cada
posição tem um identificador
único que é atribuído a todas
as operações (deals)
executadas para o ativo
durante todo o tempo de vida
da posição.

Para a função H istoryDealGetDouble()

ENUM_DEAL_PROPERTY_DOUBLE

Identificador Descrição Tipo

© 2000-2018, MetaQuotes Software Corp.


741 Constantes, Enumeradores e Estruturas

DEAL_VOLUME Volume da transação double

DEAL_PRICE Preço da transação double

DEAL_COMM ISS ION Comissão da transação double

DEAL_S W AP Swap acumulativo no double


fechamento

DEAL_PROFIT Lucro da transação double

Para a função H istoryDealGetString()

ENUM_DEAL_PROPERTY_STRING

Identificador Descrição Tipo


DEAL_S YM BOL Ativo (s ymbol) da transação string

DEAL_COMMENT Comentário da transação 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

DEAL_TYPE_SELL Venda
DEAL_TYPE_BALANCE Saldo

DEAL_TYPE_CREDIT Crédito

DEAL_TYPE_CH ARGE Cobrança adicional

DEAL_TYPE_CORRECTION Correção

DEAL_TYPE_BONUS Bonus
DEAL_TYPE_COMM ISS ION Comissão adicional

DEAL_TYPE_COMM ISS ION_DAILY Comissão diária

DEAL_TYPE_COMM ISS ION_MONTH LY Comissão mensal

DEAL_TYPE_COMM ISS ION_AGENT_DAILY Comissão de agente diário

DEAL_TYPE_COMM ISS ION_AGENT_MONTH LY Comissão de agente mensal

DEAL_TYPE_INT ERES T T axa de juros


DEAL_TYPE_BUY_CANCELED Operação de compra cancelada. Pode haver uma
situação quando uma operação de compra

© 2000-2018, MetaQuotes Software Corp.


742 Constantes, Enumeradores e Estruturas

executada anteriormente é cancelada. Neste


caso, o tipo de transação executada
anteriormente (DEAL _TYPE_BUY) é alterada para
DEAL_TYPE_BUY_CANCELED, e seu
lucro/prejuízo é zerado Lucro/prejuízo obtido
anteriormente é cobrado/sacado usando uma
operação de saldo separada

DEAL_TYPE_SELL_CANCELED Operação de venda cancelada. Pode haver uma


situação quando uma operação de venda
executada anteriormente é cancelada. Neste
caso, o tipo da operação executada
anteriormente (DEAL _TYPE_SELL) é alterada
para DEAL _TYPE_SELL _CANCELED, e seu
lucro/prejuízo é zerado. Lucro/prejuízo obtido
anteriormente é cobrado/sacado usando uma
operação de saldo separada

DEAL_DIVIDEND Operação de dividendos

DEAL_DIVIDEND_FRANKED Operação de dividendos franqueados (não


tributáveis)

DEAL_T AX Cálculo do imposto

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

DEAL_ENTRY_OUT Saída

DEAL_ENTRY_INOUT Reversão
DEAL_ENTRY_OUT_BY Fechamento pela posição oposta

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.

© 2000-2018, MetaQuotes Software Corp.


743 Constantes, Enumeradores e Estruturas

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_REASON_CLIENT T ransação realizada como resultado da ativação
de uma ordem colocada a partir de um terminal
des k top

DEAL_REASON_MOBILE T ransação realizada como resultado da ativação


de uma ordem colocada a partir de um aplicativo
móvel

DEAL_REASON_W EB T ransação realizada como resultado da ativação


de uma ordem colocada a partir da plataforma
web

DEAL_REASON_EXPERT T ransação realizada como resultado da ativação


de uma ordem colocada a partir de um programa
MQL5, Expert Advisor ou script

DEAL_REASON_SL T ransação realizada como resultado da ativação


de uma ordem Stop Loss

DEAL_REASON_TP T ransação realizada como resultado da ativação


de uma ordem T ak e Profit

DEAL_REASON_SO T ransação realizada como resultado do evento


Stop Out

DEAL_REASON_ROLLOVER T ransação realizada devido à transferência da


posição

DEAL_REASON_VMARGIN T ransação realizada após creditada/debitada a


margem de variação

DEAL_REASON_S PLIT T ransação realizada após o fracionamento


(redução do preço) do instrumento que tinha a
posição aberta durante o fracionamento

© 2000-2018, MetaQuotes Software Corp.


744 Constantes, Enumeradores e Estruturas

Tipos de Operações de Negociação (trade, transações,


negociações)
A negociação realiza-se usando a função OrderSend()e enviando ordens não só para abrir posições,
mas também para colocar, modificar e excluir ordens pendentes. Cada ordem de negociação contem
uma indicação do tipo de operação solicitada. As operações de negociação são descritas na
enumeração ENUM _TR ADE_R EQUES T_ACTIONS.

ENUM_TRADE_REQUEST_ACTIONS

Identificador Descrição
TRADE_ACTION_DEAL Coloca uma ordem de negociação para a
transação ser executada imediatamente usando
os parâmetros especificados (ordem de
mercado)

TRADE_ACTION_PENDING Coloca uma ordem de negociação para a


transação ser executada sob certas condições
(ordem pendente)

TRADE_ACTION_SLTP Modifica valores de Stop-Loss e T ak e-Profit


numa posição aberta

TRADE_ACTION_MODIFY Modifca os parâmetros de uma ordem colocada


anteriormente

TRADE_ACTION_REMOVE Exclui uma ordem pendente colocada


anteriormente

TRADE_ACTION_CLOSE_BY Fechar a posição oposta

Exemplo de operação de negociação TR ADE_ACTION_DEAL para abrir uma posição Buy:

© 2000-2018, MetaQuotes Software Corp.


745 Constantes, Enumeradores e Estruturas

#define EXPERT_MAGIC 123456 // MagicNumber do conselheiro


//+------------------------------------------------------------------+
//| Abertura da posição Buy |
//+------------------------------------------------------------------+
void OnStart()
{
//--- Atualização e inicialização do pedido e o seu resultado
MqlTradeRequest request={0};
MqlTradeResult result={0};
//--- parâmetros do pedido
request.action =TRADE_ACTION_DEAL; // tipo de operação de negociação
request.symbol =Symbol(); // símbolo
request.volume =0.1; // volume de 0.1 lotes
request.type =ORDER_TYPE_BUY; // tipo de ordem
request.price =SymbolInfoDouble(Symbol(),SYMBOL_ASK); // preço para abertura
request.deviation=5; // desvio permitido do preço
request.magic =EXPERT_MAGIC; // MagicNumber da ordem
//--- envio do pedido
if(!OrderSend(request,result))
PrintFormat("OrderSend error %d",GetLastError()); // se não for possível enviar o pedido,
//--- informação sobre a operação
PrintFormat("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order);
}
//+------------------------------------------------------------------+

Exemplo de operação de negociaçãoTR ADE_ACTION_DEAL para abertura da posição Sell:

#define EXPERT_MAGIC 123456 // MagicNumber do conselheiro


//+------------------------------------------------------------------+
//| Abertura da posição Sell |
//+------------------------------------------------------------------+
void OnStart()
{
//--- Declaração e inicialização do pedido e o seu resultado
MqlTradeRequest request={0};
MqlTradeResult result={0};
//--- parâmetros do pedido
request.action =TRADE_ACTION_DEAL; // tipo de operação de negociação
request.symbol =Symbol(); // símbolo
request.volume =0.2; // volume de 0.2 lotes
request.type =ORDER_TYPE_SELL; // tipo da ordem
request.price =SymbolInfoDouble(Symbol(),SYMBOL_BID); // preço para a abertura
request.deviation=5; // desvio permitido do preço
request.magic =EXPERT_MAGIC; // MagicNumber da ordem
//--- envio do pedido
if(!OrderSend(request,result))
PrintFormat("OrderSend error %d",GetLastError()); // se não for possível enviar o pedido,
//--- informação sobre a operação
PrintFormat("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order);
}
//+------------------------------------------------------------------+

Exemplo de ordem de negociação TR ADE_ACTION_DEAL para fechadura de posições :

© 2000-2018, MetaQuotes Software Corp.


746 Constantes, Enumeradores e Estruturas

#define EXPERT_MAGIC 123456 // MagicNumber do conselheiro


//+------------------------------------------------------------------+
//| Fechadura de todas as posições |
//+------------------------------------------------------------------+
void OnStart()
{
//--- declaração do pedido e o seu resultado
MqlTradeRequest request;
MqlTradeResult result;
int total=PositionsTotal(); // número de posições abertas
//--- iterar todas as posições abertas
for(int i=total-1; i>=0; i--)
{
//--- parâmetros da ordem
ulong position_ticket=PositionGetTicket(i); // bilhete
string position_symbol=PositionGetString(POSITION_SYMBOL); // simbolo
int digits=(int)SymbolInfoInteger(position_symbol,SYMBOL_DIGITS); //número de
ulong magic=PositionGetInteger(POSITION_MAGIC); // MagicNum
double volume=PositionGetDouble(POSITION_VOLUME); // volume d
ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); // tipo de
//--- saída de informação sobre a posição
PrintFormat("#%I64u %s %s %.2f %s [%I64d]",
position_ticket,
position_symbol,
EnumToString(type),
volume,
DoubleToString(PositionGetDouble(POSITION_PRICE_OPEN),digits),
magic);
//--- se o MagicNumber coincidir
if(magic==EXPERT_MAGIC)
{
//--- zerar os valores do pedido e os seus resultados
ZeroMemory(request);
ZeroMemory(result);
//--- configuração dos parâmetros da ordem
request.action =TRADE_ACTION_DEAL; // tipo de operação de negociação
request.position =position_ticket; // bilhete da posição
request.symbol =position_symbol; // símbolo
request.volume =volume; // volume da posição
request.deviation=5; // desvio permitido do preço
request.magic =EXPERT_MAGIC; // MagicNumber da posição
//--- colocação do preço e tipo de ordem dependendo do tipo de ordem
if(type==POSITION_TYPE_BUY)
{
request.price=SymbolInfoDouble(position_symbol,SYMBOL_BID);
request.type =ORDER_TYPE_SELL;
}
else
{
request.price=SymbolInfoDouble(position_symbol,SYMBOL_ASK);
request.type =ORDER_TYPE_BUY;
}
//--- saída de informação sobre o fechamento
PrintFormat("Close #%I64d %s %s",position_ticket,position_symbol,EnumToString(type));
//--- envio do pedido
if(!OrderSend(request,result))
PrintFormat("OrderSend error %d",GetLastError()); // se não for possível enviar o pedi
//--- informação sobre a operação
PrintFormat("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order)
//---
}

© 2000-2018, MetaQuotes Software Corp.


747 Constantes, Enumeradores e Estruturas

}
}
//+------------------------------------------------------------------+

Exemplo de operação de negociaçãoTR ADE_ACTION_PENDING para colocação de uma ordem pendente:

© 2000-2018, MetaQuotes Software Corp.


748 Constantes, Enumeradores e Estruturas

#property description "Exemplo de colocação de ordens pendentes"


#property script_show_inputs
#define EXPERT_MAGIC 123456 // MagicNumber do conselheiro
input ENUM_ORDER_TYPE orderType=ORDER_TYPE_BUY_LIMIT; // tipo da ordem
//+------------------------------------------------------------------+
//| Colocação de ordens pendentes |
//+------------------------------------------------------------------+
void OnStart()
{
//-- declaração e inicialização do pedido e o seu resultado
MqlTradeRequest request={0};
MqlTradeResult result={0};
//--- parâmetros para colocação da ordem pendente
request.action =TRADE_ACTION_PENDING; // tipo de operação de negoc
request.symbol =Symbol(); // símbolo
request.volume =0.1; // volume de 0.1 lotes
request.deviation=2; //desvio permitido do preço
request.magic =EXPERT_MAGIC; // MagicNumber da ordem
int offset = 50; // deslocamento a partir do
double price; // preço de execução da orde
double point=SymbolInfoDouble(_Symbol,SYMBOL_POINT); // tamanho do ponto
int digits=SymbolInfoInteger(_Symbol,SYMBOL_DIGITS); // número de símbolos depois
//--- verificação do tipo de operação
if(orderType==ORDER_TYPE_BUY_LIMIT)
{
request.type =ORDER_TYPE_BUY_LIMIT; // tipo de ordem
price=SymbolInfoDouble(Symbol(),SYMBOL_ASK)-offset*point; // preço para abertura
request.price =NormalizeDouble(price,digits); // нормализованная цена откр
}
else if(orderType==ORDER_TYPE_SELL_LIMIT)
{
request.type =ORDER_TYPE_SELL_LIMIT; // тип ордера
price=SymbolInfoDouble(Symbol(),SYMBOL_ASK)+offset*point; // цена для открытия
request.price =NormalizeDouble(price,digits); // preço de abertura normal
}
else if(orderType==ORDER_TYPE_BUY_STOP)
{
request.type =ORDER_TYPE_BUY_STOP; // tipo de ordem
price =SymbolInfoDouble(Symbol(),SYMBOL_ASK)+offset*point; // preço de abertura
request.price=NormalizeDouble(price,digits); // preço de abertura normal
}
else if(orderType==ORDER_TYPE_SELL_STOP)
{
request.type =ORDER_TYPE_SELL_STOP; // tipo de ordem
price=SymbolInfoDouble(Symbol(),SYMBOL_ASK)-offset*point; // preço para abertura
request.price =NormalizeDouble(price,digits); // preço de abertura normal
}
else Alert("Este exemplo é apenas para colocação de ordens pendentes"); // Se a ordem pendente
//--- enviar a ordem
if(!OrderSend(request,result))
PrintFormat("OrderSend error %d",GetLastError()); // Se não for possível envi
//--- informações sobre a operação
PrintFormat("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order);
}
//+------------------------------------------------------------------+

Exemplo da operação de negociação TR ADE_ACTION_SL TP para alterar o valor Stop-Loss e T ak e-Profit


na posição aberta:

© 2000-2018, MetaQuotes Software Corp.


749 Constantes, Enumeradores e Estruturas

#define EXPERT_MAGIC 123456 // MagicNumber do conselheiro


//+------------------------------------------------------------------+
//| Modificação do Stop-Loss e Take-Profit da posição |
//+------------------------------------------------------------------+
void OnStart()
{
//--- declaracão do pedido e o seu resultado
MqlTradeRequest request;
MqlTradeResult result;
int total=PositionsTotal(); // número de posições abertas
//--- iterar sobre todas as posições abertas
for(int i=0; i<total; i++)
{
//--- parâmetros da ordem
ulong position_ticket=PositionGetTicket(i);// bilhete da posição
string position_symbol=PositionGetString(POSITION_SYMBOL); // símbolo
int digits=(int)SymbolInfoInteger(position_symbol,SYMBOL_DIGITS); // número de signos depo
ulong magic=PositionGetInteger(POSITION_MAGIC); // MagicNumber da posição
double volume=PositionGetDouble(POSITION_VOLUME); // volume da posição
double sl=PositionGetDouble(POSITION_SL); // Stop Loss da posição
double tp=PositionGetDouble(POSITION_TP); // Take-Profit da posição
ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); // tipo da po
//--- saída de informações sobre a posição
PrintFormat("#%I64u %s %s %.2f %s sl: %s tp: %s [%I64d]",
position_ticket,
position_symbol,
EnumToString(type),
volume,
DoubleToString(PositionGetDouble(POSITION_PRICE_OPEN),digits),
DoubleToString(sl,digits),
DoubleToString(tp,digits),
magic);
//--- se o MagicNumber coincidir, o Stop-Loss e o Take-Profit não estão definidos
if(magic==EXPERT_MAGIC && sl==0 && tp==0)
{

© 2000-2018, MetaQuotes Software Corp.


750 Constantes, Enumeradores e Estruturas

//--- cálculo dos níveis de preços atuais


double price=PositionGetDouble(POSITION_PRICE_OPEN);
double bid=SymbolInfoDouble(position_symbol,SYMBOL_BID);
double ask=SymbolInfoDouble(position_symbol,SYMBOL_ASK);
int stop_level=(int)SymbolInfoInteger(position_symbol,SYMBOL_TRADE_STOPS_LEVEL);
double price_level;
//--- se o nível de deslocamento mínimo permitido em pontos a partir do preço atual de fec
if(stop_level<=0)
stop_level=150; // definimos o deslocamento em 150 pontos a partir do preço atual de fe
else
stop_level+=50; // definimos o nível de deslocamento (SYMBOL_TRADE_STOPS_LEVEL + 50) po

//--- cálculo e arredondamento dos valores Stop-Loss e Take-Profit


price_level=stop_level*SymbolInfoDouble(position_symbol,SYMBOL_POINT);
if(type==POSITION_TYPE_BUY)
{
sl=NormalizeDouble(bid-price_level,digits);
tp=NormalizeDouble(ask+price_level,digits);
}
else
{
sl=NormalizeDouble(ask+price_level,digits);
tp=NormalizeDouble(bid-price_level,digits);
}
//--- zerar os valores de pedido e o seu resultado
ZeroMemory(request);
ZeroMemory(result);
//--- definição dos parâmetros de operação
request.action =TRADE_ACTION_SLTP; // tipo de operação de negociação
request.position=position_ticket; // bilhete da posição
request.symbol=position_symbol; // símbolo
request.sl =sl; // Stop Loss da posição
request.tp =tp; // Take Profit da posição
request.magic=EXPERT_MAGIC; // MagicNumber da posição
//--- saída de informações sobre a modificação
PrintFormat("Modify #%I64d %s %s",position_ticket,position_symbol,EnumToString(type));
//--- envio do pedido
if(!OrderSend(request,result))
PrintFormat("OrderSend error %d",GetLastError()); // se não for possível enviar o pedi
//--- informações sobre a operação
PrintFormat("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order)
}
}
}
//+------------------------------------------------------------------+

Exemplo de operação de negociação TR ADE_ACTION_MODIFY para modificar os níveis de preços das


ordens pendentes :

© 2000-2018, MetaQuotes Software Corp.


751 Constantes, Enumeradores e Estruturas

#define EXPERT_MAGIC 123456 // MagicNumber do conselheiro


//+------------------------------------------------------------------+
//| Modificação de ordens pendentes |
//+------------------------------------------------------------------+
void OnStart()
{
//-- declaração e inicialização do pedido e o seu resultado
MqlTradeRequest request={0};
MqlTradeResult result={0};
int total=OrdersTotal(); // número de ordens pendentes colocadas
//--- iterar todas as ordens pendentes colocadas
for(int i=0; i<total; i++)
{
//--- parâmetros da ordem
ulong order_ticket=OrderGetTicket(i); // bilhete da ordem
string order_symbol=Symbol(); // símbolo
int digits=(int)SymbolInfoInteger(order_symbol,SYMBOL_DIGITS); // número de signos depois da coma
ulong magic=OrderGetInteger(ORDER_MAGIC); // MagicNumber da ordem
double volume=OrderGetDouble(ORDER_VOLUME_CURRENT); // volume atual da ordem
double sl=OrderGetDouble(ORDER_SL); // Stop Loss atual da ordem
double tp=OrderGetDouble(ORDER_TP); // Take Profit atual da ordem
ENUM_ORDER_TYPE type=(ENUM_ORDER_TYPE)OrderGetInteger(ORDER_TYPE); // tipo de ordem
int offset = 50; // deslocação a partir do preço atual para colocação da ordem, em pontos
double price; // preço de ativação da ordem
double point=SymbolInfoDouble(order_symbol,SYMBOL_POINT); // tamanho do ponto
//--- saída de informações sobre a ordem
PrintFormat("#%I64u %s %s %.2f %s sl: %s tp: %s [%I64d]",
order_ticket,
order_symbol,
EnumToString(type),
volume,
DoubleToString(PositionGetDouble(POSITION_PRICE_OPEN),digits),
DoubleToString(sl,digits),
DoubleToString(tp,digits),
magic);
//--- se o MagicNumber coincidir, o Stop Loss e o Take Profit nao foram definidos
if(magic==EXPERT_MAGIC && sl==0 && tp==0)
{
request.action=TRADE_ACTION_MODIFY; // tipo de operação de negociação
request.order = OrderGetTicket(i); // bilhete da ordem
request.symbol =Symbol(); // símbolo
request.deviation=5; // desvio permitido a partir do preço
//--- definição do nível de preços Take Profit e Stop Loss da ordem dependendo do seu tipo
if(type==ORDER_TYPE_BUY_LIMIT)
{
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
}
else if(type==ORDER_TYPE_SELL_LIMIT)
{
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
}
else if(type==ORDER_TYPE_BUY_STOP)
{
price = SymbolInfoDouble(Symbol(),SYMBOL_BID)+offset*point;
request.tp = NormalizeDouble(price+offset*point,digits);

© 2000-2018, MetaQuotes Software Corp.


752 Constantes, Enumeradores e Estruturas

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);
}
}
}
//+------------------------------------------------------------------+

Exemplo de operação de negociação TR ADE_ACTION_R EMOVE para excluir ordens pendentes :

#define EXPERT_MAGIC 123456 // MagicNumber do conselheiro


//+------------------------------------------------------------------+
//| Exclusão de ordens pendentes |
//+------------------------------------------------------------------+
void OnStart()
{
//-- Declaração e inicialização do pedido e resultado
MqlTradeRequest request={0};
MqlTradeResult result={0};
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);
}
}
}
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


753 Constantes, Enumeradores e Estruturas

Exemplo de operação de negociação TR ADE_ACTION_CLOSE_BY para fechamento da posição usando a


oposta:

© 2000-2018, MetaQuotes Software Corp.


754 Constantes, Enumeradores e Estruturas

#define EXPERT_MAGIC 123456 // MagicNumber do conselheiro


//+------------------------------------------------------------------+
//| Fechamento de todas as posições opostas |
//+------------------------------------------------------------------+
void OnStart()
{
//--- declaração e inicialização do pedido e o seu resultado
MqlTradeRequest request;
MqlTradeResult result;
int total=PositionsTotal(); // numero de posições abertas
//--- iterar sobre todas as posições abertas
for(int i=total-1; i>=0; i--)
{
//--- parâmetros da ordem
ulong position_ticket=PositionGetTicket(i); // bilhete da
string position_symbol=PositionGetString(POSITION_SYMBOL); // símbolo
int digits=(int)SymbolInfoInteger(position_symbol,SYMBOL_DIGITS); // número de
ulong magic=PositionGetInteger(POSITION_MAGIC); // MagicNumbe
double volume=PositionGetDouble(POSITION_VOLUME); // volume da
double sl=PositionGetDouble(POSITION_SL); // Stop Loss
double tp=PositionGetDouble(POSITION_TP); // Take Profi
ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); // tipo de po
//--- saída de informações sobre a posição
PrintFormat("#%I64u %s %s %.2f %s sl: %s tp: %s [%I64d]",
position_ticket,
position_symbol,
EnumToString(type),
volume,
DoubleToString(PositionGetDouble(POSITION_PRICE_OPEN),digits),
DoubleToString(sl,digits),
DoubleToString(tp,digits),
magic);
//--- se o MagicNumber coincidir
if(magic==EXPERT_MAGIC)
{
for(int j=0; j<i; j++)
{
string symbol=PositionGetSymbol(j); // símbolo da posição oposta
//--- se os símbolos das posições opostas e iniciais coincidirem
if(symbol==position_symbol && PositionGetInteger(POSITION_MAGIC)==EXPERT_MAGIC)
{
//--- o tipo de posição oposta
ENUM_POSITION_TYPE type_by=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
//--- saída, se os símbolos das posições opostas e iniciais coincidirem
if(type==type_by)
continue;
//--- zerar os valores do pedido e o seu resultado
ZeroMemory(request);
ZeroMemory(result);
//--- definição os parâmetros de operação
request.action=TRADE_ACTION_CLOSE_BY; // tipo de operação de
request.position=position_ticket; // bilhete da posição
request.position_by=PositionGetInteger(POSITION_TICKET); // bilhete da posição
//request.symbol =position_symbol;
request.magic=EXPERT_MAGIC; // MagicNumber da posi
//--- saída de informações sobre o fechamento pela posição oposta
PrintFormat("Close #%I64d %s %s by #%I64d",position_ticket,position_symbol,EnumToStr
//--- envio do pedido
if(!OrderSend(request,result))
PrintFormat("OrderSend error %d",GetLastError()); // se não for possível enviar o

© 2000-2018, MetaQuotes Software Corp.


755 Constantes, Enumeradores e Estruturas

//--- informações sobre a operação


PrintFormat("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.
}
}
}
}
}
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


756 Constantes, Enumeradores e Estruturas

Tipos de Transação de Negociação


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.

· Realização de operações no lado de um servidor de negociação.


As seguintes transações de negociação são realizadas como resultado destas ações :

· tratamento de uma solicitação de negociação

· mudança de ordens de abertura

· mudança de histórico de ordens

· mudança de histórico de operações (deals)

· 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.

O tipo de transação de negociação é submetida no parâmetro de tipo de estrutura


MqlT radeT ransaction. Os poss íveis tipos de transações de negociação são descritos através da
seguinte enumeração:

ENUM_TRADE_TRANSACTION_TY PE

Identificador Descrição
TRADE_TRANSACTION_ORDER_ADD Adição de uma nova ordem de abertura.

TRADE_TRANSACTION_ORDER_UPDAT E Atualização de uma ordem de aberturar. As


atualizações incluem não somente mudanças
evidentes provenientes do terminal cliente ou do
lado de um servidor de negociação, mas
também alterações de estado de uma ordem ao
configurá-lo (por exemplo, transição de
ORDER_S T AT E_S T ART ED para
ORDER_S T AT E_PLACED ou de
ORDER_S T AT E_PLACED para
ORDER_S T AT E_PARTIAL, etc.).

© 2000-2018, MetaQuotes Software Corp.


757 Constantes, Enumeradores e Estruturas

TRADE_TRANSACTION_ORDER_DELET E Remoção de uma ordem da lista de ordens em


aberto. Uma ordem pode ser excluída da lista de
ordens em aberto como resultado da
configuração de um solicitação apropriada ou
execução (preenchimento) ou movimentação
para o histórico.

TRADE_TRANSACTION_DEAL_ADD Adição de uma operação (deal) para o histórico.


A ação é realizada como resultado de uma
execução de uma ordem ou realização de
operações com o saldo da conta.

TRADE_TRANSACTION_DEAL_UPDAT E Atualização de uma operação (deal) no histórico.


Pode haver caso quando uma operação (deal)
executada previamente é alterada em um
servidor. Por exemplo, uma operação (deal) foi
alterada em um sistema de negociação externo
(exchange) onde ela foi transferida
anteriormente por uma corretora (brok er).

TRADE_TRANSACTION_DEAL_DELET E Exclusão de uma operação (deal) do histórico.


Pode haver casos quando uma operação (deal)
executada anteriormente é excluída de um
servidor. Por exemplo, uma operação (deal) foi
excluída de um sistema de negociação externo
(exchange) onde ela foi transferida
anteriormente por uma corretora (brok er).

TRADE_TRANSACTION_HIS T ORY_ADD Adição de uma ordem no histórico como


resultado de uma execução ou cancelamento.

TRADE_TRANSACTION_HIS T ORY_UPDAT E Alteração de uma ordem localizada no histórico


de ordens. Este tipo é fornecido para aumentar
a funcionalidade no lado de um servidor de
negociação.

TRADE_TRANSACTION_HIS T ORY_DELET E Exclusão de uma ordem do histórico de ordens.


Este tipo é fornecido para aumentar a
funcionalidade no lado de um servidor de
negociação.

TRADE_TRANSACTION_POS ITION Alteração de uma posição não relacionada com a


execução de uma operação (deal). Este tipo de
transação mostra que uma posição foi alterada
pelo lado de um servidor de negociação. O
volume de uma posição, o preço de abertura, os
níveis de Stop Loss e T ak e Profit podem ter sido
alterados. Dados sobre alteração são submetidos
na estrutura MqlT radeT ransaction via o handler
OnT radeT ransaction. Alterações de posição
(adição, alteração ou encerramento), como
resultado de uma execução de operação (deal),
não levam a ocorrência de uma transação
TRADE_TRANSACTION_POS ITION.

© 2000-2018, MetaQuotes Software Corp.


758 Constantes, Enumeradores e Estruturas

TRADE_TRANSACTION_REQUES T Notificação do fato de que uma solicitação de


negociação foi processada por um servidor e o
resultado processado foi recebido. Apenas o
campo type (tipo de transação de negociação)
deve ser analisado em tais transações na
estrutura MqlT radeT ransaction. O segundo e
terceiro parâmetros de OnT radeT ransaction
(request e result) devem ser analisados para
dados adicionais.

Dependendo do tipo da transação de negociação, vários parâmetros são preenchidos na estrutura


MqlT radeT ransaction, descrevendo-a. Uma descrição detalhada dos dados submetidos é mostrada em
Estrutura de uma T ransação de Negociação.

Também Veja
Estrutura de uma T ransação de Negociação, OnT radeT ransaction

© 2000-2018, MetaQuotes Software Corp.


759 Constantes, Enumeradores e Estruturas

Ordens de Negociação na Profundidade de Mercado


Para ações, a janela Profundidade de Mercado é disponível, onde você pode ver as ordens de Compra e
Venda correntes. A direção desejada de uma operação de negociação, a quantidade requerida e o
preço solicitado são especificados em cada ordem.

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)

BOOK_TYPE_BUY Ordem de compra (Bid)

BOOK_TYPE_SELL_MARKET Ordem de venda (Offer)

BOOK_TYPE_BUY_MARKET 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

© 2000-2018, MetaQuotes Software Corp.


760 Constantes, Enumeradores e Estruturas

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.

Enumeração de propriedades do tipo double do sinal de negociação:

ENUM_SIGNAL_BASE_DOUBLE

ID Descrição
S IGNAL _BASE_BALANCE Saldo da conta

S IGNAL _BASE_EQUITY Saldo da conta

S IGNAL _BASE_GAIN Ganho da conta


S IGNAL _BASE_MAX_DR AWDOWN Retirada máxima da conta
S IGNAL _BASE_PRICE Preço de assinatura do sinal
S IGNAL _BASE_R OI Retorno do Investimento (%)

Enumeração de propriedades do tipo integer do sinal de negociação

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)

S IGNAL _BASE_DAT E_S T ART ED Data de início da monitorização


S IGNAL _BASE_DAT E_UPDAT ED Data da última atualização da estatística de
negociação do sinal

S IGNAL _BASE_ID ID do sinal


S IGNAL _BASE_LEVER AGE Alavancagem da conta

S IGNAL _BASE_PIPS Lucro em pips

S IGNAL _BASE_R ATING Posição na classificação


S IGNAL _BASE_SUBSCRIBER S Número de assinantess
S IGNAL _BASE_TR ADES Número de negociações
S IGNAL _BASE_TR ADE_MODE T ipo de conta (0-real, 1-demo, 2-concurso)

Enumeração de propriedades do tipo string do sinal de negociação:

ENUM_SIGNAL_BASE_STRING

ID Descrição
S IGNAL _BASE_AUTH OR_LOGIN Login do autor

© 2000-2018, MetaQuotes Software Corp.


761 Constantes, Enumeradores e Estruturas

S IGNAL _BASE_BR OKER Nome da corretora (empresa)


S IGNAL _BASE_BR OKER_SERVER Server da corretora

S IGNAL _BASE_NAME Nome do sinal


S IGNAL _BASE_CURR ENCY Moeda base do sinal

Enumeração de propriedades do tipo double das configurações de cópia do sinal:

ENUM_SIGNAL_INFO_DOUBLE

ID Descrição
S IGNAL _INFO_EQUITY_L IM IT Limite patrimonial

S IGNAL _INFO_SL IPPAGE Deslizamento (usado ao colocar ordens de


mercado em sincronização de posições e cópia
de negociações)

S IGNAL _INFO_VOLUME_PER CENT Porcentagem máxima do depósito utilizado (%),


r/o

Enumeração de propriedades do tipo integer das configurações de cópia do sinal:

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

S IGNAL _INFO_COPY_SL TP Copia as flags Stop Loss e T ak e Profit

S IGNAL _INFO_DEPOS IT_PER CENT Porcentagem de depósito (%)


S IGNAL _INFO_ID ID do sinal, r/o
S IGNAL _INFO_SUBSCRIPTION_ENABLED Permissão da flag " Copiar negociações por
assinaturas "

S IGNAL _INFO_T ER MS _AGR EE Flag " Concordar com os termos de uso do


serviço de Sinais " , r/o

Enumeração de propriedades do tipo string das configurações de cópia do sinal:

ENUM_SIGNAL_INFO_STRING

ID Descrição
S IGNAL _INFO_NAME Nome do sinal, r/o

Veja também
Sinais de Negociação

© 2000-2018, MetaQuotes Software Corp.


762 Constantes, Enumeradores e Estruturas

Constantes Nomeados
T odas as constantes usadas em MQL5 podem ser divididas nos seguintes grupos :
· Substituições macro predefinidas – valores são substituídos durante compilação;
· Constantes matemáticas – valores de algumas expressões matemáticas ;
· Constantes de tipo numérico – algumas restrições de tipo simples ;
· Códigos de motivos de Desinicialização – descrição de motivos de não inicialização;
· Verificação de Ponteiro de Objeto – enumeração dos tipos de ponteiros retornados pela função
CheckPointer();
· Outras constantes – todas as outras constantes.

© 2000-2018, MetaQuotes Software Corp.


763 Constantes, Enumeradores e Estruturas

Substituições de Macro Predefinidas


Para simplificar o processo de depuração e obter informações sobre a operação de um programa-mql5,
existem constantes de macro especiais, valores que são definidos no momento da compilação. A
forma mais fácil de usar estas constantes é imprimir estes valores através da função Print(), como é
mostrado no exemplo.

Constante Descrição
__DAT E__ Data de compilação do arquivo sem a hora
(horas, minutos e segundos são iguais a 0)

__DAT ETIME__ Data e hora de compilação do arquivo


__LINE__ Assinatura da função em cujo corpo a macro
está localizada.

__FILE__ Nome do arquivo compilado corrente


__PATH__ O caminho absoluto para o arquivo que está
sendo compilado correntemente

__FUNCTION__ Nome da função, em cujo corpo a macro está


localizada

__FUNCS IG__ Assinatura da função em cujo corpo a macro


está localizada. O registro da descrição
completa de funções pode ser útil na
identificação de funções sobrecarregadas

__MQLBUILD__, __MQL5BUILD__ Número do compilação

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

© 2000-2018, MetaQuotes Software Corp.


764 Constantes, Enumeradores e Estruturas

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__);
}

© 2000-2018, MetaQuotes Software Corp.


765 Constantes, Enumeradores e Estruturas

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.

Constante Descrição Valor


M _E e 2.71828182845904523536
M _LOG2E log 2(e) 1.44269504088896340736
M _LOG10E log 10(e) 0.434294481903251827651
M _L N2 ln(2) 0.693147180559945309417
M _L N10 ln(10) 2.30258509299404568402
M _PI pi 3.14159265358979323846
M _PI_2 pi/2 1.57079632679489661923
M _PI_4 pi/4 0.785398163397448309616
M _1_PI 1/pi 0.318309886183790671538
M _2_PI 2/pi 0.636619772367581343076
M _2_SQRTPI 2/sqrt(pi) 1.12837916709551257390
M _SQRT2 sqrt(2) 1.41421356237309504880
M _SQRT1_2 1/sqrt(2) 0.707106781186547524401

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));

© 2000-2018, MetaQuotes Software Corp.


766 Constantes, Enumeradores e Estruturas

© 2000-2018, MetaQuotes Software Corp.


767 Constantes, Enumeradores e Estruturas

Constantes de Tipo Numérico


Cada tipo numérico simples é destinado para um certo tipo de tarefa e permite otimizar a operação de
um programa-mql5 quando usado corretamente. Para uma melhor legibilidade de código e correto
manejo dos resultados de cálculos, existem constantes que permitem receber informações sobre um
conjunto de restrições definido a um certo tipo de dados simples.

Constante Descrição Valor


CH AR_M IN Valor mínimo, que pode ser -128
representado pelo tipo char

CH AR_MAX Valor máximo, que pode ser 127


representado pelo tipo char

UCH AR_MAX Valor máximo, que pode ser 255


representado pelo tipo uchar

S H ORT_M IN Valor mínimo, que pode ser -32768


representado pelo tipo s hort

S H ORT_MAX Valor máximo, que pode ser 32767


representado pelo tipo s hort

US H ORT_MAX Valor máximo, que pode ser 65535


representado pelo tipo us hort

INT_M IN Valor mínimo, que pode ser -2147483648


representado pelo tipo int

INT_MAX Valor máximo, que pode ser 2147483647


representado pelo tipo int

UINT_MAX Valor máximo, que pode ser 4294967295


representado pelo tipo uint

LONG_M IN Valor mínimo, que pode ser -9223372036854775808


representado pelo tipo long

LONG_MAX Valor máximo, que pode ser 9223372036854775807


representado pelo tipo long

ULONG_MAX Valor máximo, que pode ser 18446744073709551615


representado pelo tipo ulong

DBL_M IN Valor positivo mínimo, que 2.2250738585072014e-308


pode ser representado pelo
tipo double

DBL_MAX Valor máximo, que pode ser 1.7976931348623158e+308


representado pelo tipo double

DBL_EPS ILON Valor mínimo, que satisfaz a 2.2204460492503131e-016


condição:
1.0+DBL_EPS ILON != 1.0 (para
o tipo double)

© 2000-2018, MetaQuotes Software Corp.


768 Constantes, Enumeradores e Estruturas

DBL_DIG Número de algarismos 15


decimais significativos para o
tipo double

DBL_MANT_DIG Quantidade de bits em uma 53


mantissa para o tipo double

DBL_MAX_10_EXP Valor decimal máximo de grau 308


de expoente para o tipo double

DBL_MAX_EXP Valor binário máximo de grau 1024


de expoente para o tipo double

DBL_M IN_10_EXP Valor decimal mínimo de grau (-307)


de expoente para o tipo double

DBL_M IN_EXP Valor binário mínimo de grau (-1021)


de expoente para o tipo double

FLT_M IN Valor positivo mínimo, que 1.175494351e-38


pode ser representado pelo
tipo float

FLT_MAX Valor máximo, que pode ser 3.402823466e+38


representado pelo tipo float

FLT_EPS ILON Valor mínimo, que satisfaz a 1.192092896e–07


condição:
1.0+DBL_EPS ILON != 1.0 (para
o tipo float)

FLT_DIG Número de algarismos 6


decimais significativos para o
tipo float

FLT_MANT_DIG Quantidade de bits em uma 24


mantissa para o tipo float

FLT_MAX_10_EXP Valor decimal máximo de grau 38


de expoente para o tipo float

FLT_MAX_EXP Valor binário máximo de grau 128


de expoente para o tipo float

FLT_M IN_10_EXP Valor decimal mínimo de grau -37


de expoente para o tipo float

FLT_M IN_EXP Valor binário mínimo de grau (-125)


de expoente para o tipo float

Exemplo:
void OnStart()
{
//--- imprime os valores de constantes
printf("CHAR_MIN = %d",CHAR_MIN);
printf("CHAR_MAX = %d",CHAR_MAX);

© 2000-2018, MetaQuotes Software Corp.


769 Constantes, Enumeradores e Estruturas

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);
}

© 2000-2018, MetaQuotes Software Corp.


770 Constantes, Enumeradores e Estruturas

Códigos de Motivos de Desinicialização


Os códigos de razão de não inicialização são devolvidos pela função UninitializeR eason(). Os valores
poss íveis são os seguintes :

Constante Valor Descrição


REASON_PROGRAM 0 O Expert Advisor terminou sua
operação chamando a função
ExpertR emove()

REASON_REMOVE 1 O programa foi excluído do


gráfico

REASON_RECOM PILE 2 O programa foi recompilado

REASON_CH ART CH ANGE 3 O período do s ímbolo ou


gráfico foi alterado

REASON_CH ART CLOSE 4 O gráfico foi encerrado

REASON_PARAMET ERS 5 Os parâmetros de entrada


foram alterados por um
usuário

REASON_ACCOUNT 6 Outra conta foi ativada ou o


servidor de negociação foi
reconectado devido a
alterações nas configurações
de conta

REASON_T EM PLAT E 7 Um novo modelo foi aplicado

REASON_INITFAILED 8 Esse valor significa que o


manipulador OnInit() retornou
um valor diferente de zero

REASON_CLOSE 9 T erminal foi fechado

O código de razão de desinicialização também é passado como um parâmetro da função


predeterminada OnDeinit(const int reason).

Exemplo:
//+------------------------------------------------------------------+
//| obter descrição do texto |
//+------------------------------------------------------------------+
string getUninitReasonText(int reasonCode)
{
string text="";
//---
switch(reasonCode)
{
case REASON_ACCOUNT:
text="Account was changed";break;

© 2000-2018, MetaQuotes Software Corp.


771 Constantes, Enumeradores e Estruturas

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));
}

© 2000-2018, MetaQuotes Software Corp.


772 Constantes, Enumeradores e Estruturas

Verificação de Ponteiro de Objeto


A função CheckPointer() é usado para verificar o tipo do ponteiro de objeto. A função retorna um valor
da enumeração ENUM _POINT ER_TYPE. Caso um ponteiro incorreto seja usado, a execução do
programa será imediatamente finalizada.

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_INVALID Ponteiro incorreto
POINT ER_DYNAM IC Ponteiro do objeto criado por meio do operador
new()

POINT ER_AUT OMATIC Ponteiro de qualquer objeto criado


automaticamente (sem usar new())

Também Veja
Erros em T empo de Execução, Exclusão de Objeto Operador delete, CheckPointer

© 2000-2018, MetaQuotes Software Corp.


773 Constantes, Enumeradores e Estruturas

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()).

Constante Descrição Valor


CH ART S _MAX O número poss ível máximo de 100
gráficos abertos
simultaneamente em um
terminal

clrNONE Ausência de cor -1

EM PTY_VALUE Valor vazio em um buffer de DBL_MAX


indicador

INVALID_H ANDLE Manipulador incorreto -1

IS _DEBUG_MODE Flag que indica que um não-zero para modo de


programa MQL5 opera em depuração, zero caso contrário
modo de depuração

IS _PROFILE_MODE Flag que indica que um não-zero para modo de


programa MQL5 opera em profiling, zero caso contrário
modo de profiling

NULL Zero para quaisquer tipos 0


WH OLE_ARRAY Significa o número de itens -1
restantes até o final do array,
isto é, o array inteiro será
processado

WRONG_VALUE A constante pode ser -1


implicitamente convertido
para qualquer tipo de
enumeração

A constante EM PTY_VALUE 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 EM PTY_VALUE.

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_EM PTY_VALUE.

© 2000-2018, MetaQuotes Software Corp.


774 Constantes, Enumeradores e Estruturas

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_VALUE é 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_VALUE é 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);
}

A constante WH OLE_ARR AY é destinada para funções que requerem especificar o número de


elementos nos arrays processados :

· ArrayCopy();

· ArrayMinimum();

· ArrayMaximum();
· FileReadArray();
· 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:

//--- Sleep pode afetar (alterar) enormemente o resultado do profiling


if(!IS_PROFILE_MODE) Sleep(100); // desabilita a chamada Sleep() no modo de profiling

© 2000-2018, MetaQuotes Software Corp.


775 Constantes, Enumeradores e Estruturas

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
{

© 2000-2018, MetaQuotes Software Corp.


776 Constantes, Enumeradores e Estruturas

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
CRYPT_AES 128 Criptografia AES com chave de 128 bits (16
bytes)

CRYPT_AES 256 Criptografia AES com chave de 256 bits (32


bytes)

CRYPT_DES Criptografia DES com chave de 56 bits (7 bytes)

CRYPT_H AS H_S H A1 S H A1 H AS H caculation

CRYPT_H AS H_S H A256 S H A256 H AS H caculation

CRYPT_H AS H_M D5 M D5 H AS H caculation

CRYPT_AR CH_ZIP ZIP archives

Também Veja
Debug Break , Propriedades de programas MQL5 executados, CryptEncode(), CryptDecode()

© 2000-2018, MetaQuotes Software Corp.


777 Constantes, Enumeradores e Estruturas

Estruturas de Dados
A linguagem MQL5 oferece 8 estruturas predefinidas :

· MqlDateT ime é destinado para trabalhar com data e hora;

· 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,
volume e spread;
· MqlBookI nfo é destinado para obter informações sobre a Profundidade de Mercado;

· MqlT radeR equest é usado para criar uma solicitação de negociação para operações de negociação;

· MqlT radeR esult contém uma resposta do servidor de negociação a uma solicitação de negócio,
enviado via função OrderSend();
· MqlT radeT ransaction contém a descrição de uma transação de negociação;

· MqlT ick é projetado para recuperação rápida da maioria das informações requeridas sobre os preços
correntes.

© 2000-2018, MetaQuotes Software Corp.


778 Constantes, Enumeradores e Estruturas

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

© 2000-2018, MetaQuotes Software Corp.


779 Constantes, Enumeradores e Estruturas

A Estrutura de Entrada de Parâmetros de Indicadores


(MqlParam)
A estrutura MqlParam foi projetada especialmente para fornecer parâmetros de entrada quando criar
um um indicador técnico usando a função IndicatorCreate().

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
};

T odos os parâmetros de entrada de um indicador são transmitidos na forma de um array do tipo


MqlParam, o campo type de cada elemento deste array especifica o tipo de dado transmitido pelo
elemento. Os valores do indicador devem ser primeiro colocados nos campos apropriados para cada
elemento (in integer_value, in double_value or string_value) dependendo de qual valor da enumeração
ENUM _DAT ATYPE é especificado no campo type.

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.

© 2000-2018, MetaQuotes Software Corp.


780 Constantes, Enumeradores e Estruturas

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

© 2000-2018, MetaQuotes Software Corp.


781 Constantes, Enumeradores e Estruturas

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
};

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.

O DOM (Profundidade de Mercado) é disponível somente para alguns ativos (s ymbols).

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

© 2000-2018, MetaQuotes Software Corp.


782 Constantes, Enumeradores e Estruturas

A Estrutura de Solicitação de Negociação (MqlTradeRequest)


A interação entre o terminal do cliente e o servidor de negociação para colocar ordens realiza-se
usando solicitações de negociação (pedidos de negociação). A solicitação de negociação é apresentada
por uma estrutura predefinida especial chamada de MqlT radeR equest, ela contém todos os campos
necessários para realizar operações (deals) de negociação. O resultado do processamento da
solicitação é apresentado pela mesma estrutura MqlT radeR esult.

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
};

Descrição dos Campos

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.

magic Expert Advisor ID. Permite organizar um


processamento analítico de ordens de
negociação. Cada Expert Advisor pode definir
seu próprio ID (identificador) único ao enviar
uma solicitação de negociação.

order Bilhetagem (tick et) da ordem. É usado para


modificar ordens pendentes.

s ymbol Ativo da ordem. Não é necessário para


modificação de ordens e operações de
encerramento de posição.

© 2000-2018, MetaQuotes Software Corp.


783 Constantes, Enumeradores e Estruturas

volume Volume da ordem solicitada em lotes. Note que


o volume real de uma operação (deal)
dependerá do tipo de execução da ordem.

price Preço no qual a ordem deve ser executada.


Ordens a mercado de ativos, cujo tipo de
execução é " Mark et
Execution" (S YM BOL _TR ADE_EXECUTION_MARK
ET ), de tipo TR ADE_ACTION_DEAL, não
necessitam que se especifique o preço.

stoplimit O valor do preço, no qual a ordem pendente


Limit será colocada, quando o preço corrente
alcança o valor deste preço(esta condição é
obrigatória). Até lá, a ordem pendente não é
colocada.

sl Preço de Stop Loss no caso de um movimento


desfavorável de preço

tp Preço de T ak e Profit no caso de um movimento


favorável de preço

deviation O máximo desvio de preço, especificado em


pontos

type T ipo de ordem. Pode ser um dos valores da


enumeração ENUM _ORDER_TYPE.

type_filling T ipo de execução da ordem. Pode ser um dos


valores da enumeração
ENUM _ORDER_TYPE_FILL ING.

type_time T ipo de expiração da ordem. Pode ser um dos


valores da enumeração
ENUM _ORDER_TYPE_TIME.

expiration H ora de expiração da ordem (para ordens do


tipo ORDER_TIME_S PECIFIED)

comment Comentário sobre a ordem

position Bilhete da posição. Deve ser preenchido ao


alterar e fechar a posição para a sua
identificação inequívoca. Normalmente,
corresponde ao bilhete de ordem, do qual, como
resultado, a posição foi aberta.

position_by Bilhete da posição oposta. Utiliza-se ao fechar


uma posição usando outra oposta, se estiver
aberta no mesmo instrumento, mas na direção
oposta.

© 2000-2018, MetaQuotes Software Corp.


784 Constantes, Enumeradores e Estruturas

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

© 2000-2018, MetaQuotes Software Corp.


785 Constantes, Enumeradores e Estruturas

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" .

Exemplo de operação de negociação TR ADE_ACTION_DEAL para abrir uma posição Buy:


#define EXPERT_MAGIC 123456 // MagicNumber do conselheiro
//+------------------------------------------------------------------+
//| Abertura da posição Buy |
//+------------------------------------------------------------------+
void OnStart()
{
//--- Atualização e inicialização do pedido e o seu resultado
MqlTradeRequest request={0};
MqlTradeResult result={0};
//--- parâmetros do pedido
request.action =TRADE_ACTION_DEAL; // tipo de operação de negociação
request.symbol =Symbol(); // símbolo
request.volume =0.1; // volume de 0.1 lotes
request.type =ORDER_TYPE_BUY; // tipo de ordem
request.price =SymbolInfoDouble(Symbol(),SYMBOL_ASK); // preço para abertura
request.deviation=5; // desvio permitido do preço
request.magic =EXPERT_MAGIC; // MagicNumber da ordem
//--- envio do pedido
if(!OrderSend(request,result))
PrintFormat("OrderSend error %d",GetLastError()); // se não for possível enviar o pedido,
//--- informação sobre a operação
PrintFormat("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order);
}
//+------------------------------------------------------------------+

Exemplo de operação de negociaçãoTR ADE_ACTION_DEAL para abertura da posição Sell:

© 2000-2018, MetaQuotes Software Corp.


786 Constantes, Enumeradores e Estruturas

#define EXPERT_MAGIC 123456 // MagicNumber do conselheiro


//+------------------------------------------------------------------+
//| Abertura da posição Sell |
//+------------------------------------------------------------------+
void OnStart()
{
//--- Declaração e inicialização do pedido e o seu resultado
MqlTradeRequest request={0};
MqlTradeResult result={0};
//--- parâmetros do pedido
request.action =TRADE_ACTION_DEAL; // tipo de operação de negociação
request.symbol =Symbol(); // símbolo
request.volume =0.2; // volume de 0.2 lotes
request.type =ORDER_TYPE_SELL; // tipo da ordem
request.price =SymbolInfoDouble(Symbol(),SYMBOL_BID); // preço para a abertura
request.deviation=5; // desvio permitido do preço
request.magic =EXPERT_MAGIC; // MagicNumber da ordem
//--- envio do pedido
if(!OrderSend(request,result))
PrintFormat("OrderSend error %d",GetLastError()); // se não for possível enviar o pedido,
//--- informação sobre a operação
PrintFormat("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order);
}
//+------------------------------------------------------------------+

Exemplo de ordem de negociação TR ADE_ACTION_DEAL para fechadura de posições :

© 2000-2018, MetaQuotes Software Corp.


787 Constantes, Enumeradores e Estruturas

#define EXPERT_MAGIC 123456 // MagicNumber do conselheiro


//+------------------------------------------------------------------+
//| Fechadura de todas as posições |
//+------------------------------------------------------------------+
void OnStart()
{
//--- declaração do pedido e o seu resultado
MqlTradeRequest request;
MqlTradeResult result;
int total=PositionsTotal(); // número de posições abertas
//--- iterar todas as posições abertas
for(int i=total-1; i>=0; i--)
{
//--- parâmetros da ordem
ulong position_ticket=PositionGetTicket(i); // bilhete
string position_symbol=PositionGetString(POSITION_SYMBOL); // simbolo
int digits=(int)SymbolInfoInteger(position_symbol,SYMBOL_DIGITS); //número de
ulong magic=PositionGetInteger(POSITION_MAGIC); // MagicNum
double volume=PositionGetDouble(POSITION_VOLUME); // volume d
ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); // tipo de
//--- saída de informação sobre a posição
PrintFormat("#%I64u %s %s %.2f %s [%I64d]",
position_ticket,
position_symbol,
EnumToString(type),
volume,
DoubleToString(PositionGetDouble(POSITION_PRICE_OPEN),digits),
magic);
//--- se o MagicNumber coincidir
if(magic==EXPERT_MAGIC)
{
//--- zerar os valores do pedido e os seus resultados
ZeroMemory(request);
ZeroMemory(result);
//--- configuração dos parâmetros da ordem
request.action =TRADE_ACTION_DEAL; // tipo de operação de negociação
request.position =position_ticket; // bilhete da posição
request.symbol =position_symbol; // símbolo
request.volume =volume; // volume da posição
request.deviation=5; // desvio permitido do preço
request.magic =EXPERT_MAGIC; // MagicNumber da posição
//--- colocação do preço e tipo de ordem dependendo do tipo de ordem
if(type==POSITION_TYPE_BUY)
{
request.price=SymbolInfoDouble(position_symbol,SYMBOL_BID);
request.type =ORDER_TYPE_SELL;
}
else
{
request.price=SymbolInfoDouble(position_symbol,SYMBOL_ASK);
request.type =ORDER_TYPE_BUY;
}
//--- saída de informação sobre o fechamento
PrintFormat("Close #%I64d %s %s",position_ticket,position_symbol,EnumToString(type));
//--- envio do pedido
if(!OrderSend(request,result))
PrintFormat("OrderSend error %d",GetLastError()); // se não for possível enviar o pedi
//--- informação sobre a operação
PrintFormat("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order)
//---
}

© 2000-2018, MetaQuotes Software Corp.


788 Constantes, Enumeradores e Estruturas

}
}
//+------------------------------------------------------------------+

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

Exemplo da operação de negociação TR ADE_ACTION_SL TP para alterar o valor Stop-Loss e T ak e-


Profit na posição aberta:
#define EXPERT_MAGIC 123456 // MagicNumber do conselheiro
//+------------------------------------------------------------------+
//| Modificação do Stop-Loss e Take-Profit da posição |
//+------------------------------------------------------------------+
void OnStart()
{
//--- declaracão do pedido e o seu resultado
MqlTradeRequest request;
MqlTradeResult result;
int total=PositionsTotal(); // número de posições abertas
//--- iterar sobre todas as posições abertas
for(int i=0; i<total; i++)
{
//--- parâmetros da ordem
ulong position_ticket=PositionGetTicket(i);// bilhete da posição
string position_symbol=PositionGetString(POSITION_SYMBOL); // símbolo
int digits=(int)SymbolInfoInteger(position_symbol,SYMBOL_DIGITS); // número de signos depo
ulong magic=PositionGetInteger(POSITION_MAGIC); // MagicNumber da posição
double volume=PositionGetDouble(POSITION_VOLUME); // volume da posição
double sl=PositionGetDouble(POSITION_SL); // Stop Loss da posição
double tp=PositionGetDouble(POSITION_TP); // Take-Profit da posição
ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); // tipo da po
//--- saída de informações sobre a posição
PrintFormat("#%I64u %s %s %.2f %s sl: %s tp: %s [%I64d]",
position_ticket,
position_symbol,
EnumToString(type),
volume,
DoubleToString(PositionGetDouble(POSITION_PRICE_OPEN),digits),
DoubleToString(sl,digits),
DoubleToString(tp,digits),
magic);
//--- se o MagicNumber coincidir, o Stop-Loss e o Take-Profit não estão definidos
if(magic==EXPERT_MAGIC && sl==0 && tp==0)
{

© 2000-2018, MetaQuotes Software Corp.


789 Constantes, Enumeradores e Estruturas

//--- cálculo dos níveis de preços atuais


double price=PositionGetDouble(POSITION_PRICE_OPEN);
double bid=SymbolInfoDouble(position_symbol,SYMBOL_BID);
double ask=SymbolInfoDouble(position_symbol,SYMBOL_ASK);
int stop_level=(int)SymbolInfoInteger(position_symbol,SYMBOL_TRADE_STOPS_LEVEL);
double price_level;
//--- se o nível de deslocamento mínimo permitido em pontos a partir do preço atual de fec
if(stop_level<=0)
stop_level=150; // definimos o deslocamento em 150 pontos a partir do preço atual de fe
else
stop_level+=50; // definimos o nível de deslocamento (SYMBOL_TRADE_STOPS_LEVEL + 50) po

//--- cálculo e arredondamento dos valores Stop-Loss e Take-Profit


price_level=stop_level*SymbolInfoDouble(position_symbol,SYMBOL_POINT);
if(type==POSITION_TYPE_BUY)
{
sl=NormalizeDouble(bid-price_level,digits);
tp=NormalizeDouble(bid+price_level,digits);
}
else
{
sl=NormalizeDouble(ask+price_level,digits);
tp=NormalizeDouble(ask-price_level,digits);
}
//--- zerar os valores de pedido e o seu resultado
ZeroMemory(request);
ZeroMemory(result);
//--- definição dos parâmetros de operação
request.action =TRADE_ACTION_SLTP; // tipo de operação de negociação
request.position=position_ticket; // bilhete da posição
request.symbol=position_symbol; // símbolo
request.sl =sl; // Stop Loss da posição
request.tp =tp; // Take Profit da posição
request.magic=EXPERT_MAGIC; // MagicNumber da posição
//--- saída de informações sobre a modificação
PrintFormat("Modify #%I64d %s %s",position_ticket,position_symbol,EnumToString(type));
//--- envio do pedido
if(!OrderSend(request,result))
PrintFormat("OrderSend error %d",GetLastError()); // se não for possível enviar o pedi
//--- informações sobre a operação
PrintFormat("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order)
}
}
}
//+------------------------------------------------------------------+

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

© 2000-2018, MetaQuotes Software Corp.


790 Constantes, Enumeradores e Estruturas

· type
· type_filling
· type_time
· expiration

T ambém é poss ível especificar valores dos campos " magic" e " comment" .

Exemplo de operação de negociação TR ADE_ACTION_PENDING para colocação de ordens pendentes :

© 2000-2018, MetaQuotes Software Corp.


791 Constantes, Enumeradores e Estruturas

#property description "Exemplo de colocação de ordens pendentes"


#property script_show_inputs
#define EXPERT_MAGIC 123456 // MagicNumber do conselheiro
input ENUM_ORDER_TYPE orderType=ORDER_TYPE_BUY_LIMIT; // tipo da ordem
//+------------------------------------------------------------------+
//| Colocação de ordens pendentes |
//+------------------------------------------------------------------+
void OnStart()
{
//-- declaração e inicialização do pedido e o seu resultado
MqlTradeRequest request={0};
MqlTradeResult result={0};
//--- parâmetros para colocação da ordem pendente
request.action =TRADE_ACTION_PENDING; // tipo de operação de negoc
request.symbol =Symbol(); // símbolo
request.volume =0.1; // volume de 0.1 lotes
request.deviation=2; //desvio permitido do preço
request.magic =EXPERT_MAGIC; // MagicNumber da ordem
int offset = 50; // deslocamento a partir do
double price; // preço de execução da orde
double point=SymbolInfoDouble(_Symbol,SYMBOL_POINT); // tamanho do ponto
int digits=SymbolInfoInteger(_Symbol,SYMBOL_DIGITS); // número de símbolos depois
//--- verificação do tipo de operação
if(orderType==ORDER_TYPE_BUY_LIMIT)
{
request.type =ORDER_TYPE_BUY_LIMIT; // tipo de ordem
price=SymbolInfoDouble(Symbol(),SYMBOL_ASK)-offset*point; // preço para abertura
request.price =NormalizeDouble(price,digits); // нормализованная цена откр
}
else if(orderType==ORDER_TYPE_SELL_LIMIT)
{
request.type =ORDER_TYPE_SELL_LIMIT; // тип ордера
price=SymbolInfoDouble(Symbol(),SYMBOL_BID)+offset*point; // цена для открытия
request.price =NormalizeDouble(price,digits); // preço de abertura normal
}
else if(orderType==ORDER_TYPE_BUY_STOP)
{
request.type =ORDER_TYPE_BUY_STOP; // tipo de ordem
price =SymbolInfoDouble(Symbol(),SYMBOL_ASK)+offset*point; // preço de abertura
request.price=NormalizeDouble(price,digits); // preço de abertura normal
}
else if(orderType==ORDER_TYPE_SELL_STOP)
{
request.type =ORDER_TYPE_SELL_STOP; // tipo de ordem
price=SymbolInfoDouble(Symbol(),SYMBOL_BID)-offset*point; // preço para abertura
request.price =NormalizeDouble(price,digits); // preço de abertura normal
}
else Alert("Este exemplo é apenas para colocação de ordens pendentes"); // Se a ordem pendente
//--- enviar a ordem
if(!OrderSend(request,result))
PrintFormat("OrderSend error %d",GetLastError()); // Se não for possível envi
//--- informações sobre a operação
PrintFormat("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order);
}
//+------------------------------------------------------------------+

Modificar Ordem Pendente

© 2000-2018, MetaQuotes Software Corp.


792 Constantes, Enumeradores e Estruturas

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:

© 2000-2018, MetaQuotes Software Corp.


793 Constantes, Enumeradores e Estruturas

#define EXPERT_MAGIC 123456 // MagicNumber do conselheiro


//+------------------------------------------------------------------+
//| Modificação de ordens pendentes |
//+------------------------------------------------------------------+
void OnStart()
{
//-- declaração e inicialização do pedido e o seu resultado
MqlTradeRequest request={0};
MqlTradeResult result={0};
int total=OrdersTotal(); // número de ordens pendentes colocadas
//--- iterar todas as ordens pendentes colocadas
for(int i=0; i<total; i++)
{
//--- parâmetros da ordem
ulong order_ticket=OrderGetTicket(i); // bilhete da ordem
string order_symbol=Symbol(); // símbolo
int digits=(int)SymbolInfoInteger(order_symbol,SYMBOL_DIGITS); // número de signos depois da coma
ulong magic=OrderGetInteger(ORDER_MAGIC); // MagicNumber da ordem
double volume=OrderGetDouble(ORDER_VOLUME_CURRENT); // volume atual da ordem
double sl=OrderGetDouble(ORDER_SL); // Stop Loss atual da ordem
double tp=OrderGetDouble(ORDER_TP); // Take Profit atual da ordem
ENUM_ORDER_TYPE type=(ENUM_ORDER_TYPE)OrderGetInteger(ORDER_TYPE); // tipo de ordem
int offset = 50; // deslocação a partir do preço atual para colocação da ordem, em pontos
double price; // preço de ativação da ordem
double point=SymbolInfoDouble(order_symbol,SYMBOL_POINT); // tamanho do ponto
//--- saída de informações sobre a ordem
PrintFormat("#%I64u %s %s %.2f %s sl: %s tp: %s [%I64d]",
order_ticket,
order_symbol,
EnumToString(type),
volume,
DoubleToString(PositionGetDouble(POSITION_PRICE_OPEN),digits),
DoubleToString(sl,digits),
DoubleToString(tp,digits),
magic);
//--- se o MagicNumber coincidir, o Stop Loss e o Take Profit nao foram definidos
if(magic==EXPERT_MAGIC && sl==0 && tp==0)
{
request.action=TRADE_ACTION_MODIFY; // tipo de operação de negociação
request.order = OrderGetTicket(i); // bilhete da ordem
request.symbol =Symbol(); // símbolo
request.deviation=5; // desvio permitido a partir do preço
//--- definição do nível de preços Take Profit e Stop Loss da ordem dependendo do seu tipo
if(type==ORDER_TYPE_BUY_LIMIT)
{
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
}
else if(type==ORDER_TYPE_SELL_LIMIT)
{
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
}
else if(type==ORDER_TYPE_BUY_STOP)
{
price = SymbolInfoDouble(Symbol(),SYMBOL_ASK)+offset*point;
request.tp = NormalizeDouble(price+offset*point,digits);

© 2000-2018, MetaQuotes Software Corp.


794 Constantes, Enumeradores e Estruturas

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);
}
}
}
//+------------------------------------------------------------------+

Excluir Ordem Pendente


Ordem de negociação para excluir uma ordem pendente. Ela requer que se especifiquem os
seguintes 2 campos :
· action
· order
Exemplo de operação de negociação TR ADE_ACTION_R EMOVE para excluir ordens pendentes :
#define EXPERT_MAGIC 123456 // MagicNumber do conselheiro

© 2000-2018, MetaQuotes Software Corp.


795 Constantes, Enumeradores e Estruturas

//+------------------------------------------------------------------+
//| Exclusão de ordens pendentes |
//+------------------------------------------------------------------+
void OnStart()
{
//-- Declaração e inicialização do pedido e resultado
MqlTradeRequest request={0};
MqlTradeResult result={0};
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

© 2000-2018, MetaQuotes Software Corp.


796 Constantes, Enumeradores e Estruturas

A Estrutura de Resultados de uma Verificação de Solicitação


de Negociação (MqlTradeCheckResult)
Antes de enviar uma solicitação de uma operação de negociação para um servidor de negociação, é
recomendado verificá-la. A verificação é realizada usando a função OrderCheck (), para a qual a
solicitação a ser verifica e uma variável estrutura do tipo MqlT radeCheckR esult são passadas. O
resultado da verificação será escrita nesta variável.

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)
};

Descrição dos Campos

Campo Descrição
retcode Código de retorno

balance Valor de saldo após a execução da operação de


negociação

equity Valor de saldo a mercado após a execução da


operação de negociação

profit Valor do lucro flutuante após a execução da


operação de negociação

margin Margem requerida para a operação de


negociação

margin_free Margem livre que sobrará após a execução da


operação de negociação

margin_level Nível de margem que será definida após a


execução da operação de negociação

comment Comentário sobre o código da resposta,


descrição do erro

Também Veja
Estrutura de Solicitação de Negociação, Estrutura para Preços Correntes, OrderSend, OrderCheck

© 2000-2018, MetaQuotes Software Corp.


797 Constantes, Enumeradores e Estruturas

A Estrutura de um Resultado de Solicitação de Negociação


(MqlTradeResult)
Como resultado de uma solicitação de negociação, um servidor de negociação retorna dados sobre o
resultado do processamento da solicitação de negociação na forma de uma estrutura predefinida
especial de tipo MqlT radeR esult.

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
};

Descrição dos Campos

Campo Descrição
retcode Código de retorno de um servidor de negociação

deal Bilhetagem (tick et) da operação (deal), caso


uma operação tenha sido realizada. É disponível
para uma operação de negociação de tipo
TRADE_ACTION_DEAL
order Bilhetagem (tick et) da ordem, caso uma ordem
tenha sido colocada. É disponível para uma
operação de negociação de tipo
TRADE_ACTION_PENDING
volume Volume de operação (deal), confirmado pela
corretora. Depende do tipo de preenchimento
da ordem

price Preço da operação (deal), confirmado pela


corretora. Depende da área de desvio da
requisição de negócio e/ou sobre operação de
negócios

bid O preço corrente de venda de mercado (preço


re-cotado)

as k O preço corrente de compra de mercado (preço


re-cotado)

© 2000-2018, MetaQuotes Software Corp.


798 Constantes, Enumeradores e Estruturas

comment O comentário da corretora para a operação (por


default, ele é preenchido com a descrição
código de retorno de um servidor de
negociação)

request_id Identificador da solicitação definida pelo


terminal ao enviar para o servidor de
negociação

retcode_external Código de erro retornado pelo sistema de


negociação exterior. O uso e tipos destes erros
dependerão da corretora e do sistema de
negociação exterior a partir do qual são
enviadas as operações 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 :

· Descrição da transação de negociação na estrutura MqlT radeT ransaction;


· Descrição da solicitação de negociação enviado a partir da função OrderSend() ou
OrdersSendAs ync(). O ID da solicitação é enviado pelo terminal para o servidor de negociação,
enquanto a solicitação em si e seu request_id são armazenados na memória do terminal;
· O resultado de execução da solicitação de negociação como estrutura MqlT radeR esult com o campo
request_id contendo o ID desta solicitação.

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);

© 2000-2018, MetaQuotes Software Corp.


799 Constantes, Enumeradores e Estruturas

//--- se o resultado falha - tentar descobrir o porquê


if(!success)
{
int answer=result.retcode;
Print("TradeLog: Requisição de negociação falhou. Erro = ",GetLastError());
switch(answer)
{
//--- nova cotação
case 10004:
{
Print("TRADE_RETCODE_REQUOTE");
Print("request.price = ",request.price," result.ask = ",
result.ask," result.bid = ",result.bid);
break;
}
//--- ordem não é aceita pelo servidor
case 10006:
{
Print("TRADE_RETCODE_REJECT");
Print("request.price = ",request.price," result.ask = ",
result.ask," result.bid = ",result.bid);
break;
}
//--- preço inválido
case 10015:
{
Print("TRADE_RETCODE_INVALID_PRICE");
Print("request.price = ",request.price," result.ask = ",
result.ask," result.bid = ",result.bid);
break;
}
//--- SL e/ou TP inválidos
case 10016:
{
Print("TRADE_RETCODE_INVALID_STOPS");
Print("request.sl = ",request.sl," request.tp = ",request.tp);
Print("result.ask = ",result.ask," result.bid = ",result.bid);
break;
}
//--- volume inválido
case 10014:
{
Print("TRADE_RETCODE_INVALID_VOLUME");
Print("request.volume = ",request.volume," result.volume = ",
result.volume);
break;
}
//--- sem dinheiro suficiente para uma operação de negociação
case 10019:

© 2000-2018, MetaQuotes Software Corp.


800 Constantes, Enumeradores e Estruturas

{
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);
}

© 2000-2018, MetaQuotes Software Corp.


801 Constantes, Enumeradores e Estruturas

Estrutura de um Transação de Negociação


(MqlTradeTransaction)
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.

· Realização de operações no lado de um servidor de negociação.


As seguintes transações de negociação são realizadas como resultado destas ações :

· tratamento de uma solicitação de negociação

· mudança de ordens de abertura

· mudança de histórico de ordens

· mudança de histórico de operações (deals)

· 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
};

© 2000-2018, MetaQuotes Software Corp.


802 Constantes, Enumeradores e Estruturas

Descrição dos Campos

Campo Descrição
deal Bilhetagem (tick et) da operação.
order Bilhetagem (tick et) da ordem.
s ymbol O nome do ativo da negociação, para o qual a
transação é realizada.

type T ipo de transação de negociação. O valor pode


ser um dos valores da enumeração
ENUM _TR ADE_TR ANSACTION_TYPE.

order_type T ipo de ordem de negociação. O valor pode ser


um dos valores da enumeração
ENUM _ORDER_TYPE.

order_state Estado da ordem de negociação. O valor pode


ser um dos valores da enumeração
ENUM _ORDER_S T AT E.

deal_type T ipo de operação. O valor pode ser um dos


valores da enumeração ENUM _DEAL _TYPE.

type_time T ipo de ordem quanto a expiração. O valor


pode ser um dos valores da enumeração
ENUM _ORDER_TYPE_TIME.

time_expiration Período de expiração de uma ordem pendente


(para ordens dos tipos ORDER_TIME_S PECIFIED
e ORDER_TIME_S PECIFIED_DAY).

price Preço. Dependendo do tipo de transação de


negociação, ele pode ser um preço de uma
ordem, de uma operação (deal), ou de uma
posição.

price_trigger Preço stop (de ativação) de uma ordem Stop


Limit (ORDER_TYPE_BUY_S T OP_L IM IT e
ORDER_TYPE_SELL _S T OP_L IM IT ).

price_sl Preço Stop Loss. Dependendo do tipo de


transação de negociação, ele pode estar
relacionado a uma ordem, a uma operação
(deal) ou a uma posição.

price_tp Preço T ak e Profit. Dependendo do tipo de


transação de negociação, ele pode estar
relacionado a uma ordem, a uma operação
(deal) ou a uma posição.

volume Volume em lotes. Dependendo do tipo de


transação de negociação, ele pode indicar o

© 2000-2018, MetaQuotes Software Corp.


803 Constantes, Enumeradores e Estruturas

valor corrente de uma ordem, de uma operação


(deal), ou de uma posição.

position Bilhete da posição que foi afetado pela


transação.

position_by Bilhete da posição oposta. Utiliza-se ao fechar


uma posição usando outra oposta, se estiver
aberta no mesmo instrumento, mas na direção
oposta.

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.

A estrutura MqlT radeT ransaction é preenchida de diferentes maneiras dependendo do tipo de


transação de negociação (ENUM _TR ADE_TR ANSACTION_TYPE):

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,
TRADE_TRANSACTION_ORDER_UPDAT E e TRADE_TRANSACTION_ORDER_DELET E) e histórico de
ordens (TR ADE_TR ANSACTION_HIS T ORY_ADD, TRADE_TRANSACTION_HIS T ORY_UPDAT E,
TRADE_TRANSACTION_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_S PECIFIED e ORDER_TIME_S PECIFIED_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 IM 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
TRADE_TRANSACTION_ORDER_ADD.

© 2000-2018, MetaQuotes Software Corp.


804 Constantes, Enumeradores e Estruturas

· 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,
TRADE_TRANSACTION_DEAL_UPDAT E e TRADE_TRANSACTION_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.

Alteração de Posição (adição, alteração, encerramento), como resultado de uma execução de


operação (deal), não leva a ocorrência de transação de TR ADE_TR ANSACTION_POS ITION.

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;

© 2000-2018, MetaQuotes Software Corp.


805 Constantes, Enumeradores e Estruturas

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;

//--- habilita a classe de negociação CTrade e declara a variável desta classe


#include <Trade\Trade.mqh>
CTrade trade;
//--- flags para instalação e exclusão de ordens pendentes
bool pending_done=false;
bool pending_deleted=false;
//--- bilhetagem da ordem pendente será armazenada aqui
ulong order_ticket;
//+------------------------------------------------------------------+
//| Função de inicialização do Expert  |
//+------------------------------------------------------------------+
int OnInit()
{
//--- define o MagicNumber para marcar todas as nossas ordens
trade.SetExpertMagicNumber(MagicNumber);
//--- solicitações de negociação serão enviadas em modo assíncrono usando a função OrderSendAsync()
trade.SetAsyncMode(true);
//--- inicializa a variável em zero
order_ticket=0;
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função tick (ponto) de um Expert |
//+------------------------------------------------------------------+
void OnTick()
{
//---instalando uma ordem pendente
if(!pending_done)
{
double ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
double buy_stop_price=NormalizeDouble(ask+1000*_Point,(int)SymbolInfoInteger(_Symbol,SYMBOL_D
bool res=trade.BuyStop(0.1,buy_stop_price,_Symbol);
//--- caso a função BuyStop() executou com sucesso
if(res)
{
pending_done=true;
//--- obtém um resultado da solicitação enviando para CTrade
MqlTradeResult trade_result;
trade.Result(trade_result);
//--- obtém o request_id para a solicitações enviada

© 2000-2018, MetaQuotes Software Corp.


806 Constantes, Enumeradores e Estruturas

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

© 2000-2018, MetaQuotes Software Corp.


807 Constantes, Enumeradores e Estruturas

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";

© 2000-2018, MetaQuotes Software Corp.


808 Constantes, Enumeradores e Estruturas

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";
//--- retorna a string obtida
return desc;
}
//+------------------------------------------------------------------+
//| Retorna a desc. textual do resultado da manipulação da solic.  |
//+------------------------------------------------------------------+
string TradeResultDescription(const MqlTradeResult &result)
{
//---
string desc="Retcode "+(string)result.retcode+"\r\n";
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: "+StringFormat("%G",result.ask)+"\r\n";
desc+="Venda: "+StringFormat("%G",result.bid)+"\r\n";
desc+="Comentário: "+result.comment+"\r\n";
//--- retorna a string obtida
return desc;
}

Também Veja
T ipos de T ransação de Negociação, OnT radeT ransaction()

© 2000-2018, MetaQuotes Software Corp.


809 Constantes, Enumeradores e Estruturas

A Estrutura para Retornar Preços Correntes (MqlTick)


Esta é uma estrutura para armazenar os últimos preços do ativo. Ela é projetada para recuperação
rápida da maioria das informações solicitadas sobre preços correntes.

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
};

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 ().

Os parâmetros de cada tick são preenchidos independentemente se existem alterações comparadas


com o tick anterior. Assim, é poss ível descobrir o preço correto para qualquer momento no passado,
sem a necessidade de procurar os valores anteriores do histórico do tick . Por exemplo, mesmo que
apenas altere o preço Bid durante a chegada do tick , a estrutura ainda contém outros parâmetros,
bem como incluindo o preço As k anterior, volume, etc.

Você pode analisar as flags dos tick s para descobrir quais dados foram alterados exatamente:
· TICK_FLAG_BID – tick alterou o preço Bid
· TICK_FLAG_AS K – tick alterou o preço As k
· TICK_FLAG_LAS T – tick alterou o último preço da oferta
· TICK_FLAG_VOLUME – tick alterou o volume
· TICK_FLAG_BUY – tick é resultado de uma compra
· TICK_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
Estruturas e Classes, CopyT ick s(), S ymbolInfoT ick ()

© 2000-2018, MetaQuotes Software Corp.


810 Constantes, Enumeradores e Estruturas

Códigos de Erros e Avisos


Esta seção contém as seguintes descrições :

· Códigos de retorno do servidor de negociação – analisando resultados da solicitação de negociação


enviada pela função OrderSend();
· Avisos do compilador – códigos de mensagens de aviso que aparecem na compilação (não erros);
· 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().

© 2000-2018, MetaQuotes Software Corp.


811 Constantes, Enumeradores e Estruturas

Códigos de Retorno do Servidor de Negociação


T odas as solicitações para executar operações de negociação são enviadas como uma estrutura de
uma solicitação de negociaçãoMqlT radeR equestusando a funçãoOrderSend(). O resultado da execução
da função é colocado na estrutura MqlT radeR esult, cujo campo retcode contém o código de retorno do
servidor de negociação.

Código Constante Descrição


10004 TRADE_RET CODE_REQUOT E Nova Cotação
10006 TRADE_RET CODE_REJECT Solicitação rejeitada

10007 TRADE_RET CODE_CANCEL Solicitação cancelada pelo


negociador

10008 TRADE_RET CODE_PLACED Ordem colocada

10009 TRADE_RET CODE_DONE Solicitação concluída

10010 TRADE_RET CODE_DONE_PARTI Somente parte da solicitação


AL foi concluída

10011 TRADE_RET CODE_ERROR Erro de processamento de


solicitação

10012 TRADE_RET CODE_TIMEOUT Solicitação cancelada por


expiração de tempo (timeout)

10013 TRADE_RET CODE_INVALID Solicitação inválida

10014 TRADE_RET CODE_INVALID_VOL Volume inválido na solicitação


UME

10015 TRADE_RET CODE_INVALID_PRI Preço inválido na solicitação


CE

10016 TRADE_RET CODE_INVALID_S T O Stops inválidos na solicitação


PS
10017 TRADE_RET CODE_TRADE_DISA Negociação está desabilitada
BLED
10018 TRADE_RET CODE_MARKET_CL Mercado está fechado
OSED

10019 TRADE_RET CODE_NO_MONEY Não existe dinheiro suficiente


para completar a solicitação

10020 TRADE_RET CODE_PRICE_CH AN Os preços se alteraram


G ED
10021 TRADE_RET CODE_PRICE_OFF Não existem cotações para
processar a solicitação

10022 TRADE_RET CODE_INVALID_EXPI Data de expiração da ordem


RATION inválida na solicitação

© 2000-2018, MetaQuotes Software Corp.


812 Constantes, Enumeradores e Estruturas

10023 TRADE_RET CODE_ORDER_CH A Estado da ordem alterada


NGED
10024 TRADE_RET CODE_T OO_MANY_ Solicitações com freqüência em
REQUES T S excesso

10025 TRADE_RET CODE_NO_CH ANGE Sem alterações na solicitação


S

10026 TRADE_RET CODE_SERVER_DISA Autotrading desabilitado pelo


BLES _AT servidor

10027 TRADE_RET CODE_CLIENT_DISA Autotrading desabilitado pelo


BLES _AT terminal cliente

10028 TRADE_RET CODE_LOCKED Solicitação bloqueada para


processamento

10029 TRADE_RET CODE_FROZEN Ordem ou posição congeladas

10030 TRADE_RET CODE_INVALID_FILL T ipo de preenchimento de


ordem inválido

10031 TRADE_RET CODE_CONNECTION Sem conexão com o servidor de


negociação

10032 TRADE_RET CODE_ONLY_REAL Operação é permitida somente


para contas reais

10033 TRADE_RET CODE_LIM IT_ORDE O número de ordens pendentes


RS atingiu o limite

10034 TRADE_RET CODE_LIM IT_VOLU O volume de ordens e posições


ME para o ativo atingiu o limite

10035 TRADE_RET CODE_INVALID_ORD Incorreto ou proibida tipo de


ER ordem

10036 TRADE_RET CODE_POS ITION_CL Posição com a especificação


OSED POS ITION_IDENTIFIER já foi
fechado

10038 TRADE_RET CODE_INVALID_CLO O volume que se pode fechar


SE_VOLUME excede o volume da posição
atual

10039 TRADE_RET CODE_CLOSE_ORDE Para a posição indicada já


R_EXIS T existe uma ordem de
fechamento. Pode aoontecer no
trabalho no sistema de
cobertura:
· ao tentar fechar a posição
oposta, se já existir uma
ordem para fechamento
desta posição
· ao tentar fechar completa ou
parcialmente, se o volume

© 2000-2018, MetaQuotes Software Corp.


813 Constantes, Enumeradores e Estruturas

total de ordens existentes


para fechamento e o volume
total da ordem re-colocada
excede o volume da posição
atual

10040 TRADE_RET CODE_LIM IT_POS IT O número de posições abertas,


IONS que pode estar
simultaneamente na conta,
pode ser limitado pelas
definições do servidor. Quando
é atingido o limite, em
resposta à colocação de uma
ordem, o servidor retorna o
erro
TRADE_RET CODE_LIM IT_POS IT
IONS. A restrição opera de
forma diferente dependendo do
tipo de cálculo para as posições
da conta:
· Sistema de compensação —
considera o número de
posições abertas. Ao atingir
o limite, a plataforma não
permite colocar novas
ordens, cuja execução pode
aumentar o número de
posições abertas. Na
verdade, a plataforma irá
colocar ordens apenas para
os s ímbolos que já têm
posições abertas. No sistema
de compensação, durante a
verificação do limite, não
são levadas em conta as
ordens pendentes atuais,
uma vez que sua execução
pode conduzir a uma
alteração nas posições
atuais, em vez de um
aumento do seu número.
· Sistema de cobertura — além
das posições abertas, são
consideradas as ordens
pendentes colocadas, uma
vez que sua execução
sempre conduz à apertura de
uma nova posição. Ao atingir
o limite, a plataforma não
permite colocar tanto ordens
de mercado para abrir

© 2000-2018, MetaQuotes Software Corp.


814 Constantes, Enumeradores e Estruturas

posições quanto ordens


pendentes.

10041 TRADE_RET CODE_REJECT_CAN O pedido de ativação da ordem


CEL pendente foi rejeitado, e a
ordem cancelada

10042 TRADE_RET CODE_LONG_ONLY O pedido foi rejeitado, porque,


no s ímbolo, foi definida a regra
" Somente são permitidas
posições
longas" (POS ITION_TYPE_BUY)
10043 TRADE_RET CODE_S H ORT_ONL O pedido foi rejeitado, porque,
Y no s ímbolo, foi definida a regra
" Somente são permitidas
posições
curtas" (POS ITION_TYPE_SELL)
10044 TRADE_RET CODE_CLOSE_ONLY O pedido foi rejeitado, porque,
no s ímbolo, foi definida a regra
" Só é permitido o fechamento
de posição"

© 2000-2018, MetaQuotes Software Corp.


815 Constantes, Enumeradores e Estruturas

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 Registro incompleto de uma data na string
datetime.

22 Número errado na string datetime para a data.


Requerimentos :
  Ano 1970 <= X <= 3000
  Mês 0 <X <= 12
  Dia 0 <X <= 31/30/28 (29 )....
23 Número errado na string datetime para hora.
Requerimentos :
  H ora 0 <= X <24
  Minuto 0 <= X <60
24 Cor inválida no formato RGB: um dos
componentes RGB é menor que 0 ou maior que
255
25 Caractere desconhecido das seqüências de
escape.
  Conhecido: \n \r \t \\ \" \' \X \x
26 Volume grande demais de variáveis locais (>
512Kb) da função, reduza o número

29 Enumeração já definida (duplicação) - membros


serão adicionados à primeira definição

30 Sobreposição (overriding) de macro

31 A variável está declarada mas não é usada em


nenhum lugar

32 Construtor deve ser do tipo void

33 Destrutor deve ser do tipo void


34 Constante não se encaixa na faixa de inteiros
(X > _UI64_MAX || X < _I64_M IN) e será
convertido para o tipo double

35 H EX longo demais - mais que 16 caracteres


significativos (grupos de 4 bits de posições
mais elevadas são cortados)

36 Sem grupos de 4 bits na string H EX "0x "

37 Sem função - nada a ser executado

38 Uma variável não inicializada sendo usada

© 2000-2018, MetaQuotes Software Corp.


816 Constantes, Enumeradores e Estruturas

41 Função não tem corpo, e não é chamada


43 Poss ível perda de dados na conversão Exemplo:
int x = (double) z;

44 Perda de precisão (de dados) durante conversão


de uma constante. Exemplo: int x = M _PI

45 Diferença entre os sinais de operandos em


operações de comparação. Exemplo: (char) c1>
(uchar) c2

46 Problemas com importação de função -


declaração de #import é requerida ou o import
de funções está fechado

47 Descrição grande demais - caracteres extras


não serão incluídos no arquivo executável

48 O número de buffers de indicador declarados é


menor que o requerido

49 Sem cor para plotar um série gráfica no


indicador

50 Sem série gráfica para desenhar o indicador

51 Função H andler 'OnStart' não encontrado no


script

52 Função handler 'OnStart' está definido com


parâmetros errados

53 Função 'OnStart' pode ser definida somente em


um script

54 Função 'OnInit' está definida com parâmetros


errados

55 Função 'OnInit' não é usada em scripts


56 Função 'OnDeinit' está definida com parâmetros
errados

57 Função 'OnDeinit' não é usada em scripts


58 Duas funções 'OnCalculate' estão definidas.
OnCalculate() com um array de preçoserá usada

59 Sobre-preenchimento detectado ao calcular uma


constante inteira complexa

60 Provavelmente, a variável não está inicializada.


61 Este declaração torna imposs ível de referenciar
a variável local declarada na linha especificada

© 2000-2018, MetaQuotes Software Corp.


817 Constantes, Enumeradores e Estruturas

62 Esta declaração torna imposs ível de referenciar


a variável global declarada na linha especificada

63 Não pode ser usada para array alocado


estaticamente

64 Esta declaração de variável oculta variável


predefinida

65 O valor da expressão é sempre true/false

66 Usar um variável ou expressão de tipo bool em


operações matemáticas não é seguro

67 O resultado da aplicação de operador menos


unário para um tipo sem sinal ulong é
indefinido

68 A versão especificada na propriedade #property


version não é aceitável para a seção Mark et;o
formato correto de #property version é
"XXX.YYY"
69 Declaração controlada vazia encontrada
70 T ipo de retorno de função inválido ou
parâmetros incorretos durante declaração da
função de manipulação de evento

71 Uma implícita conversão de estruturas para um


tipo é requerida

72 Esta declaração torna direto acesso ao membro


de uma classe declarada na string especificada
imposs ível. Acesso somente será poss ível com
o operador de resolução de escopo ::

73 A constante binária é muito grande, os dígitos


de alta ordem serão truncados

74 O parâmetro no método da classe herança tem


um diferente modificador const, a função
derivada tem sobrecarregado a função geradora

75 Negativo ou deslocamento com valor muito


grande em deslocamento de operação bit a bit,
resultado da execução é indefinido

76 Função deve retornar um valor


77 função void retorna um valor

78 Nem todos os caminhos de controle retornam


um valor

79 Expressões não são permitidas em uma escala


global

© 2000-2018, MetaQuotes Software Corp.


818 Constantes, Enumeradores e Estruturas

80 Verifica a precedência do operador para um


poss ível erro; usa parênteses para esclarecer a
precedência

81 Foi definido duas OnCalCulate(). Será utilizado


o modo OH LC

82 Struct sem membros, atribuído o tamanho de 1


byte

83 Valor de retorno da função deve ser verificado


84 Recursos do indicador é compilado para
depuração. Isso retarda o desempenho. Por
favor, recompile o indicador para aumentar o
desempenho

85 Código de caracteres muito grande na linha,


deve estar na faixa de 0 a 65535

86 Caractere não reconhecido na linha

87 Nenhuma propriedade da janela do indicador


(definindo a exibição na janela principal ou na
sub-janela) foi definida. Propriedade #property
indicator_chart_window foi aplicada

© 2000-2018, MetaQuotes Software Corp.


819 Constantes, Enumeradores e Estruturas

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

101 Erro de abertura de arquivo *. EX5 para


escrever nele para gravação

103 Sem memória livre suficiente para completar


compilação

104 Unidade sintática vazia não reconhecida pelo


compilador

105 Nome de arquivo incorreto em #include


106 Erro acessando um arquivo em #include
(provavelmente o arquivo não existe)

108 Nome inapropriado para #define


109 Comando desconhecido de preprocessador
(válidos #include, #define, #property, #import)

110 Ativo desconhecido para compilador

111 Função não implementada (descrição está


presente, mas sem corpo)

112 Dupla aspas (" ) omitida


113 Chave angular de abertura (<) ou aspas duplas
(" ) omitida

114 Aspas simples (') omitida

115 Chave angular de fechamento ">" omitida

116 T ipo não especificado na declaração


117 Sem operador return ou return não encontrado
em todas as ramificações da implementação

118 Colchete de abertura de parâmetros de


chamada era esperada

119 Erro escrevendo EX5

120 Acesso inválido a um array

121 A função não é do tipo void e o operador return


deve retornar um valor

© 2000-2018, MetaQuotes Software Corp.


820 Constantes, Enumeradores e Estruturas

122 Declaração incorreta do destrutor


123 Dois pontos ":" está faltando
124 Variável já esta declarada
125 Variável com tal identificador já declarado
126 Nome de variável é longo demais (> 250
caracteres)

127 Estrutura com tal identificador já definida

128 Estrutura não está definida

129 Membro de estrutura com o mesmo nome já


definido

130 Sem tal membro de estrutura

131 Emparelhamento de chaves violado

132 Parênteses de abertura " (" esperada


133 Chaves desbalanceadas (sem "}" )

134 Dificuldade para compilar (ramificações


demais, níveis de empilhamento interno são
sobre-preenchidos

135 Erro de abertura de arquivo para leitura

136 Sem memória suficiente para baixar o arquivo


fonte em memória

137 Variável é esperada


138 Referência não pode ser inicializada
140 Atribuição esperada (aparece na declaração)

141 Chave de abertura "{" esperada

142 Parâmetro pode ser um array dinâmico somente


143 Uso de tipo " void" não é aceitável

144 Sem par correspondente para " )" ou "]" , isto é,


" (" ou "[" está ausente
145 Sem par correspondente para " (" ou "[" , isto é,
" )" ou "]" está ausente
146 T amanho de array incorreto
147 Excesso de parâmetros (> 64)

149 Este s ímbolo (tok en) não é esperado aqui

150 Uso inválido de operação (operandos inválidos)

© 2000-2018, MetaQuotes Software Corp.


821 Constantes, Enumeradores e Estruturas

151 Expressão de tipo void não é permitido

152 Operador é esperado

153 Uso incorreto do break

154 Ponto e v írgula ";" esperado


155 Vírgula " ," esperada
156 Deve ser um tipo classe, não estrutura
157 Expressão é esperada

158 " não caractere H EX" encontrado em H EX ou


número longo demais (número de dígitos > 511)

159 Constante-string tem mais que 65534


caracteres

160 Definição de função não é aceitável aqui


161 T érmino de programa inesperado
162 Declaração adiantada é proibida para estruturas
163 Função com este nome já está definida e tem
um outro tipo de retorno

164 Função com este nome já está definida e tem


um conjunto diferente de parâmetros

165 Função com este nome já está definida e


implementada

166 Sobrecarga de função para esta chamada não


foi encontrada

167 Função com um valor de retorno de tipo void


não pode retornar um valor

168 Função não está definida


170 Valor é esperado
171 Em expressão case somente constantes inteiras
são válidas

172 O valor de case neste switch já é usado

173 Inteiro é esperado


174 Em expressão #import, nome de arquivo é
esperado

175 Expressões não são permitidas em nível global

176 Parênteses " )" omitido antes de ";"

© 2000-2018, MetaQuotes Software Corp.


822 Constantes, Enumeradores e Estruturas

177 Uma variável à esquerda do sinal de igualdade é


esperada

178 O resultado de expressão não é usado

179 Declaração de variáveis não é permitida em


case

180 Conversão implícita de uma string para um


número

181 Conversão implícita de um número para uma


string

182 Chamada ambígua de uma função


sobrecarregada (várias sobrecargas se
enquadram)

183 else ilegal sem apropriado if

184 Inválido case ou default sem um switch


185 Uso inapropriado de reticência

186 A seqüência de inicialização tem mais


elementos que a variável inicializada

187 Uma constante paracaseesperada

188 Uma expressão constante requerida

189 Uma variável constante não pode ser alterada

190 Colchete de fechamento ou uma v írgula é


esperado (declarando membro de array)

191 Identificador de enumeração já definido


192 Enumeração não pode ter modificadores de
acesso (const, extern, static)

193 Membro de enumeração já declarado com um


valor diferente

194 Existe uma variável definida com o mesmo


nome

195 Existe uma estrutura definida com o mesmo


nome

196 Nome de membro de enumeração esperado


197 Expressão de inteiro esperado

198 Divisão por zero em expressão constante


199 Número errado de parâmetros na função
200 Parâmetro por referência deve ser uma variável

© 2000-2018, MetaQuotes Software Corp.


823 Constantes, Enumeradores e Estruturas

201 Variável de mesmo tipo para passar por


referência esperada

202 Uma variável constante não pode ser passada


por uma referência não constante

203 Requer uma constante inteira positiva


204 Falha em acessar membro protegido de classe
205 Import já definido de uma outra forma
208 Arquivo executável não criado

209 Ponto de entrada 'OnCalculate' não encontrado


para o indicador

210 O operador continue pode ser usado somente


dentro de um loop

211 Erro acessando membro privado (fechado) de


classe

213 Método de estrutura ou classe não está


declarado

214 Erro acessando método privado (fechado) de


classe

216 Cópia de estruturas com objetos não é


permitida

218 Índice fora do intervalo do array


219 Inicialização de array em declaração de
estrutura ou classe não permitida

220 Construtor de classe não pode ter parâmetros

221 Destrutor de classe não pode ter parâmetros


222 Método de classe ou estrutura com o mesmo
nome e parâmetros já foi declarado

223 Operando esperado

224 Método de classe ou estrutura com o mesmo


nome existe, mas com parâmetros diferentes
(declaração!=implementação)

225 Função importada não está descrita


226 ZeroMemory() is not allowed for objects with
protected members or inheritance

227 Chamada ambígua da função sobrecarregada


(correspondência exata de parâmetros para
várias sobrecargas)

© 2000-2018, MetaQuotes Software Corp.


824 Constantes, Enumeradores e Estruturas

228 Nome de variável esperada


229 Um referência não pode ser declarada neste
local

230 Já usado como nome da enumeração


232 Classe ou estrutura esperada

235 Não pode chamar operador 'delete' para excluir


o array

236 Operador 'while' esperado

237 Operador 'delete' deve ter um ponteiro

238 Já existe 'default' para este 'switch'


239 Erro de sintaxe

240 Seqüência-escape pode ocorrer somente em


strings (começam com '\')

241 Array requerido - colchete '[' não se aplica a um


array, ou não arrays são passados como
parâmetros de array

242 Não pode ser inicializado através da seqüência


de inicialização

243 Import não está definido


244 Erro de otimizador na árvore sintática

245 Estruturas declaradas em excesso (tente


simplificar o programa)

246 Conversão do parâmetro não é permitida

247 Uso incorreto do operador 'delete'

248 Não é permitido declarar um ponteiro para uma


referência

249 Não é permitido declarar uma referência para


uma referência

250 Não é permitido declarar um ponteiro para um


ponteiro

251 Declaração de estrutura na lista de parâmetros


não é permitida

252 Operação inválida de conversão de tipo

253 Um ponteiro pode ser declarado somente para


uma classe ou estrutura

256 Identificador não declarado

© 2000-2018, MetaQuotes Software Corp.


825 Constantes, Enumeradores e Estruturas

257 Erro do otimizador de código executável

258 Erro de geração de código executável

260 Expressão inválida para o operador 'switch'

261 Pool de constantes de string sobre-preenchido,


simplifique o programa

262 Não pode converter para enumeração


263 Não use 'virtual' para dados (membros de uma
classe ou estrutura)

264 Não pode chamar método protegido de uma


classe

265 Funções virtuais sobrepostas retornam um tipo


diferente

266 Classe não pode ser herdada de uma estrutura

267 Estrutura não pode ser herdada de uma classe

268 Construtor não pode ser virtual (especificador


virtual não é permitido)

269 Estrutura não pode ter métodos virtuais

270 Função deve ter um corpo


271 Sobrecarga de funções de sistema (funções de
terminal) é proibida

272 Especificador const não é válido para funções


que não são membros de uma classe ou
estrutura

274 Não permitido alterar membros de classe em


método constante

276 Seqüência de inicialização inapropriada

277 Valor padrão faltante para o parâmetro


(declaração específica de parâmetros default)

278 Sobreposição do parâmetro padrão (valores


diferentes na declaração e implementação)

279 Não permitido chamar método não constante


para um objeto constante

280 Um objeto é necessário para acessar membros


(um ponteiro para uma não classe/estrutura
está definido)

281 O nome de uma estrutura já declarada não pode


ser usado em declaração

© 2000-2018, MetaQuotes Software Corp.


826 Constantes, Enumeradores e Estruturas

284 Conversão não autorizada (em herança


fechada)

285 Estruturas e arrays não podem ser usados como


variáveis de input

286 Especificador const não é válido para


construtor/destrutor

287 Expressão de string incorreta para um datetime

288 Propriedade desconhecida (#property)


289 Valor incorreto de uma propriedade
290 Índice inválido para uma propriedade em
#property
291 Chamar parâmetro omitido - <func (x,)>

293 Objeto deve ser passado por referência

294 Array deve ser passado por referência

295 Função foi declarada como exportável


296 Função não foi declarada como exportável
297 É proibido exportar funções importadas
298 Função importada não pode ter este parâmetro
(proibido passar um ponteiro, classe ou
estrutura contendo um array dinâmico,
ponteiro, classe, etc.)

299 Deve ser uma classe


300 #import não foi fechado
302 T ipo incompatível
303 Variável externa (extern)já está inicializada
304 Nenhuma funçãoexportadaouponto de
entradaencontrado

305 Chamada explícita aoconstrutornão é permitida

306 Método foi declarado comoconstante

307 Método não foi declarado comoconstante

308 T amanho incorreto do arquivo de recurso


309 Nome de recurso incorreto
310 Erro de abertura de arquivo de recurso

311 Erro de leitura de arquivo de recurso

© 2000-2018, MetaQuotes Software Corp.


827 Constantes, Enumeradores e Estruturas

312 T ipo de recurso desconhecido


313 Caminho incorreto para o arquivo de recurso

314 O nome dorecursoespecificado já é usado

315 Argumento esperado para a macro tipo-função

316 S ímbolo inesperado na definição de macro

317 Erro em parâmetros formais da macro

318 Número inválido de parâmetros para uma macro


319 Parâmetro em excesso para uma macro
320 Complexo demais, simplifique a macro

321 Parametro para EnumT oString() somente pode


ser uma enumeração

322 O nome do recurso é longo demais

323 Formato de imagem não suportado (somente


BM P com cor de 24 ou 32 bits de profundidade é
suportado)

324 Um array não pode ser declarado em operador

325 A função pode ser declarada somente no escopo


global

326 A declaração não é permitida para o escopo


corrente

327 Inicialização de variáveis estáticas com os


valores de variáveis locais não é permitida

328 Declaração ilegal de um array de objetos que


não tem um construtor padrão

329 Lista de inicialização permitida somente para


construtores

330 Sem definição de função após lista de


inicialização

331 Lista de inicialização está vazia

332 Inicialização de array em um construtor não é


permitida

333 Inicializar membros de uma classe pai na lista


de inicialização não é permitido

334 Expressão do tipo inteiro esperado

335 Memória requerida para o array excede o valor


máximo

© 2000-2018, MetaQuotes Software Corp.


828 Constantes, Enumeradores e Estruturas

336 Memória requerida para a estrutura excede o


valor máximo

337 Memória requerida para as variáveis declaradas


no nível global excede o valor máximo

338 Memória requerida para variáveis locais excede


o valor máximo

339 Construtornão definido

340 Nome inválido do arquivo de ícone


341 Não pode abrir o arquivo de íconeno caminho
especificado

342 O arquivo de ícone está incorreto e não é do


formato ICO format

343 Reinicialização de um membro em um


construtor de uma classe/estrutura usando a
lista de inicialização

344 Inicialização de membros estáticos na lista de


inicialização do construtor não é permitida

345 Inicialização de um membro não-estático de


uma classe/estrutura em nível global não é
permitida

346 O nome do método da classe/estrutura


corresponde ao nome de um membro declarado
anteriormente

347 O nome do membro da classe/estrutura


corresponde ao nome de um método declarado
anteriormente

348 Função virtual não pode ser declarada como


estática

349 O modificador const não é permitido para


funções estáticas

350 Construtor ou destrutor não pode ser estático

351 Membros não-estáticos de uma classe ou


estrutura não podem ser acessados a partir de
uma função estática

352 Uma operação de sobrecarregada (+,-,[],++,--


etc.) é esperada após a palavra-chave operator

353 Nem todas as operações podem ser


sobrecarregadas em MQL5

354 Definição não corresponde à declaração

© 2000-2018, MetaQuotes Software Corp.


829 Constantes, Enumeradores e Estruturas

355 Um número inválido de parâmetros é


especificado para o operador

356 Função de manipulação de evento não


encontrada

357 Método não pode ser exportado

358 Um ponteiro para o objeto constante não pode


ser normalizado por um objeto não-constante

359 T emplates de classe não são suportados ainda


360 Sobrecargade template de função não é
suportado ainda

361 T emplate de função não pode ser aplicado


362 Parâmetro ambíguo em template de função
(vários tipos de parâmetros podem ser
aplicados)

363 Incapaz de determinar o tipo do parâmetro,


através do qual o argumento do template de
função deveria ser normalizado

364 Número incorreto de parâmetros no template de


função

365 T emplate de função não pode ser virtual


366 T emplates de função não podem ser exportados
367 T emplates de função não podem ser importados
368 Estruturas contendo objetos não são permitidas

369 Arrays de seqüência e estruturas que contêm os


objetos não são permitidos

370 Um membro estático de classe/estrutura deve


ser explicitamente inicializado

371 Limitação do compilador: a string não pode


conter mais de 65 535 caracteres

372 Inconsistente #ifdef/#endif


373 Objeto de classe não pode ser retornado,
construtor de cópia não encontrado

374 Membros e métodos não estáticos não podem


ser usados

375 OnT esterInit() imposs ível de usar sem o


OnT esterDeinit()

376 Redefinição do parâmetro formal '%s '

© 2000-2018, MetaQuotes Software Corp.


830 Constantes, Enumeradores e Estruturas

377 Macro __FUNCS IG__ e __FUNCTION__ não pode


aparecer fora de um corpo de função

378 T ipo inválido retornado. Por exemplo, este erro


será produzido para funções importadas da DLL
que retornam estrutura ou ponteiro.

379 Erro ao utilizar o modelo

380 Não é utilizado


381 Sintaxe inadmiss ível ao declarar apenas a
função virtual, é somente permitido "=NULL " ou
"=0"
382 As funções virtuais podem ser declaradas
apenas com o especificador da função virtual
("=NULL " ou "=0" )

383 É proibido criar um exemplar de classe abstrata


384 Para uma conversão dinâmica usando o
operador dynamic_cast, o tipo de propósito
deve ser o ponteiro para o tipo de usuário

385 Espera-se o tipo de " ponteiro para a função"

386 Não são suportados os ponteiros para métodos


387 Erro, não é poss ível determinar o tipo de
ponteiro para a função

388 A conversão de tipo não está disponível devido


a herançafechada

389 A variável com modificador const deve ser


inicializada imediatamente após à declaração

393 Na interface podem ser declarados apenas os


métodos com acesso público

394 Anexo inválido da interface para outra interface

395 A interface pode ser herdada apenas a partir de


outra interface

396 À espera da interface


397 As interfaces apenas suportam herança pública

398 A interface não pode conter membros

399 Não se devem criar diretamente os objetos da


interface, só através da herança

© 2000-2018, MetaQuotes Software Corp.


831 Constantes, Enumeradores e Estruturas

Erros em Tempo de Execução


GetLastError() é a função que retorna o código do último erro que está armazenado na variável
predefinida _LastError. Este valor pode ser redefinido para zero através da função R esetLastError().

Constante Código Descrição


ERR_SUCCESS 0 A operação concluída com
sucesso

ERR_INT ERNAL _ERR OR 4001 Erro interno inesperado

ERR_WR ONG_INT ERNAL _PAR A 4002 Parâmetro errado na chamada


MET ER interna da função do terminal
cliente

ERR_INVAL ID_PAR AMET ER 4003 Parâmetro errado ao chamar a


função de sistema

ERR_NOT_ENOUGH_MEMORY 4004 Sem memória suficiente para


executar a função de sistema

ERR_S TR UCT_WITH OBJECT S _ 4005 A estrutura contém objetos de


OR CLASS strings e/ou arrays dinâmicos
e/ou estrutura de tais objetos
e/ou classes

ERR_INVAL ID_ARR AY 4006 Array de um tipo errado,


tamanho errado, ou um objeto
defeituoso de um array
dinâmico

ERR_ARR AY_R ES IZE_ERR OR 4007 Sem memória suficiente para


a realocação de um array, ou
uma tentativa de alterar o
tamanho de um array estático

ERR_S TRING_R ES IZE_ERR OR 4008 Sem memória suficiente para


a realocação de string

ERR_NOTINITIAL IZED_S TRING 4009 String não inicializada

ERR_INVAL ID_DAT ETIME 4010 Data e/ou hora inválida


ERR_ARR AY_BAD_S IZE 4011 T amanho de array solicitado
excede 2 GB

ERR_INVAL ID_POINT ER 4012 Ponteiro errado


ERR_INVAL ID_POINT ER_TYPE 4013 T ipo errado de ponteiro
ERR_FUNCTION_NOT_ALLOW E 4014 Função de sistema não é
D permitida para chamar

ERR_R ESOUR CE_NAME_DUPL IC 4015 Os nomes do recurso dinâmico


A T ED e do estático equivalem

© 2000-2018, MetaQuotes Software Corp.


832 Constantes, Enumeradores e Estruturas

ERR_R ESOUR CE_NOT_FOUND 4016 Recurso com este nome não


foi encontrado em EX5

ERR_R ESOUR CE_UNSUPPOT ED 4017 T ipo de recurso não suportado


_TYPE ou seu tamanho excede 16 Mb

ERR_R ESOUR CE_NAME_IS _T O 4018 O nome do recurso excede 63


O_LONG caracteres

ERR_MATH_OVERFLOW 4019 Durante cálculo de funções


matemáticas ocorreu um
estouro

Gráficos

ERR_CH ART_WR ONG_ID 4101 Identificador de gráfico (chart


ID) errado
ERR_CH ART_NO_R EPL Y 4102 Gráfico não responde
ERR_CH ART_NOT_FOUND 4103 Gráfico não encontrado
ERR_CH ART_NO_EXPERT 4104 Nenhum Expert Advisor no
gráfico que pudesse manipular
o evento

ERR_CH ART_CANNOT_OPEN 4105 Erro de abertura de gráfico

ERR_CH ART_CANNOT_CH ANG 4106 Falha ao alterar ativo e


E período de um gráfico

ERR_CH ART_WR ONG_PAR AME 4107 Valor de erro do parâmetro


T ER para a função que trabalha
com gráficos

ERR_CH ART_CANNOT_CR EAT E 4108 Falha ao criar timer


_TIMER
ERR_CH ART_WR ONG_PR OPER 4109 Identificador de propriedade
TY (property ID) do gráfico errado

ERR_CH ART_SCR EENS H OT_FAI 4110 Erro criando telas


LED (screens hots)

ERR_CH ART_NAVIGAT E_FAILE 4111 Erro navegando através de


D gráfico

ERR_CH ART_T EM PLAT E_FAILE 4112 Erro aplicando template


D
ERR_CH ART_WINDOW_NOT_F 4113 Sub-janela contendo o
OUND indicador não foi encontrada

ERR_CH ART_INDICAT OR_CANN 4114 Erro adicionando um indicador


OT_ADD no gráfico

ERR_CH ART_INDICAT OR_CANN 4115 Erro excluindo um indicador do


OT_DEL gráfico

© 2000-2018, MetaQuotes Software Corp.


833 Constantes, Enumeradores e Estruturas

ERR_CH ART_INDICAT OR_NOT_ 4116 Indicador não encontrado no


FOUND gráfico especificado

Objetos Gráficos
ERR_OBJECT_ERR OR 4201 Erro trabalhando com um
objeto gráfico

ERR_OBJECT_NOT_FOUND 4202 Objeto gráfico não foi


encontrado

ERR_OBJECT_WR ONG_PR OPER 4203 Identificador (ID) de uma


TY propriedade de objeto gráfico
errado

ERR_OBJECT_GETDAT E_FAILE 4204 Não foi poss ível obter data


D correspondente ao valor

ERR_OBJECT_GETVALUE_FAIL 4205 Não foi poss ível obter valor


ED correspondente à data

MarketInfo
ERR_MARKET_UNKNOWN_S YM 4301 Ativo desconhecido
BOL
ERR_MARKET_NOT_SELECT ED 4302 Ativo não está selecionado na
janela Observação de Mercado

ERR_MARKET_WR ONG_PR OPE 4303 Identificador de uma


RTY propriedade de ativo errado

ERR_MARKET_LAS TTIME_UNKN 4304 H ora do último tick não é


OWN conhecida (sem tick s)

ERR_MARKET_SELECT_ERR OR 4305 Erro adicionando ou excluindo


um ativo na janela Observação
de Marcado

Acesso de Histórico
ERR_HIS T ORY_NOT_FOUND 4401 H istórico solicitado não
encontrado

ERR_HIS T ORY_WR ONG_PR OPE 4402 Identificador (ID) da


RTY propriedade de histórico
errado

ERR_HIS T ORY_TIMEOUT 4403 Esgotado o tempo de


solicitação do histórico

ERR_HIS T ORY_BAR S _L IM IT 4404 Número de barras restrito


pelas configurações do
terminal

ERR_HIS T ORY_LOAD_ERR OR S 4405 Erros múltiplos ao carregar o


histórico

© 2000-2018, MetaQuotes Software Corp.


834 Constantes, Enumeradores e Estruturas

ERR_HIS T ORY_SMALL _BUFFER 4407 A matriz de recebimento é


muito pequena para
armazenar todos os dados
solicitados

Variáveis ​Globais
ERR_GLOBAL VARIABLE_NOT_F 4501 Variável global do terminal
OUND cliente não foi encontrada

ERR_GLOBAL VARIABLE_EXIS T S 4502 Variável global do terminal


cliente com o mesmo nome já
existe

ERR_GLOBAL VARIABLE_NOT_M 4503 Não houve modificações de


ODIFIED variáveis ​g lobais

ERR_GLOBAL VARIABLE_CANNO 4504 Foi imposs ível abrir e ler o


TREAD arquivo com os valores das
variáveis ​g lobais

ERR_GLOBAL VARIABLE_CANNO 4505 Foi imposs ível escrever o


TWRIT E arquivo com os valores das
variáveis ​g lobais

ERR_MAIL _SEND_FAILED 4510 Envio de email falhou

ERR_PLAY_SOUND_FAILED 4511 Reprodução de som falhou


ERR_MQL5_WR ONG_PR OPERT 4512 Identificador de propriedade
Y do programa errado

ERR_T ER M INAL _WR ONG_PR OP 4513 Identificador de propriedade


ERTY do terminal errado

ERR_FTP_SEND_FAILED 4514 Envio de arquivo via ftp falhou

ERR_NOTIFICATION_SEND_FAI 4515 Falha ao enviar uma


LED notificação

ERR_NOTIFICATION_WR ONG_P 4516 Parâmetro inválido para enviar


AR AMET ER uma notificação – uma string
vazia ou NULL foi passada
para a função
SendNotification()

ERR_NOTIFICATION_WR ONG_S 4517 Configurações de notificações


ETTINGS erradas no terminal (ID não
está especificado ou
permissão não está definida)

ERR_NOTIFICATION_T OO_FR E 4518 Freqüência de envio de


QUENT notificações em excesso

ERR_FTP_NOSERVER 4519 O servidor FTP não está


especificado nos atributos de
configuração

© 2000-2018, MetaQuotes Software Corp.


835 Constantes, Enumeradores e Estruturas

ERR_FTP_NOLOGIN 4520 O login FTP não está


especificado nos atributos de
configuração

ERR_FTP_FILE_ERR OR 4521 O ficheiro não existe

ERR_FTP_CONNECT_FAILED 4522 A ligação ao servidor FTP


falhou

ERR_FTP_CH ANGEDIR 4523 Não foi encontrado o diretório


no servidor FTP para o upload
do ficheiro

ERR_FTP_CLOSED 4524 A ligação ao servidor FTP foi


fechada

Buffers de Indicador
Customizado
ERR_BUFFER S _NO_MEMORY 4601 Sem memória suficiente para
a distribuição de buffers de
indicador

ERR_BUFFER S _WR ONG_INDEX 4602 Índice de buffer de indicador


errado

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

ERR_TR ADE_WR ONG_PR OPER 4751 Identificador (ID) de


TY propriedade da negociação
(trade) errado

ERR_TR ADE_DISABLED 4752 Negociação via Expert


Advisors proibida

ERR_TR ADE_POS ITION_NOT_F 4753 Posição não encontrada


OUND

ERR_TR ADE_ORDER_NOT_FOU 4754 Ordem não encontrada


ND
ERR_TR ADE_DEAL _NOT_FOUN 4755 Operação (deal) não
D encontrada

ERR_TR ADE_SEND_FAILED 4756 Envio de solicitação de


negociação falhou

© 2000-2018, MetaQuotes Software Corp.


836 Constantes, Enumeradores e Estruturas

ERR_TR ADE_CALC_FAILED 4758 Imposs ível calcular o valor do


índice de negociação
Indicadores
ERR_INDICAT OR_UNKNOWN_S 4801 Ativo desconhecido
YM BOL
ERR_INDICAT OR_CANNOT_CR E 4802 Indicador não pode ser criado
AT E

ERR_INDICAT OR_NO_MEMORY 4803 Sem memória suficiente para


adicionar o indicador

ERR_INDICAT OR_CANNOT_APP 4804 O indicador não pode ser


LY aplicado a um outro indicador

ERR_INDICAT OR_CANNOT_ADD 4805 Erro ao aplicar um indicador


ao gráfico

ERR_INDICAT OR_DAT A_NOT_F 4806 Dado solicitado não


OUND encontrado

ERR_INDICAT OR_WR ONG_H AN 4807 Manuseio de indicador errado


DLE
ERR_INDICAT OR_WR ONG_PAR 4808 Numero errado de parâmetros
AMET ER S ao criar um indicador

ERR_INDICAT OR_PAR AMET ER S 4809 Sem parâmetros ao criar um


_M ISS ING indicador

ERR_INDICAT OR_CUS T OM _NA 4810 O primeiro parâmetro no array


ME deve ser o nome do indicador
customizado

ERR_INDICAT OR_PAR AMET ER_ 4811 T ipo de parâmetro inválido no


TYPE array ao criar um indicador

ERR_INDICAT OR_WR ONG_INDE 4812 Índice errado de buffer do


X indicador solicitado

Profundidade de Mercado
ERR_BOOKS _CANNOT_ADD 4901 Profundidade de Mercado não
pode ser adicionado

ERR_BOOKS _CANNOT_DELET E 4902 Profundidade de Mercado não


pode ser removido

ERR_BOOKS _CANNOT_GET 4903 Os dados da Profundidade de


Mercado não podem ser
obtidos

ERR_BOOKS _CANNOT_SUBSCRI 4904 Erro em subscrever para


BE receber novos dados da
Profundidade de Mercado

© 2000-2018, MetaQuotes Software Corp.


837 Constantes, Enumeradores e Estruturas

Operações de Arquivo
ERR_T OO_MANY_FILES 5001 Mais que 64 arquivos não
podem ser abertos ao mesmo
tempo

ERR_WR ONG_FILENAME 5002 Nome de arquivo inválido


ERR_T OO_LONG_FILENAME 5003 Nome de arquivo longo demais
ERR_CANNOT_OPEN_FILE 5004 Erro de abertura de arquivo

ERR_FILE_CACH EBUFFER_ERR 5005 Sem memória suficiente de


OR cache para leitura

ERR_CANNOT_DELET E_FILE 5006 Erro excluindo arquivo

ERR_INVAL ID_FILEH ANDLE 5007 Um arquivo com este handle


foi fechado, ou simplesmente
não estava aberto

ERR_WR ONG_FILEH ANDLE 5008 H andle de arquivo errado


ERR_FILE_NOTT OWRIT E 5009 O arquivo deve estar abertura
para escrita

ERR_FILE_NOTT OR EAD 5010 O arquivo deve estar aberto


para leitura

ERR_FILE_NOTBIN 5011 O arquivo deve estar aberto


como um arquivo binário

ERR_FILE_NOTTXT 5012 O arquivo deve estar aberto


como um texto

ERR_FILE_NOTTXT OR CS V 5013 O arquivo deve estar aberto


como um texto ou CS V

ERR_FILE_NOT CS V 5014 O arquivo deve estar aberto


como CS V

ERR_FILE_R EADERR OR 5015 Erro de leitura de arquivo

ERR_FILE_BINS TRINGS IZE 5016 T amanho da string deve estar


especificado, porque o arquivo
está aberto como binário

ERR_INCOM PATIBLE_FILE 5017 Um arquivo de texto deve ser


usado para arrays de strings,
para outros arrays - binários

ERR_FILE_IS _DIR ECT ORY 5018 Isto não é um arquivo, isto é


um diretório

ERR_FILE_NOT_EXIS T 5019 Arquivo inexistente

ERR_FILE_CANNOT_R EWRIT E 5020 Arquivo não pode ser reescrito

© 2000-2018, MetaQuotes Software Corp.


838 Constantes, Enumeradores e Estruturas

ERR_WR ONG_DIR ECT ORYNAM 5021 Nome de diretório errado


E

ERR_DIR ECT ORY_NOT_EXIS T 5022 Diretório inexistente


ERR_FILE_IS NOT_DIR ECT ORY 5023 Isto é um arquivo, não um
diretório

ERR_CANNOT_DELET E_DIR ECT 5024 O diretório não pode ser


ORY removido

ERR_CANNOT_CLEAN_DIR ECT 5025 Falha ao limpar o diretório


ORY (provavelmente um ou mais
arquivos estão bloqueados e a
operação de remoção falhou)

ERR_FILE_WRIT EERR OR 5026 Falha ao escrever um recurso


para um arquivo

ERR_FILE_ENDOFFILE 5027

Conversão de String
ERR_NO_S TRING_DAT E 5030 Sem data na string

ERR_WR ONG_S TRING_DAT E 5031 Data errada na string


ERR_WR ONG_S TRING_TIME 5032 H ora errada na string
ERR_S TRING_TIME_ERR OR 5033 Erro convertendo string em
data

ERR_S TRING_OUT_OF_MEMOR 5034 Sem memória suficiente para


Y a string

ERR_S TRING_SMALL _LEN 5035 O comprimento da string é


menor que o esperado

ERR_S TRING_T OO_BIGNUM BER 5036 Número grande demais, maior


que ULONG_MAX

ERR_WR ONG_FOR MAT S TRING 5037 string de formato inválido

ERR_T OO_MANY_FOR MATT ER 5038 Quantidade de especificadores


S de formato maior que de
parâmetros

ERR_T OO_MANY_PAR AMET ER S 5039 Quantidade de parâmetros


maior que de especificadores
de formato

ERR_WR ONG_S TRING_PAR AME 5040 Parâmetro de tipo string


T ER defeituoso

ERR_S TRINGPOS _OUT OFR ANG 5041 Posição fora da string


E

© 2000-2018, MetaQuotes Software Corp.


839 Constantes, Enumeradores e Estruturas

ERR_S TRING_ZER OADDED 5042 0 adicionado ao final da


string, uma operação inútil

ERR_S TRING_UNKNOWNTYPE 5043 T ipo de dado desconhecido ao


converter para uma string

ERR_WR ONG_S TRING_OBJECT 5044 Objeto de string defeituoso

Operações com Arrays


ERR_INCOM PATIBLE_ARR AYS 5050 Copiando arrays
incompatíveis. Array de string
pode ser copiado somente
para um array de string, e um
array numérico - somente em
um array numérico

ERR_SMALL _ASSERIES _ARR AY 5051 O array de recepção está


declarado como AS _SERIES, e
é de tamanho insuficiente.

ERR_SMALL _ARR AY 5052 Array pequeno demais, a


posição inicial está fora do
array

ERR_ZER OS IZE_ARR AY 5053 Um array de comprimento zero

ERR_NUM BER_ARR AYS _ONL Y 5054 Deve ser um array numérico


ERR_ONEDIM _ARR AYS _ONL Y 5055 Deve ser um array
unidimensional

ERR_SERIES _ARR AY 5056 Série de tempo (timeseries)


não pode ser usada

ERR_DOUBLE_ARR AY_ONL Y 5057 Deve ser um array de tipo


double

ERR_FLOAT_ARR AY_ONL Y 5058 Deve ser um array de tipo


float

ERR_LONG_ARR AY_ONL Y 5059 Deve ser um array de tipo long


ERR_INT_ARR AY_ONL Y 5060 Deve ser um array de tipo int
ERR_S H ORT_ARR AY_ONL Y 5061 Deve ser um array de tipo
s hort

ERR_CH AR_ARR AY_ONL Y 5062 Deve ser um array de tipo char


ERR_S TRING_ARR AY_ONL Y 5063 Deve ser uma matriz do tipo
cadeia de caracteres

Operações com OpenCL


ERR_OPENCL _NOT_SUPPORT E 5100 Funções OpenCL não são
D suportados neste computador

© 2000-2018, MetaQuotes Software Corp.


840 Constantes, Enumeradores e Estruturas

ERR_OPENCL _INT ERNAL 5101 Erro interno ocorreu ao


executar OpenCL

ERR_OPENCL _INVAL ID_H ANDL 5102 H andle de OpenCL inválido


E

ERR_OPENCL _CONT EXT_CR EA 5103 Erro criando o contexto de


TE OpenCL

ERR_OPENCL _QUEUE_CR EAT E 5104 Falha ao criar um fila de


execução em OpenCL

ERR_OPENCL _PR OGR AM _CR EA 5105 Erro ocorreu ao compilar um


TE programa OpenCL

ERR_OPENCL _T OO_LONG_KER 5106 Nome de k ernel longo


NEL_NAME demais(k ernel de OpenCL)

ERR_OPENCL _KERNEL _CR EAT E 5107 Erro criando um k ernel de


OpenCL

ERR_OPENCL _SET_KERNEL _PA 5108 Erro ocorreu ao configurar


RAMET ER parâmetrospara o k ernel de
OpenCL

ERR_OPENCL _EXECUT E 5109 Erro em tempo de execução de


programa de OpenCL

ERR_OPENCL _WR ONG_BUFFER 5110 T amanho inválido do buffer de


_S IZE OpenCL

ERR_OPENCL _WR ONG_BUFFER 5111 Deslocamento (offset) inválido


_OFFSET do buffer de OpenCL

ERR_OPENCL _BUFFER_CR EAT E 5112 Falha ao criar um buffer de


OpenCL

ERR_OPENCL _T OO_MANY_OBJ 5113 Excedido o número máximo de


ECT S objetos OpenCL

ERR_OPENCL _SELECTDEVICE 5114 Erro ao selecionar o


dispositivo OpenCL

Operations with W ebRequest


ERR_W EBR EQUES T_INVAL ID_A 5200 UR L inválido
DDRESS
ERR_W EBR EQUES T_CONNECT_ 5201 Falha ao conectar com o URL
FAILED especificado

ERR_W EBR EQUES T_TIMEOUT 5202 T empo limite excedido


ERR_W EBR EQUES T_R EQUES T_ 5203 Falha na solicitação do HTTP
FAILED
Símbolos personalizados

© 2000-2018, MetaQuotes Software Corp.


841 Constantes, Enumeradores e Estruturas

ERR_NOT_CUS T OM _S YM BOL 5300 Deve ser especificado o


s ímbolo personalizado

ERR_CUS T OM _S YM BOL _WR ON 5301 Nome de s ímbolo


G_NAME personalizado incorreto. No
nome do s ímbolo é poss ível
utilizar apenas caracteres
latinos sem pontuação,
espaços e caracteres especiais
(são permitidos " ." , "_" , "&" e
"#" ). Não é recomendado usar
os caracteres <, >, :, " , /,\, |,
?, *.
ERR_CUS T OM _S YM BOL _NAME_ 5302 Nome demasiado longo para o
LONG s ímbolo personalizado. O
nome não pode exceder 32
caracteres tendo em conta o 0
final

ERR_CUS T OM _S YM BOL _PATH_ 5303 Caminho demasiado longo


LONG para o s ímbolo personalizado.
A caminho não deve exceder
128 caracteres, tendo em
conta " Custom\\" , o nome do
s ímbolo, separadores de
grupos e o 0 final

ERR_CUS T OM _S YM BOL _EXIS T 5304 Já existe um caráter


personalizado com esse nome

ERR_CUS T OM _S YM BOL _ERR OR 5305 Erro ao criar, excluir ou


modificar o s ímbolo
personalizado

ERR_CUS T OM _S YM BOL _SELEC 5306 T entativa de excluir um


T ED s ímbolo personalizado
selecionado na Observação do
mercado (Mark et W atch)

ERR_CUS T OM _S YM BOL _PR OPE 5307 Propriedade de s ímbolo


RTY_WRONG personalizado incorreto

ERR_CUS T OM _S YM BOL _PAR AM 5308 Parâmetro errado ao definir


ET ER_ERR OR propriedade do s ímbolo
personalizado

ERR_CUS T OM _S YM BOL _PAR AM 5309 Parâmetro de cadeia muito


ET ER_LONG longo ao definir propriedade
do s ímbolo personalizado

ERR_CUS T OM _TICKS _WR ONG_ 5310


ORDER

Erros Definidos pelo Usuário

© 2000-2018, MetaQuotes Software Corp.


842 Constantes, Enumeradores e Estruturas

ERR_USER_ERR OR_FIR S T 65536 Erros definidos pelo


usuáriocomeçam com este
código

Veja Também
Códigos de R etorno do Servidor de Negociação

© 2000-2018, MetaQuotes Software Corp.


843 Constantes, Enumeradores e Estruturas

Constantes de Entrada e Saída


Constantes :

· Flags de abertura de arquivo


· Propriedades de arquivo
· Posicionamento dentro de um arquivo
· Uso de code page

· MessageBox

© 2000-2018, MetaQuotes Software Corp.


844 Constantes, Enumeradores e Estruturas

Flags de Abertura de Arquivo


Valores de flags de abertura de arquivo especificam o modo de acesso do arquivo. Flags são definidos
como se segue:

Identificador Valor Descrição


FILE_READ 1 Arquivo é aberto para leitura.
Flag é usado em FileOpen(). Ao
abrir um arquivo, a
especificação de FILE_WRIT E
e/ou FILE_R EAD é requerida.

FILE_WRIT E 2 Arquivo é aberto para escrita.


Flag é usado em FileOpen(). Ao
abrir um arquivo, a
especificação de FILE_WRIT E
e/ou FILE_R EAD é requerida.

FILE_BIN 4 Modo de leitura/escrita binária


(sem conversão string para
string). Flag é usado em
FileOpen()
FILE_CS V 8 Arquivo CS V (todos seus
elementos são convertidos para
strings do tipo apropriado,
unicode ou ansi, e separados
por separador). Flag é usado
em FileOpen()

FILE_TXT 16 Arquivo de texto simples


(semelhando ao arquivo csv,
mas sem levar em conta os
separadores). Flag é usado em
FileOpen()
FILE_ANS I 32 Strings de tipo ANS I (s ímbolos
de um byte). Flag é usado em
FileOpen()
FILE_UNICODE 64 Strings de tipo UNICODE
(s ímbolos de dois bytes). Flag é
usado em FileOpen()

FILE_S H ARE_READ 128 Acesso compartilhado para


leitura a partir de vários
programas. Flag é usado em
FileOpen(), mas ele não
substitui a necessidade de
indicar o flag FILE_WRIT E e/ou
FILE_READ ao abrir um
arquivo.

© 2000-2018, MetaQuotes Software Corp.


845 Constantes, Enumeradores e Estruturas

FILE_S H ARE_WRIT E 256 Acesso compartilhado para


escrita a partir de vários
programas. Flag é usado em
FileOpen(), mas ele não
substitui a necessidade de
indicar o flag FILE_WRIT E e/ou
FILE_READ ao abrir um
arquivo.

FILE_REWRIT E 512 Possibilidade de reescrever o


arquivo usando as funções
FileCopy() e FileMove(). O
arquivo deve existir ou deve
estar aberto para escrita, de
outra forma o arquivo não será
aberto.

FILE_COMMON 4096 O caminho do arquivo na pasta


comum de todos os terminais
cliente
\T erminal\Common\Files. Flag
é usado em funções FileOpen(),
FileCopy(), FileMove() e em
FileIsExist().

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);

Existem algumas características específicas de funcionamento ao se especificar flags de leitura e


escrita:

· Se FILE_READ é 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.
· FILE_READ|FILE_WRIT E – um novo arquivo é criado caso o arquivo com o nome especificado não
exista.
· FILE_WRIT E – o arquivo é criado novamente com tamanho zero.
Ao abrir um arquivo, a especificação de FILE_WRIT E e/ou FILE_R EAD é requerida.

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.

© 2000-2018, MetaQuotes Software Corp.


846 Constantes, Enumeradores e Estruturas

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

© 2000-2018, MetaQuotes Software Corp.


847 Constantes, Enumeradores e Estruturas

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
FILE_CREAT E_DAT E Data de criação
FILE_MODIFY_DAT E Data da última modificação
FILE_ACCESS _DAT E Data do último acesso ao arquivo
FILE_S IZE T amanho de arquivo em bytes
FILE_POS ITION Posição de um ponteiro no arquivo
FILE_END Obtém o sinal de término de arquivo

FILE_LINE_END Obtém o sinal de termino de linha

FILE_IS _COMMON O arquivo está aberto em uma pasta


compartilhada por todos os terminais (veja
FILE_COMMON)
FILE_IS _T EXT O arquivo está aberto como um arquivo de
texto (veja FILE_TXT )

FILE_IS _BINARY O arquivo está aberto como um arquivo binário


(veja FILE_BIN)

FILE_IS _CS V O arquivo está aberto como CS V (veja


FILE_CS V)
FILE_IS _ANS I O arquivo está aberto como ANS I (veja
FILE_ANS I)
FILE_IS _READABLE O arquivo aberto pode ser lido (veja
FILE_READ)
FILE_IS _WRIT ABLE O arquivo aberto pode ser escrito (veja
FILE_WRIT E)

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.

A segunda opção da função FileGetInteger() retorna valores de propriedades de arquivo através do


nome do arquivo. Usando esta opção, somente as seguintes propriedades gerais podem ser obtidas :

· FILE_EXIS T S – existência de um arquivo com o nome especificado


· FILE_CREAT E_DAT E – data de criação do arquivo com o nome especificado

© 2000-2018, MetaQuotes Software Corp.


848 Constantes, Enumeradores e Estruturas

· FILE_MODIFY_DAT E – data de modificação do arquivo com o nome especificado


· FILE_ACCESS _DAT E - data do último acesso ao arquivo com o nome especificado
· FILE_S IZE – tamanho do arquivo com o nome especificado
Ao tentar obter propriedades outras daquelas especificadas acima, a segunda opção de chamada de
FileGetInteger() retornará um erro.

© 2000-2018, MetaQuotes Software Corp.


849 Constantes, Enumeradores e Estruturas

Posicionamento Dentro de um Arquivo


A maioria das funções de arquivo é associada com operações leitura/escrita de dados. Ao mesmo
tempo, usando a função FileSeek () você pode especificar a posição de um ponteiro de arquivo para
uma posição dentro do arquivo, a partir da qual a próxima operação de leitura ou escrita será
realizada. A enumeração ENUM _FILE_POS ITION contém posições válidas de ponteiro, com a qual você
pode especificar um deslocamento em bytes para a próxima operação.

ENUM_FILE_POSITION

Identificador Descrição
SEEK_SET Início de arquivo
SEEK_CUR Posição corrente de um ponteiro de arquivo
SEEK_END Fim de arquivo

Também Veja
FileIsEnding, FileIsLineEnding

© 2000-2018, MetaQuotes Software Corp.


850 Constantes, Enumeradores e Estruturas

Usando um Código de Página (Codepage) em Operações de


Conversão de String
Ao converter variáveis string em arrays de tipo char e vice-versa, a codificação que por default
correspodente ao ANS I corrente do sistema operacional W indows (CP_ACP) é usada em MQL5. Se você
quiser especificar um tipo diferente de codificação, isso pode ser definido como parâmetro adicional
para as funções CharArrayT oString(), String T oCharArray() e FileOpen().

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.

Constantes Internas de Código de Páginas (Codepages)

Constante Valor Descrição


CP_ACP 0 O código de página ANS I do
W indows corrente.
CP_OEMCP 1 O código de página do sistema
OEM corrente.

CP_MACCP 2 O código de página do sistema


Macintos h corrente.
Note: Este valor é usado
principalmente em códigos de
programa criados antigamente
e está sem uso atualmente, já
que computadores Macintos h
modernos usando Unicode para
codificação.

CP_THR EAD_ACP 3 O código de página ANS I do


W indows para o thread
corrente.

CP_S YM BOL 42 Código de página de s ímbolo

CP_UTF7 65000 Código de página UTF-7.

CP_UTF8 65001 Código de página UTF-8.

Também Veja
Propriedades do T erminal Cliente

© 2000-2018, MetaQuotes Software Corp.


851 Constantes, Enumeradores e Estruturas

Constantes da Janela de Diálogo MessageBox


Esta seção contém códigos de retorno da função MessageBox(). Se um janela de mensagem tem um
botão Cancel, a função retorna IDCANCEL no caso da tecla ESC ou o botão Cancel serem pressionados.
Caso não exista nenhum botão Cancel na janela de mensagem, pressionar o ESC não produz nenhum
efeito.

Constante Valor Descrição


IDOK 1 Botão " OK" foi pressionado
IDCANCEL 2 Botão " Cancel" foi pressionado
IDABORT 3 Botão " Abort" foi pressionado
IDRETRY 4 Botão "Retry" foi pressionado
IDIGNORE 5 Botão "Ignore" foi pressionado
IDYES 6 Botão "Yes " foi pressionado
IDNO 7 Botão "No" foi pressionado
IDTRYAGAIN 10 Botão "T ry Again" foi
pressionado

IDCONTINUE 11 Botão " Continue" foi


pressionado

Os principais flags da função MessageBox() definem o conteúdo e comportamento da janela de


diálogo. Este valor pode ser uma combinação dos seguintes grupos de flag :

Constante Valor Descrição


M B_OK 0x 00000000 Janela de mensagem contém
somente um botão: OK.
Default
M B_OKCANCEL 0x 00000001 Janela de mensagem contém
dois botões : OK e Cancel

M B_ABORTR ETRYIGNOR E 0x 00000002 Janela de mensagem contém


três botões : Abort, R etry e
Ignore
M B_YES NOCANCEL 0x 00000003 Janela de mensagem contém
três botões : Yes, No e Cancel

M B_YES NO 0x 00000004 Janela de mensagem contém


dois botões : Yes e No

M B_R ETRYCANCEL 0x 00000005 Janela de mensagem contém


dois botões : R etry e Cancel

© 2000-2018, MetaQuotes Software Corp.


852 Constantes, Enumeradores e Estruturas

M B_CANCEL TRYCONTINUE 0x 00000006 Janela de mensagem contém


três botões : Cancel, T ry
Again, Continue

Para exibir um ícone na janela de mensagem é necessário especificar flags adicionais :

Constante Valor Descrição


M B_ICONS T OP, 0x 00000010 O ícone de sinal S T OP
M B_ICONERR OR ,
M B_ICONH AND

M B_ICONQUES TION 0x 00000020 O ícone de sinal de


interrogação

M B_ICONEXCLAMATION, 0x 00000030 O ícone de sinal de


M B_ICONW ARNING exclamação/aviso

M B_ICONINFOR MATION, 0x 00000040 O sinal i cercado


M B_ICONAS T ERIS K

Os botões default são definidos através dos seguintes flags :

Constante Valor Descrição


M B_DEFBUTT ON1 0x 00000000 O primeiro botão
M B_DEFBUTT ON1 - é o default,
se os outros botões
M B_DEFBUTT ON2,
M B_DEFBUTT ON3, ou
M B_DEFBUTT ON4 não forem
especificados

M B_DEFBUTT ON2 0x 00000100 O segundo botão é o default

M B_DEFBUTT ON3 0x 00000200 O terceiro botão é o default

M B_DEFBUTT ON4 0x 00000300 O quarto botão é o default

© 2000-2018, MetaQuotes Software Corp.


853 Programas MQL5

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.

Características operacionais de programas MQL5 são descritas nas seguintes seções :

· Execução de Programa – ordem de chamada de manipuladores de eventos predefinidos.


· T estando estratégias de negociação – características operacionais de programas MQL5 no Provador
de Estratégias.
· Eventos do terminal cliente – descrição de eventos, que podem ser processados em programas.
· Chamada de funções importadas – ordem de descrição, parâmetros permitidos, detalhes de busca e
convenção de chamada para funções importadas.
· Erros em tempo de execução – obtenção de informações sobre erros críticos e em tempo de
execução.

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 " .

A fim de parar um indicador customizado, ele deve ser removido de um gráfico.

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.

Em um gráfico podem operar no máximo um Expert Advisor, um script e um número ilimitado de


indicadores.

© 2000-2018, MetaQuotes Software Corp.


854 Programas MQL5

Execução de Programa
Cada script e cada Expert Advisor é executado em seu próprio segmento separado. T odos os
indicadores calculados sobre um s ímbolo, mesmo se eles estiverem anexados a difidentes gráficos,
trabalham em um mesmo segmento. Assim, todos os indicadores sobre um s ímbolo compartilham os
recursos de um segmento.

T odas as outras ações associadas a um s ímbolo, como processamento de tick s e sincronização de


histórico, também são consistentemente realizadas no mesmo segmento com indicadores. Isso
significa que se uma ação infinita é realizada em um indicador, todos os outros eventos associados a
seu ativo nunca serão realizados.

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.

A tabela abaixo contém um breve resumo sobre programas MQL5:

Programa Execução Observação


Script Um segmento separado, o Um script em loop não é capaz
número de segmentos para de interromper a execução de
scripts é igual ao número de outros programas
scripts

Expert Advisor Um segmento separado, o Um Expert Advisor em loop


número de segmentos para não é capaz de interromper a
Expert Advisor é igual ao execução de outros programas
número de Expert Advisor

Indicador Um segmento para todos os Um loop infinito em um


indicadores de um s ímbolo. O indicador irá parar todos os
número de segmentos é igual outros indicadores sobre este
ao número de s ímbolos com ativo
indicadores

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.

Tipo Nome da Parâmetros Aplicativo Comentário


F unção

int OnInit nenhum Expert Advisors H andler de


e indicadores evento Init. Ele
permite usar o

© 2000-2018, MetaQuotes Software Corp.


855 Programas MQL5

tipo de retorno
void.

void OnDeinit const int reason Expert Advisors H andler de


e indicadores evento Deinit.

void OnStart nenhum scripts H andler de


evento Start.

int OnCalculate const int indicadores H andler de evento


rates _total, Calculate para
const int todos os preços.
prev _calculated,
const datetime
&T ime[],
const double
&Open[],
const double
&H ig h[],
const double
&Low[],
const double
&Close[],
const long
&T ickVolume[],
const long
&Volume[],
const int
&Spread[]
int OnCalculate const int indicadores H andler de
rates _total, evento Calculate
const int sobre um array
prev _calculated, único de dados.
const int begin, Um indicador não
const double pode ter
&price[] simultaneamente
dois handlers de
evento.
Neste caso
apenas um
handler
(manipulador) de
evento vai
trabalhar na
array de dados.

void OnT ick nenhum Expert Advisors H andler de


evento NewT ick .
Enquanto o
evento de
recebimento de

© 2000-2018, MetaQuotes Software Corp.


856 Programas MQL5

um novo tick
está sendo
processado,
nenhum outro
evento deste
tipo é recebido.

void OnT imer nenhum Expert Advisors H andler de


e indicadores evento T imer.

void OnT rade nenhum Expert Advisors H andler de


evento T rade.

double OnT ester nenhum Expert Advisors H andler de


evento T ester.

void OnChartEvent const int id, Expert Advisors H andler de


const long e indicadores evento
&lparam, ChartEvent.
const double
&dparam,
const string
&sparam
void OnBook Event const string Expert Advisors H andler de
&s ymbol_name e indicadores evento
Book Event.

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.

Não é recomendável usar loops infinitos para tratar eventos. A exceção a esta regra poderiam ser
scripts somente, que processam só um único evento, Start.

Bibliotecas não tratam nenhum evento.

© 2000-2018, MetaQuotes Software Corp.


857 Programas MQL5

Funç õ es proibidas em Indicadores e Expert Advisors


Indicatores, scripts e Expert Advisors são programas executáveis escritos em MQL5. Eles são
projetados para diferentes tipos de tarefas. Portanto existem algumas restrições quanto ao uso de
certas funções, dependendo do tipo de programa. As seguintes funções são proibidas em indicadores :

· OrderCalcMargin();

· OrderCalcProfit();

· OrderCheck ();

· OrderSend();

· SendFTP();

· Sleep();

· ExpertR emove();

· MessageBox().

T odas as funções projetadas para indicadores são proibidas em Expert Advisors e scripts :
· SetI ndex Buffer();

· I ndicatorSetDouble();

· I ndicatorSetI nteger();

· I ndicatorSetString();

· PlotIndexSetDouble();
· PlotIndexSetInteger();
· PlotIndexSetString();
· PlotIndex GetInteger.
A biblioteca (library) não é um programa independente e é executado no contexto do programa MQL5
que a chamou: script, indicador ou Expert Advisor. Desta forma, as restrições acima se aplicam à
biblioteca (library) chamada.

Carga e Descarga de Indicadores


Indicadores são carregados nos seguintes casos :
· um indicador é anexado a um gráfico;

· inicio do terminal (se o indicador estava anexado a um gráfico antes do encerramento do terminal);

· carga de um template (se o indicador anexado a um gráfico estiver especificado no template);

· alteração de um perfil (se o indicador estiver anexado a um dos gráficos do perfil alterado);

· alteração de um ativo e/ou período de um gráfico, no qual o indicador está anexado;

· após uma bem sucedida recompilação de um indicador, se o indicador estiver anexado a um gráfico;

· alteração de parâmetros de entrada do indicador.

© 2000-2018, MetaQuotes Software Corp.


858 Programas MQL5

Indicadores são descarregados nos seguintes casos :


· ao desanexar um indicador de um gráfico;

· encerramento do terminal (se o indicador estiver anexado a um gráfico);

· carga de um template, se um indicador estiver anexado a um gráfico;

· fechamento de um gráfico, no qual o indicador estava anexado;

· alteração de um perfil, se o indicador estiver anexado a um dos gráficos do perfil alterado;

· alteração de um ativo e/ou período de um gráfico, no qual o indicador está anexado;


· alteração de parâmetros de entrada do indicador.

Carga e Descarga de Expert Advisors


Expert Advisors são carregados nos seguintes casos :

· ao anexar um Expert Advisor 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.

Expert Advisors são descarregados nos seguintes casos :

· ao desanexar um Expert Advisor de um gráfico;

· 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);

· carga de um template, se um Expert Advisor está anexado a um gráfico;

· fechamento de um gráfico, no qual o Expert Advisor está anexado.

· 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.

Carga e Descarga de Scripts

© 2000-2018, MetaQuotes Software Corp.


859 Programas MQL5

Scripts são carregados imediatamente após eles serem anexados a um gráfico e descarregados
imediatamente após eles concluírem sua operação. OnInit() e OnDeinit() não são chamados por
scripts.

Quando um programa é descarregado (excluído de um gráfico) o terminal cliente realiza a


desinicialização de variáveis globais e excluí a fila de eventos. Neste caso a desinicialização significa
a redefinição de todas as variáveis de tipo string, desalocação de objetos de array dinâmico e
chamada de seus destrutores se eles estiverem disponíveis.

Para um melhor entendimento do funcionamento de um Expert Advisor, nós recomendamos compilar o


código do seguinte Expert Advisor e realizar ações de carga/descarga, alteração de template,
alteração de ativo, alteração de período, etc:

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);
}
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


860 Programas MQL5

//| Função tick (ponto) de um Expert |


//+------------------------------------------------------------------+
void OnTick()
{
//---

}
//+------------------------------------------------------------------+

Também Veja
Eventos do terminal cliente, H andlers de Evento

© 2000-2018, MetaQuotes Software Corp.


861 Programas MQL5

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 :

– permite-lhe criar um modelo com uma função de manipulação de eventos


· Expert Advisor (modelo)
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.

Verificando a Permissão para Realizar uma Negociação


Automatizada
A fim de desenvolver um Expert Advisor confiável capaz de trabalhar sem intervenção humana, é
necessário organizar um conjunto de verificações importantes. Primeiro, devemos verificar
programaticamente se a negociação é permitida em tudo. Esta é uma verificação básica que é
indispensável ao desenvolver qualquer sistema automatizado.

Verificaç ão da permissão para realizar a negociaç ão automatizada no terminal

© 2000-2018, MetaQuotes Software Corp.


862 Programas MQL5

As configurações de terminal fornecem a você a capacidade de permitir ou proibir a negociação


automatizada de todos os programas.

Você pode alternar a opção de negociação automatizada diretamente no painel Padrão do terminal:

· – negociação automatizada habilitada, funções de negociação em aplicativos


lançados são permitidos para uso.

· – negociação automatizada desabilitada, as aplicações em execução não


conseguem executar funções de negociação.

Verificar amostra:

if (!TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
Alert("Verifique se a negociação automatizada é permitida nas configurações do terminal!");

Verificando se a negociaç ão é permitida para uma determinada execuç ão do


Expert Advisor/script
Você pode permitir ou proibir a negociação automatizada para um determinado programa ao lançá-lo.
Para fazer isso, use a caixa de seleção especial nas propriedades do programa.

© 2000-2018, MetaQuotes Software Corp.


863 Programas MQL5

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__);
}

Verificando se a negociaç ão é permitida para qualquer Expert Advisors/scripts


para a conta corrente
A negociação automatizada pode ser desativada no lado do servidor de negociação. Verificar amostra:

if(!AccountInfoInteger(ACCOUNT_TRADE_EXPERT))
Alert("Negociação automatizada é proibida para a conta ",AccountInfoInteger(ACCOUNT_LOGIN),
" no lado do servidor de negociação");

Se a negociação automatizada estiver desativada para uma conta de negociação, as operações de


negociação de Expert Advisors /scripts não serão executadas.

Verificando se a negociaç ão é permitida para a conta corrente


Em alguns casos, quaisquer operações de negociação são desativadas para uma determinada conta de
negociação - nem manual nem automatizado de negociação pode ser realizada. Exemplo de verificação
quando uma senha de investidor foi usada para conectar-se a uma conta 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:",

© 2000-2018, MetaQuotes Software Corp.


864 Programas MQL5

"\n\'",AccountInfoInteger(ACCOUNT_LOGIN),"\': negociação foi desativada - modo investid

AccountInfoInteger(ACCOUNT_TR ADE_ALLOW ED) deve retornar falsa nos casos seguintes :

· Sem conexão com o servidor de negociação. Isso pode ser verificado usando
T erminalInfoInteger(T ERM INAL_CONNECT ED);
· Conta de negociação comutada para modo somente leitura (enviada para o arquivo);

· A negociação na conta é desativada no lado do servidor de negociação;

· A conexão com uma conta de negociação foi realizada no modo I nvestidor.

Veja também
Propriedades do terminal do cliente, Propriedades da Conta, Propriedades de um programa MQL5 em
execução

© 2000-2018, MetaQuotes Software Corp.


865 Programas MQL5

Eventos do Terminal Cliente


Init

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

Antes de variáveis globais serem desinicializadas e o programa (Expert Advisor ou indicador


customizado) ser descarregado, o terminal cliente envia o evento Deinit para o programa. Deinit é
também gerado quando o terminal cliente é encerrado, quando um gráfico é fechado, logo antes o
ativo e/ou período ser alterado, em uma recompilação de programa bem sucedida, quando parâmetros
de input são alterados e quando a conta é alterada.

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

O evento Start é um evento especial para ativação de script após ele ser carregado. O evento é
processado pelo handler (manipulador) OnStart. O evento Start não é enviado para Expert Advisor ou
indicadores customizados.

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.

© 2000-2018, MetaQuotes Software Corp.


866 Programas MQL5

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:

· envio, modificação e remoção de uma ordem pendente;

· cancelamento de uma ordem pendente com ausência de dinheiro suficiente ou expiração;

· ativação de uma ordem pendente;

· abertura, acréscimo ou encerramento de uma posição (ou parte da posição);

· modificação da posição aberta (alteração de stops - Stop Loss e/ou T ak e Profit).

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.

· Realização de operações no lado de um servidor de negociação.


As seguintes transações de negociação são realizadas como resultado destas ações :

· tratamento de uma solicitação de negociação

· mudança de ordens de abertura

· mudança de histórico de ordens

· mudança de histórico de operações (deals)

· 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().

© 2000-2018, MetaQuotes Software Corp.


867 Programas MQL5

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

O evento T esterDeinit é gerado após o fim de um otimização de um Expert Advisor no Provador de


Estratégia. O evento T esterDeinit é tratado pela função OnT esterDeinit().

ChartEvent

O evento ChartEvent é gerado pelo terminal cliente quando um usuário está trabalhando com um
gráfico:

· pressionar de teclado, quando a janela de gráfico está com foco

· objeto gráfico criado

· objeto gráfico excluído

· pressionar de mouse sobre um objeto gráfico do gráfico

· movimentação do objeto gráfico usando o mouse

· fim de edição de texto no LabelEdit

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

© 2000-2018, MetaQuotes Software Corp.


868 Programas MQL5

Recursos
Usando gráficos e som em programas MQL5
Programas em MQL5 permitem trabalhar com som e arquivos gráficos :
· PlaySound() executa um arquivo de som.
· 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:

//--- Pasta, na qual dados de terminal são armazenados


string terminal_path=TerminalInfoString(TERMINAL_PATH);

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:

//--- Pasta, na qual dados de terminal são armazenados


string terminal_data_path=TerminalInfoString(TERMINAL_DATA_PATH);

Por exemplo, se o arquivo de som 'Demo.wav ' está localizado em terminal_data_directory\MQL5\Files,


então a chamada de PlaySound() deveria ser escrita da seguinte forma:

//--- toca Demo.wav a partir da pasta terminal_directory_data\MQL5\Files\Demo.wav


PlaySound("\\Files\\Demo.wav");

© 2000-2018, MetaQuotes Software Corp.


869 Programas MQL5

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.

Call PlaySound() function with NULL parameter to stop playback:

//--- Chamar o PlaySound() com parâmetro NULL interrompe a reprodução


PlaySound(NULL);

ObjectCreate()
Exemplo de um Expert Advisor, que cria um rótulo gráfico (OBJ_BIT MAP_LABEL) usando a função
ObjectCreate().

string label_name="currency_label"; // nome do objeto OBJ_BITMAP_LABEL


string euro ="\\Images\\euro.bmp"; // caminho do arquivo terminal_dara_directory\MQL5\Image
string dollar ="\\Images\\dollar.bmp"; // caminho do arquivo terminal_dara_directory\MQL5\Image
//+------------------------------------------------------------------+
//| Função de inicialização do Expert  |
//+------------------------------------------------------------------+
int OnInit()
{
//--- cria um botão OBJ_BITMAP_LABEL, se ele já não tiver sido criado
if(ObjectFind(0,label_name)<0)
{
//--- tenta criar objeto OBJ_BITMAP_LABEL
bool created=ObjectCreate(0,label_name,OBJ_BITMAP_LABEL,0,0,0);
if(created)
{
//--- vincula o botão ao canto superior esquerdo do gráfico
ObjectSetInteger(0,label_name,OBJPROP_CORNER,CORNER_RIGHT_UPPER);
//--- agora configura as propriedades do objeto
ObjectSetInteger(0,label_name,OBJPROP_XDISTANCE,100);
ObjectSetInteger(0,label_name,OBJPROP_YDISTANCE,50);
//--- redefine o código do último erro para 0
ResetLastError();
//--- carrega uma figura para indicador o estado "Pressionado" do botão
bool set=ObjectSetString(0,label_name,OBJPROP_BMPFILE,0,euro);
//--- testa o resultado
if(!set)
{
PrintFormat("Falha no download a partir do arquivo de imagem %s. Código de erro %d",eur
}
ResetLastError();
//--- carrega uma figura para indicador do estado "Não pressionado" do botão

© 2000-2018, MetaQuotes Software Corp.


870 Programas MQL5

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:

string euro ="\\Images\\euro.bmp"; // caminho do arquivo terminal_dara_directory\MQL5\Image


string dollar ="\\Images\\dollar.bmp"; // caminho do arquivo terminal_dara_directory\MQL5\Image

Os arquivos estão localizados na pasta terminal_data_directory\MQL5\Images.

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.

© 2000-2018, MetaQuotes Software Corp.


871 Programas MQL5

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_BM PFILE, 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.

Inclusão de recursos em arquivos executáveis durante compilação


de programas MQL5
Um programa mql5 pode precisar de um monte de diferentes recursos baixáveis na forma de arquivos
de imagem e som. A fim de eliminar a necessidade de transferir todos estes arquivos ao mover um
arquivo executável em MQL5, a diretriz do compilador #resource deve ser usada:

#resource path_to_resource_file

O comando #resource diz ao compilador que o recurso no caminho especificado path_to_resource_file


deve ser incluído dentro do arquivo executável EX5. Assim, todos os sons e imagens necessários
podem ser alocados diretamente dentro de um arquivo EX5, de modo que não exista necessidade de
transferir separadamente os arquivos nele usados, caso você queira executar o programa em um
terminal diferente. Qualquer arquivo EX5 pode conter recursos, e qualquer programa EX5 pode usar
recursos de um outro programa EX5.

Os arquivo em formato BM P e W AV são automaticamente comprimidos antes de serem incluídos em


um arquivo EX5. Isso significa que além de criar programas completos em MQL5, o uso de recursos
também permite reduzir o tamanho total dos arquivos necessários ao usar gráficos e sons, quando
comparado com a forma usual de escrever um programa MQL5.

O arquivo de recurso não deve exceder 16 Mb.

© 2000-2018, MetaQuotes Software Corp.


872 Programas MQL5

Busca por recursos específicos pelo compilador


Um recurso é inserido usando o comando #resorce "<path to the resource file>"

#resource "<path_to_resource_file>"

O comprimento da constante string <path_to_resource_file> não de exceder 63 caracteres.

O compilador busca por um recurso no caminho especificado na seguinte ordem:

· 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.

O caminho do recurso não pode conter as sub-cadeias " ..\\" e ":\\" .

Exemplos de inclusão de recurso:

//--- correct specification of resources


#resource "\\Images\\euro.bmp" // euro.bmp está localizado em terminal_data_directory\MQL5\Images\
#resource "picture.bmp" // picture.bmp está localizado no mesmo diretoria que o arquivo font
#resource "Resource\\map.bmp" // O recurso está localizado em source_file_directory\Resource\map.b

//--- especificação incorreta de recursos


#resource ":picture_2.bmp" // não deve conter ":"
#resource "..\\picture_3.bmp" // não deve conter ".."
#resource "\\Files\\Images\\Folder_First\\My_panel\\Labels\\too_long_path.bmp" //mais que 63 símbol

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 :

//--- exemplos de especificação de recurso e seus nomes em comentários


#resource "\\Images\\euro.bmp" // nome do recurso - Images\euro.bmp
#resource "picture.bmp" // nome do recurso - picture.bmp
#resource "Resource\\map.bmp" // nome do recurso - Resource\map.bmp
#resource "\\Files\\Pictures\\good.bmp" // nome do recurso - Files\Pictures\good.bmp
#resource "\\Files\\Demo.wav"; // nome do recurso - Files\Demo.wav"
#resource "\\Sounds\\thrill.wav"; // nome do recurso - Sounds\thrill.wav"
...

© 2000-2018, MetaQuotes Software Corp.


873 Programas MQL5

//--- utilização dos recursos


ObjectSetString(0,bitmap_name,OBJPROP_BMPFILE,0,"::Images\\euro.bmp");
...
ObjectSetString(0,my_bitmap,OBJPROP_BMPFILE,0,"::picture.bmp");
...
set=ObjectSetString(0,bitmap_label,OBJPROP_BMPFILE,1,"::Files\\Pictures\\good.bmp");
...
PlaySound("::Files\\Demo.wav");
...
PlaySound("::Sounds\\thrill.wav");

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_BM PFILE não pode ser modificado manualmente.
Por exemplo, para criar OBJ_BIT MAP_LABEL nós usados euro.bmp e dollar.bmp.

#resource "\\Images\\euro.bmp"; // euro.bmp está localizado em terminal_data_directory\MQL5\Imag


#resource "\\Images\\dollar.bmp"; // dollar.bmp está localizado em terminal_data_directory\MQL5\Im

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:

Usando os recursos em outros programas MQL5


Existe uma outra vantagem no uso de recurso – em qualquer programa MQL5, os recursos de um outro
arquivo EX5 podem ser usados. Assim, os recursos de um arquivo EX5 podem ser usados em muitos
outros programas MQL5.

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"

© 2000-2018, MetaQuotes Software Corp.


874 Programas MQL5

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.

//--- usando o curso no script


ObjectSetString(0,my_bitmap_name,OBJPROP_BMPFILE,0,"::Files\\triangle.bmp");

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:

//--- usando um recurso de um script em um EA


ObjectSetString(0,my_bitmap_name,OBJPROP_BMPFILE,0,"\\Scripts\\Draw_Triangles_Script.ex5::Files\\tr

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:

//--- chama recurso de script em um EA sem especificar o caminho


ObjectSetString(0,my_bitmap_name,OBJPROP_BMPFILE,0,"Draw_Triangles_Script.ex5::Files\\triangle.bmp"

então o arquivo será procurado na pasta terminal_data_directory\MQL5\Experts \, caso o Expert


Advisor esteja localizado em terminal_data_directory\MQL5\Experts \.

Trabalhando com indicadores personalizados que estão conectados como


recursos
O funcionamento de programas MQL5 pode exigir um ou mais indicadores personalizados, eles podem
ser incluídos no código do programa executável MQL5. A inclusão de indicadores como recursos
simplifica a distribuição de programas.

Exemplo de conexão e utilização do indicador personalizado SampleIndicator.ex5, localizado na pasta:


diretório_de_dados_do_terminal\MQL5\Indicators \:
//+------------------------------------------------------------------+
//| SampleEA.mq5 |
//| Copyright 2013, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#resource "\\Indicators\\SampleIndicator.ex5"
int handle_ind;
//+------------------------------------------------------------------+
//| Função de inicialização do Expert  |
//+------------------------------------------------------------------+
int OnInit()
{
//---
handle_ind=iCustom(_Symbol,_Period,"::Indicators\\SampleIndicator.ex5");

© 2000-2018, MetaQuotes Software Corp.


875 Programas MQL5

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>.

Por exemplo, se o indicador SampleIndicator.ex5 estiver incluído no Expert Advisor SampleEA.ex5


como um recurso, então o caminho para si mesmo será especificado ao chamar iCustom() na função
de inicialização do indicador personalizado, isso será da seguinte forma: "\\Experts \
\SampleEA.ex5::Indicators \\SampleIndicator.ex5" . Se for definido explicitamente o caminho, o
indicador personalizado SampleIndicator.ex5 será firmemente ligado ao Advisor SampleEA.ex5 e
perderá a capacidade de trabalhar de forma independente.

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);

© 2000-2018, MetaQuotes Software Corp.


876 Programas MQL5

}
//+------------------------------------------------------------------+
//| 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:

#resource caminho_para_o_arquivo_do_recurso as tipo_de_variável_de_recurso nome_de_variável_de_recu

© 2000-2018, MetaQuotes Software Corp.


877 Programas MQL5

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.

#resource "\\Images\\euro.bmp" as bitmap euro[][]


#resource "\\Images\\dollar.bmp"
//+------------------------------------------------------------------+
//| Função de criação de objeto OBJ_BITMAP_LABEL usando o recurso|
//+------------------------------------------------------------------+
void Image(string name,string rc,int x,int y)
{
ObjectCreate(0,name,OBJ_BITMAP_LABEL,0,0,0);
ObjectSetInteger(0,name,OBJPROP_XDISTANCE,x);
ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y);
ObjectSetString(0,name,OBJPROP_BMPFILE,rc);
}
//+------------------------------------------------------------------+
//| Função de início do programa script |
//+------------------------------------------------------------------+
void OnStart()
{
//--- imprimimos os tamanhos da imagem [width, height], que é armazenada na variável de recurso eur
Print(ArrayRange(euro,1),", ",ArrayRange(euro,0));
//--- alteramos a imagem no euro - desenhamos uma faixa horizontal no meio
for(int x=0;x<ArrayRange(euro,1);x++)
euro[ArrayRange(euro,1)/2][x]=0xFFFF0000;
//--- criamos o recurso gráfico usando a variável de recurso
ResourceCreate("euro_icon",euro,ArrayRange(euro,0),ArrayRange(euro,1),0,0,ArrayRange(euro,1),COL
//--- criamos objeto do rótulo gráfico Euro, para o qual colocamos a imagem a partir do recurso eur
Image("Euro","::euro_icon",10,40);
//--- outro modo de utilizar o recurso, nós não podemos desenhar nele
Image("USD","::Images\\dollar.bmp",15+ArrayRange(euro,1),40);
//--- a maneira direta de endereçamento para o recurso euro.bmp não está disponível, uma vez que el
Image("E2","::Images\\euro.bmp",20+ArrayRange(euro,1)*2,40); // acontece o erro de tempo de exec
}

Resultado 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.

© 2000-2018, MetaQuotes Software Corp.


878 Programas MQL5

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.

A utilização de variáveis de recurso é particularmente útil para publicar produtos no Mercado.

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.
· O tamanho do arquivo de recurso não pode ser maior do que 128 M B.
· Para arquivos de sequência de caracteres, a codificação de BOM (cabeçalho) é detectada
automaticamente. Se não houver nenhum BOM, a codificação será determinada pelo conteúdo. São
suportados arquivos codificados em ANS I, UTF-8 e UTF-16. T odas as cadeias de caracteres são
convertidas para Unicode.

Programas em OpenCL

© 2000-2018, MetaQuotes Software Corp.


879 Programas MQL5

A utilização de variáveis - de sequências de caracteres - de recurso pode facilitar muito a escrita de


alguns programas. Por exemplo, você pode escrever o código de um programa OpenCL num arquivo CL
separado e, em seguida, incluir esse arquivo - como uma cadeia de caracteres - nos recursos de seu
programa MQL5.

#resource "seascape.cl" as string cl_program


...
int context;
if((cl_program=CLProgramCreate(context,cl_program)!=INVALID_HANDLE)
{
//--- executa ações futuras com o programa 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
ResourceCreate(), ResourceSave(), PlaySound(), ObjectSetInteger(), ChartApplyT emplate(), Funções
de Arquivo

© 2000-2018, MetaQuotes Software Corp.


880 Programas MQL5

Chamadas de Funções Importadas


Para importar funções durante a execução de um programa-mql5, o terminal cliente usar " early
binding " . Isso significa que se um programa tem uma chamada de uma função importada, o
correspondente módulo (ex5 ou dll) é carregada durante a carga do programa. MQL5 e bibliotecas DLL
são executadas na thread do módulo da chamada.

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 ERM 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.

A biblioteca importada EX5 é procurada na seguinte seqüência:

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).

Funções importadas DLL em um programa-mql5 devem garantir a conformidade de chamadas do


W indows API. Para garantir tal conformidade, no texto fonte de programas escritos em C ou C++, use
a palavra-chave _stdcall, que é específico para os compiladores Microsoft(r). Esta conformidade é
caraterizada pelo seguinte:

· 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.

© 2000-2018, MetaQuotes Software Corp.


881 Programas MQL5

· 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.

© 2000-2018, MetaQuotes Software Corp.


882 Programas MQL5

Erros em Tempo de Execução


O subsistema de execução do terminal cliente tem a oportunidade de salvar o código do erro em caso
de ocorrência durante a execução de um programa MQL5. Existe um variável predefinida _LastError
para cada programa executável MQL5.

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:

· divisão por zero

· ir além dos limites de um array

· usando um ponteiro de objeto incorreto

© 2000-2018, MetaQuotes Software Corp.


883 Programas MQL5

Testando Estratégias de Negociação


A ideia de negociação automática é atraente pelo fato de que o robô de negociação pode trabalhar
sem parar 24 horas por dia, sete dias por semana. O robô não fica cansado, em dúvida, ou com medo,
ele é totalmente livre de quaisquer problemas psicológicos. Basta formalizar de forma clara as regras
de negociação e implementá-las nos algoritmos, e o robô está pronto para trabalhar incansavelmente.
Mas primeiro, você deve se certificar de que as duas condição importantes seguintes estão
satisfeitas :

· O Expert Advisor realiza operações de negociação em concordância com as regras do sistema de


negociação;
· A estratégia de negociação, implementada no EA, demonstra lucro no histórico.

Para obter respostas para estas questões, nos voltamos para o Provador de Estratégia, incluído no
terminal cliente MetaT rader 5.

Esta seção aborda as características do teste e otimização de programa no Provador de Estratégia:

· Function Limitations in the Strateg y T ester


· Modos de Geração de T ick
· Simulação de Spread

· Usando tick s reais durante os testes

· As Variáveis Globais do T erminal Cliente


· O Cálculo de I ndicadores durante um T este
· Carregando H istórico durante T este
· T este Multi-Moeda
· Simulação de T empo no Provador de Estratégia

· Objetos Gráficos no T este


· A Função OnT imer() no Provador de Estratégia

· A Função Sleep() no Provador de Estratégia

· Usando o Provador de Estratégia para Problemas de Otimização em Cálculos Matemáticos

· A Sincronização de Barras no modo " Somente Preço de Abertura"

· A função I ndicatorR elease() no Provador de Estratégia

· T ratamento de Evento no Provador de Estratégia


· Agentes de T este

· A T roca de Dados entre o T erminal e o Agente


· Usando a Pasta Compartilhada para T odos os T erminais Cliente
· Usando DLLs

Restrições de trabalho das funções no testador de estratégias de


negociação

© 2000-2018, MetaQuotes Software Corp.


884 Programas MQL5

Existem restrições no que diz respeito ao trabalho de algumas funções no testador de estratégias de
negociação

Funç õ es Comment(), Print() e PrintFormat()


A fim de aumentar o desempenho na otimização de parâmetros do expert, não são executadas as
funções Comment(), Print() e PrintFormat(). A exceção é o uso dessas funções dentro do manipulador
Oninit(). Isto torna mais fácil procurar as causas de erros quando eles ocorrem.

Funç õ es Alert(), MessageBox(), PlaySound(), SendFTP, SendMail(),


SendNotification(), WebRequest()
Funções de interação com o " mundo exterior" Alert(), MessageBox(), PlaySound(), SendFTP(),
SendMail(), SendNotification() e W ebR equest() não são executadas no testador de estratégias.

Modos de Geração de Tick


Um Expert Advisor é um programa, escrito em MQL5, que é rodado a cada instante em resposta a
algum evento externo. O EA tem uma função correspondente (handler de evento) para cada evento
pré-definido.

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
· OH LC por minuto (preços OH LC, Open-H ig h-Low-Close, com barras de minuto)

· Somente Preços de Abertura

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.

"Cada Tic k"


Os dados de cotação histórica para instrumentos financeiros são transferidos do servidor de
negociação para o terminal cliente MetaT rader 5 na forma de barras de minuto empacotadas.
Informações detalhadas sobre a ocorrência de solicitações e a construção das janelas de tempo
requiridas podem ser obtidas a partir do capítulo Organizando Acesso a Dados da R eferência MQL5.

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 :

· Abertura (Open) - o preço em que a barra de minuto foi aberta;

· Máximo (H ig h) - 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;

· Fechamento (Close) - o preço de fechamento da barra.

© 2000-2018, MetaQuotes Software Corp.


885 Programas MQL5

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 EUR US 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.

© 2000-2018, MetaQuotes Software Corp.


886 Programas MQL5

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.

"OHLC por minuto "


O modo " Cada T ick" é o mais preciso dos três modos, mas é ao mesmo tempo, o mais lento. A
execução do handler OnT ick () ocorre a cada tick , a mesmo tempo que o volume de tick pode ser muito
grande. Para uma estratégia, na qual a seqüência de tick s da movimentação de preços em toda barra
não importa, existe um modo de simulação mais rápido e grosseiro - " OH LC por minuto" .

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.

Um exemplo de tal Graal é apresentado no Código Base - Grr-al.

© 2000-2018, MetaQuotes Software Corp.


887 Programas MQL5

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" .

Observação: Se os resultados do teste do EA em modos de teste grosseiros (" OH LC por minuto" e


" Somente Preços de Abertura" ) parecerem muito bons, certifique-se de testar-lo no modo " Cada
T ick" .

"Somente Preços de Abertura"


Neste modo os tick s são gerados baseados nos preços OH LC das janelas de tempo selecionados para
teste. A função OnT ick () do Expert Advisor roda somente no começo da barra, no preço de Abertura.
Devido a este característica, níveis de stop e ordens pendentes podem disparar em um preço que
difere do preço especificado (especialmente ao testar em janelas de tempo mais altas). Em
contrapartida, nós temos uma oportunidade de executar rapidamente um teste de avaliação do Expert
Advisor.

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 EUR US 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

© 2000-2018, MetaQuotes Software Corp.


888 Programas MQL5

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).

· O cálculo de requerimentos de margem;

· O disparo de níveis de Stop Loss e T ak e Profit;

· O disparo de ordens pendentes ;

· A remoção de ordens pendentes expiradas.

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.

Executar um teste de EA no EUR US D H1 sobre um intervalo a partir de 2010.09.01 to 2010.12.31, e


comparar os gráficos. A figura mostra o gráfico de saldo do relatório de teste para todos os três
modos.

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.

Existem algumas limitações no modo " Somente Preços de Abertura":

· Você não pode usar o modo de execução Atraso Aleatório.


· 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

© 2000-2018, MetaQuotes Software Corp.


889 Programas MQL5

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 EUR US 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
EUR US 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 EUR US 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.

© 2000-2018, MetaQuotes Software Corp.


890 Programas MQL5

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:

//--- abre o arquivo


file=FileOpen(filename,FILE_WRITE|FILE_CSV|FILE_COMMON,";");
//--- verifica a handle de arquivo
if(file==INVALID_HANDLE)
{
PrintFormat("Erro na abertura do arquivo %s para escrever. Erro de codigo=%d",filename,GetLas
return;
}
else
{
PrintFormat("O arquivo será criado na %s pasta",TerminalInfoString(TERMINAL_COMMONDATA_PATH))
}

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.

//--- abre o arquivo


int file=FileOpen(fname,FILE_READ|FILE_CSV|FILE_COMMON,";");
//--- verifica a handle de arquivo
if(file==INVALID_HANDLE)
{
PrintFormat("Erro na abertura do arquivo %s para leitura. Erro de codigo=%d",fname,GetLastErr
return;
}
else
{

© 2000-2018, MetaQuotes Software Corp.


891 Programas MQL5

PrintFormat("Arquivo será aberto a partir %s",TerminalInfoString(TERMINAL_COMMONDATA_PATH));


}

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.

No Provador de Estratégia, o spread é sempre considerado flutuante. Isto é, a função


S ymbolInfoInteger(s ymbol, S YM BOL _S PR EAD_FLOAT ) sempre retorna true.

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
};

Usando ticks reais durante os testes


O teste e a otimização de acordo com tick s reais se aproximam ao máximo das condições reais. Em
vez de tick s gerados com base em dados de minuto, são usados tick s reais acumulados pela corretora.
Esses são tick s provindos da bolsa e dos provedores de liquidez.

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 ig h/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

© 2000-2018, MetaQuotes Software Corp.


892 Programas MQL5

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 testar tick s reais, considere as seguintes particularidades :

· 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.

As Variáveis Globais do Terminal Cliente


Durante um teste, as variáveis globais do terminal cliente são também emulados, mas elas não estão
relacionadas como as variáveis globais correntes do terminal, que podem ser vistas no terminal
usando a tecla F3. Significa que todas as operações com as variáveis globais do terminal, durante um
teste, acontecem fora terminal cliente (no agente de teste).

O Cálculo de Indicadores durante um Teste


No modo tempo-real, os valores de um indicador são calculados a cada tick . O Provador de Estratégia
adotou um modelo de custo-benefício para calcular indicadores - indicadores são recalculados somente
imediatamente antes da execução do EA. Significa que o recálculo dos indicados é feito antes da
chamada das funções OnT ick (), OnT rade() e OnT imer().

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.

Carregando Histórico durante Teste


O histórico de um ativo a ser testado é sincronizado e carregado pelo terminal a partir do servidor de
negociação antes de começar o processo de teste. Durante a primeira vez, o terminal carrega todo o

© 2000-2018, MetaQuotes Software Corp.


893 Programas MQL5

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 EUR US D e US DCHF do terminal cliente, embora a estratégia não contenha chamadas de uso direta a
estes ativos.

Antes de testar um estratégia multi-moeda, é recomendável baixar todos os dados históricos


necessários para o terminal cliente. Isso ajudará a evitar atrasos em um teste/otimização associado
com a baixa dos dados requeridos. Você pode baixar histórico, por exemplo, via abertura dos gráficos
apropriados e rolá-los para o começa do histórico. Um exemplo de carga forçada de histórico para o
terminal está disponível na seção Organizando Acesso a Dados da R eferência MQL5.

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.

· O termianl carrega o histórico a partir de um servidor de negociação apenas uma vez, na


primeira vez que o agente solicita o histórico de um ativo a ser testado do terminal. O histórico
é carregado em forma de pacote para reduzir o tráfego.
· T ick s não são enviados pela rede, eles são gerados nos agentes de teste.

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.

Assim, se nós rodarmos um teste no intervalo 2010.11.01-2010.12.01 (teste para um intervalo de um


mês) com um período de M 15 (cada barra e igual a 15 minutos), então será solicitado ao terminal o
histórico do instrumento para o ano inteiro de 2010. Para a janela de tempo semanal, nós
solicitaremos um histórico de 100 barras, que é aproximadamente dois anos (um ano tem 52
semanas). Para testar em uma janela de tempo mensal, o agente solicitará o histórico de 8 anos (12
meses x 8 anos = 96 meses).

© 2000-2018, MetaQuotes Software Corp.


894 Programas MQL5

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.

Referência aos dados de um " outro" ativo ocorre nos seguintes casos :
· Ao usar a função de indicadores técnicos e I ndicatorCreate() no ativo/período;

· 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. CopyRates
3. CopyT ime
4. CopyOpen
5. CopyH ig h
6. CopyLow
7. CopyClose
8. CopyT ickVolume
9. CopyRealVolume

© 2000-2018, MetaQuotes Software Corp.


895 Programas MQL5

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.

Simulação de Tempo no Provador de Estratégia


Durante um teste, a hora local T imeLocal() é sempre igual a hora do servidor T imeT radeServer(). Por
sua vez, a hora do servidor é sempre igual a hora correspondente à hora GM T - T imeGM T (). Desta
forma, todas estas funções mostram a mesma hora durante um teste.

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.

Objetos Gráficos no Teste


Durante um teste/otimização objetos gráficos não são plotados. Assim, ao referenciar as
propriedades de um objeto criado durante um teste/otimização, um Expert Advisor receberá valores
zero.

Este limitação não se aplica ao se testar em modo visual.

A Função OnTimer() no Provador de Estratégia


MQL5 fornece a oportunidade de tratar eventos de timer. A chamada ao handler OnT imer() é feita
independentemente do modo do teste. Isso significa que se um teste é rodado no modo " Somente
Preços de Abertura" para o período H4, e o EA tem um timer definido para uma chamada por segundo,
então na abertura de cada barra de H4, o handler OnT ick () será chamado uma vez, e o handler
OnT imer() será chamado 14400 vezes (3600 segundos * 4 horas). A quantidade de tempo de teste do
EA que será aumentada depende da lógica do EA.

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.

//--- parâmetros de entrada


input int timer=1; // valor do timer, segundos
input bool timer_switch_on=true; // timer ativado
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


896 Programas MQL5

//| Função de inicialização do Expert  |


//+------------------------------------------------------------------+
int OnInit()
{
//--- rodar o timer se timer_switch_on==true
if(timer_switch_on)
{
EventSetTimer(timer);
}
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de Desinicialização do Expert |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- para o timer
EventKillTimer();
}
//+------------------------------------------------------------------+
//| Função Timer  |
//+------------------------------------------------------------------+
void OnTimer()
{
//---
// nenhum ação é tomada, o corpo do handler está vazio
}
//+------------------------------------------------------------------+

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.

© 2000-2018, MetaQuotes Software Corp.


897 Programas MQL5

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.

A Função Sleep() no Provador de Estratégia


A função Sleep() permite ao EA ou script suspender a execução do programa MQL5 por um tempo, ao
trabalhar no gráfico. Isso pode ser útil ao solicitar dados, que não estão prontos no momento da
solicitação e você precisa esperar até eles estarem prontos. Um exemplo detalhado do uso da função
Sleep() pode ser encontrado na seção Preparativo para acesso a dados.

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.

Usando o Provador de Estratégia para Problemas de Otimização em


Cálculos Matemáticos
O Provador de Estratégia no terminal MetaT rader 5 pode ser usado, não apenas para testar
estratégias de negociação, mas também para cálculos matemáticos. Para usar-lo, é necessário
selecionar o modo " Cálculos matemáticos "

© 2000-2018, MetaQuotes Software Corp.


898 Programas MQL5

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.

Ao usar o Provador de Estratégia para resolver problemas matemáticos, a carga do histórico e a


geração de tick s não ocorrem.

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.

Para resolvê-lo nos precisamos que:


· O cálculo do valor da função deve estar localizado na função OnT ester();

· 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);

© 2000-2018, MetaQuotes Software Corp.


899 Programas MQL5

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.

Como exemplo, fornecemos a função sink ():

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);
}
//+------------------------------------------------------------------+

Execute uma otimização e veja os resultados da otimização na forma de um gráfico 2D.

© 2000-2018, MetaQuotes Software Corp.


900 Programas MQL5

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:

A Sincronização de Barras no modo "Somente Preço de Abertura"


O Provador de Estratégia no terminal cliente do Metatrader 5 permite-nos verificar os chamados EAs
" multi-moedas " . Uma EA multi-moeda - é um EA que negocia sobre dois ou mais ativos.

O teste de estratégias, que negociam em ativos múltiplos, impõe alguns requerimentos técnicos
adicionais ao Provador de Estratégia:

© 2000-2018, MetaQuotes Software Corp.


901 Programas MQL5

· A geração de tick s para estes ativos ;

· O cálculo de valores de indicadores para estes ativos ;

· O cálculo de requerimentos de margem para estes ativos ;

· Sincronização das seqüências de tick s geradas para todos os ativos negociados.

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 EUR US 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
US PJPY, é 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()!

O código do EA S ynchronize_Bars _Use_Sleep.mq5, que mostra um exemplo da sincronização de barras


no modo " Somente Preços de Abertura":

//+------------------------------------------------------------------+
//| 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()
{

© 2000-2018, MetaQuotes Software Corp.


902 Programas MQL5

//--- verifica ativo


if(_Symbol==other_symbol)
{
PrintFormat("Você tem de especificar outro símbolo nos parâmetros de entrada ou selecionar ou
//--- força parar teste
return(INIT_PARAMETERS_INCORRECT);
}
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função tick (ponto) de um Expert |
//+------------------------------------------------------------------+
void OnTick()
{
//--- variável estática usada para armazenar a hora da última barra
static datetime last_bar_time=0;
//--- flag de sincronização
static bool synchonized=false;
//--- caso a variável estática não esteja inicializada
if(last_bar_time==0)
{
//--- é a primeira chamada, salva hora da barra e saiu
last_bar_time=(datetime)SeriesInfoInteger(_Symbol,Period(),SERIES_LASTBAR_DATE);
PrintFormat("A variável last_bar_time é inicializada com valor %s",TimeToString(last_bar_time
}
//--- obtém hora de abertura da última barra do ativo do gráfico
datetime curr_time=(datetime)SeriesInfoInteger(Symbol(),Period(),SERIES_LASTBAR_DATE);
//--- se as horas não são iguais
if(curr_time!=last_bar_time)
{
//--- salva a hora da barra aberta na variável estática
last_bar_time=curr_time;
//--- não sincronizado
synchonized=false;
//--- imprime mensagem
PrintFormat("Uma nova barra está aparecendo no símbolo %s em %s",_Symbol,TimeToString(TimeCur
}
//--- hora de abertura da barra de outra ativo
datetime other_time;
//--- loop até a hora de abertura do outro ativo ser igual a curr_time
while(!(curr_time==(other_time=(datetime)SeriesInfoInteger(other_symbol,Period(),SERIES_LASTBAR_
{
PrintFormat("Espera 5 segundos..");
//--- espera 5 segundos e chama SeriesInfoInteger(other_symbol,Period(),SERIES_LASTBAR_DATE)
Sleep(5000);
}
//--- barras são sincronizadas
synchonized=true;

© 2000-2018, MetaQuotes Software Corp.


903 Programas MQL5

PrintFormat("Tempo de abertura da barra do símbolo %s do gráfico: é %s",_Symbol,TimeToString(las


PrintFormat("Tempo de abertura da barra do símbolo %s: é %s",other_symbol,TimeToString(other_tim
//--- TimeCurrent() não é útil, usar TimeTradeServer()
Print("As barras são sincronizadas em ",TimeToString(TimeTradeServer(),TIME_SECONDS));
}
//+------------------------------------------------------------------+

Perceba que a última linha no EA, que exibe a hora corrente quando o sincronização de fato foi
estabelecida:

Print("As barras são sincronizadas em ",TimeToString(TimeTradeServer(),TIME_SECONDS));

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.

A função IndicatorRelease() no Provador de Estratégia


Após completar um teste individual, um gráfico do instrumento é automaticamente aberto, que exibe
as operações (deals) completas e os indicadores usados no EA. Isso ajuda a verificar visualmente os
pontos de entrada e saída, e comprará-los com os valores dos indicadores.

Observação: indicadores, exibidos no gráfico, que automaticamente abrem após a conclusão do


teste, são calculados novamente após a conclusão do teste. Mesmo se estes indicadores foram
usados no EA testado.

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
IndicatorRelease() é apropriada.

Se o terminal define um template com o nome tester.tpl no directory/profiles /templates do terminal


cliente, então ele será aplicado ao gráfico aberto. Na usa ausência, o template padrão é aplicado.
(default.tpl).

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

© 2000-2018, MetaQuotes Software Corp.


904 Programas MQL5

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 IndicatorRelease() 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
IndicatorRelease() no handler OnDeinit().

Tratamento de Evento no Provador de Estratégia


A presença do handler OnT ick () no EA não é obrigatória para que possa ser pass ível de teste em dados
históricos no Provador de Estratégias do MetaT rader 5. É suficiente para o EA conter pelo menos as
seguintes funções-handlers :

· OnT ick () - H andler de evento de uma nova chegada de tick;


· OnT rade() - H andler de evento de negociação;
· OnT imer() - H andler de evento de uma chegada de sinal do timer;
· OnChartEvent() - um handler para eventos de cliente.

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.

Durante um teste, um Indicador pode gerar eventos customizados usando a função


EventChartCustom(), e o EA pode processar este evento no OnChartEvent().

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 esterInit - 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.

© 2000-2018, MetaQuotes Software Corp.


905 Programas MQL5

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.

O agente armazena o histórico, recebido do terminal, em pastas separadas, pelo nome do


instrumento, assim o histórico para EUR US D é armazenado em uma pasta chamada EUR US D. Além
disso, o histórico dos instrumentos é separado pelas suas fontes. A estrutura para armazenar o
histórico tem o seguinte forma:

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\EUR US 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.

A Troca de Dados entre o Terminal e o Agente


Ao rodar um teste, o terminal cliente prepara para enviar ao agente um número de blocos de
parâmetros :

· 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"

© 2000-2018, MetaQuotes Software Corp.


906 Programas MQL5

· A especificação do ativo do teste (o tamanho do contrato, as margens permitidas do mercado para


definir um StopLoss e T ak eprofit, etc)
· O Expert Advisor (robot) para ser testado e os valores de seus parâmetros de entrada

· I nformações sobre arquivos adicionais (bibliotecas, indicadores, arquivos de dados - # property


tester_ ...)

tester_indicator string Nome de um indicador


customizado no formato de
" indicator_name.ex5" .
Indicadores que requerem
teste são definidos
automaticamente a partir da
chamada à função iCustom(),
se o correspondente
parâmetro estiver definido
através de um string
constante. Para todos os
outros casos (use da função
IndicatorCreate() ou uso de
uma string não constante no
parâmetro que defini o nome
do indicador) esta propriedade
é requerida

tester_file string Nome de arquivo para um


testador com a indicação de
extensão, entre aspas duplas
(como uma string constante).
O arquivo especificado será
passado para o T estador de
Estratégias. Arquivos de
entrada para serem testados,
se forem necessários, devem
sempre ser especificados.

tester_library string Nome da biblioteca (library)


com a extensão, entre aspas
duplas. Uma biblioteca pode
ter extensão dll ou ex5.
Bibliotecas que requerem teste
são definidas
automaticamente. No entanto,
se alguma das bibliotecas é
usada por um indicador
customizado, esta propriedade
é requerida

Para cada bloco de parâmetros, uma impressão digital na forma de M D5-has h é criada, que é enviado
para o agente. O M D5-has h é único para cada conjunto, seu volume é muito menor que a quantidade
de informação na qual ele é calculado

© 2000-2018, MetaQuotes Software Corp.


907 Programas MQL5

O agente recebe um has h 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 has h 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 S harpe, 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 odo tráfego entre o terminal e o agente é encripto-grafado.

T ick s não são enviados pela rede, eles são gerados nos agentes de teste.

Usando a Pasta Compartilhada para Todos os Terminais Cliente


T odos os agentes de teste são isolados uns dos outros e do terminal cliente: cada agente tem sua
própria pasta na qual seus logs são gravados. Além disso, todas as operações de arquivo durante o
teste do agente ocorrem na pasta agent_name/MQL5/F iles. Contudo, nós podemos implementar a
interação entre os agentes locais e o terminal cliente através de uma pasta compartilhada para todos
os terminais clientes, se durante a abertura do arquivo você especificar a flag FILE_COMMON:

//+------------------------------------------------------------------+
//| 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);

© 2000-2018, MetaQuotes Software Corp.


908 Programas MQL5

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.

© 2000-2018, MetaQuotes Software Corp.


909 Variáveis Predefinidas

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

_Digits Número de casas decimais


_Point T amanho do ponto do ativo corrente na moeda
de cotação

_LastError O último código de erro

_Period Janela de tempo do gráfico corrente


_RandomSeed Status atual do gerador de números pseudo-
aleatórios

_StopFlag Flag de parada de programa


_S ymbol Nome do ativo do gráfico corrente
_UninitReason Código do motivo da não inicialização

_Is X64 A variável _Is X64 permite saber em que


terminal está funcionando o programa MQL5

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.

© 2000-2018, MetaQuotes Software Corp.


910 Variáveis Predefinidas

int _AppliedTo
A variável _AppliedT o permite ver no indicador o tipo de dados em que é calculado:

Tipo de dados Valor Descrição dos dados usados ​


para calcular o indicador
— 0 O indicador usa a segunda
maneira de chamada de
OnCalculate() - os dados para o
cálculo não são especificados
por um buffer ou array de dados

Close 1 Preço Close


Open 2 Preço Open
H ig h 3 Preço H ig h
Low 4 Preço Low
Median Price (H L /2) 5 Preço médio = (H ig h+Low)/2
Typical Price (H LC/3) 6 Preço típico =
(H ig h+Low+Close)/3

W eig hted Price (H LCC/4) 7 Preço ponderado =


(Open+H ig h+Low+Close)/4

Previous Indicator's Data 8 Dados do indicador inicializado


no gráfico antes deste indicador

First Indicator's Data 9 Dados do indicador inicializado


no gráfico pela primeira vez

Indicator handle 10+ Dados do indicador transferidos


para a função iCustom() com
ajuda do identificador do
indicador. O valor _AppliedT o
contém o identificador do
indicador

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));

© 2000-2018, MetaQuotes Software Corp.


911 Variáveis Predefinidas

//---
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

© 2000-2018, MetaQuotes Software Corp.


912 Variáveis Predefinidas

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.

Você pode também usar a função Digits().

© 2000-2018, MetaQuotes Software Corp.


913 Variáveis Predefinidas

double _Point
A variável _Point contém o tamanho do ponto do ativo corrente na moeda de cotação.

Você também pode usar a função Point().

© 2000-2018, MetaQuotes Software Corp.


914 Variáveis Predefinidas

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().

© 2000-2018, MetaQuotes Software Corp.


915 Variáveis Predefinidas

int _Period
A variável _Period contém o valor da janela de tempo do gráfico corrente.

Você também pode usar a função Period().

Também Veja
PeriodSeconds, Janelas de tempo de gráficos, Data e H ora, Visibilidade de objetos

© 2000-2018, MetaQuotes Software Corp.


916 Variáveis Predefinidas

_RandomSeed
Variável para armazenamento do estado corrente ao gerar inteiros pseudo-aleatórios. _RandomSeed
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

© 2000-2018, MetaQuotes Software Corp.


917 Variáveis Predefinidas

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().

© 2000-2018, MetaQuotes Software Corp.


918 Variáveis Predefinidas

string _Symbol
A variável _S ymbol contém o nome do ativo do gráfico corrente.

Você também pode usar a função S ymbol().

© 2000-2018, MetaQuotes Software Corp.


919 Variáveis Predefinidas

int _UninitReason
A variável _UninitR eason contém o código do motivo de não inicialização do programa.

Geralmente, este código é obtido através da função UninitializeReason().

© 2000-2018, MetaQuotes Software Corp.


920 Variáveis Predefinidas

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.

Você também pode usar a função T erminalInfoInteger(T ERM INAL_X64).

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)

© 2000-2018, MetaQuotes Software Corp.


921 Funções Comuns

Funções Comuns
Funções de propósito geral não inclusas em nenhum grupo especializado estão listadas aqui.

F unção Ação
Alert Exibe uma mensagem em uma janela separada

CheckPointer Retorna o tipo do ponteiro de objeto


Comment Gera um comentário no canto superior esquerdo
do gráfico

CryptEncode T ransforma os dados do array com o método


especificado

CryptDecode Executa a transformação inversa dos dados do


array

Debug Break Ponto de parada de programa em depuração


ExpertR emove Interrompe um Expert Advisor e o descarrega
do gráfico

GetPointer Retorna o ponteiro de objeto


GetT ick Count Retorno o número de milissegundos decorridos
desde que o sistema foi iniciado

GetMicrosecondCount Retorna o número de microssegundos que


decorreram desde o início do programa MQL5

MessageBox Cria, exibe uma caixa de mensagem e o


gerencia

PeriodSeconds Retorna o número de segundos no período


PlaySound T oca um arquivo de som
Print Exibe uma mensagem no log

PrintFormat Formata e imprime um conjunto de s ímbolos e


valores em um arquivo de log de acordo com
um formato predefinido

ResetLastError Define o valor da variável predeterminada


_LastError para zero
ResourceCreate Cria um recurso de imagem baseado em um
conjunto de dados

ResourceFree Exclui recursos criados dinamicamente


(liberando a memória alocada para ele)

ResourceReadImage Lê os dados do recurso gráfico criado pela


função R esourceCreate() ou salvo em arquivo
EX5 durante a compilação

© 2000-2018, MetaQuotes Software Corp.


922 Funções Comuns

ResourceSave Salva um recurso em um arquivo especificado

SetUserError Define a variável predefinida _LastError para o


valor igual a ERR_USER_ERR OR_FIR S T +
user_error

SendFTP Envia um arquivo no endereço especificado na


janela de configurações da guia "FTP"

SendMail Envia um email no endereço especificado na


janela de configurações da guia " Email"

SendNotification Envia notificações pus h para terminais móveis,


cujos MetaQuotes ID's estão especificados na
guia "Notificações "

Sleep Suspende por um intervalo especificado a


execução do Expert Advisor corrente ou script

T erminalClose Ordena o terminal a finalizar a operação

T esterH ideIndicators Define o modo mostrar/ocultar indicadores


usados no Expert Advisor

T esterStatistics Retorna o valor de uma estatística específica


calculada com base em resultados de teste

T esterW ithdrawal Função especial para emular a operação de


saque de dinheiro no processo de teste

T ranslateKey Retorna o caractere Unicode de acordo com o


código de tecla virtual

W ebRequest Sends HTTP request to the specified server

ZeroMemory Redefine uma variável passada para ela por


referência. A variável pode ser de qualquer
tipo, exceto classes e estruturas que tenham
construtores.

© 2000-2018, MetaQuotes Software Corp.


923 Funções Comuns

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.

Alert() function does not work in the Strateg y T ester.

© 2000-2018, MetaQuotes Software Corp.


924 Funções Comuns

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
Retorna 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 CheckPointer antes de usar um ponteiro. Um ponteiro pode
estar incorreto nos seguintes casos :

· o ponteiro é igual a NULL;

· o objeto foi excluído usando o operador delete.

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");
}
//---
}

© 2000-2018, MetaQuotes Software Corp.


925 Funções Comuns

Também Veja
Ponteiros de Objetos, Verificação do Ponteiro de Objeto, Exclusão de Objeto Operador delete

© 2000-2018, MetaQuotes Software Corp.


926 Funções Comuns

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.

A função Comment() não funciona no durante a otimização no T estador de Estratégias.

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

© 2000-2018, MetaQuotes Software Corp.


927 Funções Comuns

ChartSetString, ChartGetString

© 2000-2018, MetaQuotes Software Corp.


928 Funções Comuns

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()

© 2000-2018, MetaQuotes Software Corp.


929 Funções Comuns

{
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()

© 2000-2018, MetaQuotes Software Corp.


930 Funções Comuns

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()

© 2000-2018, MetaQuotes Software Corp.


931 Funções Comuns

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.

© 2000-2018, MetaQuotes Software Corp.


932 Funções Comuns

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.

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)
{

© 2000-2018, MetaQuotes Software Corp.


933 Funções Comuns

ExpertRemove();
Print(TimeCurrent(),": ",__FUNCTION__," Expert Advisor será descarregado");
}
Print("tick_counter =",tick_counter);
//---
}
//+------------------------------------------------------------------+

Também Veja
Execução de programas, Eventos do terminal Cliente

© 2000-2018, MetaQuotes Software Corp.


934 Funções Comuns

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 CheckPointer() deve ser chamada antes de usar um ponteiro. Um ponteiro pode
estar incorreto nos seguintes casos :

· o ponteiro é igual a NULL;

· o objeto foi excluído usando o operador delete.

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  |
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


935 Funções Comuns

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)

© 2000-2018, MetaQuotes Software Corp.


936 Funções Comuns

{
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

© 2000-2018, MetaQuotes Software Corp.


937 Funções Comuns

Também Veja
Ponteiros de Objetos, Verificação do Ponteiro de Objeto, Exclusão de Objeto Operador delete

© 2000-2018, MetaQuotes Software Corp.


938 Funções Comuns

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

© 2000-2018, MetaQuotes Software Corp.


939 Funções Comuns

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)

© 2000-2018, MetaQuotes Software Corp.


940 Funções Comuns

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

© 2000-2018, MetaQuotes Software Corp.


941 Funções Comuns

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
Não é recomendado usar a função em indicadores personalizados, uma vez que a chamada de
MessageBox() pára o fluxo de execução do indicador durante todo o tempo de espera para a
resposta do usuário. E uma vez que todos os indicadores de cada s ímbolo são executados em um
único fluxo, serão parados todos os gráficos em todos os timeframes desse s ímbolo.

MessageBox() function does not work in the Strateg y T ester.

© 2000-2018, MetaQuotes Software Corp.


942 Funções Comuns

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 _TIMEFRAMES. 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

© 2000-2018, MetaQuotes Software Corp.


943 Funções Comuns

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.

Chamar o PlaySound() com o parâmetro NULL interrompe a reprodução.

A função PlaySound() não funciona no T estador de Estratégias.

Também Veja
Recursos

© 2000-2018, MetaQuotes Software Corp.


944 Funções Comuns

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

A função Print() não funciona no durante a otimização no T estador de Estratégias.

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

//--- Veja como um float é impresso


float c=(float)M_PI; // Nós devemos explicitamente converter para o tipo desejado
Print("c=",c, " Pi=",M_PI, " (float)M_PI=",(float)M_PI);
// c=3.14159 Pi=3.141592653589793 (float)M_PI=3.14159

//--- 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");

© 2000-2018, MetaQuotes Software Corp.


945 Funções Comuns

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)

//--- Cria um valor muito pequeno epsilon=1E-013


double epsilon=1e-13;
Print("---- Criando um valor muito pequeno");
Print("epsilon=",epsilon); // Obter epsilon=1E-013
//--- Agora subtrai epsilon de b e novamente imprime o valor no diário Experts
b=b-epsilon;
//--- Duas formas de uso
Print("---- Depois de subtrair epsilon da variável b");
Print("Print(b)=",b);
Print("Print(DoubleToString(b,16))=",DoubleToString(b,16));
//--- Imprime no diário Experts
// Print(b)=199.9999999999999 (agora o valor de b após subtrair epsilon não pode ser arredondado p
// Print(DoubleToString(b,16))=199.9999999999998578
// (agora o valor de b após subtrair epsilon não podem ser arredondado para 200)
}

Também Veja
DoubleT oString, String Format

© 2000-2018, MetaQuotes Software Corp.


946 Funções Comuns

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.

A especificação de formato tem a seguinte forma:

%[flags][largura][.precisão][{h | l | ll | I32 | I64}]tipo

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

© 2000-2018, MetaQuotes Software Corp.


947 Funções Comuns

F lag Descrição Comportamento Default


– (menos) Justificação a esquerda Justificação a direita
dentro da largura (width)
predefinida

+ (mais) Imprime o sinal + ou - de O sinal somente é mostrada


valores de tipos com sinal se o valor for negativo

0 (zero) Zeros são adicionados antes Nada é adicionado


de um valor impresso com a
largura predefinida. Se o flag
0 for especificado com um
formato inteiro (i, u, x, X , o,
d) e a especificação de
precisão for definida (por
exemplo, %04.d), então 0 é
ignorado.

espaço Um espaço é exibido antes de Espaços não são inseridos


um valor impresso, se ele for
um valor com sinal e positivo

# Se usado em conjunto com o Nada é adicionado


formato o, x ou X , então
antes do valor de saída 0, 0x
ou 0X é adicionado
respectivamente.

Se usado em conjunto com o Ponto decimal é mostrado


formato e, E, a ou A, o valor somente se houver um parte
é sempre mostrado com um fracionária não-zero.
ponto decimal.

Se usado em conjunto com o Ponto decimal é mostrado


formato g ou G, o flag define somente se houver um parte
a presença de um ponto fracionária não-zero. Zeros à
decimal no valor de saída e esquerda são cortados.
evita o truncamento de zeros
à esquerda.
O flag # é ignorado quando
usado em conjunto com
formatos c, d , i, u, s.

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.

© 2000-2018, MetaQuotes Software Corp.


948 Funções Comuns

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.

O uso da especificação de precisão é diferente para tipos de formato diferentes.

Tipos Descrição Comportamento Default


a, A Especificação de precisão Precisão padrão – 6.
define o número de dígitos
após o ponto decimal.

c, C Não usado
d, i, u, o, x, X Define o número mínimo de Precisão padrão – 1.
dígitos de saída. Se o número
de dígitos em um parâmetro
correspondente for menor que
esta precisão, zeros são
adicionados a esquerda do
valor de saída. O valor de
saída não é cortado, se o
número de dígitos de saída é
maior do que a precisão
apurada.

e, E, f Define o número de dígitos de Precisão padrão – 6. Se a


saída após o ponto decimal. O definição de precisão for 0 ou a
último dígito é arredondado. parte decimal estiver ausente,
o ponto decimal não é exibido.

g, G Define o número máximo de 6 números significativos são


números significativos. impressos.

s, S Define o número de saída dos T oda a string é a saída.


s ímbolos de uma string. Se o
comprimento da string excede
ao apurado, a string e
cortada.

h | l | ll | I32 | I64
Especificação de tamanhos dos dados, passados como parâmetro.

© 2000-2018, MetaQuotes Software Corp.


949 Funções Comuns

Tipo de Parâmetro Prefixo Usado Especificador Conjunto de


Tipo
int l (letra minúscula L) d, i, o, x, or X

uint l (letra minúscula L) o, u, x, or X

long ll (duas letras minúsculas L) d, i, o, x, or X

s hort h d, i, o, x, or X

us hort 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.

Símbolo Tipo F ormato de Saída

c int S ímbolo de tipo s hort


(Unicode)

C int S ímbolo de tipo char (ANS I)

d int Inteiro decimal com sinal


i int Inteiro decimal com sinal
o int Inteiro octal sem sinal
u int Inteiro decimal sem sinal
x int Inteiro hexadecimal sem
sinal, usando " abcdef"

X int Inteiro hexadecimal sem


sinal, usando " ABCDEF"

e double Um valor real no formato [-]


d.dddde[sinal] ddd, onde d -
um dígito decimal, dddd - um
ou mais dígitos decimais, ddd
- um número de três dígitos
que determina o tamanho do
exponente, sinal - mais ou
menos

© 2000-2018, MetaQuotes Software Corp.


950 Funções Comuns

E double Semelhando ao formato de e,


exceto que o sinal do
expoente é impresso em letra
maiúscula (E ao invés de e)

f double Um valor real no format [-]


dddd.dddd, onde dddd - um
ou mais dígitos decimais.
Número de dígitos exibidos
depois do ponto decimal
depende do tamanho do valor
do número. Número de dígitos
após o ponto decimal depende
da precisão requerida.

g double Uma saída de valor real no


formato f ou edepende de
qual saída é mais compacta.

G double Uma saída de valor real no


formato F ou Edepende de
qual saída é mais compacta.

a double Um número real no formato


[−]0x h.hhhh p±dd, onde
h.hhhh – mantissa na forma
de dígitos hexadecimais,
usando " abcdef" , dd - Um ou
mais dígitos de expoente.
Número de posições decimais
é determinado pela
especificação de precisão

A double Um número real no formato


[−]0x h.hhhh p±dd, onde
h.hhhh – mantissa na forma
de dígitos hexadecimais,
usando " abcdef" , dd - Um ou
mais dígitos de expoente.
Número de posições decimais
é determinado pela
especificação de precisão

s string Saída da string

Ao invés de PrintFormat(), você pode usar printf().

Exemplo:

© 2000-2018, MetaQuotes Software Corp.


951 Funções Comuns

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)

© 2000-2018, MetaQuotes Software Corp.


952 Funções Comuns

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
ResetLastError() é chamada antes de chamar uma função, após o qual um surgimento de erro é
verificado.

© 2000-2018, MetaQuotes Software Corp.


953 Funções Comuns

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
);

Criando um recurso baseado em um array de pixels


bool  ResourceCreate(
const string  resource_name,  // Nome do recurso
const uint&   data[],  // Conjunto de dados em um array
uint img_width,   // A largura do recurso de imagem
uint img_height,   // A altura do recurso de imagem
uint data_xoffset, // O deslocamento horizontal para direita do canto superi
uint data_yoffset, // O deslocamento vertical para baixo do canto superior e
uint data_width,   // A largura total da imagem baseada no conjunto de dados
ENUM_COLOR_FORMAT color_format // Método de processamento de cor
);

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] Requerido 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

© 2000-2018, MetaQuotes Software Corp.


954 Funções Comuns

[in] Método de processamento de cor, a partir de um valor da enumeração


ENUM _COLOR_FOR MAT .

Valor do Retorno
Retorna 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_RESOURCE_NAME_DUPLICAT 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_UNSUPPORT 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 BM P 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_NOAL PH A O componente do canal alfa é ignorado

COLOR_FOR MAT_ARGB_R AW Componentes de cor não são tratados pelo


terminal (devem ser corretamente definidos
pelo usuário)

COLOR_FOR MAT_ARGB_NOR MAL IZE Componentes de cor são tratados pelo terminal

Também Veja
Recursos, ObjectCreate(), ObjectSetString(), OBJPROP_BM PFILE

© 2000-2018, MetaQuotes Software Corp.


955 Funções Comuns

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
ResourceFree() 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.

A função deleta apenas recursos dinâmicos criados pelo programa.

Também Veja
Recursos, ObjectCreate(), PlaySound(), ObjectSetString(), OBJPROP_BM PFILE

© 2000-2018, MetaQuotes Software Corp.


956 Funções Comuns

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] Recurso gráfico da largura da imagem em pixels .
img_height
[out] Recurso 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_NOAL PH 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
Recursos, ObjectCreate(), ObjectSetString(), OBJPROP_BM PFILE

© 2000-2018, MetaQuotes Software Corp.


957 Funções Comuns

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
Recursos, ObjectCreate(), PlaySound(), ObjectSetString(), OBJPROP_BM PFILE

© 2000-2018, MetaQuotes Software Corp.


958 Funções Comuns

SetUserError
Define a variável predefinida _LastError para o valor igual a ERR_USER_ERROR_FIRS 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
*/
}

© 2000-2018, MetaQuotes Software Corp.


959 Funções Comuns

SendFTP
Envia um arquivo no endereço especificado na janela de configurações da guia "FTP" .
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 FTP. 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 FTP e/ou a senha de acesso não estiverem
especificados nas configurações.

SendFTP() function does not work in the Strateg y T ester.

© 2000-2018, MetaQuotes Software Corp.


960 Funções Comuns

SendNotification
Envia notificações pus h 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_NOTIFICATION_SEND_FAILED,
· 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.

SendNotification() function does not work in the Strateg y T ester.

© 2000-2018, MetaQuotes Software Corp.


961 Funções Comuns

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().

SendMail() function does not work in the Strateg y T ester.

© 2000-2018, MetaQuotes Software Corp.


962 Funções Comuns

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.

© 2000-2018, MetaQuotes Software Corp.


963 Funções Comuns

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;

© 2000-2018, MetaQuotes Software Corp.


964 Funções Comuns

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

© 2000-2018, MetaQuotes Software Corp.


965 Funções Comuns

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.

Se, na pasta <catálogo_de_dados >MQL5\Profiles \T emplates, estiver o modelo especial


<nome_do_expert>.tpl, serão exibidos apenas os indicadores desse modelo, durante o teste visual e
no gráfico de teste. Neste caso, não serão exibidos os indicadores utilizados no EA testado. Mesmo
se, no código do EA, fosse chamada a função T esterH ideIndicators() com parâmetro true.

Se, na pasta <catálogo_de_dados >MQL5\Profiles \T emplates, não se encontrar o modelo especial


<nome_do_expert>.tpl, mas estiver o modelo tester.tpl, então, durante o teste visual e no gráfico
de teste, serão exibidos os indicadores do modelo tester.tpl e os indicadores não exibidos devido ao
uso da função T esterH ideIndicators(). Se não estiver o modelo tester.tpl, em vez dele serão usados
os indicadores do modelo default.tpl.

Se o testador de estratégias não encontrar nenhum modelo adequado (<nome_do_expert>.tpl,


tester.tpl ou default.tpl), a função T esterH ideIndicators() controlará completamente a exibição dos
indicadores usados no EA.

Exemplo:

© 2000-2018, MetaQuotes Software Corp.


966 Funções Comuns

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
IndicatorRelease

© 2000-2018, MetaQuotes Software Corp.


967 Funções Comuns

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.

© 2000-2018, MetaQuotes Software Corp.


968 Funções Comuns

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.

© 2000-2018, MetaQuotes Software Corp.


969 Funções Comuns

TranslateKey
Retorna 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

© 2000-2018, MetaQuotes Software Corp.


970 Funções Comuns

W ebRequest
A função envia uma solicitação HTTP para um servidor especificado. A função possui duas versões :

1. Enviando solicitações simples do tipo "k ey = value" usando o cabeçalho Content-Type:


application/x-www-form-urlencoded.
int  WebRequest(
const string  method, // método HTTP
const string   url, // URL
const string   cookie, // cookie
const string   referer, // referer
int timeout,   // tempo esgotado
const char   &data[], // A matriz do corpo da mensagem HTTP
int data_size,   // tamanho do array data[] em bytes
char &result[], // Uma matriz contendo dados de resposta do servidor
string &result_headers // cabeçalhos de resposta do servidor
);

2. Enviando uma solicitação de qualquer tipo especificando o conjunto personalizado de cabeçalhos


para uma interação mais flex ível com vários serviços da W eb.
int  WebRequest(
const string  method, // método HTTP
const string   url, // URL
const string   headers, // cabeçalho
int timeout,   // tempo esgotado
const char   &data[], // A matriz do corpo da mensagem HTTP
char &result[], // Uma matriz contendo dados de resposta do servidor
string &result_headers // cabeçalhos de resposta do servidor
);

Parâmetros
método
[in] método HTTP.
url
[in] URL.
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 Referer do pedido HTTP.
timeout
[in] T empo limite em milissegundos.

© 2000-2018, MetaQuotes Software Corp.


971 Funções Comuns

data[]
[in] Matriz de dados do corpo da mensagem HTTP.
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 HTTP ou -1 para um erro.

Nota
Para usar a função W ebRequest(), adicione os endereços dos servidores necessários na lista de URLs
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" .

O W ebR equest() não pode ser executada no T estador de Estratégia.

Um exemplo de usar a primeira versão da função W ebR equest():

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

© 2000-2018, MetaQuotes Software Corp.


972 Funções Comuns

}
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);
}
}

© 2000-2018, MetaQuotes Software Corp.


973 Funções Comuns

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.

© 2000-2018, MetaQuotes Software Corp.


974 Funções para Array

Grupo de Funções para Trabalhar com Arrays


Arrays podem ter no máximo quatro dimensões. Cada dimensão é indexada de 0 a dimension_size-1.
No caso particular de um array de uma dimensão de 50 elementos, a chamada do primeiro elemento
aparece como array[0], do último elemento - como array[49].

F unção Ação
ArrayBsearch Retorna o índice do primeiro elemento
encontrado na primeira dimensão do array

ArrayCopy Copia um array em outro array

ArrayCompare Retorna o resultado da comparação entre dois


arrays de tipos simples ou estruturas
personalizados sem objetos complexos

ArrayFree Libera buffer de qualquer array dinâmico e


define o tamanho da dimensão zero em 0.

ArrayGetAsSeries Verifica a direção da indexação de um array


ArrayInitialize Define todos os elementos de um array
numérico para um único valor

ArrayFill Preenche um array com o valor especificado


ArrayIsSeries Verifica se um é array é uma série de tempo
ArrayIs Dynamic Verifica se um array é dinâmico
ArrayMaximum Busca por um elemento com o valor máximo
ArrayPrint No log, exibe uma matriz de tipo ou estrutura
simples

ArrayMinimum Busca por um elemento com o valor mínimo


ArrayR ange Retorna o número de elementos na dimensão
especifica do array

ArrayR esize Define o novo tamanho da primeira dimensão


do array

ArraySetAsSeries Define a direção de indexação de um array


ArraySize Retorna o número de elemento no array
ArraySort Ordena arrays números pela primeira dimensão

ArraySwap T roca entre si o conteúdo de duas matrizes do


tipo dinâmico

© 2000-2018, MetaQuotes Software Corp.


975 Funções para 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.

Para buscar em um array de tipo double


int  ArrayBsearch(
const double&   array[], // array para busca
double  value  // o que é pesquisada por
);

Para buscar em um array de tipo float


int  ArrayBsearch(
const float&   array[], // array para busca
float  value  // o que é pesquisada por
);

Para buscar em um array de tipo long


int  ArrayBsearch(
const long&   array[], // array para busca
long  value  // o que é pesquisada por
);

Para buscar em um array de tipo int


int  ArrayBsearch(
const int&   array[], // array para busca
int  value  // o que é pesquisada por
);

Para buscar em um array de tipo short


int  ArrayBsearch(
const short&   array[], // array para busca
short  value  // o que é pesquisada por
);

Para buscar em um array de tipo char


int  ArrayBsearch(
const char&   array[], // array para busca
char  value  // o que é pesquisada por
);

Parâmetros
array[]
[in] Array numérico para busca.
value

© 2000-2018, MetaQuotes Software Corp.


976 Funções para Array

[in] Valor para busca.

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);
}

© 2000-2018, MetaQuotes Software Corp.


977 Funções para Array

//--- copiar os valores do indicador para um determinado período de tempo


ResetLastError();
if(CopyBuffer(rsi_handle,0,InpDateStart,InpDateFinish,rsi_buff)==-1)
{
PrintFormat("Falha para copiar valores do indicador. Código de erro = %d",GetLastError());
return;
}
//--- recebe o tamanho do array
size=ArraySize(rsi_buff);
//--- classificar o array
ArraySort(rsi_buff);
//--- descobrir o tempo (em termos percentuais) que o mercado ficou na área sobre-vendida
double ovs=(double)ArrayBsearch(rsi_buff,InpOversoldValue)*100/(double)size;
//--- descobrir o tempo (em termos percentuais) que o mercado ficou na área sobre-comprada
double ovb=(double)(size-ArrayBsearch(rsi_buff,InpOverboughtValue))*100/(double)size;
//--- formar as strings para exibir os dados
string str="A partir de "+TimeToString(InpDateStart,TIME_DATE)+" para "
+TimeToString(InpDateFinish,TIME_DATE)+" o mercado ficou:";
string str_ovb="em área sobre-comprada "+DoubleToString(ovb,2)+"% do tempo";
string str_ovs="em área sobre-vendida "+DoubleToString(ovs,2)+"% do tempo";
//--- mostrar os dados no gráfico
CreateLabel("topo",5,60,str,clrDodgerBlue);
CreateLabel("sobre-comprado",5,35,str_ovb,clrDodgerBlue);
CreateLabel("sobre-vendido",5,10,str_ovs,clrDodgerBlue);
//--- redesenhar o gráfico
ChartRedraw(0);
//--- pausa
Sleep(10000);
}
//+------------------------------------------------------------------+
//| Mostrar comentário no canto inferior esquerdo do gráfico  |
//+------------------------------------------------------------------+
void CreateLabel(const string name,const int x,const int y,
const string str,const color clr)
{
//--- cria um rótulo (label)
ObjectCreate(0,name,OBJ_LABEL,0,0,0);
//--- colocar a etiqueta no canto inferior esquerdo
ObjectSetInteger(0,name,OBJPROP_CORNER,CORNER_LEFT_LOWER);
//--- alterar a posição do ponto de ancoragem
ObjectSetInteger(0,name,OBJPROP_ANCHOR,ANCHOR_LEFT_LOWER);
//--- distância a partir do ponto de ancoragem na direção X
ObjectSetInteger(0,name,OBJPROP_XDISTANCE,x);
//--- distância a partir do ponto de ancoragem na direção Y
ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y);
//--- texto do rótulo
ObjectSetString(0,name,OBJPROP_TEXT,str);
//--- cor do texto
ObjectSetInteger(0,name,OBJPROP_COLOR,clr);

© 2000-2018, MetaQuotes Software Corp.


978 Funções para Array

//--- tamanho do texto


ObjectSetInteger(0,name,OBJPROP_FONTSIZE,12);
}

© 2000-2018, MetaQuotes Software Corp.


979 Funções para Array

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
Retorna 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). The 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."

© 2000-2018, MetaQuotes Software Corp.


980 Funções para Array

//--- configurações do indicador


#property indicator_chart_window
#property indicator_buffers 5
#property indicator_plots 1
//---- plotar
#property indicator_label1 "Extremums"
#property indicator_type1 DRAW_COLOR_CANDLES
#property indicator_color1 clrLightSteelBlue,clrRed,clrBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- constante pré-definida
#define INDICATOR_EMPTY_VALUE 0.0
//--- parâmetros de entrada
input int InpNum=4; // Meio intervalo de comprimento
//--- buffers do indicador
double ExtOpen[];
double ExtHigh[];
double ExtLow[];
double ExtClose[];
double ExtColor[];
//--- variáveis globais
int ExtStart=0; // índice do primeiro candlestick que não é um extremo
int ExtCount=0; // número de não extremos no intervalo
//+------------------------------------------------------------------+
//| Preenchimento dos candlesticks não extremos  |
//+------------------------------------------------------------------+
void FillCandles(const double &open[],const double &high[],
const double &low[],const double &close[])
{
//--- preencher os candlesticks
ArrayCopy(ExtOpen,open,ExtStart,ExtStart,ExtCount);
ArrayCopy(ExtHigh,high,ExtStart,ExtStart,ExtCount);
ArrayCopy(ExtLow,low,ExtStart,ExtStart,ExtCount);
ArrayCopy(ExtClose,close,ExtStart,ExtStart,ExtCount);
}
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado  |
//+------------------------------------------------------------------+
int OnInit()
{
//--- mapeamento de buffers do indicador
SetIndexBuffer(0,ExtOpen);
SetIndexBuffer(1,ExtHigh);
SetIndexBuffer(2,ExtLow);
SetIndexBuffer(3,ExtClose);
SetIndexBuffer(4,ExtColor,INDICATOR_COLOR_INDEX);
//--- especificar o valor que não é apresentado
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,INDICATOR_EMPTY_VALUE);
//--- especificar os nomes dos buffers do indicador para exibir na janela de dados

© 2000-2018, MetaQuotes Software Corp.


981 Funções para Array

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))

© 2000-2018, MetaQuotes Software Corp.


982 Funções para Array

{
//--- 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++)

© 2000-2018, MetaQuotes Software Corp.


983 Funções para Array

{
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);
}

© 2000-2018, MetaQuotes Software Corp.


984 Funções para Array

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.

© 2000-2018, MetaQuotes Software Corp.


985 Funções para Array

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.

No caso, é necessário controlar manualmente a memória no ambiente dinâmico complexo da


aplicação, a função ArrayFree() permite que os usuários possam liberar a memória ocupada pelo
array dinâmico desnecessário de forma direta e imediata.

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[];

© 2000-2018, MetaQuotes Software Corp.


986 Funções para Array

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

© 2000-2018, MetaQuotes Software Corp.


987 Funções para 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)
{
}

© 2000-2018, MetaQuotes Software Corp.


988 Funções para Array

//+------------------------------------------------------------------+
//| 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

© 2000-2018, MetaQuotes Software Corp.


989 Funções para Array

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);

© 2000-2018, MetaQuotes Software Corp.


990 Funções para Array

//--- adicionar a caixa de combinação para controlar elementos


if(!Add(m_combo_box_step))
return(false);
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| Criar uma caixa de combinação para o tipo de array  |
//+------------------------------------------------------------------+
bool CMemoryControl::CreateComboBoxType(void)
{
//--- criar a caixa de combinação
if(!m_combo_box_type.Create(m_chart_id,"type_combobox",m_subwin,X_START+100,Y_START+210,X_START+
return(false);
//--- adicionar elementos para a caixa de combinação
if(!m_combo_box_type.ItemAdd("char",0))
return(false);
if(!m_combo_box_type.ItemAdd("int",1))
return(false);
if(!m_combo_box_type.ItemAdd("float",2))
return(false);
if(!m_combo_box_type.ItemAdd("double",3))
return(false);
if(!m_combo_box_type.ItemAdd("long",4))
return(false);
//--- definir o elemento atual da caixa de combinação
if(!m_combo_box_type.SelectByValue(3))
return(false);
//--- armazenar o elemento da caixa de combinação atual
m_combo_box_type_value=3;
//--- adicionar a caixa de combinação para controlar elementos
if(!Add(m_combo_box_type))
return(false);
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------+
//| criar um rótulo  |
//+------------------------------------------------------------------+
bool CMemoryControl::CreateLabel(CLabel &lbl,const string name,const int x,
const int y,const string str,const int font_size,
const int clr)
{
//--- criar um rótulo
if(!lbl.Create(m_chart_id,name,m_subwin,x,y,0,0))
return(false);
//--- texto
if(!lbl.Text(str))
return(false);

© 2000-2018, MetaQuotes Software Corp.


991 Funções para Array

//--- tamanho de fonte


if(!lbl.FontSize(font_size))
return(false);
//--- cor
if(!lbl.Color(clr))
return(false);
//--- adicionar a etiqueta para controlar elementos
if(!Add(lbl))
return(false);
//--- sucesso
return(true);
}
//+------------------------------------------------------------------+
//| Manipulador criando botão de evento "Adicionar"  |
//+------------------------------------------------------------------+
void CMemoryControl::OnClickButtonAdd(void)
{
//--- aumentar o tamanho do array
m_arr_size+=(int)m_combo_box_step.Value();
//--- tentativa de alocar memória para o atual array
if(CurrentArrayAdd())
{
//--- memória alocada, exibir o status atual na tela
m_lbl_memory_available.Text("Memória disponível = "+(string)TerminalInfoInteger(TERMINAL_MEMO
m_lbl_memory_used.Text("Memória usada = "+(string)TerminalInfoInteger(TERMINAL_MEMORY_USED)+"
m_lbl_array_size.Text("Tamanho de array = "+IntegerToString(m_arr_size));
m_lbl_error.Text("");
}
else
{
//--- falha para alocar memória, exibir a mensagem de erro
m_lbl_error.Text("Array é muito grande, erro!");
//--- retornar o tamanho do array anterior
m_arr_size-=(int)m_combo_box_step.Value();
}
}
//+------------------------------------------------------------------+
//| Manipulador criando o botão de evento "Livre"  |
//+------------------------------------------------------------------+
void CMemoryControl::OnClickButtonFree(void)
{
//--- liberar memória do atual array
CurrentArrayFree();
//--- exibir o status atual na tela
m_lbl_memory_available.Text("Memória disponível = "+(string)TerminalInfoInteger(TERMINAL_MEMORY_
m_lbl_memory_used.Text("Memória usada = "+(string)TerminalInfoInteger(TERMINAL_MEMORY_USED)+" Mb
m_lbl_array_size.Text("Tamanho de array = 0");
m_lbl_error.Text("");
}

© 2000-2018, MetaQuotes Software Corp.


992 Funções para Array

//+------------------------------------------------------------------+
//| 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);
}
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


993 Funções para Array

//| Expert chart event function |


//+------------------------------------------------------------------+
void OnChartEvent(const int id,
const long &lparam,
const double &dparam,
const string &sparam)
{
ExtDialog.ChartEvent(id,lparam,dparam,sparam);
}

© 2000-2018, MetaQuotes Software Corp.


994 Funções para Array

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
Retorna 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

© 2000-2018, MetaQuotes Software Corp.


995 Funções para Array

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  |
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


996 Funções para Array

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[])
{
//--- calcular o indicador de acordo com o valor do sinalizador
if(InpPrices)
CandleSizeOnBuffer(rates_total,prev_calculated,open,close,ExtBuffer);
else
CandleSizeOnBuffer(rates_total,prev_calculated,high,low,ExtBuffer);
//--- valor retorno de prev_calculated para a próxima chamada
return(rates_total);
}

Também Veja
Aceso a séries de tempo, ArraySetAsSeries

© 2000-2018, MetaQuotes Software Corp.


997 Funções para Array

ArrayInitialize
A função inicializa um array numérico com um valor predefinido.

F or initialization of an array of char type

int  ArrayInitialize(
char  array[],  // array inicializado
char  value  // valor que será definido
);

F or initialization of an array of short type

int  ArrayInitialize(
short  array[],  // array inicializado
short  value  // valor que será definido
);

F or initialization of an array of int type

int  ArrayInitialize(
int  array[],  // array inicializado
int  value  // valor que será definido
);

F or initialization of an array of long type

int  ArrayInitialize(
long  array[],  // array inicializado
long  value  // valor que será definido
);

F or initialization of an array of float type

int  ArrayInitialize(
float  array[],  // array inicializado
float  value  // valor que será definido
);

F or initialization of an array of double type

int  ArrayInitialize(
double  array[],  // array inicializado
double  value  // valor que será definido
);

F or initialization of an array of bool type

int  ArrayInitialize(
bool  array[],  // array inicializado
bool  value  // valor que será definido
);

© 2000-2018, MetaQuotes Software Corp.


998 Funções para Array

F or initialization of an array of uint type

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.

A inicialização de um array usando ArrayInitialize(array, init_val) não significa a inicialização com o


mesmo valor dos elementos da reserva alocados para este array. Em uma expansão posterior do
array usando a função ArrayR esize(), os elementos serão adicionados no final do array, seus valores
serão indefinidos e na maioria dos casos não serão iguais ao init_value.

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]);
}

© 2000-2018, MetaQuotes Software Corp.


999 Funções para Array

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, s hort, us hort, 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.

Um array multidimensional é exibido como unidimensional quando processado pela função


ArrayFill(). Por exemplo, array[2][4] é processado como array[8]. Portanto, você deve especificar o
índice do elemento inicial para ser igual a 5 quando trabalhar com este array. Assim, a chamada de
ArrayFill(array, 5, 2, 3.14) para array[2][4] preenche os elementos array[1][1] e array[1][2] com
3.14.

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

© 2000-2018, MetaQuotes Software Corp.


1000 Funções para Array

ArrayFill(a,5,5,456);
//--- mostrar valores
for(int i=0;i<ArraySize(a);i++) printf("a[%d] = %d",i,a[i]);
}

© 2000-2018, MetaQuotes Software Corp.


1001 Funções para Array

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
Retorna 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[])

© 2000-2018, MetaQuotes Software Corp.


1002 Funções para Array

{
//--- 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

© 2000-2018, MetaQuotes Software Corp.


1003 Funções para Array

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
Retorna 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[],

© 2000-2018, MetaQuotes Software Corp.


1004 Funções para Array

const long &tick_volume[],


const long &volume[],
const int &spread[])
{
//---
if(ArrayIsSeries(open))
Print("open[] é timeseries");
else
Print("open[] não é timeseries!!!");
//--- valor retorno de prev_calculated para a próxima chamada
return(rates_total);
}

Também Veja
Acesso a séries de tempo e indicadores

© 2000-2018, MetaQuotes Software Corp.


1005 Funções para Array

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.

Funções ArrayMaximum e ArrayMinimum aceitam arrays multi-dimensionais como um parâmetro. No


entanto, a pesquisa é sempre aplicada à primeira (zero) dimensão.

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

© 2000-2018, MetaQuotes Software Corp.


1006 Funções para Array

//---- 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

© 2000-2018, MetaQuotes Software Corp.


1007 Funções para Array

const double ExtEmptyBodySize=0.2*SymbolInfoDouble(Symbol(),SYMBOL_POINT);


//+------------------------------------------------------------------+
//| Preenchendo a parte básica do candlestick  |
//+------------------------------------------------------------------+
void FillCandleMain(const double &open[],const double &close[],
const double &high[],const double &low[],
const int start,const int last,const int fill_index,
int &index_max,int &index_min)
{
//--- encontrar o índice dos elementos máximo e mínimo nos arrays
index_max=ArrayMaximum(high,ExtStartPos,last-start+1); // máximo em Alta
index_min=ArrayMinimum(low,ExtStartPos,last-start+1); // mínimo em Baixa
//--- definir quantas barras do período de tempo atual serão preenchidas
int count=fill_index-start+1;
//--- se o preço de fechamento no primeiro bar é excede ao do último bar, o candlesticks é de baixa
if(open[start]>close[last])
{
//--- antes que o candlestick seja de alta, limpar os valores de alta dos buffers do indicado
if(ExtDirectionFlag!=-1)
ClearCandle(ExtBullBodyFirst,ExtBullBodySecond,ExtBullShadowFirst,ExtBullShadowSecond,star
//--- candlestick de baixa
ExtDirectionFlag=-1;
//--- gerar o candlestick
FormCandleMain(ExtBearBodyFirst,ExtBearBodySecond,ExtBearShadowFirst,ExtBearShadowSecond,open
close[last],high[index_max],low[index_min],start,count,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])
{
//--- antes que o candlestick seja de baixa, limpar os valores de baixa dos buffers do indica
if(ExtDirectionFlag!=1)
ClearCandle(ExtBearBodyFirst,ExtBearBodySecond,ExtBearShadowFirst,ExtBearShadowSecond,star
//--- candlesticks de alta
ExtDirectionFlag=1;
//--- gerar o candlestick
FormCandleMain(ExtBullBodyFirst,ExtBullBodySecond,ExtBullShadowFirst,ExtBullShadowSecond,clos
open[start],high[index_max],low[index_min],start,count,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
//--- antes que o candlestick seja de alta, limpar os valores de alta dos buffers do indicador
if(ExtDirectionFlag!=-1)
ClearCandle(ExtBullBodyFirst,ExtBullBodySecond,ExtBullShadowFirst,ExtBullShadowSecond,start,c
//--- candlestick de baixa
ExtDirectionFlag=-1;

© 2000-2018, MetaQuotes Software Corp.


1008 Funções para Array

//--- 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
}
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


1009 Funções para Array

//| Função de inicialização do indicador customizado  |


//+------------------------------------------------------------------+
int OnInit()
{
//--- verificar o período do indicador
if(!CheckPeriod((int)Period(),(int)InpPeriod))
return(INIT_PARAMETERS_INCORRECT);
//--- exibir dados de preço num primeiro plano
ChartSetInteger(0,CHART_FOREGROUND,0,1);
//--- vincular buffers do indicador
SetIndexBuffer(0,ExtBearBodyFirst);
SetIndexBuffer(1,ExtBearBodySecond);
SetIndexBuffer(2,ExtBearBodyEndFirst);
SetIndexBuffer(3,ExtBearBodyEndSecond);
SetIndexBuffer(4,ExtBearShadowFirst);
SetIndexBuffer(5,ExtBearShadowSecond);
SetIndexBuffer(6,ExtBearShadowEndFirst);
SetIndexBuffer(7,ExtBearShadowEndSecond);
SetIndexBuffer(8,ExtBullBodyFirst);
SetIndexBuffer(9,ExtBullBodySecond);
SetIndexBuffer(10,ExtBullBodyEndFirst);
SetIndexBuffer(11,ExtBullBodyEndSecond);
SetIndexBuffer(12,ExtBullShadowFirst);
SetIndexBuffer(13,ExtBullShadowSecond);
SetIndexBuffer(14,ExtBullShadowEndFirst);
SetIndexBuffer(15,ExtBullShadowEndSecond);
//--- definir alguns valores de propriedade para a criação do indicador
for(int i=0;i<8;i++)
{
PlotIndexSetInteger(i,PLOT_DRAW_TYPE,DRAW_FILLING); // tipo de construção gráfica
PlotIndexSetInteger(i,PLOT_LINE_STYLE,STYLE_SOLID); // estilo de linha de desenho
PlotIndexSetInteger(i,PLOT_LINE_WIDTH,1); // largura de linha de desenho
}
//---
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[])

© 2000-2018, MetaQuotes Software Corp.


1010 Funções para Array

{
//--- 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);

© 2000-2018, MetaQuotes Software Corp.


1011 Funções para Array

//--- deslocar a posição inicial para desenhar o próximo candlestick


ExtStartPos=i;
//--- aumentar o contador de array
ExtCount++;
}
else
continue;
}
else
{
//--- redefinir os valores de array
ResetLastError();
//--- receber a última data do maior período de tempo
if(CopyTime(Symbol(),InpPeriod,0,1,ExtCurrentTime)==-1)
{
Print("Erro na cópia dos dados, código = ",GetLastError());
return(0);
}
//--- se a nova data for posterior, parar de gerar o candlestick
if(ExtCurrentTime[0]>ExtLastTime)
{
//--- limpar a área entre a última e a penúltima barra nos principais buffers do ind
ClearEndOfBodyMain(i-1);
//--- preencher a área usando buffers auxiliares do indicador
FillCandleEnd(open,close,high,low,ExtStartPos,i-1,i-1,ExtIndexMax,ExtIndexMin);
//--- deslocar a posição inicial para desenhar o próximo candlestick
ExtStartPos=i;
//--- restabelecer flag da direção do preço
ExtDirectionFlag=0;
//--- armazenar a nova última data
ExtLastTime=ExtCurrentTime[0];
}
else
{
//--- gerar o candlestick
FillCandleMain(open,close,high,low,ExtStartPos,i,i,ExtIndexMax,ExtIndexMin);
}
}
}
}
//--- valor retorno de prev_calculated para a próxima chamada
return(rates_total);
}
//+------------------------------------------------------------------+
//| Verificar a exatidão do período do indicador determinado  |
//+------------------------------------------------------------------+
bool CheckPeriod(int current_period,int high_period)
{
//--- o período do indicador deve ultrapassar o período de tempo que é exibido sobre

© 2000-2018, MetaQuotes Software Corp.


1012 Funções para Array

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);

© 2000-2018, MetaQuotes Software Corp.


1013 Funções para Array

//--- definir o índice do loop para o array zero


ExtCount=0;
//--- definir a posição atual do candlestick no período de tempo para zero
ExtStartPos=0;
ExtStartFlag=true;
//--- armazenar o último valor de tempo a partir da maior periodicidade
ExtLastTime=ExtTimeBuff[ExtSize-1];
//--- sucesso na execução
return(true);
}
//+------------------------------------------------------------------------------+
//| Função constitui a parte principal do candlestick. Dependendo do sinalizador |
//| valor, a função define quais dados e arrays serão  |
//| usados para exibição correta.  |
//+------------------------------------------------------------------------------+
void FormCandleMain(double &body_fst[],double &body_snd[],
double &shadow_fst[],double &shadow_snd[],
const double fst_value,const double snd_value,
const double fst_extremum,const double snd_extremum,
const int start,const int count,const bool flag)
{
//--- verificar o valor do flag
if(flag)
{
//--- gerar o corpo do candlestick
FormMain(body_fst,body_snd,fst_value,snd_value,start,count);
//--- gerar a sombra do candlestick
FormMain(shadow_fst,shadow_snd,fst_extremum,snd_extremum,start,count);
}
else
{
//--- gerar o corpo do candlestick
FormMain(body_fst,body_snd,snd_value,fst_value,start,count);
//--- gerar a sombra do candlestick
FormMain(shadow_fst,shadow_snd,snd_extremum,fst_extremum,start,count);
}
}
//+-------------------------------------------------------------------------------+
//| A função para formar o final do candlestick. Depende do valor do sinalizador, |
//| a função define quais dados e arrays são  |
//| usados para exibição correta.  |
//+-------------------------------------------------------------------------------+
void FormCandleEnd(double &body_fst[],double &body_snd[],
double &shadow_fst[],double &shadow_snd[],
const double fst_value,const double snd_value,
const double fst_extremum,const double snd_extremum,
const int end,bool &flag)
{
//--- verificar o valor do flag

© 2000-2018, MetaQuotes Software Corp.


1014 Funções para Array

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)

© 2000-2018, MetaQuotes Software Corp.


1015 Funções para Array

{
//--- 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;
}

© 2000-2018, MetaQuotes Software Corp.


1016 Funções para Array

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.

Funções ArrayMaximum e ArrayMinimum aceitam arrays multi-dimensionais como um parâmetro. No


entanto, a pesquisa é sempre aplicada à primeira (zero) dimensão.

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

© 2000-2018, MetaQuotes Software Corp.


1017 Funções para Array

//---- 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

© 2000-2018, MetaQuotes Software Corp.


1018 Funções para Array

const double ExtEmptyBodySize=0.2*SymbolInfoDouble(Symbol(),SYMBOL_POINT);


//+------------------------------------------------------------------+
//| Preenchendo a parte básica do candlestick  |
//+------------------------------------------------------------------+
void FillCandleMain(const double &open[],const double &close[],
const double &high[],const double &low[],
const int start,const int last,const int fill_index,
int &index_max,int &index_min)
{
//--- encontrar o índice dos elementos máximo e mínimo nos arrays
index_max=ArrayMaximum(high,ExtStartPos,last-start+1); // máximo em Alta
index_min=ArrayMinimum(low,ExtStartPos,last-start+1); // mínimo em Baixa
//--- definir quantas barras do período de tempo atual serão preenchidas
int count=fill_index-start+1;
//--- se o preço de fechamento no primeiro bar é excede ao do último bar, o candlesticks é de baixa
if(open[start]>close[last])
{
//--- antes que o candlestick seja de alta, limpar os valores de alta dos buffers do indicado
if(ExtDirectionFlag!=-1)
ClearCandle(ExtBullBodyFirst,ExtBullBodySecond,ExtBullShadowFirst,ExtBullShadowSecond,star
//--- candlestick de baixa
ExtDirectionFlag=-1;
//--- gerar o candlestick
FormCandleMain(ExtBearBodyFirst,ExtBearBodySecond,ExtBearShadowFirst,ExtBearShadowSecond,open
close[last],high[index_max],low[index_min],start,count,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])
{
//--- antes que o candlestick seja de baixa, limpar os valores de baixa dos buffers do indica
if(ExtDirectionFlag!=1)
ClearCandle(ExtBearBodyFirst,ExtBearBodySecond,ExtBearShadowFirst,ExtBearShadowSecond,star
//--- candlesticks de alta
ExtDirectionFlag=1;
//--- gerar o candlestick
FormCandleMain(ExtBullBodyFirst,ExtBullBodySecond,ExtBullShadowFirst,ExtBullShadowSecond,clos
open[start],high[index_max],low[index_min],start,count,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
//--- antes que o candlestick seja de alta, limpar os valores de alta dos buffers do indicador
if(ExtDirectionFlag!=-1)
ClearCandle(ExtBullBodyFirst,ExtBullBodySecond,ExtBullShadowFirst,ExtBullShadowSecond,start,c
//--- candlestick de baixa
ExtDirectionFlag=-1;

© 2000-2018, MetaQuotes Software Corp.


1019 Funções para Array

//--- 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
}
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


1020 Funções para Array

//| Função de inicialização do indicador customizado  |


//+------------------------------------------------------------------+
int OnInit()
{
//--- verificar o período do indicador
if(!CheckPeriod((int)Period(),(int)InpPeriod))
return(INIT_PARAMETERS_INCORRECT);
//--- exibir dados de preço num primeiro plano
ChartSetInteger(0,CHART_FOREGROUND,0,1);
//--- vincular buffers do indicador
SetIndexBuffer(0,ExtBearBodyFirst);
SetIndexBuffer(1,ExtBearBodySecond);
SetIndexBuffer(2,ExtBearBodyEndFirst);
SetIndexBuffer(3,ExtBearBodyEndSecond);
SetIndexBuffer(4,ExtBearShadowFirst);
SetIndexBuffer(5,ExtBearShadowSecond);
SetIndexBuffer(6,ExtBearShadowEndFirst);
SetIndexBuffer(7,ExtBearShadowEndSecond);
SetIndexBuffer(8,ExtBullBodyFirst);
SetIndexBuffer(9,ExtBullBodySecond);
SetIndexBuffer(10,ExtBullBodyEndFirst);
SetIndexBuffer(11,ExtBullBodyEndSecond);
SetIndexBuffer(12,ExtBullShadowFirst);
SetIndexBuffer(13,ExtBullShadowSecond);
SetIndexBuffer(14,ExtBullShadowEndFirst);
SetIndexBuffer(15,ExtBullShadowEndSecond);
//--- definir alguns valores de propriedade para a criação do indicador
for(int i=0;i<8;i++)
{
PlotIndexSetInteger(i,PLOT_DRAW_TYPE,DRAW_FILLING); // tipo de construção gráfica
PlotIndexSetInteger(i,PLOT_LINE_STYLE,STYLE_SOLID); // estilo de linha de desenho
PlotIndexSetInteger(i,PLOT_LINE_WIDTH,1); // largura de linha de desenho
}
//---
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[])

© 2000-2018, MetaQuotes Software Corp.


1021 Funções para Array

{
//--- 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);

© 2000-2018, MetaQuotes Software Corp.


1022 Funções para Array

//--- deslocar a posição inicial para desenhar o próximo candlestick


ExtStartPos=i;
//--- aumentar o contador de array
ExtCount++;
}
else
continue;
}
else
{
//--- redefinir os valores de array
ResetLastError();
//--- receber a última data do maior período de tempo
if(CopyTime(Symbol(),InpPeriod,0,1,ExtCurrentTime)==-1)
{
Print("Erro na cópia dos dados, código = ",GetLastError());
return(0);
}
//--- se a nova data for posterior, parar de gerar o candlestick
if(ExtCurrentTime[0]>ExtLastTime)
{
//--- limpar a área entre a última e a penúltima barra nos principais buffers do ind
ClearEndOfBodyMain(i-1);
//--- preencher a área usando buffers auxiliares do indicador
FillCandleEnd(open,close,high,low,ExtStartPos,i-1,i-1,ExtIndexMax,ExtIndexMin);
//--- deslocar a posição inicial para desenhar o próximo candlestick
ExtStartPos=i;
//--- restabelecer flag da direção do preço
ExtDirectionFlag=0;
//--- armazenar a nova última data
ExtLastTime=ExtCurrentTime[0];
}
else
{
//--- gerar o candlestick
FillCandleMain(open,close,high,low,ExtStartPos,i,i,ExtIndexMax,ExtIndexMin);
}
}
}
}
//--- valor retorno de prev_calculated para a próxima chamada
return(rates_total);
}
//+------------------------------------------------------------------+
//| Verificar a exatidão do período do indicador determinado  |
//+------------------------------------------------------------------+
bool CheckPeriod(int current_period,int high_period)
{
//--- o período do indicador deve ultrapassar o período de tempo que é exibido sobre

© 2000-2018, MetaQuotes Software Corp.


1023 Funções para Array

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);

© 2000-2018, MetaQuotes Software Corp.


1024 Funções para Array

//--- definir o índice do loop para o array zero


ExtCount=0;
//--- definir a posição atual do candlestick no período de tempo para zero
ExtStartPos=0;
ExtStartFlag=true;
//--- armazenar o último valor de tempo a partir da maior periodicidade
ExtLastTime=ExtTimeBuff[ExtSize-1];
//--- sucesso na execução
return(true);
}
//+--------------------------------------------------------------------------+
//| Função constitui a parte principal do candlestick. Dependendo do sinalizador |
//| valor, a função define quais dados e arrays serão  |
//| usados para exibição correta.  |
//+--------------------------------------------------------------------------+
void FormCandleMain(double &body_fst[],double &body_snd[],
double &shadow_fst[],double &shadow_snd[],
const double fst_value,const double snd_value,
const double fst_extremum,const double snd_extremum,
const int start,const int count,const bool flag)
{
//--- verificar o valor do flag
if(flag)
{
//--- gerar o corpo do candlestick
FormMain(body_fst,body_snd,fst_value,snd_value,start,count);
//--- gerar a sombra do candlestick
FormMain(shadow_fst,shadow_snd,fst_extremum,snd_extremum,start,count);
}
else
{
//--- gerar o corpo do candlestick
FormMain(body_fst,body_snd,snd_value,fst_value,start,count);
//--- gerar a sombra do candlestick
FormMain(shadow_fst,shadow_snd,snd_extremum,fst_extremum,start,count);
}
}
//+--------------------------------------------------------------------------------+
//| A função para formar o final do candlestick. Dependendo do valor da flag, |
//| A função define quais dados e arrays são  |
//| usados para exibição correta.  |
//+--------------------------------------------------------------------------------+
void FormCandleEnd(double &body_fst[],double &body_snd[],
double &shadow_fst[],double &shadow_snd[],
const double fst_value,const double snd_value,
const double fst_extremum,const double snd_extremum,
const int end,bool &flag)
{
//--- verificar o valor do flag

© 2000-2018, MetaQuotes Software Corp.


1025 Funções para Array

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)

© 2000-2018, MetaQuotes Software Corp.


1026 Funções para Array

{
//--- 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;
}

© 2000-2018, MetaQuotes Software Corp.


1027 Funções para Array

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 IM 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

© 2000-2018, MetaQuotes Software Corp.


1028 Funções para Array

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

© 2000-2018, MetaQuotes Software Corp.


1029 Funções para Array

FileSave, FileLoad

© 2000-2018, MetaQuotes Software Corp.


1030 Funções para Array

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
}

© 2000-2018, MetaQuotes Software Corp.


1031 Funções para Array

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.

Если ArrayResize() применена к статическому массиву, таймсерии или индикаторному буферу, то


размер массива остается прежним – такие массивы не могут быть перераспределены. В этом
случае если new_size<=ArraySize(array), то функция просто вернет new_size; в противном случае
будет возвращено -1.
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.

T otal amount of elements in the array cannot exceed 2147483647.

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.

© 2000-2018, MetaQuotes Software Corp.


1032 Funções para Array

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;
}

© 2000-2018, MetaQuotes Software Corp.


1033 Funções para Array

}
}
//--- 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

© 2000-2018, MetaQuotes Software Corp.


1034 Funções para Array

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).

Exemplo: Indicador que mostra número de barra

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1
//---- plota Numeration

© 2000-2018, MetaQuotes Software Corp.


1035 Funções para Array

#property indicator_label1 "Numeration"


#property indicator_type1 DRAW_LINE
#property indicator_color1 CLR_NONE
//--- buffers do indicador
double NumerationBuffer[];
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado  |
//+------------------------------------------------------------------+
int OnInit()
{
//--- mapeamento de buffers do indicador
SetIndexBuffer(0,NumerationBuffer,INDICATOR_DATA);
//--- definir a indexação do buffer como numa timeseries
ArraySetAsSeries(NumerationBuffer,true);
//--- define a precisão de exibição na Janela de Dados
IndicatorSetInteger(INDICATOR_DIGITS,0);
//--- como o nome do array do indicador é exibido na Janela de Dados
PlotIndexSetString(0,PLOT_LABEL,"Bar #");
//---
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ós armazenaremos a hora de abertura da barra zero corrente
static datetime currentBarTimeOpen=0;
//--- acesso reverso ao array time[] - fazemos isso como em séries temporais
ArraySetAsSeries(time,true);
//--- se a hora da barra zero difere da hora armazenada
if(currentBarTimeOpen!=time[0])
{
//--- enumera todas as barras a partir do corrento para a profundidade do gráfico
for(int i=rates_total-1;i>=0;i--) NumerationBuffer[i]=i;
currentBarTimeOpen=time[0];
}
//--- valor retorno de prev_calculated para a próxima chamada
return(rates_total);
}

© 2000-2018, MetaQuotes Software Corp.


1036 Funções para Array

Também Veja
Acesso à séries de tempo, ArrayGetAsSeries

© 2000-2018, MetaQuotes Software Corp.


1037 Funções para Array

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);

© 2000-2018, MetaQuotes Software Corp.


1038 Funções para Array

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);
}

© 2000-2018, MetaQuotes Software Corp.


1039 Funções para Array

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.

Funções ArraySort e ArrayBSearch aceitam arrays de qualquer dimensão como um parâmetro. No


entanto, a pesquisa e a classificação são sempre aplicadas à primeira dimensão (zero).

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[];

© 2000-2018, MetaQuotes Software Corp.


1040 Funções para Array

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

© 2000-2018, MetaQuotes Software Corp.


1041 Funções para Array

{
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

© 2000-2018, MetaQuotes Software Corp.


1042 Funções para Array

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;

© 2000-2018, MetaQuotes Software Corp.


1043 Funções para Array

}
}
//--- 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

© 2000-2018, MetaQuotes Software Corp.


1044 Funções para Array

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
Retorna 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++)
{

© 2000-2018, MetaQuotes Software Corp.


1045 Funções para Array

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

© 2000-2018, MetaQuotes Software Corp.


1046 Funções de Conversão

Funções de Conversão
Este é um grupo de funções que fornece conversão de dados de um formato para outro.

The 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.

F unção Ação
CharT oString Converte um código de s ímbolo em um string
de um caractere.

DoubleT oString Converte um valor numérico para um linha de


texto com a precisão especificada

EnumT oString Converte um valor de enumeração de qualquer


tipo para string

NormalizeDouble Arredonda um número de ponto flutuando para


uma precisão especificada

String T oDouble Converte uma string contendo um


representação de s ímbolo de número em um
número de tipo double

String T oInteger Converte uma string contendo uma


representação de s ímbolo de número em um
número de tipo int

String T oT ime Converte uma string contendo hora ou data no


formato "yyyy.mm.dd [hh:mi]" em um tipo
datetime

T imeT oString Converte um valor contendo hora em segundos


decorridos deste 01.01.1970 em uma string de
formato "yyyy.mm.dd hh:mi"

IntegerT oString Converte int em uma string de comprimento


predefinido

S hortT oString Converte código de s ímbolo (unicode) em string


de um s ímbolo

S hortArrayT oString Copia parte de um array em uma string

String T oS hortArray Copia s ímbolo a s ímbolo uma string para uma


parte selecionada de array de tipo us hort

CharArrayT oString Converte código de s ímbolo (ansi) em um array


de um s ímbolo

String T oCharArray Copia s ímbolo a s ímbolo uma string convertida


de Unicode para ANS I, para um lugar
selecionado de um array de tipo uchar

© 2000-2018, MetaQuotes Software Corp.


1047 Funções de Conversão

ColorT oARGB Converte tipo color para tipo uint para receber
representação ARGB da cor.

ColorT oString Converte um valor de color em uma string como


"R,G,B"
String T oColor Converte uma string "R ,G,B" ou uma string com
nome de cor em valor de tipo color

String Format Converte um número em string de acordo com


um formato predefinido

Também Veja
Uso de um Código de Página (Codepage)

© 2000-2018, MetaQuotes Software Corp.


1048 Funções de Conversão

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.

© 2000-2018, MetaQuotes Software Corp.


1049 Funções de Conversão

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
Uso de um Código de Página (Codepage)

© 2000-2018, MetaQuotes Software Corp.


1050 Funções de Conversão

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

© 2000-2018, MetaQuotes Software Corp.


1051 Funções de Conversã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
Recursos, ResourceCreate(), T extOut(), T ipo color, T ipos char, s hort, int e long

© 2000-2018, MetaQuotes Software Corp.


1052 Funções de Conversão

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
Representaçã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);

clr=ColorToString(C'0,255,0',true); // obtém a constante de cor


Print(clr);

© 2000-2018, MetaQuotes Software Corp.


1053 Funções de Conversão

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

© 2000-2018, MetaQuotes Software Corp.


1054 Funções de Conversão

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));

//--- define o intervalo de tempo igual a um quadrimestre (três meses)


period=quarter;
Print(EnumToString(period)+"="+IntegerToString(period));

//--- define o intervalo de tempo igual a um ano (12 meses)


period=year;
Print(EnumToString(period)+"="+IntegerToString(period));

//--- verifica como o tipo de ordem é mostrado

© 2000-2018, MetaQuotes Software Corp.


1055 Funções de Conversão

ENUM_ORDER_TYPE type=ORDER_TYPE_BUY;
Print(EnumToString(type)+"="+IntegerToString(type));

//--- verifica como valores incorretos são mostrados


type=WRONG_VALUE;
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

© 2000-2018, MetaQuotes Software Corp.


1056 Funções de Conversão

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.

© 2000-2018, MetaQuotes Software Corp.


1057 Funções de Conversão

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.

© 2000-2018, MetaQuotes Software Corp.


1058 Funções de Conversão

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 us hort (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.

© 2000-2018, MetaQuotes Software Corp.


1059 Funções de Conversão

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.

© 2000-2018, MetaQuotes Software Corp.


1060 Funções de Conversão

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

você terá o seguinte no terminal:

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:

© 2000-2018, MetaQuotes Software Corp.


1061 Funções de Conversão

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), Redução de tipos,

© 2000-2018, MetaQuotes Software Corp.


1062 Funções de Conversão

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
Uso de um Código de Página (Codepage)

© 2000-2018, MetaQuotes Software Corp.


1063 Funções de Conversão

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] Representaçã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);

© 2000-2018, MetaQuotes Software Corp.


1064 Funções de Conversão

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.

© 2000-2018, MetaQuotes Software Corp.


1065 Funções de Conversão

StringToInteger
A função converte uma string contendo uma representação de s ímbolo de um número em um número
de tipo int (inteiro).
long  StringToInteger(
string  value  // string
);

Parâmetros
value
[in] String contendo um número.

Valor do Retorno
Valor de tipo long.

© 2000-2018, MetaQuotes Software Corp.


1066 Funções de Conversão

StringToShortArray
A função copia s ímbolo a s ímbolo uma string em um lugar especificado de um array de tipo us hort.
Retorna 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 us hort (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.

© 2000-2018, MetaQuotes Software Corp.


1067 Funções de Conversão

StringToTime
A função converte uma string contendo hora ou data no formato "yyyy.mm.dd [hh:mi]" para o tipo
datetime.
datetime  StringToTime(
string  value  // string de data/hora
);

Parâmetros
value
[in] String no formato " yyyy.mm.dd hh:mi " .

Valor do Retorno
O valor de tipo datetime contendo o número total de segundos decorridos desde 01.01.1970.

© 2000-2018, MetaQuotes Software Corp.


1068 Funções de Conversão

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:

© 2000-2018, MetaQuotes Software Corp.


1069 Funções de Conversão

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);

© 2000-2018, MetaQuotes Software Corp.


1070 Funções de Conversão

temp_string=StringFormat(" SYMBOL_SWAP_LONG = %f (long swap value)\n",


swap_long);
StringAdd(output_string,temp_string);
//--- double value output with default accuracy
double swap_short=SymbolInfoDouble(_Symbol,SYMBOL_SWAP_SHORT);
temp_string=StringFormat(" SYMBOL_SWAP_SHORT = %f (short swap value)\n",
swap_short);
StringAdd(output_string,temp_string);
//--- determining the trading mode
int trade_mode=(int)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_MODE);
string str_trade_mode;
switch(trade_mode)
{
case SYMBOL_TRADE_MODE_DISABLED: str_trade_mode="SYMBOL_TRADE_MODE_DISABLED (trade is disable
case SYMBOL_TRADE_MODE_LONGONLY: str_trade_mode="SYMBOL_TRADE_MODE_LONGONLY (only long positi
case SYMBOL_TRADE_MODE_SHORTONLY: str_trade_mode="SYMBOL_TRADE_MODE_SHORTONLY (only short pos
case SYMBOL_TRADE_MODE_CLOSEONLY: str_trade_mode="SYMBOL_TRADE_MODE_CLOSEONLY (only position
case SYMBOL_TRADE_MODE_FULL: str_trade_mode="SYMBOL_TRADE_MODE_FULL (no trade restrictions)";
}
//--- string value output
temp_string=StringFormat(" SYMBOL_TRADE_MODE = %s\n",
str_trade_mode);
StringAdd(output_string,temp_string);
//--- double value output in a compact format
double volume_min=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
temp_string=StringFormat(" SYMBOL_VOLUME_MIN = %g (minimal volume for a deal)\n",volume_min);
StringAdd(output_string,temp_string);
//--- double value output in a compact format
double volume_step=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);
temp_string=StringFormat(" SYMBOL_VOLUME_STEP = %g (minimal volume change step)\n",volume_step
StringAdd(output_string,temp_string);
//--- double value output in a compact format
double volume_max=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX);
temp_string=StringFormat(" SYMBOL_VOLUME_MAX = %g (maximal volume for a deal)\n",volume_max);
StringAdd(output_string,temp_string);
//--- determining the contract price calculation mode
int calc_mode=(int)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_CALC_MODE);
string str_calc_mode;
switch(calc_mode)
{
case SYMBOL_CALC_MODE_FOREX:str_calc_mode="SYMBOL_CALC_MODE_FOREX (Forex)";break;
case SYMBOL_CALC_MODE_FUTURES:str_calc_mode="SYMBOL_CALC_MODE_FUTURES (futures)";break;
case SYMBOL_CALC_MODE_CFD:str_calc_mode="SYMBOL_CALC_MODE_CFD (CFD)";break;
case SYMBOL_CALC_MODE_CFDINDEX:str_calc_mode="SYMBOL_CALC_MODE_CFDINDEX (CFD for indices)";br
case SYMBOL_CALC_MODE_CFDLEVERAGE:str_calc_mode="SYMBOL_CALC_MODE_CFDLEVERAGE (CFD at leverag
case SYMBOL_CALC_MODE_EXCH_STOCKS:str_calc_mode="SYMBOL_CALC_MODE_EXCH_STOCKS (trading securi
case SYMBOL_CALC_MODE_EXCH_FUTURES:str_calc_mode="SYMBOL_CALC_MODE_EXCH_FUTURES (trading futu
case SYMBOL_CALC_MODE_EXCH_FUTURES_FORTS:str_calc_mode="SYMBOL_CALC_MODE_EXCH_FUTURES_FORTS (
}
//--- string value output
temp_string=StringFormat(" SYMBOL_TRADE_CALC_MODE = %s\n",
str_calc_mode);
StringAdd(output_string,temp_string);
//--- double value output with 2 digits after the decimal point
double margin_initial=SymbolInfoDouble(_Symbol,SYMBOL_MARGIN_INITIAL);
temp_string=StringFormat(" SYMBOL_MARGIN_INITIAL = %.2f (initial margin)\n",
margin_initial);
StringAdd(output_string,temp_string);
//--- double value output with 2 digits after the decimal point
double margin_maintenance=SymbolInfoDouble(_Symbol,SYMBOL_MARGIN_MAINTENANCE);
temp_string=StringFormat(" SYMBOL_MARGIN_MAINTENANCE = %.2f (maintenance margin)\n",

© 2000-2018, MetaQuotes Software Corp.


1071 Funções de Conversão

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

© 2000-2018, MetaQuotes Software Corp.


1072 Funções Matemáticas

Funções Matemáticas
Um conjunto de funções matemáticas e trigonométricas.

F unção Ação
MathAbs Retorna o valor absoluto (modulo) do valor
numérico especificado

MathArccos Retorna o arco-cosseno de x em radianos


MathArcsin Retorna o arco-seno de x em radianos
MathArctan Retorna o arco-tangente de x em radianos
MathCeil Retorna o valor numérico inteiro mais próximo
do acima

MathCos Retorna o cosseno de um número


MathExp Retorna o exponencial de um número
MathFloor Retorna o valor numérico inteiro mais próximo
do abaixo

MathLog Retorna o logaritmo natural


MathLog 10 Retorna o logaritmo decimal (de um número na
base 10)

MathMax Retorna o valor máximo entre dois valores


numéricos

MathMin Retorna de valor mínimo entre dois valores


numéricos

MathMod Retorna o resto real da divisão de dois números


MathPow Eleva uma base a um expoente especificado

MathR and Retorna um valor pseudo-aleatório entre 0 e


32767
MathR ound Arredonda um valor para o inteiro mais próximo

MathSin Retorna o seno de um número


MathSqrt Retorna a raiz quadrada
MathSrand Define o ponto inicial para geração de uma
série de inteiros pseudo-aleatórios

MathT an Retorna a tangente de um número


MathIs ValidNumber Verifica a validade de um número real
MathExpm1 Retorna o valor da expressão MathExp(x)-1
MathLog 1p Retorna o valor da expressão MathLog(1+x)

© 2000-2018, MetaQuotes Software Corp.


1073 Funções Matemáticas

MathArccos h Retorna o valor do arco cosseno hiperbólico


MathArcsinh Retorna o valor do arco seno hiperbólico
MathArctanh Retorna o valor do arco tangente hiperbólico
MathCos h Retorna o valor do cosseno hiperbólico
MathSinh Retorna o valor do seno hiperbólico
MathT anh Retorna o valor da tangente hiperbólica

© 2000-2018, MetaQuotes Software Corp.


1074 Funções Matemáticas

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().

© 2000-2018, MetaQuotes Software Corp.


1075 Funções Matemáticas

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)

© 2000-2018, MetaQuotes Software Corp.


1076 Funções Matemáticas

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)

© 2000-2018, MetaQuotes Software Corp.


1077 Funções Matemáticas

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().

© 2000-2018, MetaQuotes Software Corp.


1078 Funções Matemáticas

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().

© 2000-2018, MetaQuotes Software Corp.


1079 Funções Matemáticas

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().

© 2000-2018, MetaQuotes Software Corp.


1080 Funções Matemáticas

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)

© 2000-2018, MetaQuotes Software Corp.


1081 Funções Matemáticas

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().

© 2000-2018, MetaQuotes Software Corp.


1082 Funções Matemáticas

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)

© 2000-2018, MetaQuotes Software Corp.


1083 Funções Matemáticas

MathLog
Retorna 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)

© 2000-2018, MetaQuotes Software Corp.


1084 Funções Matemáticas

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.

Se dados de mesmo tipo são passados, nenhuma conversão é realizada.

© 2000-2018, MetaQuotes Software Corp.


1085 Funções Matemáticas

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.

Se dados de mesmo tipo são passados, nenhuma conversão é realizada.

© 2000-2018, MetaQuotes Software Corp.


1086 Funções Matemáticas

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().

© 2000-2018, MetaQuotes Software Corp.


1087 Funções Matemáticas

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().

© 2000-2018, MetaQuotes Software Corp.


1088 Funções Matemáticas

MathRand
Retorna 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().

© 2000-2018, MetaQuotes Software Corp.


1089 Funções Matemáticas

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().

© 2000-2018, MetaQuotes Software Corp.


1090 Funções Matemáticas

MathSin
Retorna 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().

© 2000-2018, MetaQuotes Software Corp.


1091 Funções Matemáticas

MathSqrt
Retorna 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
Raiz 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)

© 2000-2018, MetaQuotes Software Corp.


1092 Funções Matemáticas

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.

Para garantir o recebimento de uma seqüência não recorrente, use a chamada de


MathSrand(GetT ick Count()), uma vez que o valor de GetT ick Count() aumenta a partir do momento
do início do sistema operativo e não se repete dentro de 49 dias, quando o contador built-in de
milissegundos transborda. O uso do MathSrand(T imeCurrent()) não é adequado, porque a função
T imeCurrent() retorna a hora do último tick , que pode não se alterar por um longo tempo, por
exemplo, nos finais de semana.

A inicialização do gerador de números aleatórios usando MathSrand() para indicadores e Expert


Advisors é melhor realizada no handler OnInit(); isso evita os seguidos reinícios múltiplos caso a
inicialização do gerador fosse colocada em OnT ick () ou OnCalculate().

Ao invés da função MathSrand(), você pode usar a função srand().

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;

© 2000-2018, MetaQuotes Software Corp.


1093 Funções Matemáticas

//--- Um buffer do indicador para desenhar a distribuição


double LabelBuffer[];
//--- Um contador de ticks
double ticks_counter;
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado  |
//+------------------------------------------------------------------+
void OnInit()
{
//--- Ligando um array e um buffer de indicador
SetIndexBuffer(0,LabelBuffer,INDICATOR_DATA);
//--- transformar o buffer do indicador em torno do presente para o passado
ArraySetAsSeries(LabelBuffer,true);
//--- Inicializar o gerador de números aleatórios
MathSrand(GetTickCount());
//--- Inicializar o contador de ticks
ticks_counter=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[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//--- Para um contador zero, reinicie o buffer do indicador
if(ticks_counter==0) ArrayInitialize(LabelBuffer,0);
//--- Aumentar o contador
ticks_counter++;
//--- Devemos periodicamente redefinir os contadores, para reviver a distribuição
if(ticks_counter>100)
{
Print("Reajustamos os valores dos indicadores, vamos começar a preencher as células mais uma
ticks_counter=0;
}
//--- Obter uma amostra de valores aleatórios como a soma de três números de 0 a 7
for(int i=0;i<sample_number;i++)
{
//--- Cálculo do índice da célula, onde o número aleatório cai como a soma de outros três núm
int rand_index=0;
//--- Obter três números aleatórios de 0 a 7
for(int k=0;k<3;k++)

© 2000-2018, MetaQuotes Software Corp.


1094 Funções Matemáticas

{
//--- 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);
}

© 2000-2018, MetaQuotes Software Corp.


1095 Funções Matemáticas

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)

© 2000-2018, MetaQuotes Software Corp.


1096 Funções Matemáticas

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
Retorna 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 Reais (double, float)

© 2000-2018, MetaQuotes Software Corp.


1097 Funções Matemáticas

MathExp1
Retorna o valor da expressão MathExp(x)-1.
double  MathExp1(
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 MathExp1, retorna 0.

Observação
Com valores x próximo de 0, a função MathExp1(x) dá um valor muito mais preciso do que
MathExp(x)-1.

Em vez da função MathExp1(), é poss ível utilizar a função expm1().

Veja também
T ipos reais (double, float)

© 2000-2018, MetaQuotes Software Corp.


1098 Funções Matemáticas

MathLog1p
Retorna 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).

Em vez da função MathLog 1p(), é poss ível utilizar a função log 1p().

Veja também
T ipos reais (double, float)

© 2000-2018, MetaQuotes Software Corp.


1099 Funções Matemáticas

MathArccosh
Retorna 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 MathArccos h(), é poss ível utilizar a função acos h().

Veja também
T ipos reais (double, float)

© 2000-2018, MetaQuotes Software Corp.


1100 Funções Matemáticas

MathArcsinh
Retorna 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)

© 2000-2018, MetaQuotes Software Corp.


1101 Funções Matemáticas

MathArctanh
Retorna 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().

© 2000-2018, MetaQuotes Software Corp.


1102 Funções Matemáticas

MathCosh
Retorna 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 MathCos h(), é poss ível utilizar a função cos h().

© 2000-2018, MetaQuotes Software Corp.


1103 Funções Matemáticas

MathSinh
Retorna 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().

© 2000-2018, MetaQuotes Software Corp.


1104 Funções Matemáticas

MathTanh
Retorna o valor da tangente 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)

© 2000-2018, MetaQuotes Software Corp.


1105 Funções de String

Funções de String
Este é um grupo de funções destinado a trabalhar com dados do tipo string.

F unção Ação
StringAdd Adiciona uma string no final de uma outra
string

String BufferLen Retorna o tamanho de buffer alocado para uma


string

StringCompare Compara duas string e retorna 1 se a primeira


string for maior que a segunda; 0 - se as string
são iguais ; -1 (menos 1) - se a primeira string
for menor que a segunda.

StringConcatenate Forma uma string dos parâmetros passados


String Fill Preenche uma string especificada com s ímbolos
selecionados

String Find Busca por uma substring em uma string


String GetCharacter Retorna o valor de um número localizado na
posição de string especificada

String Init Inicializa uma string com s ímbolos


especificados e fornece o comprimento da
string especificada

StringLen Retorna o número de s ímbolos em uma string


String R eplace Substitui todas as substrings encontradas em
uma string por uma seqüência de s ímbolos

StringSetCharacter Retorna uma cópia de uma string com o valor


alterado de um s ímbolo na posição especificada

StringSplit Obtém substrings a partir de um separador


especificado da string especificada, retorna o
número de substrings obtidas

StringSubstr Extrai uma substring a partir de uma string de


texto começando a partir de uma posição
especificada

String T oLower T ransforma todos os s ímbolos de uma string


selecionada para minúscula pela localização

String T oUpper T ransforma todos os s ímbolos de uma string


selecionada para maiúscula pela localização

String T rimLeft Remove caracteres de quebra de linha, espaços


e tabs na parte esquerda da string

© 2000-2018, MetaQuotes Software Corp.


1106 Funções de String

String T rimR ig ht Remove caracteres de quebra de linha, espaços


e tabs na parte direita da string

© 2000-2018, MetaQuotes Software Corp.


1107 Funções de String

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);

//--- segundo método


start=GetTickCount();
for(i=0;i<length;i++)
{
StringAdd(a,b);
}
stop=GetTickCount();
Print("tempo para 'c = a + b' = ",(stop-start)," milissegundos, i = ",i);

//--- terceiro método


start=GetTickCount();
a="a"; // reinicializa a variável a
for(i=0;i<length;i++)

© 2000-2018, MetaQuotes Software Corp.


1108 Funções de String

{
StringConcatenate(c,a,b);
}
stop=GetTickCount();
Print("tempo para 'StringConcatenate(c,a,b)' = ",(stop-start)," milissegundos, i = ",i);
}

Também Veja
StringConcatenate

© 2000-2018, MetaQuotes Software Corp.


1109 Funções de String

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

© 2000-2018, MetaQuotes Software Corp.


1110 Funções de String

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";

//--- compara com sensibilidade à maiúscula/minúscula


int result1=StringCompare(s1,s2);
if(result1>0) PrintFormat("Comparação sensível caso: %s > %s",s1,s2);
else
{
if(result1<0)PrintFormat("Comparação sensível caso: %s < %s",s1,s2);
else PrintFormat("Comparação sensível caso: %s = %s",s1,s2);
}

//--- Comparação insensível caso


int result2=StringCompare(s1,s2,false);
if(result2>0) PrintFormat("Comparação insensível caso: %s > %s",s1,s2);
else

© 2000-2018, MetaQuotes Software Corp.


1111 Funções de String

{
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(), S hortT oString(), String T oCharArray(), String T oS hortArray(),
String GetCharacter(), Uso de um Código de Página

© 2000-2018, MetaQuotes Software Corp.


1112 Funções de String

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
Retorna 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

© 2000-2018, MetaQuotes Software Corp.


1113 Funções de String

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

© 2000-2018, MetaQuotes Software Corp.


1114 Funções de String

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
Retorna 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.

© 2000-2018, MetaQuotes Software Corp.


1115 Funções de String

StringGetCharacter
Retorna 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().

© 2000-2018, MetaQuotes Software Corp.


1116 Funções de String

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

© 2000-2018, MetaQuotes Software Corp.


1117 Funções de String

StringLen
Retorna 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.

© 2000-2018, MetaQuotes Software Corp.


1118 Funções de String

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()

© 2000-2018, MetaQuotes Software Corp.


1119 Funções de String

StringSetCharacter
Retorna 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

© 2000-2018, MetaQuotes Software Corp.


1120 Funções de String

antes: str = 0123456789 ,StringBufferLen(str) = 0 StringLen(str) = 10


após: str = 012345 ,StringBufferLen(str) = 16 StringLen(str) = 6
adição: str = 012345+ ,StringBufferLen(str) = 16 StringLen(str) = 7
*/

Também Veja
String BufferLen, StringLen, String Fill, String Init

© 2000-2018, MetaQuotes Software Corp.


1121 Funções de String

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]);
}
}

© 2000-2018, MetaQuotes Software Corp.


1122 Funções de String

Também Veja
String R eplace(), StringSubstr(), StringConcatenate()

© 2000-2018, MetaQuotes Software Corp.


1123 Funções de String

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.

© 2000-2018, MetaQuotes Software Corp.


1124 Funções de String

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().

© 2000-2018, MetaQuotes Software Corp.


1125 Funções de String

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().

© 2000-2018, MetaQuotes Software Corp.


1126 Funções de String

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
Retorna o número de s ímbolos removidos.

© 2000-2018, MetaQuotes Software Corp.


1127 Funções de String

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
Retorna o número de s ímbolos removidos.

© 2000-2018, MetaQuotes Software Corp.


1128 Data e Hora

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.

F unção Ação
T imeCurrent Retorna a última hora conhecida do servidor
(hora da última cotação recebida) no formato
de datetime(

T imeT radeServer Retorna a hora calculada corrente do servidor


de negociação

T imeLocal Retorna a hora do computador local em formato


datetime

T imeGM T Retorna a hora GM T em formato datetime com


o horário de verão por hora local do
computador, de onde o terminal cliente está
executando

T imeDaylig htSavings Retorna o sinal do ajuste do horário de verão


T imeGM T Offset Retorna a diferença corrente entre a hora GM T
e a hora do computador local em segundos,
levando em consideração o ajuste do horário de
verão

T imeT oStruct Converte um valor datetime em uma variável


do tipo estrutura MqlDateT ime

StructT oT ime Converte uma variável do tipo estrutura


MqlDateT ime em um valor datetime

© 2000-2018, MetaQuotes Software Corp.


1129 Data e Hora

TimeCurrent
Retorna 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.

Chamar sem parâmetros


datetime  TimeCurrent();

Chamar com parâmetro de tipo MqlDateTime


datetime  TimeCurrent(
MqlDateTime&  dt_struct  // variável de tipo estrutura
);

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.

© 2000-2018, MetaQuotes Software Corp.


1130 Data e Hora

TimeTradeServer
Returna 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.

Chamar sem parâmetros


datetime  TimeTradeServer();

Chamar com parâmetro de tipo MqlDateTime


datetime  TimeTradeServer(
MqlDateTime&  dt_struct  // Variável de tipo estrutura
);

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().

© 2000-2018, MetaQuotes Software Corp.


1131 Data e Hora

TimeLocal
Retorna a hora local de um computador, de onde o terminal cliente está executando. Existem 2
variantes da função.

Chamar sem parâmetros


datetime  TimeLocal();

Chamar com parâmetro de tipo MqlDateTime


datetime  TimeLocal(
MqlDateTime&  dt_struct  // Variável de tipo estrutura
);

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().

© 2000-2018, MetaQuotes Software Corp.


1132 Data e Hora

TimeGMT
Retorna 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.

Chamar sem parâmetros


datetime  TimeGMT();

Chamar com parâmetro de tipo MqlDateTime


datetime  TimeGMT(
MqlDateTime&  dt_struct  // Variável de tipo estrutura
);

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().

© 2000-2018, MetaQuotes Software Corp.


1133 Data e Hora

TimeDaylightSavings
Retorna 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.

© 2000-2018, MetaQuotes Software Corp.


1134 Data e Hora

TimeGMTOffset
Retorna 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.

T imeGM T Offset() = TimeGMT() - TimeLocal()

© 2000-2018, MetaQuotes Software Corp.


1135 Data e Hora

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().

© 2000-2018, MetaQuotes Software Corp.


1136 Data e Hora

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.

© 2000-2018, MetaQuotes Software Corp.


1137 Informações de Conta

Informações de Conta
Funções que retornam parâmetros da conta corrente.

F unção Ação
AccountInfoDouble Retorna um valor de tipo double da
correspondente propriedade da conta

AccountInfoInteger Retorna um valor de tipo inteiro (bool, int ou


long) da correspondente propriedade da conta

AccountInfoString Retorna um valor de tipo string da


correspondente propriedade da conta

© 2000-2018, MetaQuotes Software Corp.


1138 Informações de Conta

AccountInfoDouble
Retorna o valor da correspondente propriedade da conta.
double  AccountInfoDouble(
int  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

© 2000-2018, MetaQuotes Software Corp.


1139 Informações de Conta

AccountInfoInteger
Retorna o valor das propriedades da conta.
long  AccountInfoInteger(
int  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

//--- Informa sobre a possibilidade de realizar uma operação de negociação


if(thisAccountTradeAllowed)
Print("Comércio para esta conta é permitido");
else
Print("Comércio para esta conta é proibido!");

//--- Descobre se é possível negociar neste conta através de Expert Advisors


if(EATradeAllowed)
Print("Comércio com Expert Advisors é permitido para esta conta");
else
Print("Comércio com Expert Advisors é proibido para esta conta!");

//--- Descobre o tipo de conta


switch(tradeMode)
{
case(ACCOUNT_TRADE_MODE_DEMO):
Print("Esta é uma conta demonstração");
break;

© 2000-2018, MetaQuotes Software Corp.


1140 Informações de Conta

case(ACCOUNT_TRADE_MODE_CONTEST):
Print("Esta é uma conta de competição");
break;
default:Print("Esta é uma conta real!");
}

//--- Descobre o modo de configuração de nível StopOut


switch(stopOutMode)
{
case(ACCOUNT_STOPOUT_MODE_PERCENT):
Print("O nível StopOut é especificado em porcentagem");
break;
default:Print("O nível StopOut é especificado monetariamente");
}
}

Também Veja
Informações de Conta

© 2000-2018, MetaQuotes Software Corp.


1141 Informações de Conta

AccountInfoString
Retorna o valor da correspondente propriedade da conta.
string  AccountInfoString(
int  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

© 2000-2018, MetaQuotes Software Corp.


1142 Verificando Estado

Verificação de Estado
Funções que retornam parâmetros do estado corrente do terminal cliente

F unção Ação
GetLastError Retorna o último erro
IsStopped Retorna true, se um programa mql5 foi
ordenado a interromper sua operação

UninitializeR eason Retorna o código do motivo da desinicialização


T erminalInfoInteger Retorna um valor inteiro de uma propriedade
correspondente do ambiente de um programa
mql5

T erminalInfoDouble Retorna um valor de double de uma propriedade


correspondente do ambiente de um programa
mql5

T erminalInfoString Retorna um valor de string de uma propriedade


correspondente do ambiente de um programa
mql5

MQL InfoInteger Retorna um valor inteiro de uma propriedade


correspondente de um programa mql5 em
execução

MQL InfoString Retorna um valor de string de uma propriedade


correspondente de um programa mql5 em
execução

S ymbol Retorna o nome do ativo do gráfico corrente


Period Retorna a janela de tempo do gráfico corrente
Digits Retorna o número de dígitos decimais
determinando a precisão do valor do preço do
ativo do gráfico corrente

Point Retorna o tamanho do ponto do s ímbolo atual


na moeda de cotação.

© 2000-2018, MetaQuotes Software Corp.


1143 Verificando Estado

GetLastError
Retorna o conteúdo da variável de sistema _LastError.
int  GetLastError();

Valor de Retorno
Retorna 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

© 2000-2018, MetaQuotes Software Corp.


1144 Verificando Estado

IsStopped
Verifique um desligamento forçado de um programa mql5.
bool  IsStopped();

Valor de Retorno
Retorna 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.

© 2000-2018, MetaQuotes Software Corp.


1145 Verificando Estado

UninitializeReason
Retorna o código do motivo para desinicialização.
int  UninitializeReason();

Valor de Retorno
Retorna o valor de _UninitReason que é formado antes de OnDeinit() ser chamado. O valor depende
dos motivos que levaram à desinicialização.

© 2000-2018, MetaQuotes Software Corp.


1146 Verificando Estado

TerminalInfoInteger
Retorna 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.

© 2000-2018, MetaQuotes Software Corp.


1147 Verificando Estado

TerminalInfoDouble
Retorna 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.

© 2000-2018, MetaQuotes Software Corp.


1148 Verificando Estado

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.

© 2000-2018, MetaQuotes Software Corp.


1149 Verificando Estado

MQLInfoInteger
Retorna 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.

© 2000-2018, MetaQuotes Software Corp.


1150 Verificando Estado

MQLInfoString
Retorna 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.

© 2000-2018, MetaQuotes Software Corp.


1151 Verificando Estado

Symbol
Retorna 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.

© 2000-2018, MetaQuotes Software Corp.


1152 Verificando Estado

Period
Retorna 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.

Veja também
PeriodSeconds, Janelas de tempo de gráficos, Data e H ora, Visibilidade de objetos

© 2000-2018, MetaQuotes Software Corp.


1153 Verificando Estado

Digits
Retorna 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.

© 2000-2018, MetaQuotes Software Corp.


1154 Verificando Estado

Point
Retorna 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.

© 2000-2018, MetaQuotes Software Corp.


1155 Informações de Mercado

Obtendo Informações de Mercado


Estas são funções destinadas a receber informações sobre o estado do mercado.

F unção Ação
S ymbols T otal Retorna o número de ativos disponíveis
(selecionados na janela Observação de Mercado
ou todos)

S ymbolName Retorna o nome de um ativo especificado


S ymbolSelect Seleciona um ativo na janela Observação de
Mercado ou remove um ativo desta janela

S ymbolIsS ynchronized Verifica se dados de um ativo selecionado no


terminal estão sincronizados com dados no
servidor de negociações

S ymbolInfoDouble Retorna um valor double de um ativo para a


propriedade correspondente

S ymbolInfoInteger Retorna um valor de tipo inteiro (long,


datetime, int ou bool) de um ativo especificado
para a propriedade correspondente

S ymbolInfoString Retorna um valor do tipo string de um ativo


especificado para a propriedade correspondente

S ymbolInfoMarginR ate Returns the margin rates depending on the


order type and direction

S ymbolInfoT ick Retorna os preços correntes para um ativo


especificado em uma variável do tipo MqlT ick

S ymbolInfoSessionQuote Permite obter a hora de início e fim das


sessões de cotação especificadas para um ativo
especificado e dia da semana.

S ymbolInfoSessionT rade Permite obter a hora de início e fim das


sessões de negociação especificadas para um
ativo especificado e dia da semana.

Mark etBook Add Fornece abertura da Profundidade de Mercado


para um ativo selecionado, e subscrever para
receber notificações de alterações do DOM
(Depth of Mark et)

Mark etBookR elease Fornece fechamento da Profundidade de


Mercado para um ativo selecionado, e cancelar
a subscrição para receber notificações de
alterações do DOM

Mark etBookGet Retorna um array de estrutura MqlBookInfo


contendo registros da Profundidade de Mercado
de uma ativo especificado

© 2000-2018, MetaQuotes Software Corp.


1156 Informações de Mercado

SymbolsTotal
Retorna 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.

© 2000-2018, MetaQuotes Software Corp.


1157 Informações de Mercado

SymbolName
Retorna 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.

© 2000-2018, MetaQuotes Software Corp.


1158 Informações de Mercado

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.

© 2000-2018, MetaQuotes Software Corp.


1159 Informações de Mercado

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

© 2000-2018, MetaQuotes Software Corp.


1160 Informações de Mercado

SymbolInfoDouble
Retorna a propriedade correspondente de um ativo especificado. Existem 2 variantes da função.

1. Imediatamente retorna o valor da propriedade.


double  SymbolInfoDouble(
string  name,  // ativo
ENUM_SYMBOL_INFO_DOUBLE  prop_id  // identificador da propriedade
);

2. Retorna 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.

© 2000-2018, MetaQuotes Software Corp.


1161 Informações de Mercado

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);
}

© 2000-2018, MetaQuotes Software Corp.


1162 Informações de Mercado

SymbolInfoInteger
Retorna a propriedade correspondente de um ativo especificado. Existem 2 variantes da função.

1. Imediatamente retorna o valor da propriedade.


long  SymbolInfoInteger(
string  name,  // ativo
ENUM_SYMBOL_INFO_INTEGER prop_id  // identificador da propriedade

);

2. Retorna 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.

© 2000-2018, MetaQuotes Software Corp.


1163 Informações de Mercado

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);
}

© 2000-2018, MetaQuotes Software Corp.


1164 Informações de Mercado

SymbolInfoString
Retorna a propriedade correspondente de um ativo especificado. Existem 2 variantes da função.

1. Imediatamente retorna o valor da propriedade.


string  SymbolInfoString(
string  name,  // Ativo
ENUM_SYMBOL_INFO_STRING  prop_id  // Identificador de propriedade
);

2. Retorna 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.

© 2000-2018, MetaQuotes Software Corp.


1165 Informações de Mercado

SymbolInfoMarginRate
Retorna 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
Retorna true se as propriedades da consulta foram bem sucedidas, caso contrário false.

© 2000-2018, MetaQuotes Software Corp.


1166 Informações de Mercado

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.

© 2000-2018, MetaQuotes Software Corp.


1167 Informações de Mercado

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

© 2000-2018, MetaQuotes Software Corp.


1168 Informações de Mercado

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

© 2000-2018, MetaQuotes Software Corp.


1169 Informações de Mercado

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

© 2000-2018, MetaQuotes Software Corp.


1170 Informações de Mercado

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

© 2000-2018, MetaQuotes Software Corp.


1171 Informações de Mercado

MarketBookGet
Retorna 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] Referê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
Retorna 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

© 2000-2018, MetaQuotes Software Corp.


1172 Séries Temporais e Acesso a Indicadores

Acesso a séries de tempo e indicadores


Estas são funções para trabalhar com séries de tempo e indicadores. Uma série de tempo difere de um
array de dados usual pela sua ordenação reversa - elementos de séries de tempo são indexados do
final de um array para seu início (a partir do mais recente para o mais antigo). Para copiar valores de
séries de tempo e dados de indicadores, é recomendável usar somente arrays dinâmicos, porque as
funções de cópia estão projetadas para alocar o tamanho necessário dos arrays que recebem valores.

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.

O acesso a dados de indicadores e séries de tempo é implementado independentemente do fato dos


dados solicitados estarem prontos ou não (o chamado acesso ass íncrono). Isso é extremamente
importante para os cálculos de um indicador customizado, porque se não houver dados, as funções de
tipo Copy...() retornam imediatamente um erro. Contudo, ao acessar dados a partir de Expert
Advisors e scripts, as várias tentativas para receber dados são feitos com uma pausa pequena, cujo
objetivo é fornecer algum tempo necessário para baixar a série de tempo requerida para calcular
valores de um indicador.

A seção Organizando Acesso a Dados descreve detalhes de recebimento, armazenamento e solicitação


de dados de preço no terminal cliente MetaT rader 5.

© 2000-2018, MetaQuotes Software Corp.


1173 Séries Temporais e Acesso a Indicadores

É 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.

F unção Ação
Series InfoInteger Retorna informação sobre o estado dos dados
históricos
Bars Retorna o número de barras do histórico para
um ativo e período especificados

BarsCalculated Retorna o número de dados calculados em um


buffer de indicador ou -1 em caso de erro (os
dados não foram calculados ainda)

IndicatorCreate Retorna o handle para o indicador técnico


especificado criado por um array de parâmetros
de tipo MqlParam

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

IndicatorRelease Remove um handle de indicador e libera o bloco


de cálculo do indicador, se ele não for usado por
ninguém mais

CopyBuffer Copia dados de um buffer especificado de um


indicador especificado em um array

CopyR ates Obtém dados históricos da estrutura R ates para


um ativo e período especificados em um array

CopyT ime Obtém dados históricos sobre hora de abertura


de barras para um ativo e período especificados
em um array

CopyOpen Obtém dados históricos sobre preço de abertura


de barras para um ativo e período especificados
em um array

CopyH ig h Obtém histórico de dados sobre preço de barra


máximo para um ativo e período especificados
em um array

CopyLow Obtém histórico de dados sobre preço de barra


minimo para um ativo e período especificados
em um array

CopyClose Obtém histórico de dados sobre preço de


fechamento de barra para um ativo e período

© 2000-2018, MetaQuotes Software Corp.


1174 Séries Temporais e Acesso a Indicadores

especificados em um array

CopyT ickVolume Obtém histórico de dados sobre volumes de tick


para um ativo e período especificados em um
array

CopyR ealVolume Obtém dados históricos sobre volumes de


negociação para um ativo e período
especificados em um array

CopySpread Obtém histórico de dados sobre spreads para


um ativo e período especificados em um array

CopyT ick s Obtém, dentro da matriz tick s _array, tick s no


formato MqlT ick

CopyT ick s R ange Obtém, na matriz tick s _array, tick s em formato


MqlT ick

iBars Retorna o número de barras - no histórico - do


s ímbolo e do período correspondentes

iBarS hift Retorna o índice da barra na qual o tempo


especificado coincide

iClose Retorna o valor do preço de fechamento da


barra (indicado pelo parâmetro s hift) do gráfico
correspondente

iH ig h Retorna o valor do preço máximo da barra


(especificado pelo parâmetro s hift) do gráfico
correspondente

iH ig hest Retorna o índice do maior valor encontrado


(deslocamento relativo à barra atual) do gráfico
correspondente

iLow Retorna o valor do preço mínimo da barra


(indicado pelo parâmetro s hift) do gráfico
correspondente

iLowest Retorna o índice do menor valor encontrado


(deslocamento relativo à barra atual) do gráfico
correspondente

iOpen Retorna o valor do preço de abertura da barra


(indicado pelo parâmetro s hift) do gráfico
correspondente

iT ime Retorna o valor do tempo de abertura da barra


(indicado pelo parâmetro s hift) do gráfico
correspondente

iT ickVolume Retorna o valor do volume de tick (especificado


pelo parâmetro s hift) do gráfico correspondente

© 2000-2018, MetaQuotes Software Corp.


1175 Séries Temporais e Acesso a Indicadores

iR ealVolume Retorna o valor do volume real da barra


(indicado pelo parâmetro s hift) do gráfico
correspondente

iVolume Retorna o valor do volume de tick (especificado


pelo parâmetro s hift) do gráfico correspondente

iSpread Retorna o valor do spread da barra (indicado


pelo parâmetro s hift) do gráfico correspondente

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 resultado nós conseguimos a seguinte saída:

© 2000-2018, MetaQuotes Software Corp.


1176 Séries Temporais e Acesso a Indicadores

TimeCurrent = 2009.06.11 14:16:23


ArraySize(Time) = 10
TimeAsSeries[0] = 2009.06.11 14:00:00
TimeAsSeries[1] = 2009.06.11 13:00:00
TimeAsSeries[2] = 2009.06.11 12:00:00
TimeAsSeries[3] = 2009.06.11 11:00:00
TimeAsSeries[4] = 2009.06.11 10:00:00
TimeAsSeries[5] = 2009.06.11 09:00:00
TimeAsSeries[6] = 2009.06.11 08:00:00
TimeAsSeries[7] = 2009.06.11 07:00:00
TimeAsSeries[8] = 2009.06.11 06:00:00
TimeAsSeries[9] = 2009.06.11 05:00:00

ArrayNotSeries[9] = 2009.06.11 14:00:00


ArrayNotSeries[8] = 2009.06.11 13:00:00
ArrayNotSeries[7] = 2009.06.11 12:00:00
ArrayNotSeries[6] = 2009.06.11 11:00:00
ArrayNotSeries[5] = 2009.06.11 10:00:00
ArrayNotSeries[4] = 2009.06.11 09:00:00
ArrayNotSeries[3] = 2009.06.11 08:00:00
ArrayNotSeries[2] = 2009.06.11 07:00:00
ArrayNotSeries[1] = 2009.06.11 06:00:00
ArrayNotSeries[0] = 2009.06.11 05:00:00

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

© 2000-2018, MetaQuotes Software Corp.


1177 Séries Temporais e Acesso a Indicadores

Direção de Indexação em Arrays, Buffers e Séries Temporais


A indexação padrão de todos os arrays e buffers de indicador é da esquerda para direita. O índice do
primeiro elemento é sempre igual a zero. Assim, o primeiro elemento de um array ou buffer de
indicador com índice 0 está por padrão na posição mais a esquerda, enquanto o último elemento está
na posição mais a direita.

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.

Alterando a Direç ão de Indexaç ão


A função ArraySetAsSeries() permite alterar o método de acessar elementos de um array dinâmico; no
entanto, a ordem física de armazenamento de dados na memória do computador não é alterada. Esta
função simplesmente altera o método de endereçar elementos de um array, assim quando copiar um
array em um outro usando a função ArrayCopy(), o conteúdo do array recipiente não dependerá da
direção de indexação no array fonte.

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.

Recebendo Dados de Preço em Indicadores


Cada indicador customizado deve necessariamente conter a função OnCalculate(), cujos dados de
preço requeridos para calcular valores em buffers de indicadores são passados. A direção de indexação
nestes arrays passados pode ser descoberta usando a função ArrayGetAsSeries().

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().

© 2000-2018, MetaQuotes Software Corp.


1178 Séries Temporais e Acesso a Indicadores

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.

Recebendo Dados de Preço e Valores de Indicador


A direção de indexação padrão de todos os arrays em Expert Advisores, indicadores e scripts é da
esquerda para direita. Se necessário, em qualquer programa mql5 você pode solicitar valores de séries
de tempo de qualquer ativo e janela de tempo, bem como valores de indicadores calculados sobre
qualquer ativo e janela de tempo.

Use as funções Copy...() para este propósito:

· CopyBuffer – copiar valores de um buffer de indicador para um array de tipo double;


· CopyR ates – copiar histórico de preços para um array de estruturas MqlRates ;
· CopyT ime – copiar valores de H ora para um array de tipo datetime;
· CopyOpen – copiar valores de Abertura para um array de tipo double;
· CopyH ig h – copiar valores de Máximo para um array de tipo double;
· CopyLow – copiar valores de M ínimo para um array de tipo double;

· CopyClose – copiar valores de Fechamento para um array de tipo double;


· CopyT ickVolume – copiar volumes de tick para um array de tipo long ;
· CopyR ealVolume – copiar volumes de capital (equity) para um array de tipo long ;
· CopySpread – copiar o histórico de spreads para um array de tipo int;

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.

© 2000-2018, MetaQuotes Software Corp.


1179 Séries Temporais e Acesso a Indicadores

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().

int copied=CopyBuffer(ma_handle,// manipulador do indicador


0, // O índice do buffer do indicador
0, // Posição início para copiar
number, // Número de valores para copiar
Buffer // O array que recebe os valores
);
if(copied<0) return;
int k=0;
while(k<copied && !IsStopped())
{
//--- Obtém o valor para o índice k
double value=Buffer[k];
// ...
// trabalha com o valor
k++;
}

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
}

© 2000-2018, MetaQuotes Software Corp.


1180 Séries Temporais e Acesso a Indicadores

Também Veja
Organizando Acesso aos Dados

© 2000-2018, MetaQuotes Software Corp.


1181 Séries Temporais e Acesso a Indicadores

Organizando Acesso aos Dados


Nesta seção, questões associados a obtenção, armazenamento e solicitação de dados de preços (séries
de tempo) são consideradas.

Recebendo Dados de um Servidor de Negociaç ão


Antes de dados de preços ficarem disponíveis no terminal MetraT rader 5, eles devem ser recebidos e
processados. Para receber dados, uma conexão com o servidor de negociação MetaT rader 5 deve ser
estabelecida. Dados são recebidos na forma de blocos empacotados de barras de um minuto do
servidor sob a solicitação de um terminal.

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.

Armazenando Dados Intermediários


Dados recebidos de um servidor são automaticamente desempacotados e salvos no formato
intermediário H CC. Os dados de cada ativo são escritos em uma pasta separada:
terminal_directory\ bases \ server_name\history\ symbol_name. Por exemplo, dados sobre EUR US D
recebidos do servidor MetaQuotes-Demo serão armazenados em
terminal_directory\ bases \ MetaQuotes-Demo\history\ EUR US D\ .

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 EUR US D contém barras de
um minuto de EUR US 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.

Obtendo Dados em uma Janela de Tempo Necessária a partir dos Dados


Intermediários
Os arquivo H CC intermediários são usados como fonte de dados para construir dados de preço para
janelas de tempo solicitadas no formato H C. Dados de formato H C são séries de tempo que são
maximamente preparados para acesso rápido. Eles são criados sob solicitação de um gráfico ou um
programa MQL5. O volume de dados não deve exceder o valor do parâmetro " Máx. barras no gráfico" .
Os dados são armazenados para posterior uso em arquivos com extensão hc.

Para economizar recursos, os dados em uma janela de tempo são armazenados e guardamos em RAM
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 recebimento de novos dados de um servidor chama automaticamente a atualização de dados de


preço usados em formato H C de todas as janelas de tempo. Isso também leva ao recálculo de todos os
indicadores que implicitamente usam estes dados como dados de entrada para cálculos.

Parâmetro "Máx. barras no gráfico "

© 2000-2018, MetaQuotes Software Corp.


1182 Séries Temporais e Acesso a Indicadores

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 .

O volume de dados solicitados ao servidor corresponde ao número solicitado de barras de uma da


janela de tempo com o parâmetro " Max. barras em gráfico" levado em consideração. A restrição
definida por este parâmetro não é absoluta, e em alguns casos o número de barras disponíveis para
uma janela de tempo pode ser um pouco maior que o valor corrente do parâmetro.

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.

Sincronizaç ão dos Dados do Terminal com os Dados do Servidor


Já que um programa mql5 pode chamar dados de qualquer ativo e janela de tempo, existe a
possibilidade que os dados de uma série de tempo necessária não esteja formado ainda no terminal ou
o preço necessário não esteja sincronizado com o servidor de negociação. Neste caso é difícil predizer
o tempo de latência.

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

© 2000-2018, MetaQuotes Software Corp.


1183 Séries Temporais e Acesso a Indicadores

requerida falhar, você deve sair do manipulador de evento, confiando na disponibilidade de acesso
durante a próxima chamada do manipulador.

Exemplo de um Script para Adicionar Histórico


Vamos considerar um exemplo de um script que executa uma solicitação para receber histórico para o
ativo selecionado de um servidor de negociação. O script é projetado para executar em um gráfico de
um ativo selecionado; a janela de tempo não importa, porque como foi mencionado acima, dados de
preço são recebidos de um servidor de negociação como pacotes de dados de um minuto, a partir dos
quais qualquer série de tempo predefinida é construída.

Escreve todas as ações relacionadas a recepção de dados como uma função separada,
Check LoadH istory(s ymbol, timeframe, start_date):

int CheckLoadHistory(string symbol,ENUM_TIMEFRAMES period,datetime 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 :

if(symbol==NULL || symbol=="") symbol=Symbol();


if(period==PERIOD_CURRENT) period=Period();

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

© 2000-2018, MetaQuotes Software Corp.


1184 Séries Temporais e Acesso a Indicadores

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.

if(MQL5InfoInteger(MQL5_PROGRAM_TYPE)==PROGRAM_INDICATOR && Period()==period && Symbol()==symbol


return(-4);

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);
}
}

Se após todas as verificações, a thread de execução estiver ainda no corpo da função


Check LoadH istory(), isso significa que existe uma necessidade de solicitar os dados de preço faltantes
ao servidor de negociação. Primeiro, retorne o valor de " Máx. barras no gráfico" usando a função
T erminalInfoInteger():

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.

© 2000-2018, MetaQuotes Software Corp.


1185 Séries Temporais e Acesso a Indicadores

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
}

Os primeiros três pontos estão implementados pelos meios já conhecidos.

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);

© 2000-2018, MetaQuotes Software Corp.


1186 Séries Temporais e Acesso a Indicadores

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 |

© 2000-2018, MetaQuotes Software Corp.


1187 Séries Temporais e Acesso a Indicadores

//+------------------------------------------------------------------+
#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))
{

© 2000-2018, MetaQuotes Software Corp.


1188 Séries Temporais e Acesso a Indicadores

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);
}

© 2000-2018, MetaQuotes Software Corp.


1189 Séries Temporais e Acesso a Indicadores

//--- cópia da próxima parte força carga de dados


int copied=CopyTime(symbol,period,bars,100,times);
if(copied>0)
{
//--- verifica dados
if(times[0]<=start_date) return(0);
if(bars+copied>=max_bars) return(-2);
fail_cnt=0;
}
else
{
//--- não mais que 100 tentativas com falha
fail_cnt++;
if(fail_cnt>=100) return(-5);
Sleep(10);
}
}
//--- interrompido
return(-3);
}
//+------------------------------------------------------------------+
//| Retorna valor de string do período  |
//+------------------------------------------------------------------+
string GetPeriodName(ENUM_TIMEFRAMES period)
{
if(period==PERIOD_CURRENT) period=Period();
//---
switch(period)
{
case PERIOD_M1: return("M1");
case PERIOD_M2: return("M2");
case PERIOD_M3: return("M3");
case PERIOD_M4: return("M4");
case PERIOD_M5: return("M5");
case PERIOD_M6: return("M6");
case PERIOD_M10: return("M10");
case PERIOD_M12: return("M12");
case PERIOD_M15: return("M15");
case PERIOD_M20: return("M20");
case PERIOD_M30: return("M30");
case PERIOD_H1: return("H1");
case PERIOD_H2: return("H2");
case PERIOD_H3: return("H3");
case PERIOD_H4: return("H4");
case PERIOD_H6: return("H6");
case PERIOD_H8: return("H8");
case PERIOD_H12: return("H12");
case PERIOD_D1: return("Daily");
case PERIOD_W1: return("Weekly");

© 2000-2018, MetaQuotes Software Corp.


1190 Séries Temporais e Acesso a Indicadores

case PERIOD_MN1: return("Monthly");


}
//---
return("período desconhecido");
}

© 2000-2018, MetaQuotes Software Corp.


1191 Séries Temporais e Acesso a Indicadores

SeriesInfoInteger
Retorna informações sobre o estado de dados históricos. Existem 2 variantes de chamada da função.

Retorna diretamente o valor da propriedade.


long  SeriesInfoInteger(
string  symbol_name,  // nome do ativo
ENUM_TIMEFRAMES  timeframe,  // período
ENUM_SERIES_INFO_INTEGER  prop_id,  // identificador da propriedade
);

Retorna true ou false dependendo do sucesso da execução da função.


bool  SeriesInfoInteger(
string  symbol_name,  // nome do ativo
ENUM_TIMEFRAMES  timeframe,  // período
ENUM_SERIES_INFO_INTEGER  prop_id,  // ID da propriedade
long&  long_var  // variável a informação obtida
);

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 for the symbol-period at this moment = ",


(datetime)SeriesInfoInteger(Symbol(),Period(),SERIES_FIRSTDATE));

© 2000-2018, MetaQuotes Software Corp.


1192 Séries Temporais e Acesso a Indicadores

Print("The first date in the history for the symbol-period on the server = ",
(datetime)SeriesInfoInteger(Symbol(),Period(),SERIES_SERVER_FIRSTDATE));

Print("Symbol data are synchronized = ",


(bool)SeriesInfoInteger(Symbol(),Period(),SERIES_SYNCHRONIZED));
}

© 2000-2018, MetaQuotes Software Corp.


1193 Séries Temporais e Acesso a Indicadores

Bars
Retorna o número de barras no histórico para um ativo e período específicos. Existe 2 variantes de
chamada da função.

Solicita todas as barras do histórico


int  Bars(
string  symbol_name,  // nome do ativo
ENUM_TIMEFRAMES  timeframe   // período
);

Solicita as barras do histórico no intervalo de tempo selecionado


int  Bars(
string  symbol_name,  // nome do ativo
ENUM_TIMEFRAMES  timeframe,  // período
datetime  start_time,  // data e hora de início
datetime  stop_time  // data e hora de término
);

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.

© 2000-2018, MetaQuotes Software Corp.


1194 Séries Temporais e Acesso a Indicadores

Exemplo de solicitação do número de todas as barras no histórico:


int bars=Bars(_Symbol,_Period);
if(bars>0)
{
Print("Number of bars in the terminal history for the symbol-period at the moment = ",bars);
}
else //sem barras disponíveis
{
//--- dados sobre o ativo podem não estar sincronizados com os dados no servidor
bool synchronized=false;
//--- contador de loop
int attempts=0;
// faz 5 tentativas de espera por sincronização
while(attempts<5)
{
if(SeriesInfoInteger(Symbol(),0,SERIES_SYNCHRONIZED))
{
//--- sincronização feita, sair
synchronized=true;
break;
}
//--- aumentar o contador
attempts++;
//--- espera 10 milissegundos até a próxima iteração
Sleep(10);
}
//--- sair do loop após sincronização
if(synchronized)
{
Print("Number of bars in the terminal history for the symbol-period at the moment = ",bars
Print("The first date in the terminal history for the symbol-period at the moment = ",
(datetime)SeriesInfoInteger(Symbol(),0,SERIES_FIRSTDATE));
Print("The first date in the history for the symbol on the server = ",
(datetime)SeriesInfoInteger(Symbol(),0,SERIES_SERVER_FIRSTDATE));
}
//--- sincronização dos dados não aconteceu
else
{
Print("Failed to get number of bars for ",_Symbol);
}
}

Exemplo de solicitação do número de barras no intervalo estabelecido:


int n;
datetime date1 = D'2016.09.02 23:55'; // sexta-feira
datetime date2 = D'2016.09.05 00:00'; // segunda-feira
datetime date3 = D'2016.09.08 00:00'; // quinta-feira
//---

© 2000-2018, MetaQuotes Software Corp.


1195 Séries Temporais e Acesso a Indicadores

n=Bars(_Symbol,PERIOD_H1,D'2016.09.02 02:05',D'2016.09.02 10:55');


Print("Número de barras: ",n); // Mostra "Número de barras: 8", na contagem levará em conta a ba
n=Bars(_Symbol,PERIOD_D1,date1,date2);
Print("Número de barras: ",n); // Mostra "Número de barras: 1", pois o tempo de abertura de apen
n=Bars(_Symbol,PERIOD_W1,date2,date3);
Print("Número de barras: ",n); // Mostra "Número de barras: 0", pois o tempo de abertura de nenh

Veja Também
Funções de Processamento de Eventos

© 2000-2018, MetaQuotes Software Corp.


1196 Séries Temporais e Acesso a Indicadores

BarsCalculated
Retorna 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
Retorna 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;
}

© 2000-2018, MetaQuotes Software Corp.


1197 Séries Temporais e Acesso a Indicadores

else
Print("Upper fractals copied",
"i = ",i," copiado = ",copied);
}
else Print("Upper fractals copied. ArraySize = ",ArraySize(Ups));
}

© 2000-2018, MetaQuotes Software Corp.


1198 Séries Temporais e Acesso a Indicadores

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 _TIMEFRAMES, 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
Retorna o handle de um indicador técnico especificado, em caso de falha retorna INVALID_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"

© 2000-2018, MetaQuotes Software Corp.


1199 Séries Temporais e Acesso a Indicadores

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);
}

© 2000-2018, MetaQuotes Software Corp.


1200 Séries Temporais e Acesso a Indicadores

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

© 2000-2018, MetaQuotes Software Corp.


1201 Séries Temporais e Acesso a Indicadores

PrintFormat("Window=%d, indicator #%d, handle=%d",w,i,handle);


//---
MqlParam parameters[];
ENUM_INDICATOR indicator_type;
int params=IndicatorParameters(handle,indicator_type,parameters);
//--- O cabeçalho da mensagem
string par_info="Short name "+name+", type "
+EnumToString(ENUM_INDICATOR(indicator_type))+"\r\n";
//---
for(int p=0;p<params;p++)
{
par_info+=StringFormat("parâmetro %d: type=%s, long_value=%d, double_value=%G,string_va
p,
EnumToString((ENUM_DATATYPE)parameters[p].type),
parameters[p].integer_value,
parameters[p].double_value,
parameters[p].string_value
);
}
Print(par_info);
}
//--- Pronto para todos os indicadores da janela
}
//---
}

Também Veja
ChartIndicatorGet()

© 2000-2018, MetaQuotes Software Corp.


1202 Séries Temporais e Acesso a Indicadores

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
Retorna 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).

Durante o funcionamento do testador de estratégias, a função IndicatorRelease() não é executada.

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);
}
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


1203 Séries Temporais e Acesso a Indicadores

//| Função tick (ponto) de um Expert |


//+------------------------------------------------------------------+
void OnTick()
{
//--- se o valor da variável global não existir
if(!GlobalVariableCheck("MA_value"))
{
//--- obtém o valor do indicador nas últimas duas barras
if(MA_handle!=INVALID_HANDLE)
{
//--- array dinâmico para valores do indicador
double values[];
if(CopyBuffer(MA_handle,0,0,2,values)==2 && values[0]!=EMPTY_VALUE)
{
//--- lembra na variável global o valor da penúltima barra
if(GlobalVariableSet("MA_value",values[0]))
{
//--- libera o handle do indicador
if(!IndicatorRelease(MA_handle))
Print("IndicatorRelease() falhou. Error ",GetLastError());
else MA_handle=INVALID_HANDLE;
}
else
Print("GlobalVariableSet falhou. Error ",GetLastError());
}
}
}
//---
}

© 2000-2018, MetaQuotes Software Corp.


1204 Séries Temporais e Acesso a Indicadores

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.

Chamar pela posição primeira e o número de elementos requeridos


int  CopyBuffer(
int  indicator_handle,  // handle do indicador
int  buffer_num,  // número do buffer do indicador
int  start_pos,  // posição de início
int  count,  // quantidade para copiar
double  buffer[]  // array destino para copiar
);

Chamar pela data de início e o número de elementos requeridos


int  CopyBuffer(
int  indicator_handle,  // handle do indicador

© 2000-2018, MetaQuotes Software Corp.


1205 Séries Temporais e Acesso a Indicadores

int  buffer_num,  // número do buffer do indicador


datetime  start_time,  // data e hora de início
int  count,  // quantidade para copiar
double  buffer[] // array destino para copiar
);

Chamar pelas datas de início e término de um intervalo de tempo requerido


int  CopyBuffer(
int  indicator_handle,  // handle do indicador
int  buffer_num,  // número do buffer do indicador
datetime  start_time,  // data e hora de início
datetime  stop_time,  // data e hora de término
double   buffer[] // array destino para copiar
);

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
Retorna 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.

© 2000-2018, MetaQuotes Software Corp.


1206 Séries Temporais e Acesso a Indicadores

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);
}

© 2000-2018, MetaQuotes Software Corp.


1207 Séries Temporais e Acesso a Indicadores

//+------------------------------------------------------------------+
//| 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 :

· DRAW_SECTION,
· DRAW_ARROW ,
· DRAW_ZIGZAG,
· DRAW_COLOR_SECTION,
· DRAW_COLOR_ARROW ,
· DRAW_COLOR_ZIGZAG.

© 2000-2018, MetaQuotes Software Corp.


1208 Séries Temporais e Acesso a Indicadores

Também Veja
Propriedades de Indicadores Customizados, SetIndex Buffer

© 2000-2018, MetaQuotes Software Corp.


1209 Séries Temporais e Acesso a Indicadores

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.

Chamar pela posição primeira e o número de elementos requeridos


int  CopyRates(
string  symbol_name,  // nome do ativo
ENUM_TIMEFRAMES  timeframe,  // período
int  start_pos,  // posição de início
int  count,  // quantidade de dados para copiar
MqlRates rates_array[]  // array destino para copiar
);

Chamar pela data de início e o número de elementos requeridos


int  CopyRates(
string  symbol_name,  // nome do ativo
ENUM_TIMEFRAMES  timeframe,  // período
datetime  start_time,  // data e hora de início
int  count,  // quantidade de dados para copiar
MqlRates rates_array[]  // array destino para copiar
);

Chamar pelas datas de início e término de um intervalo de tempo requerido


int  CopyRates(

© 2000-2018, MetaQuotes Software Corp.


1210 Séries Temporais e Acesso a Indicadores

string  symbol_name,  // nome do ativo


ENUM_TIMEFRAMES  timeframe,  // período
datetime  start_time,  // data e hora de início
datetime  stop_time,  // data e hora de término
MqlRates rates_array[]  // array destino para copiar
);

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 MqlRates.

Valor do Retorno
Retorna 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 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, 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

© 2000-2018, MetaQuotes Software Corp.


1211 Séries Temporais e Acesso a Indicadores

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());
}

Veja um 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 :

© 2000-2018, MetaQuotes Software Corp.


1212 Séries Temporais e Acesso a Indicadores

· DRAW_SECTION,
· DRAW_ARROW ,
· DRAW_ZIGZAG,
· DRAW_COLOR_SECTION,
· DRAW_COLOR_ARROW ,
· DRAW_COLOR_ZIGZAG.

Também Veja
Estruturas e Classes, T imeT oString, String Format

© 2000-2018, MetaQuotes Software Corp.


1213 Séries Temporais e Acesso a Indicadores

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.

Chamar pela posição primeira e o número de elementos requeridos


int  CopyTime(
string  symbol_name,  // nome do ativo
ENUM_TIMEFRAMES  timeframe,  // período
int  start_pos,  // posição de início
int  count,  // quantidade de dados para copiar
datetime  time_array[] // array destino para copiar as horas de abertura
);

Chamar pela data de início e o número de elementos requeridos


int  CopyTime(
string  symbol_name,  // nome do ativo
ENUM_TIMEFRAMES  timeframe,  // período
datetime  start_time,  // data e hora de início
int  count,  // quantidade de dados para copiar
datetime  time_array[] // array destino para copiar horas de abertura
);

Chamar pelas datas de início e término de um intervalo de tempo requerido


int  CopyTime(

© 2000-2018, MetaQuotes Software Corp.


1214 Séries Temporais e Acesso a Indicadores

string  symbol_name,  // nome do ativo


ENUM_TIMEFRAMES  timeframe,  // período
datetime  start_time,  // data e hora de início
datetime  stop_time,  // data e hora de parada
datetime  time_array[] // array destino para copiar as horas de abertura
);

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
Retorna 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 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, 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

© 2000-2018, MetaQuotes Software Corp.


1215 Séries Temporais e Acesso a Indicadores

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.

Veja um 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 :

· DRAW_SECTION,
· DRAW_ARROW ,
· DRAW_ZIGZAG,
· DRAW_COLOR_SECTION,
· DRAW_COLOR_ARROW ,
· DRAW_COLOR_ZIGZAG.

© 2000-2018, MetaQuotes Software Corp.


1216 Séries Temporais e Acesso a Indicadores

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.

Chamar pela posição primeira e o número de elementos requeridos


int  CopyOpen(
string  symbol_name,  // nome do ativo
ENUM_TIMEFRAMES  timeframe,  // período
int  start_pos,  // posição de início
int  count,  // quantidade de dados para copiar
double  open_array[] // array destino para copiar preços de abertura
);

Chamar pela data de início e o número de elementos requeridos


int  CopyOpen(
string  symbol_name,  // nome do ativo
ENUM_TIMEFRAMES  timeframe,  // período
datetime  start_time,  // data e hora de início
int  count,  // quantidade de dados para copiar
double  open_array[] // array destino para preços de abertura de barras
);

Chamar pelas datas de início e término de um intervalo de tempo requerido


int  CopyOpen(

© 2000-2018, MetaQuotes Software Corp.


1217 Séries Temporais e Acesso a Indicadores

string  symbol_name,  // nome do ativo


ENUM_TIMEFRAMES  timeframe,  // período
datetime  start_time,  // data e hora de início
datetime  stop_time,  // data e hora de parada
double  open_array[] // array destino para valores de abertura de barras
);

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
Retorna 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 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, 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

© 2000-2018, MetaQuotes Software Corp.


1218 Séries Temporais e Acesso a Indicadores

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.

Veja um 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 :

· DRAW_SECTION,
· DRAW_ARROW ,
· DRAW_ZIGZAG,
· DRAW_COLOR_SECTION,
· DRAW_COLOR_ARROW ,
· DRAW_COLOR_ZIGZAG.

© 2000-2018, MetaQuotes Software Corp.


1219 Séries Temporais e Acesso a Indicadores

CopyHigh
A função obtém em hig h_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.

Chamar pela posição primeira e o número de elementos requeridos


int  CopyHigh(
string  symbol_name,  // nome do ativo
ENUM_TIMEFRAMES  timeframe,  // período
int  start_pos,  // posição de início
int  count,  // quantidade de dados para copiar
double  high_array[]  // array destino para copiar
);

Chamar pela data de início e o número de elementos requeridos


int  CopyHigh(
string  symbol_name,  // nome do ativo
ENUM_TIMEFRAMES  timeframe,  // período
datetime  start_time,  // data e hora de início
int  count,  // quantidade de dados para copiar
double  high_array[]  // array destino para copiar
);

Chamar pelas datas de início e término de um intervalo de tempo requerido


int  CopyHigh(

© 2000-2018, MetaQuotes Software Corp.


1220 Séries Temporais e Acesso a Indicadores

string  symbol_name,  // nome do ativo


ENUM_TIMEFRAMES  timeframe,  // período
datetime  start_time,  // data e hora de início
datetime  stop_time,  // data e hora de parada
double  high_array[]  // array destino para copiar
);

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
Retorna 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 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, 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

© 2000-2018, MetaQuotes Software Corp.


1221 Séries Temporais e Acesso a Indicadores

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 |

© 2000-2018, MetaQuotes Software Corp.


1222 Séries Temporais e Acesso a Indicadores

//+------------------------------------------------------------------+
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));
}

Veja um 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 :

· DRAW_SECTION,
· DRAW_ARROW ,
· DRAW_ZIGZAG,
· DRAW_COLOR_SECTION,
· DRAW_COLOR_ARROW ,
· DRAW_COLOR_ZIGZAG.

© 2000-2018, MetaQuotes Software Corp.


1223 Séries Temporais e Acesso a Indicadores

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.

Chamar pela posição primeira e o número de elementos requeridos


int  CopyLow(
string  symbol_name,  // nome do ativo
ENUM_TIMEFRAMES  timeframe,  // período
int  start_pos,  // posição de início
int  count,  // quantidade de dados para copiar
double  low_array[] // array destino para copiar
);

Chamar pela data de início e o número de elementos requeridos


int  CopyLow(
string  symbol_name,  // nome do ativo
ENUM_TIMEFRAMES  timeframe,  // período
datetime  start_time,  // data e hora de início
int  count,  // quantidade de dados para copiar
double  low_array[]  // array destino para copiar
);

Chamar pelas datas de início e término de um intervalo de tempo requerido


int  CopyLow(

© 2000-2018, MetaQuotes Software Corp.


1224 Séries Temporais e Acesso a Indicadores

string  symbol_name,  // nome do ativo


ENUM_TIMEFRAMES  timeframe,  // período
datetime  start_time,  // data e hora de início
datetime  stop_time,  // data e hora de parada
double  low_array[] // array destino para copiar
);

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
Retorna 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 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, 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

© 2000-2018, MetaQuotes Software Corp.


1225 Séries Temporais e Acesso a Indicadores

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.

Veja um 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 :

· DRAW_SECTION,
· DRAW_ARROW ,
· DRAW_ZIGZAG,
· DRAW_COLOR_SECTION,
· DRAW_COLOR_ARROW ,
· DRAW_COLOR_ZIGZAG.

Também Veja
CopyH ig h

© 2000-2018, MetaQuotes Software Corp.


1226 Séries Temporais e Acesso a Indicadores

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.

Chamar pela posição primeira e o número de elementos requeridos


int  CopyClose(
string  symbol_name,  // nome do ativo
ENUM_TIMEFRAMES  timeframe,  // período
int  start_pos,  // posição de início
int  count,  // quantidade de dados para copiar
double  close_array[]  // array destino para copiar
);

Chamar pela data de início e o número de elementos requeridos


int  CopyClose(
string  symbol_name,  // nome do ativo
ENUM_TIMEFRAMES  timeframe,  // período
datetime  start_time,  // data e hora de início
int  count,  // quantidade de dados para copiar
double  close_array[]  // array destino para copiar
);

Chamar pelas datas de início e término de um intervalo de tempo requerido


int  CopyClose(

© 2000-2018, MetaQuotes Software Corp.


1227 Séries Temporais e Acesso a Indicadores

string  symbol_name,  // nome do ativo


ENUM_TIMEFRAMES  timeframe,  // período
datetime  start_time,  // data e hora de início
datetime  stop_time,  // data e hora de parada
double  close_array[]  // array destino para copiar
);

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
Retorna 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 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, 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

© 2000-2018, MetaQuotes Software Corp.


1228 Séries Temporais e Acesso a Indicadores

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.

Veja um 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 :

· DRAW_SECTION,
· DRAW_ARROW ,
· DRAW_ZIGZAG,
· DRAW_COLOR_SECTION,
· DRAW_COLOR_ARROW ,
· DRAW_COLOR_ZIGZAG.

© 2000-2018, MetaQuotes Software Corp.


1229 Séries Temporais e Acesso a Indicadores

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.

Chamar pela posição primeira e o número de elementos requeridos


int  CopyTickVolume(
string  symbol_name,  // nome do ativo
ENUM_TIMEFRAMES  timeframe,  // período
int  start_pos,  // posição de início
int  count,  // quantidade de dados para copiar
long  volume_array[] // array destino para volumes de tick
);

Chamar pela data de início e o número de elementos requeridos


int  CopyTickVolume(
string  symbol_name,  // nome do ativo
ENUM_TIMEFRAMES  timeframe,  // período
datetime  start_time,  // data e hora de início
int  count,  // quantidade de dados para copiar
long  volume_array[] // array destino para volumes de tick
);

Chamar pelas datas de início e término de um intervalo de tempo requerido


int  CopyTickVolume(

© 2000-2018, MetaQuotes Software Corp.


1230 Séries Temporais e Acesso a Indicadores

string  symbol_name,  // nome do ativo


ENUM_TIMEFRAMES  timeframe,  // período
datetime  start_time,  // data e hora de início
datetime  stop_time,  // data e hora de parada
long  volume_array[] // array destino para volumes de tick
);

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
Retorna 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 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, 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

© 2000-2018, MetaQuotes Software Corp.


1231 Séries Temporais e Acesso a Indicadores

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[],

© 2000-2018, MetaQuotes Software Corp.


1232 Séries Temporais e Acesso a Indicadores

const double &close[],


const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//---
if(prev_calculated==0)
{
long timeseries[];
ArraySetAsSeries(timeseries,true);
int prices=CopyTickVolume(Symbol(),0,0,bars,timeseries);
for(int i=0;i<rates_total-prices;i++) TickVolumeBuffer[i]=0.0;
for(int i=0;i<prices;i++) TickVolumeBuffer[rates_total-1-i]=timeseries[prices-1-i];
Print("We have received the following number of TickVolume values: "+prices);
}
else
{
long timeseries[];
int prices=CopyTickVolume(Symbol(),0,0,1,timeseries);
TickVolumeBuffer[rates_total-1]=timeseries[0];
}
//--- valor retorno de prev_calculated para a próxima chamada
return(rates_total);
}

Veja um 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 :

· DRAW_SECTION,
· DRAW_ARROW ,
· DRAW_ZIGZAG,
· DRAW_COLOR_SECTION,
· DRAW_COLOR_ARROW ,
· DRAW_COLOR_ZIGZAG.

© 2000-2018, MetaQuotes Software Corp.


1233 Séries Temporais e Acesso a Indicadores

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.

Chamar pela posição primeira e o número de elementos requeridos


int  CopyRealVolume(
string  symbol_name,  // nome do ativo
ENUM_TIMEFRAMES  timeframe,  // período
int  start_pos,  // posição de início
int  count,  // quantidade de dados para copiar
long  volume_array[] // array destino para valores de volume
);

Chamar pela data de início e o número de elementos requeridos


int  CopyRealVolume(
string  symbol_name,  // nome do ativo
ENUM_TIMEFRAMES  timeframe,  // período
datetime  start_time,  // data e hora de início
int  count,  // quantidade de dados para copiar
long  volume_array[] // array destino para valores de volume
);

Chamar pelas datas de início e término de um intervalo de tempo requerido


int  CopyRealVolume(

© 2000-2018, MetaQuotes Software Corp.


1234 Séries Temporais e Acesso a Indicadores

string  symbol_name,  // nome do ativo


ENUM_TIMEFRAMES  timeframe,  // período
datetime  start_time,  // data e hora de início
datetime  stop_time,  // data e hora de parada
long  volume_array[] // array destino para valores de volume
);

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
Retorna 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 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, 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

© 2000-2018, MetaQuotes Software Corp.


1235 Séries Temporais e Acesso a Indicadores

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.

Veja um exemplo 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 :

· DRAW_SECTION,
· DRAW_ARROW ,
· DRAW_ZIGZAG,
· DRAW_COLOR_SECTION,
· DRAW_COLOR_ARROW ,
· DRAW_COLOR_ZIGZAG.

© 2000-2018, MetaQuotes Software Corp.


1236 Séries Temporais e Acesso a Indicadores

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.

Chamar pela posição primeira e o número de elementos requeridos


int  CopySpread(
string  symbol_name,  // nome do ativo
ENUM_TIMEFRAMES  timeframe,  // período
int  start_pos,  // posição de início
int  count,  // quantidade de dados para copiar
int  spread_array[] // array destino para valores de spread
);

Chamar pela data de início e o número de elementos requeridos


int  CopySpread(
string  symbol_name,  // nome do ativo
ENUM_TIMEFRAMES  timeframe,  // período
datetime  start_time,  // data e hora de início
int  count,  // quantidade de dados para copiar
int  spread_array[] // array destino para valores de spread
);

Chamar pelas datas de início e término de um intervalo de tempo requerido


int  CopySpread(

© 2000-2018, MetaQuotes Software Corp.


1237 Séries Temporais e Acesso a Indicadores

string  symbol_name,  // nome do ativo


ENUM_TIMEFRAMES  timeframe,  // período
datetime  start_time,  // data e hora de início
datetime  stop_time,  // data e hora de parada
int  spread_array[] // array destino para valores de spread
);

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
Retorna 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 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, 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

© 2000-2018, MetaQuotes Software Corp.


1238 Séries Temporais e Acesso a Indicadores

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[],

© 2000-2018, MetaQuotes Software Corp.


1239 Séries Temporais e Acesso a Indicadores

const double &close[],


const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//---
if(prev_calculated==0)
{
int spread_int[];
ArraySetAsSeries(spread_int,true);
int spreads=CopySpread(Symbol(),0,0,bars,spread_int);
Print("We have received the following number of Spread values: ",spreads);
for (int i=0;i<spreads;i++)
{
SpreadBuffer[rates_total-1-i]=spread_int[i];
if(i<=30) Print("spread["+i+"] = ",spread_int[i]);
}
}
else
{
double Ask,Bid;
Ask=SymbolInfoDouble(Symbol(),SYMBOL_ASK);
Bid=SymbolInfoDouble(Symbol(),SYMBOL_BID);
Comment("Ask = ",Ask," Bid = ",Bid);
SpreadBuffer[rates_total-1]=(Ask-Bid)/Point();
}
//--- valor retorno de prev_calculated para a próxima chamada
return(rates_total);
}

Veja um exemplo 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 :

· DRAW_SECTION,
· DRAW_ARROW ,
· DRAW_ZIGZAG,
· DRAW_COLOR_SECTION,
· DRAW_COLOR_ARROW ,
· DRAW_COLOR_ZIGZAG.

© 2000-2018, MetaQuotes Software Corp.


1240 Séries Temporais e Acesso a Indicadores

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

© 2000-2018, MetaQuotes Software Corp.


1241 Séries Temporais e Acesso a Indicadores

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);
}

© 2000-2018, MetaQuotes Software Corp.


1242 Séries Temporais e Acesso a Indicadores

//--- 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;

© 2000-2018, MetaQuotes Software Corp.


1243 Séries Temporais e Acesso a Indicadores

if((time>=startday) && (time<endday) && counter<100)


{
if(((tick_array[i].flags&TICK_FLAG_BUY)==TICK_FLAG_BUY) || ((tick_array[i].flags&TICK_FLAG
{
counter++;
PrintFormat("%d. %s",counter,GetTickDescription(tick_array[i]));
}
}
}
}
//+------------------------------------------------------------------+
//| Retorna a descrição de string de um tick |
//+------------------------------------------------------------------+
string GetTickDescription(MqlTick &tick)
{
string desc=StringFormat("%s.%03d ",
TimeToString(tick.time),tick.time_msc%1000);
//--- Checando flags
bool buy_tick=((tick.flags&TICK_FLAG_BUY)==TICK_FLAG_BUY);
bool sell_tick=((tick.flags&TICK_FLAG_SELL)==TICK_FLAG_SELL);
bool ask_tick=((tick.flags&TICK_FLAG_ASK)==TICK_FLAG_ASK);
bool bid_tick=((tick.flags&TICK_FLAG_BID)==TICK_FLAG_BID);
bool last_tick=((tick.flags&TICK_FLAG_LAST)==TICK_FLAG_LAST);
bool volume_tick=((tick.flags&TICK_FLAG_VOLUME)==TICK_FLAG_VOLUME);
//--- Verificar flags de negociação num primeiro tick
if(buy_tick || sell_tick)
{
//--- Formando uma saída para o tick de negociação
desc=desc+(buy_tick?StringFormat("Buy Tick: Last=%G Volume=%d ",tick.last,tick.volume):"");
desc=desc+(sell_tick?StringFormat("Sell Tick: Last=%G Volume=%d ",tick.last,tick.volume):"");
desc=desc+(ask_tick?StringFormat("Ask=%G ",tick.ask):"");
desc=desc+(bid_tick?StringFormat("Bid=%G ",tick.ask):"");
desc=desc+"(Trade tick)";
}
else
{
//--- Forme uma saída diferente para um tick de informação
desc=desc+(ask_tick?StringFormat("Ask=%G ",tick.ask):"");
desc=desc+(bid_tick?StringFormat("Bid=%G ",tick.ask):"");
desc=desc+(last_tick?StringFormat("Last=%G ",tick.last):"");
desc=desc+(volume_tick?StringFormat("Volume=%d ",tick.volume):"");
desc=desc+"(Info tick)";
}
//--- Retornando descrição do tick
return desc;
}
//+------------------------------------------------------------------+
/* Exemplo de saída
Si-12.16: recebeu 11048387 ticks em 4937 ms

© 2000-2018, MetaQuotes Software Corp.


1244 Séries Temporais e Acesso a Indicadores

Horário do último tick = 2016.09.26 18:32:59.775


Horário do primeiro tick = 2015.06.18 09:45:01.000
1. 2016.09.26 09:45.249 Ask=65370 Bid=65370 (Info tick)
2. 2016.09.26 09:47.420 Ask=65370 Bid=65370 (Info tick)
3. 2016.09.26 09:50.893 Ask=65370 Bid=65370 (Info tick)
4. 2016.09.26 09:51.827 Ask=65370 Bid=65370 (Info tick)
5. 2016.09.26 09:53.810 Ask=65370 Bid=65370 (Info tick)
6. 2016.09.26 09:54.491 Ask=65370 Bid=65370 (Info tick)
7. 2016.09.26 09:55.913 Ask=65370 Bid=65370 (Info tick)
8. 2016.09.26 09:59.350 Ask=65370 Bid=65370 (Info tick)
9. 2016.09.26 09:59.678 Bid=65370 (Info tick)
10. 2016.09.26 10:00.000 Sell Tick: Last=65367 Volume=3 (Trade tick)
11. 2016.09.26 10:00.000 Sell Tick: Last=65335 Volume=45 (Trade tick)
12. 2016.09.26 10:00.000 Sell Tick: Last=65334 Volume=95 (Trade tick)
13. 2016.09.26 10:00.191 Sell Tick: Last=65319 Volume=1 (Trade tick)
14. 2016.09.26 10:00.191 Sell Tick: Last=65317 Volume=1 (Trade tick)
15. 2016.09.26 10:00.191 Sell Tick: Last=65316 Volume=1 (Trade tick)
16. 2016.09.26 10:00.191 Sell Tick: Last=65316 Volume=10 (Trade tick)
17. 2016.09.26 10:00.191 Sell Tick: Last=65315 Volume=5 (Trade tick)
18. 2016.09.26 10:00.191 Sell Tick: Last=65313 Volume=3 (Trade tick)
19. 2016.09.26 10:00.191 Sell Tick: Last=65307 Volume=25 (Trade tick)
20. 2016.09.26 10:00.191 Sell Tick: Last=65304 Volume=1 (Trade tick)
21. 2016.09.26 10:00.191 Sell Tick: Last=65301 Volume=1 (Trade tick)
22. 2016.09.26 10:00.191 Sell Tick: Last=65301 Volume=10 (Trade tick)
23. 2016.09.26 10:00.191 Sell Tick: Last=65300 Volume=5 (Trade tick)
24. 2016.09.26 10:00.191 Sell Tick: Last=65300 Volume=1 (Trade tick)
25. 2016.09.26 10:00.191 Sell Tick: Last=65300 Volume=6 (Trade tick)
26. 2016.09.26 10:00.191 Sell Tick: Last=65299 Volume=1 (Trade tick)
27. 2016.09.26 10:00.191 Bid=65370 (Info tick)
28. 2016.09.26 10:00.232 Ask=65297 (Info tick)
29. 2016.09.26 10:00.276 Sell Tick: Last=65291 Volume=31 (Trade tick)
30. 2016.09.26 10:00.276 Sell Tick: Last=65290 Volume=1 (Trade tick)
*/

Veja também
S ymbolInfoT ick , Estrutura para recebimento de preços atuais, OnT ick ()

© 2000-2018, MetaQuotes Software Corp.


1245 Séries Temporais e Acesso a Indicadores

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.

© 2000-2018, MetaQuotes Software Corp.


1246 Séries Temporais e Acesso a Indicadores

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

© 2000-2018, MetaQuotes Software Corp.


1247 Séries Temporais e Acesso a Indicadores

iBars
Retorna 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 _TIMEFRAMES. 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

© 2000-2018, MetaQuotes Software Corp.


1248 Séries Temporais e Acesso a Indicadores

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 _TIMEFRAMES. PERIOD_CURRENT
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 iBarS hift 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()

© 2000-2018, MetaQuotes Software Corp.


1249 Séries Temporais e Acesso a Indicadores

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;
}
//---

© 2000-2018, MetaQuotes Software Corp.


1250 Séries Temporais e Acesso a Indicadores

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)
*/

© 2000-2018, MetaQuotes Software Corp.


1251 Séries Temporais e Acesso a Indicadores

iClose
Retorna o valor do preço de fechamento da barra (indicado pelo parâmetro s hift) 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 _TIMEFRAMES. 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 s hift) 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);

© 2000-2018, MetaQuotes Software Corp.


1252 Séries Temporais e Acesso a Indicadores

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

© 2000-2018, MetaQuotes Software Corp.


1253 Séries Temporais e Acesso a Indicadores

iHigh
Retorna o valor do preço máximo da barra (especificado pelo parâmetro s hift) 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 _TIMEFRAMES. 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 s hift) 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);

© 2000-2018, MetaQuotes Software Corp.


1254 Séries Temporais e Acesso a Indicadores

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 ig h, CopyR ates

© 2000-2018, MetaQuotes Software Corp.


1255 Séries Temporais e Acesso a Indicadores

iHighest
Retorna 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 _TIMEFRAMES. 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());

© 2000-2018, MetaQuotes Software Corp.


1256 Séries Temporais e Acesso a Indicadores

iLow
Retorna o valor do preço mínimo da barra (indicado pelo parâmetro s hift) 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 _TIMEFRAMES. 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 s hift) 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);

© 2000-2018, MetaQuotes Software Corp.


1257 Séries Temporais e Acesso a Indicadores

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

© 2000-2018, MetaQuotes Software Corp.


1258 Séries Temporais e Acesso a Indicadores

iLowest
Retorna 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 _TIMEFRAMES. 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());

© 2000-2018, MetaQuotes Software Corp.


1259 Séries Temporais e Acesso a Indicadores

iOpen
Retorna o valor do preço de abertura da barra (indicado pelo parâmetro s hift) 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 _TIMEFRAMES. 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 s hift) 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);

© 2000-2018, MetaQuotes Software Corp.


1260 Séries Temporais e Acesso a Indicadores

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

© 2000-2018, MetaQuotes Software Corp.


1261 Séries Temporais e Acesso a Indicadores

iTime
Retorna o valor do tempo de abertura da barra (indicado pelo parâmetro s hift) 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 _TIMEFRAMES. 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 s hift) 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)",

© 2000-2018, MetaQuotes Software Corp.


1262 Séries Temporais e Acesso a Indicadores

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

© 2000-2018, MetaQuotes Software Corp.


1263 Séries Temporais e Acesso a Indicadores

iTickVolume
Retorna o valor do volume de tick (especificado pelo parâmetro s hift) 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 _TIMEFRAMES. 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 s hift) 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);

© 2000-2018, MetaQuotes Software Corp.


1264 Séries Temporais e Acesso a Indicadores

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

© 2000-2018, MetaQuotes Software Corp.


1265 Séries Temporais e Acesso a Indicadores

iRealVolume
Retorna o valor do volume real da barra (indicado pelo parâmetro s hift) 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 _TIMEFRAMES. 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 s hift) 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);

© 2000-2018, MetaQuotes Software Corp.


1266 Séries Temporais e Acesso a Indicadores

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

© 2000-2018, MetaQuotes Software Corp.


1267 Séries Temporais e Acesso a Indicadores

iVolume
Retorna o valor do volume de tick (especificado pelo parâmetro s hift) 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 _TIMEFRAMES. 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 s hift) 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);

© 2000-2018, MetaQuotes Software Corp.


1268 Séries Temporais e Acesso a Indicadores

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

© 2000-2018, MetaQuotes Software Corp.


1269 Séries Temporais e Acesso a Indicadores

iSpread
Retorna o valor do spread da barra (indicado pelo parâmetro s hift) 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 _TIMEFRAMES. 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 s hift) 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);

© 2000-2018, MetaQuotes Software Corp.


1270 Séries Temporais e Acesso a Indicadores

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

© 2000-2018, MetaQuotes Software Corp.


1271 Símbolos personalizados

Símbolos personalizados
Funções para criar e editar as propriedades dos s ímbolos personalizados.

Ao conectar o terminal a um determinado servidor de negociação, o usuário pode trabalhar com os


T imeSeries dos instrumentos financeiros que fornece a corretora. A lista de s ímbolos - mostrada na
janela da Observação do mercado - exibe os instrumentos financeiros disponíveis, e um grupo
separado de funções permite obter informações sobre as propriedades do s ímbolo, sessões de
negociação e atualizações do livro de ofertas.

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.

F unção Ação
CustomS ymbolCreate Cria um s ímbolo personalizado com o nome
especificado no grupo definido

CustomS ymbolDelete Remove o s ímbolo personalizado com o nome


especificado

CustomS ymbolSetInteger Define o valor do tipo inteiro para o s ímbolo


personalizado

CustomS ymbolSetDouble Define o valor do tipo real para o s ímbolo


personalizado

CustomS ymbolSetString Define o valor do tipo cadeia de caracteres para


o s ímbolo personalizado

CustomS ymbolSetMarginR ate Define o coeficiente de cobrança da margem -


dependendo do tipo e direção da ordem - para o
s ímbolo personalizado

CustomS ymbolSetSessionQuote Define a hora de início e fim da sessão de


cotação especificada para o s ímbolo
especificado e dia da semana

CustomS ymbolSetSessionT rade Define a hora de início e fim da sessão de


negociação especificada para o s ímbolo
especificado e dia da semana

CustomR ates Delete Exclui todas as barras no histórico de preço do


instrumento personalizado, no intervalo de
tempo selecionado

CustomR ates R eplace Substitui todo o histórico de preço do


instrumento personalizado pelos dados na
matriz do tipo MqlR ates, no intervalo de tempo
definido

CustomR atesUpdate Adiciona ao histórico do instrumento


personalizado as barras que faltam e substitui
os dados existentes na matriz do tipo MqlR ates

© 2000-2018, MetaQuotes Software Corp.


1272 Símbolos personalizados

CustomT ick sAdd Adds data from an array of the MqlT ick type to
the price history of a custom s ymbol. The
custom s ymbol must be selected in the Mark et
W atch window.
CustomT ick s Delete Exclui todos os tick s no histórico de preço do
instrumento personalizado, no intervalo de
tempo selecionado

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

© 2000-2018, MetaQuotes Software Corp.


1273 Símbolos personalizados

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
);

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.

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 nome do s ímbolo personalizado deve ser único, independentemente do nome do grupo em que ele
é criado.

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 <, >, :, " , /, |, ?, *.

Veja também
S ymbolName, S ymbolSelect, CustomS ymbolDelete

© 2000-2018, MetaQuotes Software Corp.


1274 Símbolos personalizados

CustomSymbolDelete
Remove 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

© 2000-2018, MetaQuotes Software Corp.


1275 Símbolos personalizados

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

© 2000-2018, MetaQuotes Software Corp.


1276 Símbolos personalizados

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_VALUE – 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

© 2000-2018, MetaQuotes Software Corp.


1277 Símbolos personalizados

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 MULA, 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

© 2000-2018, MetaQuotes Software Corp.


1278 Símbolos personalizados

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

© 2000-2018, MetaQuotes Software Corp.


1279 Símbolos personalizados

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

© 2000-2018, MetaQuotes Software Corp.


1280 Símbolos personalizados

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

© 2000-2018, MetaQuotes Software Corp.


1281 Símbolos personalizados

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 atesUpdate, CopyR ates

© 2000-2018, MetaQuotes Software Corp.


1282 Símbolos personalizados

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 perso
);

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 MqlRates para o período M 1.

Valor de retorno
Número de barras atualizadas ou -1 em caso de erro.

Observação
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 atesUpdate, CopyR ates

© 2000-2018, MetaQuotes Software Corp.


1283 Símbolos personalizados

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
);

Parâmetros
symbol
[in] Nome do instrumento personalizado.
rates[]
[in] Matriz de dados históricos do tipo MqlRates para o período M 1.

Valor de retorno
Número de barras atualizadas ou -1 em caso de erro.

Observação
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

© 2000-2018, MetaQuotes Software Corp.


1284 Símbolos personalizados

CustomTicksAdd
Adds data from an array of the MqlT ick type to the price history of a custom s ymbol. The 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
);

Parameters
symbol
[in] The 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.

Return Value
The number of added tick s or -1 in case of an error.

F urther Note

The 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 s hould 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 :
· TICK_FLAG_BID – tick alterou o preço Bid
· TI CK_FLAG_AS K – tick alterou o preço As k

© 2000-2018, MetaQuotes Software Corp.


1285 Símbolos personalizados

· TICK_FLAG_LAS T – tick alterou o preço da última transação


· TI CK_FLAG_VOLUME – 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.

Sinalizadores TICK_FLAG_BUY e TICK_FLAG_SELL não são adicionados no histórico do instrumento


personalizado.

See also
CustomR ates Delete, CustomR atesUpdate, CustomT ick s R eplace, CopyT ick s, CopyT ick s R ange

© 2000-2018, MetaQuotes Software Corp.


1286 Símbolos personalizados

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 atesUpdate, CustomT ick s R eplace, CopyT ick s, CopyT ick s R ange

© 2000-2018, MetaQuotes Software Corp.


1287 Símbolos personalizados

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
);

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.

Valor de retorno
Número de tick s atualizados ou -1 em caso de erro.

Observação
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á

© 2000-2018, MetaQuotes Software Corp.


1288 Símbolos personalizados

equivalente à remoção da parte do histórico de negociação, como se fosse chamado


CustomT ick s Delete com um intervalo " buracado" .

Se não houver dados no banco de dados de tick s no intervalo de tempo especificado, a


CustomT ick s R eplace simplesmente adicionará os tick s da matriz tick s [] a ele.

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 atesUpdate, CustomT ick s Delete, CopyT ick s, CopyT ick s R ange

© 2000-2018, MetaQuotes Software Corp.


1289 Operações de Gráficos

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().

F unção Ação
ChartApplyT emplate Aplica o modelo específico de um arquivo
especificado para o gráfico

ChartSaveT emplate Salva as configurações atuais do gráfico em um


modelo com um nome especificado

ChartW indowFind Retorna o número de uma sub-janela onde um


indicador é plotado

ChartT imePriceT oXY Converte as coordenadas do gráfico a partir da


representação tempo/preço para as
coordenadas X e Y

ChartXYT oT imePrice Converte as coordenadas X e Y no gráfico para


os valores de tempo e preço

ChartOpen Abre um novo gráfico com o s ímbolo e período


especificados

ChartClose Fecha um gráfico especificado


ChartFirst Retorna o ID do primeiro gráfico do terminal do
cliente

ChartNext Retorna o ID do gráfico do próximo gráfico para


um especificado

ChartS ymbol Retorna o nome do s ímbolo do gráfico


especificado

ChartPeriod Retorna o valor do período do gráfico


especificado

ChartR edraw Chama um redesenho forçado de um gráfico


especificado

ChartSetDouble Define o valor duplo para uma propriedade


correspondente do gráfico especificado

ChartSetInteger Define um valor inteiro (datetime, int, color,


bool ou char) para uma propriedade
correspondente do gráfico especificado

© 2000-2018, MetaQuotes Software Corp.


1290 Operações de Gráficos

ChartSetString Define o valor da sequência para uma


propriedade do gráfico especificado

ChartGetDouble Retorna a propriedade de valor duplo do gráfico


especificado

ChartGetInteger Retorna a propriedade de valor inteiro do


gráfico especificado

ChartGetString Retorna a propriedade de valor da sequência do


gráfico especificado

ChartNavigate Executa deslocamento do gráfico especificado


no número especificado de barras em relação à
posição definida no gráfico

ChartID Retorna o ID do gráfico atual


ChartIndicatorAdd Adiciona um indicador com o identificador
definido a uma janela do gráfico especificado

ChartIndicatorDelete Remove um indicador com um nome definido a


partir de janela do gráfico especificado

ChartIndicatorGet Retorna o manuseio do indicador com nome


abreviado definido na janela do gráfico
especificado

ChartIndicatorName Retorna o nome abreviado do indicador pelo


número na lista de indicadores sobre a janela
do gráfico especificado

ChartIndicators T otal Retorna o número total de indicadores


utilizados para a janela do gráfico especificado

ChartW indowOnDropped Retorna o número (índice) da sub-janela do


gráfico, o Expert Advisor ou o script foi solto
pelo mouse

ChartPriceOnDropped Retorna a coordenada de preço do ponto do


gráfico em que o Expert Advisor ou o script foi
solto pelo mouse

ChartT imeOnDropped Retorna a coordenada de tempo do ponto do


gráfico em que o Expert Advisor ou Script foi
solto pelo mouse

ChartXOnDropped Retorna a coordenada X do ponto do gráfico em


que o Expert Advisor ou script foi solto

ChartYOnDropped Retorna a coordenada Y do ponto do gráfico em


que o Expert Advisor ou script foi solto

ChartSetS ymbolPeriod Modifica o valor do s ímbolo e um período do


gráfico especificado

© 2000-2018, MetaQuotes Software Corp.


1291 Operações de Gráficos

ChartScreenS hot Fornece uma captura de tela do gráfico de seu


estado atual em formato GIF, PNG ou BM P,
dependendo da extensão especificada

© 2000-2018, MetaQuotes Software Corp.


1292 Operações de Gráficos

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
Retorna 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.

Usando Modelos (Templates)


Os recursos da linguagem MQL5 permitem a configuração de propriedades de múltiplos gráficos,
incluindo cores usando a função ChartSetInteger():

· Cor do fundo do gráfico;

· Cor dos eixos, escala e da linha OH LC;

· Cor da grade;

· Cor de volumes e níveis de posições abertas ;

© 2000-2018, MetaQuotes Software Corp.


1293 Operações de Gráficos

· 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 da linha do preço de compra;

· Cor da linha do preço de venda;

· Cor da linha do último acordo de preço (Last);

· 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.

A função ChartApplyT emplate() é destinada ao uso de um modelo (template) salvo previamente, e


pode ser usada em qualquer programa MQL5. O caminho para o arquivo que armazena o modelo
(template) é passado como o segundo parâmetro para o ChartApplyT emplate(). O arquivo do modelo
(template) é procurado de acordo com as seguintes regras :

· 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:

//--- busca de um modelo (template) no terminal_dados_diretório\MQL5\


ChartApplyTemplate(0,"\\primeiro_modelo.tpl"))
//--- busca de um modelo em diretório_de_EX5_arquivo\, em seguida a pasta terminal_dados_diretório\
ChartApplyTemplate(0,"segundo_modelo.tpl"))

© 2000-2018, MetaQuotes Software Corp.


1294 Operações de Gráficos

//--- busca de um modelo em diretório_de_EX5_arquivo\My_templates\, em seguida a pasta terminal_dir


ChartApplyTemplate(0,"My_templates\\terceiro_modelo.tpl"))
Os modelos não são recursos, eles não podem ser incluídos em um arquivo executável EX5.

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
Recursos

© 2000-2018, MetaQuotes Software Corp.


1295 Operações de Gráficos

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;

© 2000-2018, MetaQuotes Software Corp.


1296 Operações de Gráficos

//--- Preparar indicador para uso


if(!PrepareZigzag(NULL,0,handle)) return; // Falhou, sair
//--- Anexar o indicador ao atual gráfico, mas em janela separada.
if(!ChartIndicatorAdd(0,1,handle))
{
PrintFormat("Falha para anexar no gráfico %s/%s um indicador com o handle=%d. Código de erro
_Symbol,
EnumToString(_Period),
handle,
GetLastError());
//--- Finalizar a operação do programa
return;
}
//--- Atualizar o gráfico para ver o indicator
ChartRedraw();
//--- Encontre as duas últimas fracturas do zigzag
double two_values[];
datetime two_times[];
if(!GetLastTwoFractures(two_values,two_times,handle))
{
PrintFormat("Falha para localizar duas últimas fracturas no ZigZag!");
//--- Finalizar a operação do programa
return;
}
//--- Anexar agora um canal de desvio padrão
string channel="StdDeviation Channel";
if(!ObjectCreate(0,channel,OBJ_STDDEVCHANNEL,0,two_times[1],0))
{
PrintFormat("Falha ao criar objeto %s. Código de erro %d",
EnumToString(OBJ_STDDEVCHANNEL),GetLastError());
return;
}
else
{
//--- O canal foi criado, definir o segundo ponto
ObjectSetInteger(0,channel,OBJPROP_TIME,1,two_times[0]);
//--- Define uma dica de contexto (tooltip) para o canal
ObjectSetString(0,channel,OBJPROP_TOOLTIP,"Demonstração no ajuda MQL5");
//--- Atualizar o gráfico
ChartRedraw();
}
//--- Salve o resultado em um template (modelo)
ChartSaveTemplate(0,"StdDevChannelOnZigzag");
//--- Abrir um novo gráfico e aplicar um modelo salvo a ele
long new_chart=ChartOpen(symbol,period);
//--- Habilitar uma dica de contexto (tootips) para objetos gráficos
ChartSetInteger(new_chart,CHART_SHOW_OBJECT_DESCR,true);
if(new_chart!=0)
{

© 2000-2018, MetaQuotes Software Corp.


1297 Operações de Gráficos

//--- Aplicar uma template (modelo) salvo para o gráfico


ChartApplyTemplate(new_chart,"StdDevChannelOnZigzag");
}
Sleep(10000);
}
//+------------------------------------------------------------------+
//| Cria um manipulador ziguezague e garante disponibilidade de seus dados|
//+------------------------------------------------------------------+
bool PrepareZigzag(string sym,ENUM_TIMEFRAMES tf,int &h)
{
ResetLastError();
//--- O indicador de ziguezague deve estar localizado em terminal_data_folder\MQL5\Examples
h=iCustom(sym,tf,"Examples\\Zigzag");
if(h==INVALID_HANDLE)
{
PrintFormat("%s: Falha ao criar manipulador do indicador Zigzag. Código de erro %d",
__FUNCTION__,GetLastError());
return false;
}
//--- Quando é criado um manipulador de indicador, requer tempo para calcular valores
int k=0; // O número de tentativas de espera para o cálculo de indicadores
//--- Aguarda até que o cálculo faça um loop (volta completa), pausando por 50 milissegundos se o c
while(BarsCalculated(h)<=0)
{
k++;
//--- Mostrar o número de tentativas
PrintFormat("%s: k=%d",__FUNCTION__,k);
//--- Espera 50 milissegundos até que o indicador seja calculado
Sleep(50);
//--- Se mais de 100 tentativas, então algo está errado
if(k>100)
{
//--- Reportar um problema
PrintFormat("Falha ao calcular o indicador para %d tentativas!");
//--- Terminar a operação do programa
return false;
}
}
//--- Tudo está pronto, o indicador é criado e os valores são calculados
return true;
}
//+------------------------------------------------------------------+
//|Busca para as últimas duas fracturas de zigzag e lugar para arrays|
//+------------------------------------------------------------------+
bool GetLastTwoFractures(double &get_values[],datetime &get_times[],int handle)
{
double values[]; // Uma array para os valores de ziguezague
datetime times[]; // Uma array para obter tempo
int size=100; // Tamanho da array

© 2000-2018, MetaQuotes Software Corp.


1298 Operações de Gráficos

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(

© 2000-2018, MetaQuotes Software Corp.


1299 Operações de Gráficos

//--- Bem sucedido


return true;
}

Também Veja
ChartApplyT emplate(), R ecursos

© 2000-2018, MetaQuotes Software Corp.


1300 Operações de Gráficos

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. Retorna 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.

É importante para formar corretamente o nome abreviado de um indicador, que é registrado 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 ChartIndicatorDelete(), ele é identificado pelo nome
abreviado.

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 |
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


1301 Operações de Gráficos

int GetIndicatorSubWindowNumber(long chartID=0,string short_name="")


{
int window=-1;
//---
if((ENUM_PROGRAM_TYPE)MQL5InfoInteger(MQL5_PROGRAM_TYPE)==PROGRAM_INDICATOR)
{
//--- a função é chamada a partir do indicador, o nome não é necessário
window=ChartWindowFind();
}
else
{
//--- a função é chamada a partir de um Expert Advisor ou script
window=ChartWindowFind(0,short_name);
if(window==-1) Print(__FUNCTION__+"(): Erro = ",GetLastError());
}
//---
return(window);
}
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar)  |
//+------------------------------------------------------------------+
void OnStart()
{
//---
int window=GetIndicatorSubWindowNumber(0,shortname);
if(window!=-1)
Print("Indicador "+shortname+" está na janela #"+(string)window);
else
Print("Indicador "+shortname+" não foi encontrado. window = "+(string)window);
}

Também Veja
ObjectCreate(), ObjectFind()

© 2000-2018, MetaQuotes Software Corp.


1302 Operações de Gráficos

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
Retorna 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()

© 2000-2018, MetaQuotes Software Corp.


1303 Operações de Gráficos

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
Retorna 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

© 2000-2018, MetaQuotes Software Corp.


1304 Operações de Gráficos

Comment(__FUNCTION__,": id=",id," lparam=",lparam," dparam=",dparam," sparam=",sparam);


//--- Se este é um evento de um mouse clicando no gráfico
if(id==CHARTEVENT_CLICK)
{
//--- Preparar variáveis
int x =(int)lparam;
int y =(int)dparam;
datetime dt =0;
double price =0;
int window=0;
//--- Converter as coordenadas X e Y em termos de data/hora
if(ChartXYToTimePrice(0,x,y,window,dt,price))
{
PrintFormat("Janela=%d X=%d Y=%d => Tempo=%s Preço=%G",window,x,y,TimeToString(dt),pri
//--- Executar a conversão inversa: (X,Y) => (Tempo,Preço)
if(ChartTimePriceToXY(0,window,dt,price,x,y))
PrintFormat("Tempo=%s Preço=%G => X=%d Y=%d",TimeToString(dt),price,x,y);
else
Print("ChartTimePriceToXY código de erro de retorno: ",GetLastError());
//--- delete lines
ObjectDelete(0,"V Line");
ObjectDelete(0,"H Line");
//--- create horizontal and vertical lines of the crosshair
ObjectCreate(0,"H Line",OBJ_HLINE,window,dt,price);
ObjectCreate(0,"V Line",OBJ_VLINE,window,dt,price);
ChartRedraw(0);
}
else
Print("ChartXYToTimePrice código de erro de retorno: ",GetLastError());
Print("+--------------------------------------------------------------+");
}
}

Também Veja
ChartT imePriceT oXY()

© 2000-2018, MetaQuotes Software Corp.


1305 Operações de Gráficos

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 _TIMEFRAMES. 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.

© 2000-2018, MetaQuotes Software Corp.


1306 Operações de Gráficos

ChartFirst
Retorna o ID do primeiro gráfico do terminal de cliente.
long  ChartFirst();

Valor do Retorno
ID Gráfico.

© 2000-2018, MetaQuotes Software Corp.


1307 Operações de Gráficos

ChartNext
Retorna 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
}

© 2000-2018, MetaQuotes Software Corp.


1308 Operações de Gráficos

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.

© 2000-2018, MetaQuotes Software Corp.


1309 Operações de Gráficos

ChartSymbol
Retorna 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

© 2000-2018, MetaQuotes Software Corp.


1310 Operações de Gráficos

ChartPeriod
Retorna 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).

© 2000-2018, MetaQuotes Software Corp.


1311 Operações de Gráficos

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

© 2000-2018, MetaQuotes Software Corp.


1312 Operações de Gráficos

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_PROPERTY_DOUBLE (exceto
apenas a leitura das propriedades).

value
[in] Valor da Propriedade.

Valor do Retorno
Retorna 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.

© 2000-2018, MetaQuotes Software Corp.


1313 Operações de Gráficos

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
);

Define o valor para a respectiva propriedade da subjanela especificada

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_PROPERTY_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
Retorna 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.

© 2000-2018, MetaQuotes Software Corp.


1314 Operações de Gráficos

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));
}

© 2000-2018, MetaQuotes Software Corp.


1315 Operações de Gráficos

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_PROPERTY_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
Retorna 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;

© 2000-2018, MetaQuotes Software Corp.


1316 Operações de Gráficos

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

© 2000-2018, MetaQuotes Software Corp.


1317 Operações de Gráficos

ChartGetDouble
Retorna 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.

1. Retorna diretamente o valor da propriedade.


double  ChartGetDouble(
long  chart_id,  // ID Gráfico
int  prop_id,  // ID Propriedade
int  sub_window=0 // número da sub-janela, se necessário
);

2. Retorna 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:

© 2000-2018, MetaQuotes Software Corp.


1318 Operações de Gráficos

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);
}

© 2000-2018, MetaQuotes Software Corp.


1319 Operações de Gráficos

ChartGetInteger
Retorna 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.

1. Retorna diretamente o valor da propriedade.


long  ChartGetInteger(
long  chart_id,  // ID Gráfico
int  prop_id,  // ID Propriedade
int  sub_window=0 // número da sub-janela, se necessário
);

2. Retorna 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:

© 2000-2018, MetaQuotes Software Corp.


1320 Operações de Gráficos

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");
}

© 2000-2018, MetaQuotes Software Corp.


1321 Operações de Gráficos

ChartGetString
Retorna 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.

1. Retorna diretamente o valor da propriedade.


string  ChartGetString(
long  chart_id,  // ID Gráfico
int  prop_id   // ID Propriedade
);

2. Retorna 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!");

© 2000-2018, MetaQuotes Software Corp.


1322 Operações de Gráficos

ChartRedraw();
Sleep(1000);
string comm=ChartGetString(0,CHART_COMMENT);
Print(comm);
}

Também Veja
Comment, ChartSetString

© 2000-2018, MetaQuotes Software Corp.


1323 Operações de Gráficos

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
Retorna 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);

//--- preparar um texto para a saída em Comment()

© 2000-2018, MetaQuotes Software Corp.


1324 Operações de Gráficos

comm="Rolar 10 barras para a direita do começo do histórico";


//--- mostrar comentário
Comment(comm);
//--- rolar 10 barras para a direita do começo do histórico
ChartNavigate(handle,CHART_BEGIN,10);
//--- começar com o número da primeira barra visível no gráfico (numeração como em série de t
long first_bar=ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,0);
//--- adicionar linha de caractere
comm=comm+"\r\n";
//--- adicionar comentário
comm=comm+"A primeira barra é o número no gráfico "+IntegerToString(first_bar)+"\r\n";
//--- mostrar comentário
Comment(comm);
//--- aguardar 5 segundos para ver como o gráfico se move
Sleep(5000);

//--- adicionar texto de cometário


comm=comm+"\r\n"+"Rolar 10 barras para a esquerda da margem direita do gráfico";
Comment(comm);
//--- rolar 10 barras para a esquerda da margem direita do gráfico
ChartNavigate(handle,CHART_END,-10);
//--- começar com o número da primeira barra visível no gráfico (numeração como em série de t
first_bar=ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,0);
comm=comm+"\r\n";
comm=comm+"A primeira barra é o número no gráfico "+IntegerToString(first_bar)+"\r\n";
Comment(comm);
//--- aguardar 5 segundos para ver como o gráfico se move
Sleep(5000);

//--- novo bloco de rolagem do gráfico


comm=comm+"\r\n"+"Rolar 300 barras para a direita do início do histórico";
Comment(comm);
//--- rolar 300 barras para a direita do início do histórico
ChartNavigate(handle,CHART_BEGIN,300);
first_bar=ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,0);
comm=comm+"\r\n";
comm=comm+"A primeira barra é o número no gráfico "+IntegerToString(first_bar)+"\r\n";
Comment(comm);
//--- aguardar 5 segundos para ver como o gráfico se move
Sleep(5000);

//--- novo bloco de rolagem do gráfico


comm=comm+"\r\n"+"Rolar 300 barras para a esquerda da margem direita do gráfico";
Comment(comm);
//--- rolar 300 barras à esquerda da margem direita do gráfico
ChartNavigate(handle,CHART_END,-300);
first_bar=ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,0);
comm=comm+"\r\n";
comm=comm+"A primeira barra é o número no gráfico "+IntegerToString(first_bar)+"\r\n";

© 2000-2018, MetaQuotes Software Corp.


1325 Operações de Gráficos

Comment(comm);
}
}

© 2000-2018, MetaQuotes Software Corp.


1326 Operações de Gráficos

ChartID
Retorna o ID do gráfico atual.
long  ChartID();

Valor do Retorno
Valor tipo long.

© 2000-2018, MetaQuotes Software Corp.


1327 Operações de Gráficos

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."

//--- parâmetros de entrada


input string symbol="AUDUSD"; // nome do símbolo
input ENUM_TIMEFRAMES period=PERIOD_M12; // time frame

© 2000-2018, MetaQuotes Software Corp.


1328 Operações de Gráficos

input int fast_ema_period=12; // período rápido MACD


input int slow_ema_period=26; // período lento MACD
input int signal_period=9; // período de sinal
input ENUM_APPLIED_PRICE apr=PRICE_CLOSE; // tipo de preço para cálculo do iMACD

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()

© 2000-2018, MetaQuotes Software Corp.


1329 Operações de Gráficos

{
//--- 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

© 2000-2018, MetaQuotes Software Corp.


1330 Operações de Gráficos

return(true);
}

Veja também
ChartIndicatorDelete(), ChartIndicatorName(), ChartIndicators T otal(), iCustom(), IndicatorCreate()

© 2000-2018, MetaQuotes Software Corp.


1331 Operações de Gráficos

ChartIndicatorDelete
Remove 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
Retorna 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().

Nome abreviado do indicador deve ser formado corretamente. a propriedade


INDICAT OR_S H ORTNAME será escrita usando a funçãoIndicatorSetString(). Sé 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 ChartIndicatorDelete(), ele é identificado pelo nome
abreviado.

Exemplo de exclusão de um indicador após inicialização ter falhado:


//+------------------------------------------------------------------+
//| Demo_ChartIndicatorDelete.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |

© 2000-2018, MetaQuotes Software Corp.


1332 Operações de Gráficos

//| 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[],

© 2000-2018, MetaQuotes Software Corp.


1333 Operações de Gráficos

const long &volume[],


const int &spread[])
{
//--- Posição de partida para trabalhar num loop
int start=prev_calculated-1;
if(start<0) start=0;
//--- Preencher o buffer do indicador com valores
for(int i=start;i<rates_total;i++)
{
HistogramBuffer[i]=close[i];
}
//--- valor retorno de prev_calculated para a próxima chamada
return(rates_total);
}
//+------------------------------------------------------------------+
//| Um processador do evento de desinicializada (Deinit)  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
PrintFormat("%s: Código de razão de finalização=%d",__FUNCTION__,reason);
if(reason==REASON_INITFAILED)
{
PrintFormat("Um indicador com um nome abreviado %s (arquivo %s) se exclui do gráfico",shortna
int window=ChartWindowFind();
bool res=ChartIndicatorDelete(0,window,shortname);
//--- Analisar o resultado de chamada de ChartIndicatorDelete()
if(!res)
{
PrintFormat("Falha para deletar o indicador %s partir da janela #%d. Código de erro %d",
shortname,window,GetLastError());
}
}
}

Também Veja
ChartIndicatorAdd(), ChartIndicatorName(), ChartIndicators T otal(), iCustom(), IndicatorCreate(),
IndicatorSetString()

© 2000-2018, MetaQuotes Software Corp.


1334 Operações de Gráficos

ChartIndicatorGet
Retorna 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
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);

© 2000-2018, MetaQuotes Software Corp.


1335 Operações de Gráficos

//--- 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()

© 2000-2018, MetaQuotes Software Corp.


1336 Operações de Gráficos

ChartIndicatorName
Retorna 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.

Nome abreviado do indicador deve ser formado corretamente. a propriedade


INDICAT OR_S H ORTNAME será escrita usando a funçãoIndicatorSetString(). Sé 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 ChartIndicatorDelete(), ele é identificado pelo nome
abreviado.

Também Veja
ChartIndicatorAdd(), ChartIndicatorDelete(), ChartIndicators T otal(), iCustom(), IndicatorCreate(),
IndicatorSetString()

© 2000-2018, MetaQuotes Software Corp.


1337 Operações de Gráficos

ChartIndicatorsTotal
Retorna 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()

© 2000-2018, MetaQuotes Software Corp.


1338 Operações de Gráficos

ChartW indowOnDropped
Retorna 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

© 2000-2018, MetaQuotes Software Corp.


1339 Operações de Gráficos

ChartPriceOnDropped
Retorna 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

© 2000-2018, MetaQuotes Software Corp.


1340 Operações de Gráficos

ChartTimeOnDropped
Retorna 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

© 2000-2018, MetaQuotes Software Corp.


1341 Operações de Gráficos

ChartXOnDropped
Retorna 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

© 2000-2018, MetaQuotes Software Corp.


1342 Operações de Gráficos

ChartYOnDropped
Retorna 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

© 2000-2018, MetaQuotes Software Corp.


1343 Operações de Gráficos

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 _TIMEFRAMES. 0 (zero) significa
o período do atual gráfico.

Valor do Retorno
Retorna 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 ymbolPerid, com o mesmo s ímbolo e timeframe, pode ser utilizada
para atualizar o gráfico (semelhante ao comando R efres h 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

© 2000-2018, MetaQuotes Software Corp.


1344 Operações de Gráficos

ChartScreenShot
Providencia uma imagem do gráfico de seu estado atual para um formato GIF, PNG ou BM P
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 _ALIGN_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
Retorna 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

#define WIDTH 800 // ChartScreenShot() para Chamar a largura da imagem


#define HEIGHT 600 // ChartScreenShot() para Chamar a altura da imagem

© 2000-2018, MetaQuotes Software Corp.


1345 Operações de Gráficos

//--- parâmetros de entrada


input int pictures=5; // O número de imagens em série
int mode=-1; // -1 denota uma mudança para a borda direita do gráfico, 1 para a es
int bars_shift=300;// O número de barras de rolagem quando o gráfico está usando ChartNa
//+------------------------------------------------------------------+
//| Função de inicialização do Expert  |
//+------------------------------------------------------------------+
void OnInit()
{
//--- Desabilita gráfico autoscroll
ChartSetInteger(0,CHART_AUTOSCROLL,false);
//--- Definir o deslocamento da borda direita do gráfico
ChartSetInteger(0,CHART_SHIFT,true);
//--- Mostra uma castiçal (vela ou barra) do gráfico
ChartSetInteger(0,CHART_MODE,CHART_CANDLES);
//---
Print("Preparação do Expert Advisor está completada");
}
//+------------------------------------------------------------------+
//| Função tick (ponto) de um Expert |
//+------------------------------------------------------------------+
void OnTick()
{
//---

}
//+------------------------------------------------------------------+
//| 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

© 2000-2018, MetaQuotes Software Corp.


1346 Operações de Gráficos

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

© 2000-2018, MetaQuotes Software Corp.


1347 Funções de Negociação (Trade)

Funções de Negociação (Trade)


Este é o grupo de funções destina-se à gestão de atividades de negociação.

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.

F unção Ação
OrderCalcMargin Calcula a margem necessária para o tipo de
ordem especificado, na moeda de depósito

OrderCalcProfit Calcula o lucro com base nos parâmetros


passados ​, na moeda de depósito

OrderCheck Verifica se há fundos suficientes para executar


a operação de negócio necessária.

OrderSend Envia pedidos de negócios para um servidor

OrderSendAs ync De forma ass íncrona envia pedidos de comércio


sem esperar a resposta da negociação do
servidor de negócio

Positions T otal Retorna o número de posições em aberto


PositionGetS ymbol Retorna o s ímbolo correspondente à posição
aberta

PositionSelect Escolhe uma posição aberta para


posteriormente trabalhar com ele

PositionSelectByT ick et Selects a position to work with by the tick et


number specified in it

PositionGetDouble Retorna a propriedade solicitado de uma


posição aberta (double)

PositionGetInteger Retorna a propriedade solicitada uma posição


aberta (datetime ou int)

PositionGetString Retorna a propriedade solicitada uma posição


aberta (string)

PositionGetT ick et Returns the tick et of the position with the


specified index in the list of open positions

Orders T otal Retorna o número de ordens


OrderGetT ick et Devolver o bilhete de uma ordem
correspondente

© 2000-2018, MetaQuotes Software Corp.


1348 Funções de Negociação (Trade)

OrderSelect Seleciona uma ordem para posteriormente


trabalhar com ele

OrderGetDouble Retorna a propriedade solicitada da ordem


(double)

OrderGetInteger Retorna a propriedade solicitada da ordem


(datetime ou int)

OrderGetString Retorna a propriedade solicitada da ordem


(string)

H istorySelect Recupera o histórico de transações e ordens


para o período do tempo de servidor
especificado

H istorySelectByPosition Pedido de histórico de acordo com um


identificador de posição especificada.

H istoryOrderSelect Seleciona uma ordem no histórico para


posteriormente trabalhar com ele

H istoryOrders T otal Retorna o número de pedidos no histórico


H istoryOrderGetT ick et Retornar bilhete ordem de uma ordem
correspondente no histórico

H istoryOrderGetDouble Retorna a propriedade solicitada de uma ordem


no histórico (double)

H istoryOrderGetInteger Retorna a propriedade solicitada de uma ordem


no histórico (datetime ou int)

H istoryOrderGetString Retorna a propriedade solicitada de uma ordem


no histórico (string)

H istoryDealSelect Seleciona um negócio no histórico para


posterior chamada através de funções
apropriadas

H istoryDeals T otal Retorna o número de ofertas no histórico


H istoryDealGetT ick et Devolve um bilhete de uma quantidade
correspondente no histórico

H istoryDealGetDouble Retorna a propriedade solicitada de um acordo


no histórico (double)

H istoryDealGetInteger Retorna a propriedade solicitada de um acordo


no histórico (datetime ou int)

H istoryDealGetString Retorna a propriedade solicitada de uma


operação no histórico (string)

© 2000-2018, MetaQuotes Software Corp.


1349 Funções de Negociação (Trade)

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)

© 2000-2018, MetaQuotes Software Corp.


1350 Funções de Negociação (Trade)

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)

© 2000-2018, MetaQuotes Software Corp.


1351 Funções de Negociação (Trade)

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 radeRequest que descreve a ação de comércio
requerida.

result
[in,out] Ponteiro para a estrutura do tipo MqlT radeCheckResult, 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.

A fim de obter informações sobre o erro, chamar a função GetLastError().

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

© 2000-2018, MetaQuotes Software Corp.


1352 Funções de Negociação (Trade)

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 radeRequest descrevendo a atividade de negociação
do cliente.

result
[in,out] Ponteiro para uma estrutura do tipo MqlT radeResult 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.

Recomenda-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

© 2000-2018, MetaQuotes Software Corp.


1353 Funções de Negociação (Trade)

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.

No momento do processamento da ordem, o servidor de negociaçãos envia ao terminal uma


mensagem sobre a ocorrência do evento T rade (evento de negociação), que pode ser processado
pela função OnT rade().

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);

© 2000-2018, MetaQuotes Software Corp.


1354 Funções de Negociação (Trade)

}
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={0};
MqlTradeRequest request={0};
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

© 2000-2018, MetaQuotes Software Corp.


1355 Funções de Negociação (Trade)

MqlTradeRequest request={0};
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={0};
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={0};
SymbolInfoTick(_Symbol,last_tick);
//--- calcular o preço de acordo com o tipo

© 2000-2018, MetaQuotes Software Corp.


1356 Funções de Negociação (Trade)

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

© 2000-2018, MetaQuotes Software Corp.


1357 Funções de Negociação (Trade)

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 radeRequestque descreve a ação comercial do
cliente.

result
[in,out] Ponteiro para uma estrutura do tipo MqlT radeResultdescrevendo o resultado da operação
comercial, no caso de uma realização bem sucedida (se verdadeiro é retornado).

Valor do Retorno
Retorna 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

© 2000-2018, MetaQuotes Software Corp.


1358 Funções de Negociação (Trade)

Em termos de objetivos e parâmetros, a função é semelhante ao OrderSend(), mas ao contrário, ela


é ass íncrona, isto é, não se sustenta o funcionamento do programa enquanto aguarda o resultado da
execução da função. Você pode comparar a taxa de operações de comércio destas duas funções,
utilizando a amostra Expert Advisor.

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();

© 2000-2018, MetaQuotes Software Corp.


1359 Funções de Negociação (Trade)

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;

© 2000-2018, MetaQuotes Software Corp.


1360 Funções de Negociação (Trade)

//--- histórico de negociação do pedido


bool update=HistorySelect(history_start,TimeCurrent());
PrintFormat("HistorySelect(%s , %s) = %s",
TimeToString(history_start),TimeToString(TimeCurrent()),(string)update);
//--- título nomeado após negociação da função handler do evento
Print("=> ",__FUNCTION__," at ",TimeToString(TimeCurrent(),TIME_SECONDS));
//--- exibir o nome do handler (manipulador) e o número de ordens no momento da manipulação
int curr_positions=PositionsTotal();
int curr_orders=OrdersTotal();
int curr_deals=HistoryOrdersTotal();
int curr_history_orders=HistoryDealsTotal();
//--- exibir o número de ordens, as posições, promoções e alterações em parênteses
PrintFormat("PositionsTotal() = %d (%+d)",
curr_positions,(curr_positions-prev_positions));
PrintFormat("OrdersTotal() = %d (%+d)",
curr_orders,curr_orders-prev_orders);
PrintFormat("HistoryOrdersTotal() = %d (%+d)",
curr_deals,curr_deals-prev_deals);
PrintFormat("HistoryDealsTotal() = %d (%+d)",
curr_history_orders,curr_history_orders-prev_history_orders);
//--- Inserir uma quebra de string para ver o log mais adequado
Print("");
//--- salvar o status da conta
prev_positions=curr_positions;
prev_orders=curr_orders;
prev_deals=curr_deals;
prev_history_orders=curr_history_orders;
//---
}
//+------------------------------------------------------------------+
//| Função ChartEvent |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
const long &lparam,
const double &dparam,
const string &sparam)
{
//--- manipulação do evento CHARTEVENT_CLICK ("Clicando no gráfico")
if(id==CHARTEVENT_OBJECT_CLICK)
{
Print("=> ",__FUNCTION__,": sparam = ",sparam);
//--- volume mínimo de um negócio
double volume_min=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
//--- Se o botão "Comprar" é pressionado, então comprar
if(sparam=="Buy")
{
PrintFormat("Buy %s %G lot",_Symbol,volume_min);
BuyAsync(volume_min);
//--- desfazer pressionando o botão

© 2000-2018, MetaQuotes Software Corp.


1361 Funções de Negociação (Trade)

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

© 2000-2018, MetaQuotes Software Corp.


1362 Funções de Negociação (Trade)

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()

© 2000-2018, MetaQuotes Software Corp.


1363 Funções de Negociação (Trade)

{
//--- 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={0};
req.action =TRADE_ACTION_DEAL;
req.symbol =_Symbol;
req.magic =MagicNumber;

© 2000-2018, MetaQuotes Software Corp.


1364 Funções de Negociação (Trade)

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={0};
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={0};
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={0};
if(!OrderSendAsync(req,res))
{
Print(__FUNCTION__,": erro ",GetLastError(),", retcode = ",res.retcode);
}
//---
}
//+------------------------------------------------------------------+

Exemplo de exibição de mensagens em log " Experts" :


12:52:52 ExpertAdvisor (EURUSD,H1) => OnChartEvent: sparam = Sell
12:52:52 ExpertAdvisor (EURUSD,H1) Sell EURUSD 0.01 lot
12:52:52 ExpertAdvisor (EURUSD,H1) => OnTradeTransaction at 09:52:53
12:52:52 ExpertAdvisor (EURUSD,H1) TRADE_TRANSACTION_REQUEST
12:52:52 ExpertAdvisor (EURUSD,H1) ------------RequestDescription
12:52:52 ExpertAdvisor (EURUSD,H1) TRADE_ACTION_DEAL
12:52:52 ExpertAdvisor (EURUSD,H1) Symbol: EURUSD
12:52:52 ExpertAdvisor (EURUSD,H1) Magic Number: 1234567
12:52:52 ExpertAdvisor (EURUSD,H1) Order ticket: 16361998
12:52:52 ExpertAdvisor (EURUSD,H1) Order type: ORDER_TYPE_SELL
12:52:52 ExpertAdvisor (EURUSD,H1) Order filling: ORDER_FILLING_FOK

© 2000-2018, MetaQuotes Software Corp.


1365 Funções de Negociação (Trade)

12:52:52 ExpertAdvisor (EURUSD,H1) Order time type: ORDER_TIME_GTC


12:52:52 ExpertAdvisor (EURUSD,H1) Order expiration: 1970.01.01 00:00
12:52:52 ExpertAdvisor (EURUSD,H1) Price: 1.29313
12:52:52 ExpertAdvisor (EURUSD,H1) Deviation points: 10
12:52:52 ExpertAdvisor (EURUSD,H1) Stop Loss: 0
12:52:52 ExpertAdvisor (EURUSD,H1) Take Profit: 0
12:52:52 ExpertAdvisor (EURUSD,H1) Stop Limit: 0
12:52:52 ExpertAdvisor (EURUSD,H1) Volume: 0.1
12:52:52 ExpertAdvisor (EURUSD,H1) Comment: Sell using OrderSendAsync()
12:52:52 ExpertAdvisor (EURUSD,H1)
12:52:52 ExpertAdvisor (EURUSD,H1) ------------ ResultDescription
12:52:52 ExpertAdvisor (EURUSD,H1) Retcode 10009
12:52:52 ExpertAdvisor (EURUSD,H1) Request ID: 2
12:52:52 ExpertAdvisor (EURUSD,H1) Order ticket: 16361998
12:52:52 ExpertAdvisor (EURUSD,H1) Deal ticket: 15048668
12:52:52 ExpertAdvisor (EURUSD,H1) Volume: 0.1
12:52:52 ExpertAdvisor (EURUSD,H1) Price: 1.29313
12:52:52 ExpertAdvisor (EURUSD,H1) Ask: 1.29319
12:52:52 ExpertAdvisor (EURUSD,H1) Bid: 1.29313
12:52:52 ExpertAdvisor (EURUSD,H1) Comment:
12:52:52 ExpertAdvisor (EURUSD,H1)
12:52:52 ExpertAdvisor (EURUSD,H1) HistorySelect( 09:34 , 09:52) = true
12:52:52 ExpertAdvisor (EURUSD,H1) => OnTrade at 09:52:53
12:52:52 ExpertAdvisor (EURUSD,H1) PositionsTotal() = 1 (+1)
12:52:52 ExpertAdvisor (EURUSD,H1) OrdersTotal() = 0 (+0)
12:52:52 ExpertAdvisor (EURUSD,H1) HistoryOrdersTotal() = 2 (+2)
12:52:52 ExpertAdvisor (EURUSD,H1) HistoryDealsTotal() = 2 (+2)
12:52:52 ExpertAdvisor (EURUSD,H1)
12:52:52 ExpertAdvisor (EURUSD,H1) => OnTradeTransaction at 09:52:53
12:52:52 ExpertAdvisor (EURUSD,H1) ------------ TransactionDescription
12:52:52 ExpertAdvisor (EURUSD,H1) TRADE_TRANSACTION_ORDER_ADD
12:52:52 ExpertAdvisor (EURUSD,H1) Symbol: EURUSD
12:52:52 ExpertAdvisor (EURUSD,H1) Deal ticket: 0
12:52:52 ExpertAdvisor (EURUSD,H1) Deal type: DEAL_TYPE_BUY
12:52:52 ExpertAdvisor (EURUSD,H1) Order ticket: 16361998
12:52:52 ExpertAdvisor (EURUSD,H1) Order type: ORDER_TYPE_SELL
12:52:52 ExpertAdvisor (EURUSD,H1) Order state: ORDER_STATE_STARTED
12:52:52 ExpertAdvisor (EURUSD,H1) Order time type: ORDER_TIME_GTC
12:52:52 ExpertAdvisor (EURUSD,H1) Order expiration: 1970.01.01 00:00
12:52:52 ExpertAdvisor (EURUSD,H1) Price: 1.29313
12:52:52 ExpertAdvisor (EURUSD,H1) Price trigger: 0
12:52:52 ExpertAdvisor (EURUSD,H1) Stop Loss: 0
12:52:52 ExpertAdvisor (EURUSD,H1) Take Profit: 0
12:52:52 ExpertAdvisor (EURUSD,H1) Volume: 0.1
12:52:52 ExpertAdvisor (EURUSD,H1)
12:52:52 ExpertAdvisor (EURUSD,H1) => OnTradeTransaction at 09:52:53
12:52:52 ExpertAdvisor (EURUSD,H1) ------------ TransactionDescription
12:52:52 ExpertAdvisor (EURUSD,H1) TRADE_TRANSACTION_ORDER_DELETE
12:52:52 ExpertAdvisor (EURUSD,H1) Symbol: EURUSD

© 2000-2018, MetaQuotes Software Corp.


1366 Funções de Negociação (Trade)

12:52:52 ExpertAdvisor (EURUSD,H1) Deal ticket: 0


12:52:52 ExpertAdvisor (EURUSD,H1) Deal type: DEAL_TYPE_BUY
12:52:52 ExpertAdvisor (EURUSD,H1) Order ticket: 16361998
12:52:52 ExpertAdvisor (EURUSD,H1) Order type: ORDER_TYPE_SELL
12:52:52 ExpertAdvisor (EURUSD,H1) Order state: ORDER_STATE_STARTED
12:52:52 ExpertAdvisor (EURUSD,H1) Order time type: ORDER_TIME_GTC
12:52:52 ExpertAdvisor (EURUSD,H1) Order expiration: 1970.01.01 00:00
12:52:52 ExpertAdvisor (EURUSD,H1) Price: 1.29313
12:52:52 ExpertAdvisor (EURUSD,H1) Price trigger: 0
12:52:52 ExpertAdvisor (EURUSD,H1) Stop Loss: 0
12:52:52 ExpertAdvisor (EURUSD,H1) Take Profit: 0
12:52:52 ExpertAdvisor (EURUSD,H1) Volume: 0.1
12:52:52 ExpertAdvisor (EURUSD,H1)
12:52:52 ExpertAdvisor (EURUSD,H1) HistorySelect( 09:34 , 09:52) = true
12:52:52 ExpertAdvisor (EURUSD,H1) => OnTrade at 09:52:53
12:52:52 ExpertAdvisor (EURUSD,H1) PositionsTotal() = 1 (+0)
12:52:52 ExpertAdvisor (EURUSD,H1) OrdersTotal() = 0 (+0)
12:52:52 ExpertAdvisor (EURUSD,H1) HistoryOrdersTotal() = 2 (+0)
12:52:52 ExpertAdvisor (EURUSD,H1) HistoryDealsTotal() = 2 (+0)
12:52:52 ExpertAdvisor (EURUSD,H1)
12:52:52 ExpertAdvisor (EURUSD,H1) => OnTradeTransaction at 09:52:53
12:52:52 ExpertAdvisor (EURUSD,H1) ------------ TransactionDescription
12:52:52 ExpertAdvisor (EURUSD,H1) TRADE_TRANSACTION_HISTORY_ADD
12:52:52 ExpertAdvisor (EURUSD,H1) Symbol: EURUSD
12:52:52 ExpertAdvisor (EURUSD,H1) Deal ticket: 0
12:52:52 ExpertAdvisor (EURUSD,H1) Deal type: DEAL_TYPE_BUY
12:52:52 ExpertAdvisor (EURUSD,H1) Order ticket: 16361998
12:52:52 ExpertAdvisor (EURUSD,H1) Order type: ORDER_TYPE_SELL
12:52:52 ExpertAdvisor (EURUSD,H1) Order state: ORDER_STATE_FILLED
12:52:52 ExpertAdvisor (EURUSD,H1) Order time type: ORDER_TIME_GTC
12:52:52 ExpertAdvisor (EURUSD,H1) Order expiration: 1970.01.01 00:00
12:52:52 ExpertAdvisor (EURUSD,H1) Price: 1.29313
12:52:52 ExpertAdvisor (EURUSD,H1) Price trigger: 0
12:52:52 ExpertAdvisor (EURUSD,H1) Stop Loss: 0
12:52:52 ExpertAdvisor (EURUSD,H1) Take Profit: 0
12:52:52 ExpertAdvisor (EURUSD,H1) Volume: 0
12:52:52 ExpertAdvisor (EURUSD,H1)
12:52:52 ExpertAdvisor (EURUSD,H1) HistorySelect( 09:34 , 09:52) = true
12:52:52 ExpertAdvisor (EURUSD,H1) => OnTrade at 09:52:53
12:52:52 ExpertAdvisor (EURUSD,H1) PositionsTotal() = 1 (+0)
12:52:52 ExpertAdvisor (EURUSD,H1) OrdersTotal() = 0 (+0)
12:52:52 ExpertAdvisor (EURUSD,H1) HistoryOrdersTotal() = 2 (+0)
12:52:52 ExpertAdvisor (EURUSD,H1) HistoryDealsTotal() = 2 (+0)
12:52:52 ExpertAdvisor (EURUSD,H1)
12:52:52 ExpertAdvisor (EURUSD,H1) => OnTradeTransaction at 09:52:53
12:52:52 ExpertAdvisor (EURUSD,H1) ------------ TransactionDescription
12:52:52 ExpertAdvisor (EURUSD,H1) TRADE_TRANSACTION_DEAL_ADD
12:52:52 ExpertAdvisor (EURUSD,H1) Symbol: EURUSD
12:52:52 ExpertAdvisor (EURUSD,H1) Deal ticket: 15048668

© 2000-2018, MetaQuotes Software Corp.


1367 Funções de Negociação (Trade)

12:52:52 ExpertAdvisor (EURUSD,H1) Deal type: DEAL_TYPE_SELL


12:52:52 ExpertAdvisor (EURUSD,H1) Order ticket: 16361998
12:52:52 ExpertAdvisor (EURUSD,H1) Order type: ORDER_TYPE_BUY
12:52:52 ExpertAdvisor (EURUSD,H1) Order state: ORDER_STATE_STARTED
12:52:52 ExpertAdvisor (EURUSD,H1) Order time type: ORDER_TIME_GTC
12:52:52 ExpertAdvisor (EURUSD,H1) Order expiration: 1970.01.01 00:00
12:52:52 ExpertAdvisor (EURUSD,H1) Price: 1.29313
12:52:52 ExpertAdvisor (EURUSD,H1) Price trigger: 0
12:52:52 ExpertAdvisor (EURUSD,H1) Stop Loss: 0
12:52:52 ExpertAdvisor (EURUSD,H1) Take Profit: 0
12:52:52 ExpertAdvisor (EURUSD,H1) Volume: 0.1
12:52:52 ExpertAdvisor (EURUSD,H1)
12:52:52 ExpertAdvisor (EURUSD,H1) HistorySelect( 09:34 , 09:52) = true
12:52:52 ExpertAdvisor (EURUSD,H1) => OnTrade at 09:52:53
12:52:52 ExpertAdvisor (EURUSD,H1) PositionsTotal() = 1 (+0)
12:52:52 ExpertAdvisor (EURUSD,H1) OrdersTotal() = 0 (+0)
12:52:52 ExpertAdvisor (EURUSD,H1) HistoryOrdersTotal() = 2 (+0)
12:52:52 ExpertAdvisor (EURUSD,H1) HistoryDealsTotal() = 2 (+0)
12:52:52 ExpertAdvisor (EURUSD,H1)

© 2000-2018, MetaQuotes Software Corp.


1368 Funções de Negociação (Trade)

PositionsTotal
Retorna 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 " .

Ao usar a exibição independente de posições, (ACCOUNT_MARGIN_MODE_R ET AIL _H EDGING)


segundo cada s ímbolo, podem ao mesmo tempo existir várias posições.

Também Veja
PositionGetS ymbol(), PositionSelect(), Propriedades de uma Posição

© 2000-2018, MetaQuotes Software Corp.


1369 Funções de Negociação (Trade)

PositionGetSymbol
Retorna 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 " .

Ao usar a exibição independente de posições, (ACCOUNT_MARGIN_MODE_R ET AIL _H EDGING)


segundo cada s ímbolo, podem ao mesmo tempo existir várias posições.

Também Veja
Positions T otal(), PositionSelect(), Propriedades de uma Posição

© 2000-2018, MetaQuotes Software Corp.


1370 Funções de Negociação (Trade)

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 " .

Ao usar a exibição independente de posições, (ACCOUNT_MARGIN_MODE_R ET AIL _H EDGING)


segundo cada s ímbolo, podem ao mesmo tempo existir várias posições. Neste caso, a PositionSelect
escolhe a posição com o menor bilhete.

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

© 2000-2018, MetaQuotes Software Corp.


1371 Funções de Negociação (Trade)

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

© 2000-2018, MetaQuotes Software Corp.


1372 Funções de Negociação (Trade)

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.

1. Imediatamente retorna o valor da propriedade.


double  PositionGetDouble(
ENUM_POSITION_PROPERTY_DOUBLE  property_id  // Identificador de propriedade
);

2. Retorna 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 " .

Ao usar a exibição independente de posições, (ACCOUNT_MARGIN_MODE_R ET AIL _H EDGING)


segundo cada s ímbolo, podem ao mesmo tempo existir várias posições.

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(), PositionSelect(), Propriedades de uma Posição

© 2000-2018, MetaQuotes Software Corp.


1373 Funções de Negociação (Trade)

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.

1. Imediatamente retorna o valor da propriedade.


long  PositionGetInteger(
ENUM_POSITION_PROPERTY_INTEGER  property_id  // Identificador de propriedade
);

2. Retorna 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_RET AIL_NETTING and
ACCOUNT_MARGIN_MODE_EXCH ANGE), only one position can exist for a s ymbol at any moment of
time. This position is a result of one or more deals. Do not confuse positions with valid pending
orders, which are also displayed on the T rading tab of the T oolbox window.

If individual positions are allowed (ACCOUNT_MARGIN_MODE_RET AIL_H EDGING), multiple positions


can be open for one s ymbol.

Para garantir o recebimento de novos dados sobre a posição, é recomendado chamar


PositionSelect() logo antes referindo-se a eles.

Exemplo:
//+------------------------------------------------------------------+
//| Função Trade  |
//+------------------------------------------------------------------+
void OnTrade()
{

© 2000-2018, MetaQuotes Software Corp.


1374 Funções de Negociação (Trade)

//--- verificar se a posição está presente e exibir a hora de sua mudança


if(PositionSelect(_Symbol))
{
receber ID posição para trabalhos futuros
ulong position_ID=PositionGetInteger(POSITION_IDENTIFIER);
Print(_Symbol," posição #",position_ID);
//--- receber o tempo de posição formando em milissegundos desde 01.01.1970
long create_time_msc=PositionGetInteger(POSITION_TIME_MSC);
PrintFormat("Posição #%d POSITION_TIME_MSC = %i64 milissegundos => %s",position_ID,
create_time_msc,TimeToString(create_time_msc/1000));
//--- receber o tempo da última alteração da posição em segundos desde 01.01.1970
long update_time_sec=PositionGetInteger(POSITION_TIME_UPDATE);
PrintFormat("Posição #%d POSITION_TIME_UPDATE = %i64 segundos => %s",
position_ID,update_time_sec,TimeToString(update_time_sec));
//--- receber o tempo da última alteração da posição em milissegundos desde 01.01.1970
long update_time_msc=PositionGetInteger(POSITION_TIME_UPDATE_MSC);
PrintFormat("Posição #%d POSITION_TIME_UPDATE_MSC = %i64 milissegundos => %s",
position_ID,update_time_msc,TimeToString(update_time_msc/1000));
}
//---
}

Também Veja
PositionGetS ymbol(), PositionSelect(), Propriedades de uma Posição

© 2000-2018, MetaQuotes Software Corp.


1375 Funções de Negociação (Trade)

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 " .

Ao usar a exibição independente de posições, (ACCOUNT_MARGIN_MODE_R ET AIL _H EDGING)


segundo cada s ímbolo, podem ao mesmo tempo existir várias posições.

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

© 2000-2018, MetaQuotes Software Corp.


1376 Funções de Negociação (Trade)

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.

1. Imediatamente retorna o valor da propriedade.


string  PositionGetString(
ENUM_POSITION_PROPERTY_STRING  property_id  // Identificador de propriedade
);

2. Retorna 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_RET AIL_NETTING and
ACCOUNT_MARGIN_MODE_EXCH ANGE), only one position can exist for a s ymbol at any moment of
time. This position is a result of one or more deals. Do not confuse positions with valid pending
orders, which are also displayed on the T rading tab of the T oolbox window.

If individual positions are allowed (ACCOUNT_MARGIN_MODE_RET AIL_H EDGING), multiple positions


can be open for one s ymbol.

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(), PositionSelect(), Propriedades de uma Posição

© 2000-2018, MetaQuotes Software Corp.


1377 Funções de Negociação (Trade)

OrdersTotal
Retorna 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.

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 " .

Ao usar a exibição independente de posições, (ACCOUNT_MARGIN_MODE_R ET AIL _H EDGING)


segundo cada s ímbolo, podem ao mesmo tempo existir várias posições.

Também Veja
OrderSelect(), OrderGetT ick et(), Propriedades de uma Ordem

© 2000-2018, MetaQuotes Software Corp.


1378 Funções de Negociação (Trade)

OrderGetTicket
Retorna 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.

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 " .

Ao usar a exibição independente de posições, (ACCOUNT_MARGIN_MODE_R ET AIL _H EDGING)


segundo cada s ímbolo, podem ao mesmo tempo existir várias posições.

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();

© 2000-2018, MetaQuotes Software Corp.


1379 Funções de Negociação (Trade)

//--- passar por ordens em um loop


for(uint i=0;i<total;i++)
{
//--- voltar ticket ordem por sua posição na lista
if((ticket=OrderGetTicket(i))>0)
{
//--- retorna propriedades de uma Ordem
open_price =OrderGetDouble(ORDER_PRICE_OPEN);
time_setup =(datetime)OrderGetInteger(ORDER_TIME_SETUP);
symbol =OrderGetString(ORDER_SYMBOL);
order_magic =OrderGetInteger(ORDER_MAGIC);
positionID =OrderGetInteger(ORDER_POSITION_ID);
initial_volume=OrderGetDouble(ORDER_VOLUME_INITIAL);
type =EnumToString(ENUM_ORDER_TYPE(OrderGetInteger(ORDER_TYPE)));
//--- preparar e apresentar informações sobre a ordem
printf("#ticket %d %s %G %s em %G foi criado em %s",
ticket, // ticket de ordem
type, // tipo
initial_volume, // volume colocado
symbol, // simbolo
open_price, // preço de abertura especificada
TimeToString(time_setup)// tempo de colocar a ordem
);
}
}
//---
}

Também Veja
Orders T otal(), OrderSelect(), OrderGetInteger()

© 2000-2018, MetaQuotes Software Corp.


1380 Funções de Negociação (Trade)

OrderSelect
Seleciona uma ordem para trabalhar. R etorna verdadeiro se a função tenha sido concluída com êxito.
Retorna 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.

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 " .

Ao usar a exibição independente de posições, (ACCOUNT_MARGIN_MODE_R ET AIL _H EDGING)


segundo cada s ímbolo, podem ao mesmo tempo existir várias posições.

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

© 2000-2018, MetaQuotes Software Corp.


1381 Funções de Negociação (Trade)

OrderGetDouble
Retorna 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.

1. Imediatamente retorna o valor da propriedade.


double  OrderGetDouble(
ENUM_ORDER_PROPERTY_DOUBLE  property_id  // Identificador de propriedade
);

2. Retorna 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.

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 " .

Ao usar a exibição independente de posições, (ACCOUNT_MARGIN_MODE_R ET AIL _H EDGING)


segundo cada s ímbolo, podem ao mesmo tempo existir várias posições.

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

© 2000-2018, MetaQuotes Software Corp.


1382 Funções de Negociação (Trade)

OrderGetInteger
Retorna 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.

1. Imediatamente retorna o valor da propriedade.


long  OrderGetInteger(
ENUM_ORDER_PROPERTY_INTEGER  property_id  // Identificador de propriedade
);

2. Retorna 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.

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 " .

Ao usar a exibição independente de posições, (ACCOUNT_MARGIN_MODE_R ET AIL _H EDGING)


segundo cada s ímbolo, podem ao mesmo tempo existir várias posições.

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

© 2000-2018, MetaQuotes Software Corp.


1383 Funções de Negociação (Trade)

OrderGetString
Retorna 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.

1. Imediatamente retorna o valor da propriedade.


string  OrderGetString(
ENUM_ORDER_PROPERTY_STRING  property_id  // Identificador de propriedade
);

2. Retorna 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.

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 " .

Ao usar a exibição independente de posições, (ACCOUNT_MARGIN_MODE_R ET AIL _H EDGING)


segundo cada s ímbolo, podem ao mesmo tempo existir várias posições.

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

© 2000-2018, MetaQuotes Software Corp.


1384 Funções de Negociação (Trade)

HistorySelect
Recupera 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
Retorna 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.

Depois de usar H istoryOrderSelect(), a lista de pedidos de história disponíveis para o programa


MQL5 é reposto e completada novamente pela ordem encontrada, se a busca de uma ordem do
tick et foi concluída com sucesso. O mesmo aplica-se à lista de ofertas disponíveis para o programa
MQL5 - é reiniciado pelo H istoryDealSelect() e preenchido novamente no caso de uma recepção bem
sucedida de um negócio pelo número do tick et.

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;

© 2000-2018, MetaQuotes Software Corp.


1385 Funções de Negociação (Trade)

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()

© 2000-2018, MetaQuotes Software Corp.


1386 Funções de Negociação (Trade)

HistorySelectByPosition
Recupera 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
Retorna 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().

Depois de usar H istoryOrderSelect(), a lista do histórico de pedidos disponíveis para o programa


MQL5 é reposto e completada novamente pela ordem encontrada, se a busca de uma ordem do
tick et foi concluída com sucesso. O mesmo refere-se à lista de ofertas disponíveis para o programa
MQL5 - é reposto pela função H istoryDealSelect() e é preenchido novamente se um acordo foi
encontrado com sucesso pelo numero do tick et.

Também Veja
H istorySelect(), H istoryOrderGetT ick et(), Propriedades de uma Ordem

© 2000-2018, MetaQuotes Software Corp.


1387 Funções de Negociação (Trade)

HistoryOrderSelect
Seleciona uma ordem a partir do histórico para posterior chamada através de funções apropriadas.
Retorna true se a função tenha sido concluída com êxito. Retorna 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
Retorna 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 istoryOrderSelect() limpa em um programa de MQL5 a lista de ordens   a partir de um histórico,


disponível para chamadas, e copia ele para uma única ordem, se a execução de H istoryOrderSelect()
foi concluída com êxito. Se você precisa passar por todas as negociações selecionadas pelo
H istorySelect() , você deve usar melhor o H istoryOrderGetT ick et().

Também Veja
H istorySelect(), H istoryOrderGetT ick et(), Propriedades de uma Ordem

© 2000-2018, MetaQuotes Software Corp.


1388 Funções de Negociação (Trade)

HistoryOrdersTotal
Retorna 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

© 2000-2018, MetaQuotes Software Corp.


1389 Funções de Negociação (Trade)

HistoryOrderGetTicket
Retornar 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)
{

© 2000-2018, MetaQuotes Software Corp.


1390 Funções de Negociação (Trade)

//--- retorna propriedades de uma Ordem


open_price= HistoryOrderGetDouble(ticket,ORDER_PRICE_OPEN);
time_setup= (datetime)HistoryOrderGetInteger(ticket,ORDER_TIME_SETUP);
time_done= (datetime)HistoryOrderGetInteger(ticket,ORDER_TIME_DONE);
symbol= HistoryOrderGetString(ticket,ORDER_SYMBOL);
order_magic= HistoryOrderGetInteger(ticket,ORDER_MAGIC);
positionID = HistoryOrderGetInteger(ticket,ORDER_POSITION_ID);
initial_volume= HistoryOrderGetDouble(ticket,ORDER_VOLUME_INITIAL);
type=GetOrderType(HistoryOrderGetInteger(ticket,ORDER_TYPE));
//--- preparar e apresentar informações sobre a ordem
printf("#ticket %d %s %G %s at %G foi criado em %s => feito em %s, pos ID=%d",
ticket, // ticket de ordem
type, // tipo
initial_volume, // volume colocado
symbol, // simbolo
open_price, // preço de abertura especificado
TimeToString(time_setup),// tempo de colocar ordem
TimeToString(time_done), // tempo de deletar ou executar a ordem
positionID // ID de uma posição, ao qual a quantidade de ordem de neg
);
}
}
//---
}
//+------------------------------------------------------------------+
//| Retorna o nome string do tipo de ordem |
//+------------------------------------------------------------------+
string GetOrderType(long type)
{
string str_type="unknown operation";
switch(type)
{
case (ORDER_TYPE_BUY): return("compra");
case (ORDER_TYPE_SELL): return("vender");
case (ORDER_TYPE_BUY_LIMIT): return("buy limit");
case (ORDER_TYPE_SELL_LIMIT): return("sell limit");
case (ORDER_TYPE_BUY_STOP): return("buy stop");
case (ORDER_TYPE_SELL_STOP): return("sell stop");
case (ORDER_TYPE_BUY_STOP_LIMIT): return("buy stop limit");
case (ORDER_TYPE_SELL_STOP_LIMIT):return("sell stop limit");
}
return(str_type);
}

Também Veja
H istorySelect(), H istoryOrders T otal(), H istoryOrderSelect(), Propriedades de uma Ordem

© 2000-2018, MetaQuotes Software Corp.


1391 Funções de Negociação (Trade)

HistoryOrderGetDouble
Retorna a requisição de propriedade de ordem. A propriedade da ordem deve ser do tipo double.
Existem 2 variantes da função.

1. Imediatamente retorna o valor da propriedade.


double  HistoryOrderGetDouble(
ulong  ticket_number,  // Ticket (bilhete)
ENUM_ORDER_PROPERTY_DOUBLE  property_id  // Identificador de propriedade
);

2. Retorna 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

© 2000-2018, MetaQuotes Software Corp.


1392 Funções de Negociação (Trade)

HistoryOrderGetInteger
Retorna a propriedade solicitada de uma ordem. A propriedade de operação deve ser de tipo datetime,
int. Existem 2 variantes da função.

1. Imediatamente retorna o valor da propriedade.


long  HistoryOrderGetInteger(
ulong  ticket_number,  // Ticket (bilhete)
ENUM_ORDER_PROPERTY_INTEGER  property_id  // Identificador de propriedade
);

2. Retorna 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();

© 2000-2018, MetaQuotes Software Corp.


1393 Funções de Negociação (Trade)

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;
}
//+---------------------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


1394 Funções de Negociação (Trade)

//| 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

© 2000-2018, MetaQuotes Software Corp.


1395 Funções de Negociação (Trade)

HistoryOrderGetString
Retorna a propriedade solicitada de uma ordem. A propriedade da ordem deve ser do tipo string.
Existem 2 variantes da função.

1. Imediatamente retorna o valor da propriedade.


string  HistoryOrderGetString(
ulong  ticket_number,  // Ticket (bilhete)
ENUM_ORDER_PROPERTY_STRING  property_id  // Identificador de propriedade
);

2. Retorna 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

© 2000-2018, MetaQuotes Software Corp.


1396 Funções de Negociação (Trade)

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
Retorna 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.

H istoryDealSelect() limpa a lista de negócios disponíveis para consulta em um programa-MQL5, e


copia um único negócio, se a execução de H istoryDealSelect() foi concluída com êxito. Se você
precisa passar por todos os negócios selecionados pela função H istorySelect(), é melhor você usar
H istoryDealGetT ick et().

Também Veja
H istorySelect(), H istoryDealGetT ick et(), Propriedades de Negócio

© 2000-2018, MetaQuotes Software Corp.


1397 Funções de Negociação (Trade)

HistoryDealsTotal
Retorna o número de ordens no histórico. Retorna 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

© 2000-2018, MetaQuotes Software Corp.


1398 Funções de Negociação (Trade)

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);

© 2000-2018, MetaQuotes Software Corp.


1399 Funções de Negociação (Trade)

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

© 2000-2018, MetaQuotes Software Corp.


1400 Funções de Negociação (Trade)

HistoryDealGetDouble
Retorna a propriedade solicitada de uma operação. A propriedade de negócio deve ser do tipo double.
Existem 2 variantes da função.

1. Imediatamente retorna o valor da propriedade.


double  HistoryDealGetDouble(
ulong  ticket_number,  // Ticket (bilhete)
ENUM_DEAL_PROPERTY_DOUBLE  property_id  // Identificador de propriedade
);

2. Retorna 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

© 2000-2018, MetaQuotes Software Corp.


1401 Funções de Negociação (Trade)

HistoryDealGetInteger
Retorna a propriedade solicitada de uma operação. A propriedade de operação deve ser de tipo
datetime, int. Existem 2 variantes da função.

1. Imediatamente retorna o valor da propriedade.


long  HistoryDealGetInteger(
ulong  ticket_number,  // Ticket (bilhete)
ENUM_DEAL_PROPERTY_INTEGER  property_id  // Identificador de propriedade
);

2. Retorna 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))

© 2000-2018, MetaQuotes Software Corp.


1402 Funções de Negociação (Trade)

{
//--- 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();

© 2000-2018, MetaQuotes Software Corp.


1403 Funções de Negociação (Trade)

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

© 2000-2018, MetaQuotes Software Corp.


1404 Funções de Negociação (Trade)

HistoryDealGetString
Retorna a propriedade solicitada de uma operação. A propriedade de negócio deve ser do tipo string.
Existem 2 variantes da função.

1. Imediatamente retorna o valor da propriedade.


string  HistoryDealGetString(
ulong  ticket_number,  // Ticket (bilhete)
ENUM_DEAL_PROPERTY_STRING  property_id  // Identificador de propriedade
);

2. Retorna 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

© 2000-2018, MetaQuotes Software Corp.


1405 Gerenciamento de sinais

Gerenciamento de sinais
Grupo de funções para gerenciar sinais de negociação. Essas funções permitem:
· receber informações sobre os sinais de negociação disponíveis para cópia,

· ler ou configurar a cópia de sinais de negociação

· assinar um sinal, bem como a sua exclusão usando linguagem MQL5.

função Ação
SignalBaseGetDouble Retorna o valor da propriedade do tipo double
para o sinal selecionado

SignalBaseGetInteger Retorna o valor da propriedade do tipo integer


para o sinal selecionado

SignalBaseGetString Retorna o valor da propriedade do tipo string


para o sinal selecionado

SignalBaseSelect Seleciona o sinal na base de sinais de


negociação disponíveis no terminal

SignalBaseT otal Retorna o número total de sinais disponíveis no


terminal

SignalInfoGetDouble Retorna, a partir das configurações de cópia do


sinal de negociação, o valor do tipo double

SignalInfoGetInteger Retorna, a partir das configurações de cópia do


sinal de negociação, o valor do tipo integer

SignalInfoGetString Retorna, a partir das configurações de cópia do


sinal de negociação, o valor do tipo string

SignalInfoSetDouble Define, nas configurações de cópia do sinal de


negociação, o valor do tipo double

SignalInfoSetInteger Define, nas configurações de cópia do sinal de


negociação, o valor do tipo integer

SignalSubscribe Realiza uma assinatura para copiar o sinal de


negociação

SignalUnsubscribe Cancela a assinatura para copiar o sinal de


negociação

© 2000-2018, MetaQuotes Software Corp.


1406 Gerenciamento de sinais

SignalBaseGetDouble
Retorna 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.

© 2000-2018, MetaQuotes Software Corp.


1407 Gerenciamento de sinais

SignalBaseGetInteger
Retorna 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.

© 2000-2018, MetaQuotes Software Corp.


1408 Gerenciamento de sinais

SignalBaseGetString
Retorna 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.

© 2000-2018, MetaQuotes Software Corp.


1409 Gerenciamento de sinais

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
Retorna 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());
}
}

© 2000-2018, MetaQuotes Software Corp.


1410 Gerenciamento de sinais

SignalBaseTotal
Retorna o número total de sinais disponíveis no terminal.
int  SignalBaseTotal();

valor de retorno
Número total de sinais disponíveis no terminal.

© 2000-2018, MetaQuotes Software Corp.


1411 Gerenciamento de sinais

SignalInfoGetDouble
Retorna, 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.

© 2000-2018, MetaQuotes Software Corp.


1412 Gerenciamento de sinais

SignalInfoGetInteger
Retorna, 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.

© 2000-2018, MetaQuotes Software Corp.


1413 Gerenciamento de sinais

SignalInfoGetString
Retorna, 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.

© 2000-2018, MetaQuotes Software Corp.


1414 Gerenciamento de sinais

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
Retorna 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().

© 2000-2018, MetaQuotes Software Corp.


1415 Gerenciamento de sinais

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
Retorna 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().

© 2000-2018, MetaQuotes Software Corp.


1416 Gerenciamento de sinais

SignalSubscribe
Realiza 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
Retorna 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().

© 2000-2018, MetaQuotes Software Corp.


1417 Gerenciamento de sinais

SignalUnsubscribe
Cancela a assinatura para copiar o sinal de negociação
bool  SignalUnsubscribe();

valor de retorno
Retorna 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().

© 2000-2018, MetaQuotes Software Corp.


1418 Variáveis Globais do Terminal

Variáveis Globais do Terminal de Cliente


H á um grupo que define as funções para trabalhar com variáveis globais.

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.

As variáveis ​g lobais do terminal de cliente são acess íveis simultaneamente de todos os programas
mql5 executados no terminal do cliente.

F unção Ação
GlobalVariableCheck Verifica a existência de uma variável global
com o nome especificado

GlobalVariableT ime Retorna o tempo do último acesso para a


variável global

GlobalVariableDel Exclui uma variável global

GlobalVariableGet Retorna o valor da variável global


GlobalVariableName Retorna o nome de uma variável global, que é o
número ordinal dentro da lista de variáveis
globais

GlobalVariableSet Define o novo valor para uma variável global


GlobalVariables Flus h Salva forçadamente o conteúdo de todas as
varáveis globais num disco

GlobalVariableT emp Define o novo valor para uma variável global,


que existe somente na sessão geral do terminal

GlobalVariableSetOnCondition Define um novo valor de existência de variável


global pela condição estabelecida

GlobalVariables DeleteAll Exclui as variáveis globais com especificação


prefixada em seus nomes

GlobalVariables T otal Retorna o número total de Variáveis Globais

© 2000-2018, MetaQuotes Software Corp.


1419 Variáveis Globais do Terminal

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
Retorna 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()

© 2000-2018, MetaQuotes Software Corp.


1420 Variáveis Globais do Terminal

GlobalVariableTime
Retorna 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 ()

© 2000-2018, MetaQuotes Software Corp.


1421 Variáveis Globais do Terminal

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.

© 2000-2018, MetaQuotes Software Corp.


1422 Variáveis Globais do Terminal

GlobalVariableGet
Retorna o valor de uma variável global existente do terminal do cliente. Existem 2 variantes da
função.

1. Imediatamente retorna o valor da variável global.


double  GlobalVariableGet(
string  name  // Nome da variável global
);

2. Retorna 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.

© 2000-2018, MetaQuotes Software Corp.


1423 Variáveis Globais do Terminal

GlobalVariableName
Retorna 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.

© 2000-2018, MetaQuotes Software Corp.


1424 Variáveis Globais do Terminal

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.

© 2000-2018, MetaQuotes Software Corp.


1425 Variáveis Globais do Terminal

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.

© 2000-2018, MetaQuotes Software Corp.


1426 Variáveis Globais do Terminal

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 Flus h() 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.

© 2000-2018, MetaQuotes Software Corp.


1427 Variáveis Globais do Terminal

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.

© 2000-2018, MetaQuotes Software Corp.


1428 Variáveis Globais do Terminal

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.

© 2000-2018, MetaQuotes Software Corp.


1429 Variáveis Globais do Terminal

GlobalVariablesTotal
Retorna 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.

© 2000-2018, MetaQuotes Software Corp.


1430 Funções de Arquivo

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.

Existem dois diretórios(com subdiretórios) onde os arquivos de trabalho estão localizados :

· 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 ERM INAL_INFO_S TRING:

//--- Pasta que armazena os dados do terminal


string terminal_data_path=TerminalInfoString(TERMINAL_DATA_PATH);
//--- Pasta comum para todos os terminais de clientes
string common_data_path=TerminalInfoString(TERMINAL_COMMONDATA_PATH);

T rabalhar com arquivos de outros diretórios é proibido.

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.

F unção Ação
FileFindFirst Começa a busca de arquivos em um diretório de
acordo com o filtro especificado

FileFindNext Continua a busca iniciada pela função


FileFindFirst()
FileFindClose Fecha o manipulador de busca
FileOpen Abre um arquivo com o nome e bandeira
especificada

FileDelete Deleta um arquivo especificado


FileFlus h Escreve para um disco todos os dados
remanescentes dentro da entrada/saída do
arquivo buffer

FileGetInteger Obtém uma propriedade inteira de um arquivo

FileIsEnding Define o final do arquivo em processo de leitura


FileIsLineEnding Define o final da linha do arquivo de texto em
processo de leitura

© 2000-2018, MetaQuotes Software Corp.


1431 Funções de Arquivo

FileClose Fecha um arquivo aberto previamente


FileIsExist Verifica a e existência de um arquivo
FileCopy Copia o arquivo original a partir de um local ou
de uma pasta compartilhada em outro arquivo

FileMove Move ou renomeia um arquivo

FileReadArray Lê arrays de qualquer tipo, exceto para a


seqüência a partir do arquivo do tipo BIN

FileReadBool Lê a partir de arquivo do tipo CS V uma


seqüência a partir da posição atual até um
delimitador (ou até o fim de uma linha de
texto) e converte a seqüência de leitura para
um valor do tipo bool

FileReadDatetime Lê a partir do arquivo do tipo CS V uma


seqüência de um dos formatos : "YYYY.MM.DD
HH:MM :SS " , "YYYY.MM.DD" or "HH:MM :SS " - e
converte-os dentro de valor de datetime

FileReadDouble Lê um valor double a partir da posição atual do


ponteiro de arquivo

FileReadFloat Lê um valor float a partir da posição atual do


ponteiro de arquivo

FileReadInteger Lê um valor int, s hort ou char a partir da


posição atual do ponteiro de arquivo

FileReadLong Lê um valor do tipo long a partir da posição


atual do ponteiro de arquivo

FileReadNumber Lê a partir de arquivo do tipo CS V uma


seqüência a partir da posição atual até um
delimitador (ou até o fim de uma linha de
texto) e converte a seqüência de leitura em um
valor double

FileReadString Lê uma seqüência a partir da posição atual do


ponteiro a partir de um arquivo

FileReadStruct Lê o conteúdo de um arquivo binário em uma


estrutura passada como um parâmetro, a partir
da posição atual do ponteiro do arquivo

FileSeek Move a posição do ponteiro de arquivo por um


determinado número de bytes em relação à
posição especificada

FileSize Retorna o tamanho da abertura de um arquivo


correspondente

© 2000-2018, MetaQuotes Software Corp.


1432 Funções de Arquivo

FileT ell Retorna a posição atual do ponteiro de um


arquivo da abertura de arquivo correspondente

FileW rite Escreve dados para um arquivo de CS V ou tipo


TXT
FileW riteArray Escreve arrays de qualquer tipo exceto para
seqüência em um arquivo do tipo BIN

FileW riteDouble Escreve valor do tipo double a partir da posição


atual de um ponteiro de arquivo em um arquivo
binário

FileW riteFloat Escreve o valor do tipo float a partir da posição


atual de um ponteiro de arquivo em um arquivo
binário

FileW riteInteger Escreve o valor do tipo int a partir da posição


atual de um ponteiro de arquivo em um arquivo
binário

FileW riteLong Escreve o valor do tipo long a partir da posição


atual de um ponteiro de arquivo em um arquivo
binário

FileW riteString Escreve o valor de um parâmetro da string em


um arquivo BIN ou TXT iniciando a partir da
posição atual do ponteiro de arquivo

FileW riteStruct Escreve o conteúdo de uma estrutura passada


como um parâmetro em um arquivo binário,
começando a partir da posição atual do ponteiro
de arquivo

FileLoad Ele lê todo o conteúdo do arquivo binário


especificado numa variedade transferida de
tipos numéricos ou estruturas simples

FileSave Armazena no arquivo binário todos os


elementos da matriz transferida como
parâmetro

FolderCreate Cria uma pasta dentro do diretório de arquivo

FolderDelete Remove um diretório selecionado. Se a pasta


não estiver vazia, então ele não pode ser
removido

FolderClean Deleta todos os arquivos dentro da pasta


especificada

Se o arquivo é aberto para escrever usando FileOpen(),todas as sub-pastas especificadas no caminho


serão criadas se elas não existirem.

© 2000-2018, MetaQuotes Software Corp.


1433 Funções de Arquivo

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
Retorna 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:

© 2000-2018, MetaQuotes Software Corp.


1434 Funções de Arquivo

//--- 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

© 2000-2018, MetaQuotes Software Corp.


1435 Funções de Arquivo

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));

© 2000-2018, MetaQuotes Software Corp.


1436 Funções de Arquivo

//--- Fechar manipulador de pesquisa


FileFindClose(search_handle);
}
else
Print("Arquivo não encontrado!");
}

Também Veja
FileFindFirst, FileFindClose

© 2000-2018, MetaQuotes Software Corp.


1437 Funções de Arquivo

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);
}

© 2000-2018, MetaQuotes Software Corp.


1438 Funções de Arquivo

else
Print("Arquivo não encontrado!");
}

Também Veja
FileFindFirst, FileFindNext

© 2000-2018, MetaQuotes Software Corp.


1439 Funções de Arquivo

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
Retorna 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.

Se common_flag = FILE_COMMON, então a função procura o arquivo em uma pasta compartilhada


por todos os terminais do cliente \T erminal\Common\Files, caso contrário, a função procura por um
arquivo em uma pasta local (MQL5\Files ou MQL5\T ester\Files no caso de testes).

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

© 2000-2018, MetaQuotes Software Corp.


1440 Funções de Arquivo

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]);
}

© 2000-2018, MetaQuotes Software Corp.


1441 Funções de Arquivo

Também Veja
FileFindFirst

© 2000-2018, MetaQuotes Software Corp.


1442 Funções de Arquivo

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_READ 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 ARE_READ leitura partilhada entre vários programas
FILE_S H ARE_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

© 2000-2018, MetaQuotes Software Corp.


1443 Funções de Arquivo

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.

O arquivo é aberto na pasta do terminal do cliente na subpasta MQL5\files (ou


testing _agent_directory\MQL5\files em caso de testes). Se FILE_COMMON é especificado entre
bandeiras, o arquivo é aberto em uma pasta compartilhada para todos os MetaT rader 5 terminais de
cliente.

"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.
· FileFlus h() 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);

© 2000-2018, MetaQuotes Software Corp.


1444 Funções de Arquivo

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

© 2000-2018, MetaQuotes Software Corp.


1445 Funções de Arquivo

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());
}

© 2000-2018, MetaQuotes Software Corp.


1446 Funções de Arquivo

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] Resultado nome do arquivo.
mode_flags
[in] Bandeiras de acesso. O parâmetro pode conter apenas duas bandeiras : FILE_REWRIT E e/ou
FILE_COMMON - outras bandeiras são ignoradas. Se o arquivo já existe, e a bandeira
FILE_REWRIT 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.

Se o novo arquivo já existe, a cópia será feita dependendo da disponibilidade da bandeira


FILE_REWRIT E dentro do parâmetro mode_flags.

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)  |

© 2000-2018, MetaQuotes Software Corp.


1447 Funções de Arquivo

//+------------------------------------------------------------------+
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));

© 2000-2018, MetaQuotes Software Corp.


1448 Funções de Arquivo

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);
}

© 2000-2018, MetaQuotes Software Corp.


1449 Funções de Arquivo

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

© 2000-2018, MetaQuotes Software Corp.


1450 Funções de Arquivo

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]);
}
}

© 2000-2018, MetaQuotes Software Corp.


1451 Funções de Arquivo

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_REWRIT E e/ou
FILE_COMMON - outras bandeiras são ignoradas. Se o arquivo já existe e a bandeira
FILE_REWRIT 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.

Se o novo arquivo já existe, a cópia será feita dependendo da disponibilidade da bandeira


FILE_REWRIT E dentro do parâmetro mode_flags.

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";
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


1452 Funções de Arquivo

//| Programa Script da função start (iniciar)  |


//+------------------------------------------------------------------+
void OnStart()
{
string local=TerminalInfoString(TERMINAL_DATA_PATH);
string common=TerminalInfoString(TERMINAL_COMMONDATA_PATH);
//--- receber caminhos de arquivo
string src_path;
string dst_path;
StringConcatenate(src_path,InpSrcDirectory,"//",InpSrcName);
StringConcatenate(dst_path,InpDstDirectory,"//",InpDstName);
//--- verifica se o arquivo de origem existe (se não - saída)
if(FileIsExist(src_path))
PrintFormat("%s file arquivo existe no %s\\Files\\%s pasta",InpSrcName,local,InpSrcDirectory)
else
{
PrintFormat("Erro, %s arquivo de origem não encontrado",InpSrcName);
return;
}
//--- verifica se o arquivo do resultado já existe
if(FileIsExist(dst_path,FILE_COMMON))
{
PrintFormat("%s arquivo existe no %s\\Files\\%s pasta",InpDstName,common,InpDstDirectory);
//--- arquivo existe, movendo-se deve ser realizado com a flag FILE_REWRITE
ResetLastError();
if(FileMove(src_path,0,dst_path,FILE_COMMON|FILE_REWRITE))
PrintFormat("%s arquivo movido",InpSrcName);
else
PrintFormat("Erro! Código = %d",GetLastError());
}
else
{
PrintFormat("%s arquivo não existe no %s\\Files\\%s pasta",InpDstName,common,InpDstDirectory)
//--- arquivo não existe, movendo-se deve ser realizado sem a flag FILE_REWRITE
ResetLastError();
if(FileMove(src_path,0,dst_path,FILE_COMMON))
PrintFormat("%s arquivo movido",InpSrcName);
else
PrintFormat("Erro! Código = %d",GetLastError());
}
//--- o arquivo é movido, vamos verificar-lo fora
if(FileIsExist(dst_path,FILE_COMMON) && !FileIsExist(src_path,0))
Print("Sucesso!");
else
Print("Erro!");
}

Também Veja

© 2000-2018, MetaQuotes Software Corp.


1453 Funções de Arquivo

FileIsExist

© 2000-2018, MetaQuotes Software Corp.


1454 Funções de Arquivo

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 FileFlus h(). 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 FileFlus h() 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)

© 2000-2018, MetaQuotes Software Corp.


1455 Funções de Arquivo

{
//--- 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

© 2000-2018, MetaQuotes Software Corp.


1456 Funções de Arquivo

FileGetInteger
Obtém uma propriedade inteira de um arquivo. Existem duas variantes da função.

1. Obtém a propriedade pelo manipulador de um arquivo.


long  FileGetInteger(
int  file_handle, // Manipular arquivo
ENUM_FILE_PROPERTY_INTEGER  property_id // ID Propriedade
);

2. Obtém a propriedade pelo nome do arquivo.


long  FileGetInteger(
const string file_name, // Nome do arquivo
ENUM_FILE_PROPERTY_INTEGER  property_id, // ID Propriedade
bool  common_folder=false // O arquivo é visto em uma pasta local (false
); // ou uma pasta comum de todos os terminais (t

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

© 2000-2018, MetaQuotes Software Corp.


1457 Funções de Arquivo

#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

© 2000-2018, MetaQuotes Software Corp.


1458 Funções de Arquivo

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

© 2000-2018, MetaQuotes Software Corp.


1459 Funções de Arquivo

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());

© 2000-2018, MetaQuotes Software Corp.


1460 Funções de Arquivo

© 2000-2018, MetaQuotes Software Corp.


1461 Funções de Arquivo

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
Retorna 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[];

© 2000-2018, MetaQuotes Software Corp.


1462 Funções de Arquivo

//--- variáveis sobre-vendido


int ovs_ind=0;
int ovs_size=0;
datetime ovs_time[];
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado  |
//+------------------------------------------------------------------+
int OnInit()
{
//--- variáveis de tamanhos de array por padrão
int ovb_def_size=100;
int ovs_def_size=100;
//--- alocar memória para arrays
ArrayResize(ovb_time,ovb_def_size);
ArrayResize(ovs_time,ovs_def_size);
//--- abre o arquivo
ResetLastError();
int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_CSV|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));
double value;
//--- ler dados de um arquivo
while(!FileIsEnding(file_handle))
{
//--- ler o primeiro valor na string
value=FileReadNumber(file_handle);
//--- ler diferentes arrays de acordo com o resultado da função
if(value>=70)
ReadData(file_handle,ovb_time,ovb_size,ovb_def_size);
else
ReadData(file_handle,ovs_time,ovs_size,ovs_def_size);
}
//--- 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);
}
//--- ligando as arrays
SetIndexBuffer(0,open_buff,INDICATOR_DATA);
SetIndexBuffer(1,high_buff,INDICATOR_DATA);
SetIndexBuffer(2,low_buff,INDICATOR_DATA);
SetIndexBuffer(3,close_buff,INDICATOR_DATA);
SetIndexBuffer(4,color_buff,INDICATOR_COLOR_INDEX);

© 2000-2018, MetaQuotes Software Corp.


1463 Funções de Arquivo

//---- 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);

© 2000-2018, MetaQuotes Software Corp.


1464 Funções de Arquivo

//---o loop para as barras que ainda não foram manipuladas


for(int i=prev_calculated;i<rates_total;i++)
{
//--- 0 por padrão
open_buff[i]=0;
high_buff[i]=0;
low_buff[i]=0;
close_buff[i]=0;
color_buff[i]=0;
//--- verificar se qualquer data continua presente
if(ovb_ind<ovb_size)
for(int j=ovb_ind;j<ovb_size;j++)
{
//--- se as datas coincidem, a barra está na zona de sobre-compra
if(time[i]==ovb_time[j])
{
open_buff[i]=open[i];
high_buff[i]=high[i];
low_buff[i]=low[i];
close_buff[i]=close[i];
//--- 0 - cor vermelha
color_buff[i]=0;
//--- aumentar o contador
ovb_ind=j+1;
break;
}
}
//--- verificar se todos os dados continuam a existir
if(ovs_ind<ovs_size)
for(int j=ovs_ind;j<ovs_size;j++)
{
//--- se as datas coincidem, a barra está na zona de sobre-venda
if(time[i]==ovs_time[j])
{
open_buff[i]=open[i];
high_buff[i]=high[i];
low_buff[i]=low[i];
close_buff[i]=close[i];
//--- 1 - cor azul
color_buff[i]=1;
//--- aumentar o contador
ovs_ind=j+1;
break;
}
}
}
//--- valor retorno de prev_calculated para a próxima chamada
return(rates_total);
}

© 2000-2018, MetaQuotes Software Corp.


1465 Funções de Arquivo

//+------------------------------------------------------------------+
//| 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

© 2000-2018, MetaQuotes Software Corp.


1466 Funções de Arquivo

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_ARRAY).

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)  |

© 2000-2018, MetaQuotes Software Corp.


1467 Funções de Arquivo

//+------------------------------------------------------------------+
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

© 2000-2018, MetaQuotes Software Corp.


1468 Funções de Arquivo

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

© 2000-2018, MetaQuotes Software Corp.


1469 Funções de Arquivo

double downbuff[]; // buffers indicador de setas para baix


bool sign_buff[]; // sinal array (verdadeiro - comprar, falso - vender)
datetime time_buff[]; // conjunto de chegada dos sinais time
int size=0; // tamanho de arrays de sinal
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado  |
//+------------------------------------------------------------------+
int OnInit()
{
//--- abre o arquivo
ResetLastError();
int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_CSV);
if(file_handle!=INVALID_HANDLE)
{
PrintFormat("%s arquivo esta aberto para leitura",InpFileName);
//--- em primeiro lugar, ler o número de sinais
size=(int)FileReadNumber(file_handle);
//--- alocar memória para os arrays
ArrayResize(sign_buff,size);
ArrayResize(time_buff,size);
//--- ler dados de um arquivo
for(int i=0;i<size;i++)
{
//--- tempo de sinal
time_buff[i]=FileReadDatetime(file_handle);
//--- valor do sinal
sign_buff[i]=FileReadBool(file_handle);
}
//--- fechar o arquivo
FileClose(file_handle);
}
else
{
PrintFormat("Falha para abrir %s arquivo, Código de erro = %d",InpFileName,GetLastError());
return(INIT_FAILED);
}
//--- ligando as arrays
SetIndexBuffer(0,upbuff,INDICATOR_DATA);
SetIndexBuffer(1,downbuff,INDICATOR_DATA);
//--- definir o código símbolo para desenho em PLOT_ARROW
PlotIndexSetInteger(0,PLOT_ARROW,241);
PlotIndexSetInteger(1,PLOT_ARROW,242);
//---- definir os valores dos indicadores que não serão vistos no gráfico
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


1470 Funções de Arquivo

//| 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(low,false);
ArraySetAsSeries(high,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
upbuff[i]=0;
downbuff[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])
{
//--- desenhar a seta de acordo com o sinal
if(sign_buff[j])
upbuff[i]=high[i];
else
downbuff[i]=low[i];
//--- aumentar o contador
ind=j+1;
break;
}
}
}
}
//--- valor retorno de prev_calculated para a próxima chamada
return(rates_total);
}

Também Veja
T ipo bool, FileW rite

© 2000-2018, MetaQuotes Software Corp.


1471 Funções de Arquivo

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)

© 2000-2018, MetaQuotes Software Corp.


1472 Funções de Arquivo

datetime time_buff[]; // conjunto de chegada dos sinais time


int size=0; // tamanho de arrays de sinal
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado  |
//+------------------------------------------------------------------+
int OnInit()
{
//--- abre o arquivo
ResetLastError();
int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_CSV);
if(file_handle!=INVALID_HANDLE)
{
PrintFormat("%s arquivo esta aberto para leitura",InpFileName);
//--- em primeiro lugar, ler o número de sinais
size=(int)FileReadNumber(file_handle);
//--- alocar memória para os arrays
ArrayResize(sign_buff,size);
ArrayResize(time_buff,size);
//--- ler dados de um arquivo
for(int i=0;i<size;i++)
{
//--- tempo de sinal
time_buff[i]=FileReadDatetime(file_handle);
//--- valor do sinal
sign_buff[i]=FileReadBool(file_handle);
}
//--- fechar o arquivo
FileClose(file_handle);
}
else
{
PrintFormat("Falha para abrir %s arquivo, Código de erro = %d",InpFileName,GetLastError());
return(INIT_FAILED);
}
//--- ligando as arrays
SetIndexBuffer(0,upbuff,INDICATOR_DATA);
SetIndexBuffer(1,downbuff,INDICATOR_DATA);
//--- definir o código símbolo para desenho em PLOT_ARROW
PlotIndexSetInteger(0,PLOT_ARROW,241);
PlotIndexSetInteger(1,PLOT_ARROW,242);
//---- definir os valores dos indicadores que não serão vistos no gráfico
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado  |
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


1473 Funções de Arquivo

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(low,false);
ArraySetAsSeries(high,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
upbuff[i]=0;
downbuff[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])
{
//--- desenhar a seta de acordo com o sinal
if(sign_buff[j])
upbuff[i]=high[i];
else
downbuff[i]=low[i];
//--- aumentar o contador
ind=j+1;
break;
}
}
}
}
//--- valor retorno de prev_calculated para a próxima chamada
return(rates_total);
}

Também Veja
T ipo datetime, String T oT ime, T imeT oString, FileW rite

© 2000-2018, MetaQuotes Software Corp.


1474 Funções de Arquivo

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[];

© 2000-2018, MetaQuotes Software Corp.


1475 Funções de Arquivo

//+------------------------------------------------------------------+
//| 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[],

© 2000-2018, MetaQuotes Software Corp.


1476 Funções de Arquivo

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 continuam a existir
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]=ma_buff[j];
//--- 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 reais (double, float), String T oDouble, DoubleT oString, FileW riteDouble

© 2000-2018, MetaQuotes Software Corp.


1477 Funções de Arquivo

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[];
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


1478 Funções de Arquivo

//| Função de inicialização do indicador customizado  |


//+------------------------------------------------------------------+
int OnInit()
{
int def_size=100;
//--- alocar memória para os arrays
ArrayResize(close_buff,def_size);
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));
//--- ler dados de um arquivo
while(!FileIsEnding(file_handle))
{
//--- ler valores de tempo e preço
time_buff[size]=(datetime)FileReadDouble(file_handle);
close_buff[size]=(double)FileReadFloat(file_handle);
size++;
//--- aumentar o tamanho do array, se eles estão transbordados
if(size==def_size)
{
def_size+=100;
ArrayResize(close_buff,def_size);
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 arrays para os buffers de indicadores
SetIndexBuffer(0,buff,INDICATOR_DATA);
SetIndexBuffer(1,color_buff,INDICATOR_COLOR_INDEX);
//---- 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  |

© 2000-2018, MetaQuotes Software Corp.


1479 Funções de Arquivo

//+------------------------------------------------------------------+
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 Reais (double, float), FileReadDouble, FileW riteFloat

© 2000-2018, MetaQuotes Software Corp.


1480 Funções de Arquivo

FileReadInteger
A função lê os valores int, s hort 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_VALUE = 1, S H ORT_VALUE = 2 e INT_VALUE = 4, então a função pode ler todo o
valor do tipo char, s hort 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 s hort (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

© 2000-2018, MetaQuotes Software Corp.


1481 Funções de Arquivo

#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);

© 2000-2018, MetaQuotes Software Corp.


1482 Funções de Arquivo

}
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;
}
}

© 2000-2018, MetaQuotes Software Corp.


1483 Funções de Arquivo

}
}
//--- 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

© 2000-2018, MetaQuotes Software Corp.


1484 Funções de Arquivo

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()

© 2000-2018, MetaQuotes Software Corp.


1485 Funções de Arquivo

{
//--- 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[])
{

© 2000-2018, MetaQuotes Software Corp.


1486 Funções de Arquivo

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, FileReadInteger, FileW riteLong

© 2000-2018, MetaQuotes Software Corp.


1487 Funções de Arquivo

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[];

© 2000-2018, MetaQuotes Software Corp.


1488 Funções de Arquivo

//--- variáveis sobre-vendido


int ovs_ind=0;
int ovs_size=0;
datetime ovs_time[];
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado  |
//+------------------------------------------------------------------+
int OnInit()
{
//--- variáveis de tamanhos de array por padrão
int ovb_def_size=100;
int ovs_def_size=100;
//--- alocar memória para arrays
ArrayResize(ovb_time,ovb_def_size);
ArrayResize(ovs_time,ovs_def_size);
//--- abre o arquivo
ResetLastError();
int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_CSV|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));
double value;
//--- ler dados de um arquivo
while(!FileIsEnding(file_handle))
{
//--- ler o primeiro valor na string
value=FileReadNumber(file_handle);
//--- ler diferentes arrays de acordo com o resultado da função
if(value>=70)
ReadData(file_handle,ovb_time,ovb_size,ovb_def_size);
else
ReadData(file_handle,ovs_time,ovs_size,ovs_def_size);
}
//--- 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);
}
//--- ligando as arrays
SetIndexBuffer(0,open_buff,INDICATOR_DATA);
SetIndexBuffer(1,high_buff,INDICATOR_DATA);
SetIndexBuffer(2,low_buff,INDICATOR_DATA);
SetIndexBuffer(3,close_buff,INDICATOR_DATA);
SetIndexBuffer(4,color_buff,INDICATOR_COLOR_INDEX);

© 2000-2018, MetaQuotes Software Corp.


1489 Funções de Arquivo

//---- 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);

© 2000-2018, MetaQuotes Software Corp.


1490 Funções de Arquivo

//---o loop para as barras que ainda não foram manipuladas


for(int i=prev_calculated;i<rates_total;i++)
{
//--- 0 por padrão
open_buff[i]=0;
high_buff[i]=0;
low_buff[i]=0;
close_buff[i]=0;
color_buff[i]=0;
//--- verificar se qualquer data continua presente
if(ovb_ind<ovb_size)
for(int j=ovb_ind;j<ovb_size;j++)
{
//--- se as datas coincidem, a barra está na zona de sobre-compra
if(time[i]==ovb_time[j])
{
open_buff[i]=open[i];
high_buff[i]=high[i];
low_buff[i]=low[i];
close_buff[i]=close[i];
//--- 0 - cor vermelha
color_buff[i]=0;
//--- aumentar o contador
ovb_ind=j+1;
break;
}
}
//--- verificar se todos os dados continuam a existir
if(ovs_ind<ovs_size)
for(int j=ovs_ind;j<ovs_size;j++)
{
//--- se as datas coincidem, a barra está na zona de sobre-venda
if(time[i]==ovs_time[j])
{
open_buff[i]=open[i];
high_buff[i]=high[i];
low_buff[i]=low[i];
close_buff[i]=close[i];
//--- 1 - cor azul
color_buff[i]=1;
//--- aumentar o contador
ovs_ind=j+1;
break;
}
}
}
//--- valor retorno de prev_calculated para a próxima chamada
return(rates_total);
}

© 2000-2018, MetaQuotes Software Corp.


1491 Funções de Arquivo

//+------------------------------------------------------------------+
//| 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

© 2000-2018, MetaQuotes Software Corp.


1492 Funções de Arquivo

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;

© 2000-2018, MetaQuotes Software Corp.


1493 Funções de Arquivo

//--- ler dados de um arquivo


while(!FileIsEnding(file_handle))
{
//--- descobrir quantos símbolos são usados ​para escrever o tempo
str_size=FileReadInteger(file_handle,INT_VALUE);
//--- ler a string
str=FileReadString(file_handle,str_size);
//--- imprimir a string
PrintFormat(str);
}
//--- 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());
}

Também Veja
T ipo string, Conversão de Dados, FileW riteInteger

© 2000-2018, MetaQuotes Software Corp.


1494 Funções de Arquivo

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

© 2000-2018, MetaQuotes Software Corp.


1495 Funções de Arquivo

//+------------------------------------------------------------------+
//| 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

© 2000-2018, MetaQuotes Software Corp.


1496 Funções de 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)
{

© 2000-2018, MetaQuotes Software Corp.


1497 Funções de Arquivo

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

© 2000-2018, MetaQuotes Software Corp.


1498 Funções de Arquivo

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
Retorna 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

© 2000-2018, MetaQuotes Software Corp.


1499 Funções de Arquivo

//+------------------------------------------------------------------+
//| 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[])
{

© 2000-2018, MetaQuotes Software Corp.


1500 Funções de Arquivo

//--- 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);
}

© 2000-2018, MetaQuotes Software Corp.


1501 Funções de Arquivo

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)

© 2000-2018, MetaQuotes Software Corp.


1502 Funções de Arquivo

{
//--- 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!");
}

© 2000-2018, MetaQuotes Software Corp.


1503 Funções de Arquivo

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)

© 2000-2018, MetaQuotes Software Corp.


1504 Funções de Arquivo

{
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))

© 2000-2018, MetaQuotes Software Corp.


1505 Funções de Arquivo

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);
}

© 2000-2018, MetaQuotes Software Corp.


1506 Funções de Arquivo

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

© 2000-2018, MetaQuotes Software Corp.


1507 Funções de Arquivo

input int InpSignalPeriod=9; // diferença de período médio


input ENUM_APPLIED_PRICE InpAppliedPrice=PRICE_CLOSE; // tipo de preço
input datetime InpDateStart=D'2012.01.01 00:00'; // data de início da cópia dos dados
//--- parâmetros para a gravação de dados ao arquivo
input string InpFileName="MACD.csv"; // nome do arquivo
input string InpDirectoryName="Data"; // nome do diretório
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar)  |
//+------------------------------------------------------------------+
void OnStart()
{
datetime date_finish; // copiando dados com a data final
bool sign_buff[]; // sinal array (verdadeiro - comprar, falso - vender)
datetime time_buff[]; // array de chegada de tempo de sinais
int sign_size=0; // tamanho de array
double macd_buff[]; // array do valor do indicador
datetime date_buff[]; // array da data do indicador
int macd_size=0; // tamanho de arrays de indicadores
//--- tempo final é o tempo corrente
date_finish=TimeCurrent();
//--- receber a manipulação do indicador MACD
ResetLastError();
int macd_handle=iMACD(InpSymbolName,InpSymbolPeriod,InpFastEMAPeriod,InpSlowEMAPeriod,InpSignalP
if(macd_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(macd_handle)==-1)
Sleep(10); // pausa para permitir que o indicador calcule os respectivos valores
//--- copiar os valores do indicador para um determinado período de tempo
ResetLastError();
if(CopyBuffer(macd_handle,0,InpDateStart,date_finish,macd_buff)==-1)
{
PrintFormat("Falha para copiar valores do indicador. Código de erro = %d",GetLastError());
return;
}
//--- copiar o tempo apropriado para os valores do indicador
ResetLastError();
if(CopyTime(InpSymbolName,InpSymbolPeriod,InpDateStart,date_finish,date_buff)==-1)
{
PrintFormat("Falha para copiar valores de tempo. Código de erro = %d",GetLastError());
return;
}
//--- libera a memória ocupada pelo indicador
IndicatorRelease(macd_handle);
//--- receber o tamanho do buffer

© 2000-2018, MetaQuotes Software Corp.


1508 Funções de Arquivo

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

© 2000-2018, MetaQuotes Software Corp.


1509 Funções de Arquivo

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_ARRAY 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  |
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


1510 Funções de Arquivo

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;
}
}

© 2000-2018, MetaQuotes Software Corp.


1511 Funções de Arquivo

//+------------------------------------------------------------------+
//| 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

© 2000-2018, MetaQuotes Software Corp.


1512 Funções de Arquivo

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()
{

© 2000-2018, MetaQuotes Software Corp.


1513 Funções de Arquivo

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]);

© 2000-2018, MetaQuotes Software Corp.


1514 Funções de Arquivo

}
//--- 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)

© 2000-2018, MetaQuotes Software Corp.


1515 Funções de Arquivo

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;

© 2000-2018, MetaQuotes Software Corp.


1516 Funções de Arquivo

//--- 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 valores de preço de fechamento. Código de erro = %d",GetLastErro
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á aberto para escrita",InpFileName);
PrintFormat("Caminho do arquivo: %s\\Files\\",TerminalInfoString(TERMINAL_DATA_PATH));
//--- escrever fechamento do tempo dos preços e os valores para o arquivo
for(int i=0;i<size;i++)
{
FileWriteDouble(file_handle,(double)time_buff[i]);
FileWriteFloat(file_handle,(float)close_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 riteDouble

© 2000-2018, MetaQuotes Software Corp.


1517 Funções de Arquivo

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_VALUE=1, S H ORT_VALUE=2 e INT_VALUE=4, então a função pode escrever o
valor inteiro do tipo char, uchar, s hort, us hort, 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()

© 2000-2018, MetaQuotes Software Corp.


1518 Funções de Arquivo

{
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

© 2000-2018, MetaQuotes Software Corp.


1519 Funções de Arquivo

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

© 2000-2018, MetaQuotes Software Corp.


1520 Funções de Arquivo

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;

© 2000-2018, MetaQuotes Software Corp.


1521 Funções de Arquivo

//--- redefine o valor de erro


ResetLastError();
//--- copiar volumes de tick para cada bar
if(CopyTickVolume(InpSymbolName,InpSymbolPeriod,InpDateStart,date_finish,volume_buff)==-1)
{
PrintFormat("Falha ao copiar valores do volume de tick. Código de erro = %d",GetLastError());
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(volume_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_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));
//--- primeiro, escreva o tamanho da amostra de dados
FileWriteLong(file_handle,(long)size);
//--- escrever valores de tempo e de volume para o arquivo
for(int i=0;i<size;i++)
{
FileWriteLong(file_handle,(long)time_buff[i]);
FileWriteLong(file_handle,volume_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 inteiros, FileW riteInteger

© 2000-2018, MetaQuotes Software Corp.


1522 Funções de Arquivo

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

© 2000-2018, MetaQuotes Software Corp.


1523 Funções de Arquivo

//--- 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 InpMAPeriod=14; // período de média móvel
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="RSI.csv"; // nome do arquivo
input string InpDirectoryName="Data"; // nome do diretório
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar)  |
//+------------------------------------------------------------------+
void OnStart()
{
datetime date_finish; // copiando dados com a data final
double rsi_buff[]; // array do valor do indicador
datetime date_buff[]; // array da data do indicador
int rsi_size=0; // tamanho de arrays de indicadores
//--- tempo final é o atual
date_finish=TimeCurrent();
//--- receber a manipulação do indicador RSI
ResetLastError();
int rsi_handle=iRSI(InpSymbolName,InpSymbolPeriod,InpMAPeriod,InpAppliedPrice);
if(rsi_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;
}
//--- fica no loop, até que o indicador calcula todos os seus valores
while(BarsCalculated(rsi_handle)==-1)
Sleep(10); // pausa para permitir que o indicador calcule os respectivos valores
//--- copiar os valores do indicador para um determinado período de tempo
ResetLastError();
if(CopyBuffer(rsi_handle,0,InpDateStart,date_finish,rsi_buff)==-1)
{
PrintFormat("Falha para copiar valores do indicador. Código de erro = %d",GetLastError());
return;
}
//--- copiar o tempo apropriado para os valores do indicador
ResetLastError();
if(CopyTime(InpSymbolName,InpSymbolPeriod,InpDateStart,date_finish,date_buff)==-1)
{
PrintFormat("Falha para copiar valores de tempo. Código de erro = %d",GetLastError());
return;
}
//--- libera a memória ocupada pelo indicador
IndicatorRelease(rsi_handle);
//--- receber o tamanho do buffer

© 2000-2018, MetaQuotes Software Corp.


1524 Funções de Arquivo

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

© 2000-2018, MetaQuotes Software Corp.


1525 Funções de Arquivo

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] Referê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

© 2000-2018, MetaQuotes Software Corp.


1526 Funções de Arquivo

{
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)
{

© 2000-2018, MetaQuotes Software Corp.


1527 Funções de Arquivo

PrintFormat("Falha ao copiar os valores dos preços de fechamento. Código de erro = %d",GetLas


return;
}
//--- definir o tamanho de arrays
size=ArraySize(time_buff);
//--- salvar todos os dados na estrutura array
ArrayResize(cand_buff,size);
for(int i=0;i<size;i++)
{
cand_buff[i].open=open_buff[i];
cand_buff[i].close=close_buff[i];
cand_buff[i].high=high_buff[i];
cand_buff[i].low=low_buff[i];
cand_buff[i].date=time_buff[i];
}

//--- 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

© 2000-2018, MetaQuotes Software Corp.


1528 Funções de Arquivo

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

© 2000-2018, MetaQuotes Software Corp.


1529 Funções de Arquivo

//+------------------------------------------------------------------+
//| 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

© 2000-2018, MetaQuotes Software Corp.


1530 Funções de Arquivo

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)

© 2000-2018, MetaQuotes Software Corp.


1531 Funções de Arquivo

{
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

© 2000-2018, MetaQuotes Software Corp.


1532 Funções de Arquivo

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
Retorna 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"

//--- mostramos a janela de parâmetros de entrada ao executar o script


#property script_show_inputs
//--- o parâmetro de entrada define a pasta em que está sendo executado o script
input bool common_folder=false; // pasta compartilhada de todos os terminais
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- pasta que criamos em MQL5\Files
string root_folder="Folder_A";
if(CreateFolder(root_folder,common_folder))

© 2000-2018, MetaQuotes Software Corp.


1533 Funções de Arquivo

{
//--- 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);

//--- terceira pasta filha


string folder_C13="Child_Folder_C13";
child_path=root_folder+"\\"+folder_C13;
CreateFolder(child_path,common_folder);
}
}
//---
}
//+------------------------------------------------------------------+
//| Tenta criar a pasta e exibe uma mensagem sobre isto |
//+------------------------------------------------------------------+
bool CreateFolder(string folder_path,bool common_flag)
{
int flag=common_flag?FILE_COMMON:0;
string working_folder;
//--- definimos o caminho completo dependendo do parâmetro common_flag
if(common_flag)
working_folder=TerminalInfoString(TERMINAL_COMMONDATA_PATH)+"\\MQL5\\Files";
else
working_folder=TerminalInfoString(TERMINAL_DATA_PATH)+"\\MQL5\\Files";
//--- mensagem de depuração
PrintFormat("folder_path=%s",folder_path);
//--- tentativa de criar a pasta no caminho relativo MQL5\Files
if(FolderCreate(folder_path,flag))
{
//--- exibimos o caminho completo para a pasta criada
PrintFormat("Criamos a pasta %s",working_folder+"\\"+folder_path);
//--- redefinimos o código de erro
ResetLastError();
//--- execução bem-sucedida
return true;
}
else
PrintFormat("Falha ao cria a pasta %s. Código de erro %d",working_folder+folder_path,GetLastE

© 2000-2018, MetaQuotes Software Corp.


1534 Funções de Arquivo

//--- execução mal-sucedida


return false;
}

Veja Também
FileOpen(), FolderClean(), FileCopy()

© 2000-2018, MetaQuotes Software Corp.


1535 Funções de Arquivo

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
Retorna 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

//--- Mostrar a caixa de diálogo de parâmetros de entrada quando se inicia o script


#property script_show_inputs
//--- Parâmetros de entrada

© 2000-2018, MetaQuotes Software Corp.


1536 Funções de Arquivo

input string firstFolder="empty"; // Uma pasta vazia


input string secondFolder="nonempty";// A pasta, em que um arquivo será criado
string filename="delete_me.txt"; // O nome do arquivo que será criado na pasta secondFolder
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar)  |
//+------------------------------------------------------------------+
void OnStart()
{
//--- Escreva o manipulador de arquivo aqui
int handle;
//--- Descubra em qual pasta estamos trabalhando
string working_folder=TerminalInfoString(TERMINAL_DATA_PATH)+"\\MQL5\\Files";
//--- Uma mensagem de depuração
PrintFormat("working_folder=%s",working_folder);
//--- Tentando criar uma pasta vazia em relação ao caminho MQL5\Files
if(FolderCreate(firstFolder,0)) // 0 (zero) significa que estamos trabalhando na pasta local do
{
//--- Insira o caminho completo para a pasta criada
PrintFormat("Pasta %s foi criada",working_folder+"\\"+firstFolder);
//--- Redefine o código de erro
ResetLastError();
}
else
PrintFormat("Falha ao criar a pasta %s. Código de erro %d",working_folder+"\\"+firstFolder, G

//--- Agora, crie uma pasta não-vazia utilizando a função FileOpen()


string filepath=secondFolder+"\\"+filename; // Formar caminho do arquivo que desejamos abrir pa
handle=FileOpen(filepath,FILE_WRITE|FILE_TXT); // Flag FILE_WRITE neste caso é obrigatória, cons
if(handle!=INVALID_HANDLE)
PrintFormat("Arquivo %s foi aberto para leitura",working_folder+"\\"+filepath);
else
PrintFormat("Falha para criar arquivo %s na pasta %s. Código de erro=",filename,secondFolder,

Comment(StringFormat("Preparar para deletar pastas %s e %s", firstFolder, secondFolder));


//--- Uma pequena pausa de 5 segundos para ler uma mensagem no gráfico
Sleep(5000); // Sleep() não pode ser utilizado em indicadores!

//--- Mostrar uma caixa de diálogo e pedir ao usuário


int choice=MessageBox(StringFormat("Você quer apagar pastas %s e %s?", firstFolder, secondFolder
"Deletando pastas",
MB_YESNO|MB_ICONQUESTION); // Dois botões - "Yes" e "No"

//--- Executar uma ação dependendo da variante selecionada


if(choice==IDYES)
{
//--- Excluir no gráfico o formulário de comentário
Comment("");
//--- Adicione uma mensagem dentro do jornal "Experts"
PrintFormat("Tentando deletar pastas %s e %s",firstFolder, secondFolder);
ResetLastError();

© 2000-2018, MetaQuotes Software Corp.


1537 Funções de Arquivo

//--- Deletar uma pasta vazia


if(FolderDelete(firstFolder))
//--- A seguinte mensagem deve aparecer uma vez que a pasta está vazia
PrintFormat("Pasta %s foi deletada com sucesso",firstFolder);
else
PrintFormat("Falha para deletar pasta %s. Código de erro=%d", firstFolder, GetLastError())

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()

© 2000-2018, MetaQuotes Software Corp.


1538 Funções de Arquivo

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
Retorna 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

//--- Mostrar caixa de diálogo de parâmetros de entrada quando se inicia o script


#property script_show_inputs
//--- Parâmetros de entrada
input string foldername="demo_folder"; // Criar uma pasta em MQL5/Files/

© 2000-2018, MetaQuotes Software Corp.


1539 Funções de Arquivo

input int files=5; // O número de arquivos para criar e excluir


//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar)  |
//+------------------------------------------------------------------+
void OnStart()
{
string name="testfile";
//---Primeiro abrir ou criar arquivos na pasta de dados do terminal
for(int N=0;N<files;N++)
{
//--- O nome do arquivo no formato demo_pasta\testfileN.txt'
string filemane=StringFormat("%s\\%s%d.txt",foldername,name,N);
//--- Abrir um arquivo com a bandeira para a escrita, neste caso, o 'demo_pasta' será criado
int handle=FileOpen(filemane,FILE_WRITE);
//--- Descubra se a função FileOpen() foi bem sucedida
if(handle==INVALID_HANDLE)
{
PrintFormat("Falha para criar arquivo %s. Código de erro",filemane,GetLastError());
ResetLastError();
}
else
{
PrintFormat("Arquivo %s foi aberto com sucesso",filemane);
//--- O arquivo aberto não é mais necessário, então fechá-lo
FileClose(handle);
}
}

//--- Verifique o número de arquivos na pasta


int k=FilesInFolder(foldername+"\\*.*",0);
PrintFormat("Totalmente a pasta %s contém %d arquivos",foldername,k);

//--- Mostrar uma janela para perguntar ao usuário


int choice=MessageBox(StringFormat("Você vai apagar %d arquivos da pasta %s. Você quer continuar
"Excluindo arquivos da pasta",
MB_YESNO|MB_ICONQUESTION); // Dois botões - "Sim" e "Não"
ResetLastError();

//--- Executar uma ação dependendo da variante selecionada


if(choice==IDYES)
{
//--- Começar deletar arquivos
PrintFormat("Tentando deletar todos os arquivos da pasta %s",foldername);
if(FolderClean(foldername,0))
PrintFormat("Arquivos foram deletados com sucesso, %d arquivos que restaram na pasta %s",
foldername,
FilesInFolder(foldername+"\\*.*",0));
else
PrintFormat("Falha ao deletar arquivos da pasta %s. Código de erro %d",foldername,GetLastE
}

© 2000-2018, MetaQuotes Software Corp.


1540 Funções de Arquivo

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

© 2000-2018, MetaQuotes Software Corp.


1541 Indicadores Customizados

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.

F unção Ação
SetIndex Buffer Vincula-se o buffer de indicador especificado
com dinâmica unidimensional array do tipo
double

IndicatorSetDouble Define o valor da propriedade de um indicador


do tipo double

IndicatorSetInteger Define o valor da propriedade de um indicador


do tipo int

IndicatorSetString Define o valor da propriedade de um indicador


do tipo string

PlotIndexSetDouble Define o valor da propriedade de linha de um


indicador do tipo double

PlotIndexSetInteger Define o valor da propriedade de linha de um


indicador do tipo int

PlotIndexSetString Define o valor da propriedade de linha de um


indicador do tipo string

PlotIndex GetInteger Retorna o valor da propriedade de linha de um


indicador do tipo inteiro

Propriedades de indicador podem ser definidas utilizando as diretivas de compilador ou o uso de


funções. Para entender melhor isso, é recomendável que você estude estilos de indicador como
exemplos.

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.

Parâmetro prev_calculated é o resultado da execução de OnCalculate() na chamada anterior, que


permite organizar um algoritmo salvo para calcular os valores do indicador. Por exemplo, se o valor
corrente de rates _total = 1000, prev _calculated = 999, então talvez seja bastante para fazer os
cálculos apenas para um valor de cada buffer 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).

© 2000-2018, MetaQuotes Software Corp.


1542 Indicadores Customizados

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:

© 2000-2018, MetaQuotes Software Corp.


1543 Indicadores Customizados

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():

© 2000-2018, MetaQuotes Software Corp.


1544 Indicadores Customizados

//--- define a primeira barra a partir do qual o índice será desenhado


PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,37);

Usando a função PlotIndexSetInteger(0, PLOT_DR AW_BEGIN, empty_first_values), nós definimos o


número não-existente dos primeiros valores no array zero de um indicador personalizado, o qual não
precisamos aceitar para o cálculo (empty_first_values). Assim, temos mecanismos para:

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.

© 2000-2018, MetaQuotes Software Corp.


1545 Indicadores Customizados

Estilos de Indicador em Exemplos


O MetaT rader 5 T erminal Cliente inclui 38 indicadores técnicos que podem ser usados em MQL5
programas usando funções apropriadas. Mas a principal vantagem da língua MQL5 é a capacidade de
criar indicadores personalizados, os quais podem então serem utilizados em Expert Advisors ou
simplesmente serem aplicados sobre gráficos de preços para fins de análise técnica.

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:

#property indicator_buffers 3 // Número de buffers


#property indicator_plots 2 // Número de plotes

O número de buffers no indicador é sempre maior ou igual ao número de plotagem no indicador.

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:

Plotagem Descrição Buffers de valor Buffers de cor


DRAW_NONE Não é apresentado 1 -
visualmente no
gráfico, mas os
valores do buffer
correspondente podem
ser vistos na Janela de
Dados
DRAW_LINE Uma linha é plotada 1 -
sobre os valores do
buffer correspondente
(valores vazios no
buffer são
indesejáveis)

DRAW_SECTION É desenhado como 1 -


segmentos de linha
entre os valores do

© 2000-2018, MetaQuotes Software Corp.


1546 Indicadores Customizados

buffer correspondente
(geralmente tem
muitos valores vazios)

DRAW_HIS T OGRAM É desenhado como um 1 -


histograma a partir da
linha zero para os
valores do buffer
correspondente (pode
ter valores vazios)

DRAW_HIS T OGRAM 2 É desenhado como um 2 -


histograma sobre dois
buffers de indicador
(pode ter valores
vazios)

DRAW_ARROW É desenhado como 1 -


s ímbolos(pode ter
valores vazios)

DRAW_ZIGZAG Similar ao estilo 2 -


DRAW_SECTION, mas
diferentemente, pode
plotar segmentos
verticais em uma
barra

DRAW_FILLING Preenchimento de cor 2 -


entre duas linhas. 2
valores dos buffers
correspondentes são
mostrados na Janela
de Dados

DRAW_BARS É desenhado como 4 -


barras. 2 valores dos
buffers
correspondentes são
mostrados na Janela
de Dados

DRAW_CANDLES Desenhado como 4 -


Castiçais Japoneses
(candlestick s). 2
valores dos buffers
correspondentes são
mostrados na Janela
de Dados

DRAW_COLOR_LINE Uma linha para o qual 1 1


você pode alternar as
cores em diferentes
barras ou mudar suas

© 2000-2018, MetaQuotes Software Corp.


1547 Indicadores Customizados

cores, a qualquer
momento

DRAW_COLOR_SECTIO Similar ao estilo 1 1


N DRAW_SECTION, mas
a cor de cada seção
pode ser ajustada
individualmente; cor
também pode ser
ajustada
dinamicamente

DRAW_COLOR_HIS T O Similar ao estilo 1 1


GRAM DRAW_HIS T OGRAM,
mas cada faixa pode
ter uma cor diferente,
você pode definir a cor
dinamicamente

DRAW_COLOR_HIS T O Similar ao estilo 2 1


GRAM 2 DRAW_HIS T OGRAM 2,
mas cada faixa pode
ter uma cor diferente,
você pode definir a cor
dinamicamente

DRAW_COLOR_ARRO Similar ao estilo 1 1


W DRAW_ARROW , mas
cada s ímbolo pode ter
sua cor. Cor pode ser
mudada
dinamicamente

DRAW_COLOR_ZIGZAG O estilo DR AW_ZIGZAG 2 1


com opções de cores
individuais das seções
e mudança dinâmica
das cores

DRAW_COLOR_BARS O estilo DR AW_BAR S 4 1


com opções de cores
individuais das barras
e mudança dinâmica
das cores

DRAW_COLOR_CANDL O estilo 4 1
ES DRAW_CANDLES com
opções de cores
individuais dos
castiçais (candlestick s)
e mudança dinâmica
das cores

© 2000-2018, MetaQuotes Software Corp.


1548 Indicadores Customizados

A diferença entre um buffer de indicador e um array


Cada indicador, no seu nível global, você deve declarar uma ou mais arrays do tipo double, o qual
então deve ser usado como um buffer de indicador usando a função SetIndex Buffer(). Para desenhar
plotagem de indicador, apenas os valores dos buffers do indicador são utilizados, quaisquer outros
arrays não podem ser usados para esta finalidade. Além disso, os valores de buffer são exibidos na
Janela de Dados.

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).

Se os cálculos dos valores de indicador requerem segurança de cálculos intermediários e


armazenamento de valores adicionais para cada barra, então esse array pode ser declarado como um
buffer de cálculo durante a ligação (INDICAT OR_CALCULATIONS). Para valores intermediários, você
também pode usar um array regular, mas neste caso, o programador tem que gerenciar o tamanho do
array.

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().

O número de buffers de indicadores devem ser especificados usando a diretiva de compilador


#property indicator_buffers number_of_buffers :

#property indicator_buffers 3 // o indicador tem 3 buffers

O número máximo permitido de buffers em um indicador é 512.

Relevância de Buffers de Indicadores e Plotagem


Cada plotagem é baseada em um ou mais buffers do indicador. Assim, para a exibição de castiçais
(candlestick s) simples, quatro valores são obrigatórios - Open (abertura), H ig h (alta), Low (baixa) e
Close (fechamento) de preços. Conseqüentemente, para exibir um indicador na forma de castiçais
(candlestick s), é necessário declarar 4 buffers de indicadores e 4 arrays do tipo double para eles. Por
exemplo:

//--- O indicador tem quatro buffers de indicadores


#property indicator_buffers 4
//--- O indicador tem uma plotagem
#property indicator_plots 1
//--- Graficamente plotando número 1 aparecerá como castiçais (candlesticks)
#property indicator_type1 DRAW_CANDLES
//--- Castiçais (candlesticks) serão desenhados em clrDodgerBlue

© 2000-2018, MetaQuotes Software Corp.


1549 Indicadores Customizados

#property indicator_color1 clrDodgerBlue


//--- 4 arrays para buffers de indicadores
double OBuffer[];
double HBuffer[];
double LBuffer[];
double CBuffer[];

Graficamente, plotagens automáticas usam buffers de indicadores de acordo com o número de


plotagem. A numeração da plotagem começa com um, a numeração dos buffers começa com zero. Se a
primeira plotagem requer 4 buffers do indicador, então os primeiros quatro buffers do indicador serão
utilizados para desenhá-lo. Estes quatro buffers devem estar lincados com os arrays apropriados com a
indexação correta usando a função SetIndex Buffer().

//--- Arrays vinculados com buffers de indicador


SetIndexBuffer(0,OBuffer,INDICATOR_DATA); // O primeiro buffer corresponde ao índice zero
SetIndexBuffer(1,HBuffer,INDICATOR_DATA); // O segundo buffer corresponde ao índice 1
SetIndexBuffer(2,LBuffer,INDICATOR_DATA); // O terceiro buffer corresponde ao índice 2
SetIndexBuffer(3,CBuffer,INDICATOR_DATA); // O quarto buffer corresponde ao índice 3

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.

//--- O indicador tem 5 buffers de indicador


#property indicator_buffers 5
//--- O indicador tem 2 plotagens
#property indicator_plots 2
//--- Plotagem 1 é uma linha
#property indicator_type1 DRAW_LINE
//--- A cor d linha é clrDodgerRed
#property indicator_color1 clrDodgerRed
//--- Plotagem 2 é desenhado como castiçal (candlestick) japonês
#property indicator_type2 DRAW_CANDLES
//--- A cor do castiçal (candlestick) é clrDodgerBlue
#property indicator_color2 clrDodgerBlue
//--- 5 arrays para buffers de indicador
double LineBuffer[];
double OBuffer[];
double HBuffer[];
double LBuffer[];
double CBuffer[];

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).

SetIndexBuffer(0,LineBuffer,INDICATOR_DATA); // O primeiro buffer corresponde ao índice 0

© 2000-2018, MetaQuotes Software Corp.


1550 Indicadores Customizados

//--- Ligando arrays com buffers de indicador para os castiçais (candlesticks)


SetIndexBuffer(1,OBuffer,INDICATOR_DATA); // O segundo buffer corresponde ao índice 1
SetIndexBuffer(2,HBuffer,INDICATOR_DATA); // O terceiro buffer corresponde ao índice 2
SetIndexBuffer(3,LBuffer,INDICATOR_DATA); // O quarto buffer corresponde ao índice 3
SetIndexBuffer(4,CBuffer,INDICATOR_DATA); // O quinto buffer corresponde ao índice 4

O número de buffers e plotagens serão definidos usando somente diretivas de compilador, é


imposs ível alterar essas propriedades dinamicamente usando funções.

Versõ es Coloridas de Estilos


Como são vistos na tabela, os estilos são divididos em dois grupos. O primeiro grupo inclui estilos
cujo nome não existe a palavra COLOR, nós chamamos de estilos básicos :

· DRAW_LINE
· DRAW_SECTION
· DRAW_HIS T OGRAM
· DRAW_HIS T OGRAM 2
· DRAW_ARROW
· DRAW_ZIGZAG
· DRAW_FILLING
· DRAW_BARS
· DRAW_CANDLES
No segundo grupo, os nomes de estilo contêm a palavra COLOR, vamos chamá-los de versões de
cores :

· DRAW_COLOR_LINE
· DRAW_COLOR_SECTION
· DRAW_COLOR_HIS T OGRAM
· DRAW_COLOR_HIS T OGRAM 2
· DRAW_COLOR_ARROW
· DRAW_COLOR_ZIGZAG
· DRAW_COLOR_BARS
· DRAW_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

© 2000-2018, MetaQuotes Software Corp.


1551 Indicadores Customizados

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.

//--- definir a cor clrRed para candlestick


col_buffer[buffer_index]=0;

O conjunto de cores não é colocado de uma vez por todas, pode ser alterado de forma dinâmica
usando PlotIndexSetInteger(). Exemplo:

//--- 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
color_array[i]); // Uma nova cor

Propriedades do indicador e plotagem


Para plotagem de indicadores, propriedades podem ser definidas por meio de diretivas de compilador
e usando as funções apropriadas. Ler maiores informações sobre isto em Conexão entre Propriedades
do Indicador e Funções. Mudança dinâmica de propriedades do indicador usando funções especiais
permitem a criação de indicadores personalizados mais flex íveis.

Início do Desenho do Indicador no Gráfico


Em muitos casos, de acordo com as condições do algoritmo, é imposs ível iniciar o cálculo dos valores
do indicador imediatamente com a barra atual, uma vez que é necessário proporcionar um número
mínimo de barras anteriores disponíveis no histórico. Por exemplo, muitos tipos de alisamento
implicam na utilização de um array de preços sobre N barras anteriores, e com base nestes valores, o
valor do indicador na barra atual é calculado.

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:

//--- Ligando arrays com buffers de indicador para os castiçais (candlesticks)

© 2000-2018, MetaQuotes Software Corp.


1552 Indicadores Customizados

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.

© 2000-2018, MetaQuotes Software Corp.


1553 Indicadores Customizados

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);
}

O número de buffers requeridos para plotagem de DR AW_NONE é 1.

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 |
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


1554 Indicadores Customizados

#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 Invisível
#property indicator_label1 "Barra Índice"
#property indicator_type1 DRAW_NONE
#property indicator_style1 STYLE_SOLID
#property indicator_color1 clrRed
#property indicator_width1 1
//--- buffers do indicador
double InvisibleBuffer[];
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado  |
//+------------------------------------------------------------------+
int OnInit()
{
//--- Ligando um array e um buffer de 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);
}
//+------------------------------------------------------------------+
//| 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 datetime lastbar=0;
//--- Se este for o primeiro cálculo do indicador
if(prev_calculated==0)
{
//--- Renumerar as barras pela primeira vez
CalcValues(rates_total,close);
//--- Lembrar que a abertura do tempo da barra atual é no fechamento da última barra
lastbar=(datetime)SeriesInfoInteger(_Symbol,_Period,SERIES_LASTBAR_DATE);
}

© 2000-2018, MetaQuotes Software Corp.


1555 Indicadores Customizados

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;
}

© 2000-2018, MetaQuotes Software Corp.


1556 Indicadores Customizados

DRAW_LINE
DRAW_LINE 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.

O número de buffers requerido para plotagem de DR AW_L INE é 1.

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 DRAW_LINE, 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 description "Um indicador para demonstrar DRAW_LINE"


#property description "Ele desenha uma linha de uma cor especifica no fechamento dos preços"
#property description "Cor, a largura e o estilo de linhas é alterado aleatoriamente"
#property description "depois de cada N ticks"

© 2000-2018, MetaQuotes Software Corp.


1557 Indicadores Customizados

#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)
{

© 2000-2018, MetaQuotes Software Corp.


1558 Indicadores Customizados

//--- Alterar as propriedades da linha


ChangeLineAppearance();
//--- Redefinir o contador de ticks para zero
ticks=0;
}

//--- Bloco para cálculo dos valores do indicador


for(int i=0;i<rates_total;i++)
{
LineBuffer[i]=close[i];
}

//--- Retorna o valor de prev_calculated para a próxima chamada da função


return(rates_total);
}
//+------------------------------------------------------------------+
//| Altera a aparência da linha desenhada 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 cor da linha
//--- Obtém aleatoriamente um número
int number=MathRand();
//--- 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+(string)colors[color_index];

//--- Um bloco para alterar a largura da linha


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);

//--- Um bloco para mudar o estilo da linha


number=MathRand();
//--- O divisor é igual ao tamanho do array de estilos
size=ArraySize(styles);
//--- Obter o índice para selecionar um novo estilo como o resto da divisão inteira
int style_index=number%size;

© 2000-2018, MetaQuotes Software Corp.


1559 Indicadores Customizados

//--- Definir a cor com a propriedade PLOT_LINE_COLOR


PlotIndexSetInteger(0,PLOT_LINE_STYLE,styles[style_index]);
//--- Escrever o estilo de linha
comm=EnumToString(styles[style_index])+", "+comm;
//--- Mostrar a informação no gráfico usando um comentário
Comment(comm);
}

© 2000-2018, MetaQuotes Software Corp.


1560 Indicadores Customizados

DRAW_SECTION
DRAW_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_EM PTY_VALUE: 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:

//--- O valor 0 (vazio) não vai participar no desenho


PlotIndexSetDouble(index_of_plot_DRAW_SECTION,PLOT_EMPTY_VALUE,0);

Sempre preencha explicitamente nos valores dos buffers do indicador, defina um valor vazio num
buffer para os elementos que não devem ser plotados.

O número de buffers requeridos para plotagem de DR AW_SECTION é 1.

Um exemplo do indicador que desenha seções entre os preços de Alta (hig h) 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 DRAW_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 |

© 2000-2018, MetaQuotes Software Corp.


1561 Indicadores Customizados

//| 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 "Um indicador para demonstrar DRAW_SECTION"


#property description "Desenha seções em linha reta para cada barra"
#property description "A cor, a largura eo estilo de seções são alteradas aleatoriamente"
#property description "depois de cada N ticks"

#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;
//---+

© 2000-2018, MetaQuotes Software Corp.


1562 Indicadores Customizados

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

© 2000-2018, MetaQuotes Software Corp.


1563 Indicadores Customizados

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];

//--- Um bloco para alterar a largura da linha


number=MathRand();
//--- Obter a largura do restante da divisão inteira
int width=number%5; // A largura é definida de 0 a 4
//--- Definir a largura
PlotIndexSetInteger(0,PLOT_LINE_WIDTH,width);
//--- Escrever a largura da linha
comm=comm+"\r\nWidth="+IntegerToString(width);

//--- Um bloco para mudar o estilo da linha


number=MathRand();
//--- O divisor é igual ao tamanho do array de estilos
size=ArraySize(styles);
//--- Obter o índice para selecionar um novo estilo como o resto da divisão inteira
int style_index=number%size;
//--- define o estilo da linha
PlotIndexSetInteger(0,PLOT_LINE_STYLE,styles[style_index]);
//--- Escrever o estilo de linha
comm="\r\n"+EnumToString(styles[style_index])+""+comm;
//--- Mostrar a informação no gráfico usando um comentário
Comment(comm);
}

© 2000-2018, MetaQuotes Software Corp.


1564 Indicadores Customizados

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.

O número de buffers requerido para plotagem de DR AW_HIS T OGR AM é 1.

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 DRAW_HIS T OGRAM, 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."

© 2000-2018, MetaQuotes Software Corp.


1565 Indicadores Customizados

#property link "https://www.mql5.com"


#property version "1.00"

#property description "Um indicador para demonstrar DRAW_HISTOGRAM"


#property description "Ele desenha um senóide como um histograma em uma janela separada"
#property description "A cor e a largura das colunas são alterados aleatoriamente"
#property description "depois de cada N ticks"
#property description "O parâmetro das barras define o número de barras no ciclo da senóide"

#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  |

© 2000-2018, MetaQuotes Software Corp.


1566 Indicadores Customizados

//+------------------------------------------------------------------+
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;
}

//--- Calcule os valores do indicador


int start=0;
//--- Se já foi calculado durante os inícios anteriores do OnCalculate
if(prev_calculated>0) start=prev_calculated-1; // definir o início do cálculo com a penúltima ba
//--- Preencher o buffer do indicador com valores
for(int i=start;i<rates_total;i++)
{
HistogramBuffer[i]=sin(i*multiplier);
}
//--- Retorna o valor de prev_calculated para a próxima chamada da função
return(rates_total);
}
//+------------------------------------------------------------------+
//| Altera a aparência das linhas 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 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;

© 2000-2018, MetaQuotes Software Corp.


1567 Indicadores Customizados

//--- 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];

//--- Um bloco para alterar a largura da linha


number=MathRand();
//--- Obter a largura do restante da divisão inteira
int width=number%5; // A largura é definida de 0 a 4
//--- Definir a largura
PlotIndexSetInteger(0,PLOT_LINE_WIDTH,width);
//--- Escrever a largura da linha
comm=comm+"\r\nWidth="+IntegerToString(width);

//--- Um bloco para mudar o estilo da linha


number=MathRand();
//--- O divisor é igual ao tamanho do array de estilos
size=ArraySize(styles);
//--- Obter o índice para selecionar um novo estilo como o resto da divisão inteira
int style_index=number%size;
//--- define o estilo da linha
PlotIndexSetInteger(0,PLOT_LINE_STYLE,styles[style_index]);
//--- Escrever o estilo de linha
comm="\r\n"+EnumToString(styles[style_index])+""+comm;
//--- Mostrar a informação no gráfico usando um comentário
Comment(comm);
}

© 2000-2018, MetaQuotes Software Corp.


1568 Indicadores Customizados

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.

O número de buffers requerido para plotagem de DR AW_HIS T OGR AM 2 é 2.

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_EM PTY_VALUE=0:

//--- Definir um valor vazio


PlotIndexSetDouble(index_of_plot_DRAW_SECTION,PLOT_EMPTY_VALUE,0);

Note que inicialmente para plot1 com DRAW_HIS T OGRAM 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 |

© 2000-2018, MetaQuotes Software Corp.


1569 Indicadores Customizados

//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"

#property description "Un indicador para demonstrar DRAW_HISTOGRAM2"


#property description "É desenhado um segmento entre a abertura e fechamento em cada barra"
#property description "A cor, a largura e o estilo são alterados aleatoriamente"
#property description "depois de cada N ticks"

#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,

© 2000-2018, MetaQuotes Software Corp.


1570 Indicadores Customizados

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;
}

//--- Calcule os valores do indicador


int start=0;
//--- Para obter o dia da semana pela abertura de preço de cada barra
MqlDateTime dt;
//--- Se já foi calculado durante os inícios anteriores do OnCalculate
if(prev_calculated>0) start=prev_calculated-1; // definir o início do cálculo com a penúltima ba
//--- Preencher o buffer do indicador com valores
for(int i=start;i<rates_total;i++)
{
TimeToStruct(time[i],dt);
if(dt.day_of_week==invisible_day)
{
Histogram_2Buffer1[i]=0;
Histogram_2Buffer2[i]=0;
}
else
{
Histogram_2Buffer1[i]=open[i];
Histogram_2Buffer2[i]=close[i];
}
}
//--- Retorna o valor de prev_calculated para a próxima chamada da função
return(rates_total);
}
//+------------------------------------------------------------------+
//| Altera a aparência das linhas no indicador  |
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


1571 Indicadores Customizados

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];

//--- Um bloco para alterar a largura da linha


number=MathRand();
//--- Obter a largura do restante da divisão inteira
int width=number%5; // A largura é definida de 0 a 4
//--- Define a largura da linha
PlotIndexSetInteger(0,PLOT_LINE_WIDTH,width);
//--- Escrever a largura da linha
comm=comm+"\r\nWidth="+IntegerToString(width);

//--- Um bloco para mudar o estilo da linha


number=MathRand();
//--- O divisor é igual ao tamanho do array de estilos
size=ArraySize(styles);
//--- Obter o índice para selecionar um novo estilo como o resto da divisão inteira
int style_index=number%size;
//--- define o estilo da linha
PlotIndexSetInteger(0,PLOT_LINE_STYLE,styles[style_index]);
//--- Escrever o estilo de linha
comm="\r\n"+EnumToString(styles[style_index])+""+comm;
//--- Adiciona informação sobre o dia que é omitido nos cálculos
comm="\r\nDia não plotado - "+EnumToString((ENUM_DAY_OF_WEEK)invisible_day)+comm;
//--- Mostrar a informação no gráfico usando um comentário
Comment(comm);
}

© 2000-2018, MetaQuotes Software Corp.


1572 Indicadores Customizados

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.

O código de s ímbolo é definido usando a propriedade PLOT_ARR OW .

//--- Definir o código símbolo a partir das fontes Wingdings para desenhar em PLOT_ARROW
PlotIndexSetInteger(0,PLOT_ARROW,code);

O valor padrão do PLOT_ARR OW=159 (um círculo).

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 :

//--- Definir o deslocamento vertical das setas em pixels


PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,shift);

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.

//--- Definir um valor vazio


PlotIndexSetDouble(index_of_plot_DRAW_ARROW,PLOT_EMPTY_VALUE,0);

O número de buffers necessários para plotagem DR AW_ARR OW é 1.

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.

© 2000-2018, MetaQuotes Software Corp.


1573 Indicadores Customizados

No exemplo, para plot1 com o estilo DRAW_ARROW , 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 description "Um indicador para demonstrar DRAW_ARROW"


#property description "Desenha setas definidas pelos caracteres Unicode, sobre um gráfico"
#property description "A cor, o tamanho, deslocamento e código símbolo da seta, são alterados de fo
#property description "depois de cada N ticks"
#property description "O parâmetro de código define o valor da base: código = 159 (um círculo)"

#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

© 2000-2018, MetaQuotes Software Corp.


1574 Indicadores Customizados

input int N=5; // Número de ticks para mudar


input ushort code=159; // Código símbolo para desenhar em DRAW_ARROW
//--- Um buffer do indicador para plotar
double ArrowsBuffer[];
//--- Um array para armazenar as cores
color colors[]={clrRed,clrBlue,clrGreen};
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado  |
//+------------------------------------------------------------------+
int OnInit()
{
//--- mapeamento de buffers do indicador
SetIndexBuffer(0,ArrowsBuffer,INDICATOR_DATA);
//--- Definir o código símbolo para desenho em PLOT_ARROW
PlotIndexSetInteger(0,PLOT_ARROW,code);
//--- Definir o deslocamento vertical das setas em pixels
PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,5);
//--- Definir como um valor vazio 0
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[])
{
static int ticks=0;
//--- Calcular ticks para mudar a cor, tamanho, deslocamento e código da seta
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;
}

//--- Bloco para cálculo dos valores do indicador

© 2000-2018, MetaQuotes Software Corp.


1575 Indicadores Customizados

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];

//--- Um bloco para mudar o tamanho das setas


number=MathRand();
//--- Obter a largura do restante da divisão inteira
int width=number%5; // O tamanho é definido a partir de 0 até 4
//--- Definir a cor com a propriedade PLOT_LINE_WIDTH
PlotIndexSetInteger(0,PLOT_LINE_WIDTH,width);
//--- Escrever a cor da linha
comm=comm+"\r\nWidth="+IntegerToString(width);

//--- Um bloco para mudar o código das setas (PLOT_ARROW)


number=MathRand();
//--- Obter o restante da divisão de número inteiro para calcular um novo código da seta(a partir d
int code_add=number%20;
//--- Definir o novo símbolo de código como o resultado de code+code_add
PlotIndexSetInteger(0,PLOT_ARROW,code+code_add);
//--- Escreva o código de símbolo PLOT_ARROW

© 2000-2018, MetaQuotes Software Corp.


1576 Indicadores Customizados

comm="\r\n"+"PLOT_ARROW="+IntegerToString(code+code_add)+comm;

//--- Um bloco de mudança do deslocamento vertical das setas em pixels


number=MathRand();
//--- Obter o deslocamento como o restante da divisão inteira
int shift=20-number%41;
//--- Definir o deslocamento novo de -20 a 20
PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,shift);
//--- Escrever o deslocamento PLOT_ARROW_SHIFT
comm="\r\n"+"PLOT_ARROW_SHIFT="+IntegerToString(shift)+comm;

//--- Mostrar a informação no gráfico usando um comentário


Comment(comm);
}

© 2000-2018, MetaQuotes Software Corp.


1577 Indicadores Customizados

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_EM PTY_VALUE:

//--- O valor 0 (vazio) não vai participar no desenho


PlotIndexSetDouble(index_of_plot_DRAW_ZIGZAG,PLOT_EMPTY_VALUE,0);

Sempre preencher explicitamente os valores dos buffers do indicador, definir um valor vazio num
buffer para ignorar barras.

O número de buffers requeridos para plotagem DR AW_ZIGZAG é 2.

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 DRAW_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.

© 2000-2018, MetaQuotes Software Corp.


1578 Indicadores Customizados

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_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 description "Um indicador para demonstrar DRAW_ZIGZAG"


#property description "Ele desenha uma \"serra\" como segmentos de reta, ignorando as barras de um
#property description "O dia a ignorar é selecionado aleatoriamente durante a inicialização do indi
#property description "A cor, a largura e tamanho dos segmentos são alterados aleatoriamente"
#property description " a cada N ticks"

#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

© 2000-2018, MetaQuotes Software Corp.


1579 Indicadores Customizados

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;

//--- A posição inicial dos cálculos


int start=0;
//--- Se o indicador foi calculado com o tick anterior, então inicia o cálculo com o passado, mas d
if(prev_calculated!=0) start=prev_calculated-1;
//--- Calculando loop
for(int i=start;i<rates_total;i++)
{
//--- Escreva o tempo de abertura da barra na estrutura
TimeToStruct(time[i],dt);
//--- Se o dia da semana desta barra é igual para invisible_day
if(dt.day_of_week==invisible_day)
{
//--- Escrever valores vazios de buffers para este barra
ZigZagBuffer1[i]=0;

© 2000-2018, MetaQuotes Software Corp.


1580 Indicadores Customizados

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];

//--- Um bloco para alterar a largura da linha


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

© 2000-2018, MetaQuotes Software Corp.


1581 Indicadores Customizados

comm=comm+"\r\nWidth="+IntegerToString(width);

//--- Um bloco para mudar o estilo da linha


number=MathRand();
//--- O divisor é igual ao tamanho do array de estilos
size=ArraySize(styles);
//--- Obter o índice para selecionar um novo estilo como o resto da divisão inteira
int style_index=number%size;
//--- Definir a cor com a propriedade PLOT_LINE_COLOR
PlotIndexSetInteger(0,PLOT_LINE_STYLE,styles[style_index]);
//--- Escrever o estilo de linha
comm="\r\n"+EnumToString(styles[style_index])+""+comm;
//--- Adiciona informação sobre o dia que é omitido nos cálculos
comm="\r\nDia não plotado - "+EnumToString((ENUM_DAY_OF_WEEK)invisible_day)+comm;
//--- Mostrar a informação no gráfico usando um comentário
Comment(comm);
}

© 2000-2018, MetaQuotes Software Corp.


1582 Indicadores Customizados

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.

Você pode definir duas cores de preenchimento:


· 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_EM PTY_VALUE:

#define INDICATOR_EMPTY_VALUE -1.0


...
//--- INDICATOR_EMPTY_VALUE (valor vazio) não vai participar no cálculo de
PlotIndexSetDouble (DRAW_FILLING_creation_index,PLOT_EMPTY_VALUE,INDICATOR_EMPTY_VALUE);

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.

© 2000-2018, MetaQuotes Software Corp.


1583 Indicadores Customizados

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.

O número de buffers necessários para plotagem DR AW_FILL ING é 2.

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 DRAW_FILLING 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."

© 2000-2018, MetaQuotes Software Corp.


1584 Indicadores Customizados

#property link "https://www.mql5.com"


#property version "1.00"

#property description "Um indicador para demonstrar DRAW_FILLING"


#property description "Ele desenha um canal entre duas MAs em uma janela separada"
#property description "O preenchimento da cor é alterada aleatoriamente"
#property description "depois de cada N ticks"

#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,

© 2000-2018, MetaQuotes Software Corp.


1585 Indicadores Customizados

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;
}

//--- 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

© 2000-2018, MetaQuotes Software Corp.


1586 Indicadores Customizados

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_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);
}

© 2000-2018, MetaQuotes Software Corp.


1587 Indicadores Customizados

DRAW_BARS
O estilo DR AW_BAR S desenha barras nos valores de quatro buffers do indicador, que contêm a
Abertura (open), Alta (hig h), 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_EM PTY_VALUE:

//--- O valor 0 (vazio) não vai participar no desenho


PlotIndexSetDouble(index_of_plot_DRAW_BARS,PLOT_EMPTY_VALUE,0);

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 ig h (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).

© 2000-2018, MetaQuotes Software Corp.


1588 Indicadores Customizados

Por favor, note que para plot1 com o estilo DRAW_BARS, 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 description "Um indicador para demonstrar DRAW_BARS"


#property description "Ele desenha barras de uma seleção de símbolos numa janela separada"
#property description "A cor e a largura das barras, bem como o símbolo são alterados aleatoriament
#property description "cada N ticks"

#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

© 2000-2018, MetaQuotes Software Corp.


1589 Indicadores Customizados

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++;
}

© 2000-2018, MetaQuotes Software Corp.


1590 Indicadores Customizados

//--- 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)
{
//--- 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_BARS("+name+")");
}
//--- Inicializar buffers com valores vazios
ArrayInitialize(BarsBuffer1,0.0);
ArrayInitialize(BarsBuffer2,0.0);
ArrayInitialize(BarsBuffer3,0.0);

© 2000-2018, MetaQuotes Software Corp.


1591 Indicadores Customizados

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];

//--- Um bloco para alterar a largura das barras


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

© 2000-2018, MetaQuotes Software Corp.


1592 Indicadores Customizados

PlotIndexSetInteger(0,PLOT_LINE_WIDTH,width);
//--- Escrever a largura da linha
comm=comm+"\r\nWidth="+IntegerToString(width);

//--- Escreve o nome do símbolo


comm="\r\n"+symbol+comm;

//--- Mostrar a informação no gráfico usando um comentário


Comment(comm);
}

© 2000-2018, MetaQuotes Software Corp.


1593 Indicadores Customizados

DRAW_CANDLES
O estilo DR AW_CANDLES desenha candlestick s sobre os valores dos quatro buffers do indicador, que
contêm Open (abertura), H ig h (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_EM PTY_VALUE:

//--- O valor 0 (vazio) não vai participar no desenho


PlotIndexSetDouble(index_of_plot_DRAW_CANDLES,PLOT_EMPTY_VALUE,0);

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 ig h (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 DRAW_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.

//--- velas semelhantes pintadas numa cor


#property indicator_label1 "One color candles"
#property indicator_type1 DRAW_CANDLES
//--- como é indicada apenas uma cor, todas as velas terão uma cor
#property indicator_color1 clrGreen

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.

//--- a cor das velas é diferente da cor das sombras


#property indicator_label1 "Two color candles"
#property indicator_type1 DRAW_CANDLES
//--- sombras e contornos das velas de cor verde e corpo branco
#property indicator_color1 clrGreen,clrWhite

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.

//--- a cor das velas é diferente da cor das sombras


#property indicator_label1 "One color candles"
#property indicator_type1 DRAW_CANDLES
//--- sombras e contorno de cor verde, corpo da vela de alta de cor branca, corpo da vela de baixa

© 2000-2018, MetaQuotes Software Corp.


1594 Indicadores Customizados

#property indicator_color1 clrGreen,clrWhite,clrRed

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_DRAW_CANDLES, PLOT_LINE_COLOR,
número_de_modificador, cor), aqui o número_de_modificador pode ter os seguintes valores :

· 0 – cor do contorno e sombras


· 1– cor do corpo da vela de alta
· 2 – cor do corpo da vela de baixa
//--- definimos a cor do contorno e sombras
PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,clrBlue);
//--- definimos a cor do corpo para velas de alta
PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,clrGreen);
//--- definimos a cor do corpo para velas de baixa
PlotIndexSetInteger(0,PLOT_LINE_COLOR,2,clrRed);

Um exemplo de indicador que desenha candlestick s para um instrumento financeiro selecionado em


uma janela separada. A cor dos candlestick s 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, 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 |
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


1595 Indicadores Customizados

#property copyright "Copyright 2011, MetaQuotes Software Corp."


#property link "https://www.mql5.com"
#property version "1.00"

#property description "Um indicador para demonstrar DRAW_CANDLES."


#property description "ele desenha candlesticks de um símbolo selecionado numa janela separada"
#property description " "
#property description "A cor e a largura dos candlesticks, bem como o símbolo são alterados"
#property description "aleatoriamente a cada N ticks"

#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

//--- 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 Candle1Buffer1[];
double Candle1Buffer2[];
double Candle1Buffer3[];
double Candle1Buffer4[];
//--- 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,Candle1Buffer1,INDICATOR_DATA);
SetIndexBuffer(1,Candle1Buffer2,INDICATOR_DATA);
SetIndexBuffer(2,Candle1Buffer3,INDICATOR_DATA);
SetIndexBuffer(3,Candle1Buffer4,INDICATOR_DATA);

© 2000-2018, MetaQuotes Software Corp.


1596 Indicadores Customizados

//--- Um valor vazio


PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//--- 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_CANDLES("+symbol+")");
//---
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=INT_MAX-100;
//--- 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 a forma
ChangeLineAppearance();
//--- Selecione um novo símbolo a partir da janela de observação do Mercado
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,
Candle1Buffer1,Candle1Buffer2,Candle1Buffer3,Candle1Buffer4)
&& 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);

© 2000-2018, MetaQuotes Software Corp.


1597 Indicadores Customizados

}
//+------------------------------------------------------------------+
//| 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);

© 2000-2018, MetaQuotes Software Corp.


1598 Indicadores Customizados

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);
}

© 2000-2018, MetaQuotes Software Corp.


1599 Indicadores Customizados

© 2000-2018, MetaQuotes Software Corp.


1600 Indicadores Customizados

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.

O número de buffers requerido para plotagem de DR AW_COLOR_L INE é 2.

· um buffer para armazenar os valores do indicador utilizado para desenhar uma linha;

· um buffer para armazenar o índice de cores da linha em cada barra.

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().

//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


1601 Indicadores Customizados

//| Altera a cor dos segmentos de linha  |


//+------------------------------------------------------------------+
void ChangeColors(color &cols[],int plot_colors)
{
//--- O número de cores
int size=ArraySize(cols);
//---
string comm=ChartGetString(0,CHART_COMMENT)+"\r\n\r\n";

//--- 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 DRAW_COLOR_LINE 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"

© 2000-2018, MetaQuotes Software Corp.


1602 Indicadores Customizados

#property description "Um indicador para demonstrar RAW_COLOR_LINE"


#property description "Ele desenha uma linha no Fechamento do preço em partes coloridas de cada 20
#property description "A largura, estilo e cor de partes da linha são alteradas aleatoriamente "
#property description "cada N ticks"

#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[];

//--- O array para armazenar cores contendo 7 elementos


color colors[]={clrRed,clrBlue,clrGreen,clrChocolate,clrMagenta,clrDodgerBlue,clrGoldenrod};
//--- 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,ColorLineBuffer,INDICATOR_DATA);
SetIndexBuffer(1,ColorLineColors,INDICATOR_COLOR_INDEX);
//--- 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[],

© 2000-2018, MetaQuotes Software Corp.


1603 Indicadores Customizados

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 as cores de seções de linhas
ChangeColors(colors,5);
//--- Redefinir o contador de ticks para zero
ticks=0;
}

//--- Bloco para cálculo dos valores do indicador


for(int i=0;i<rates_total;i++)
{
//--- Escrever o valor do indicador para o buffer
ColorLineBuffer[i]=close[i];
//--- Agora, aleatoriamente definir um índice de cores para esta barra
int color_index=i%(5*Length);
color_index=color_index/Length;
//--- Para esta barra, a linha terá a cor com o índice color_index
ColorLineColors[i]=color_index;
}

//--- Retorna o valor de prev_calculated para a próxima chamada da função


return(rates_total);
}
//+------------------------------------------------------------------+
//| Altera a cor dos segmentos de linha  |
//+------------------------------------------------------------------+
void ChangeColors(color &cols[],int plot_colors)
{
//--- O número de cores
int size=ArraySize(cols);
//---
string comm=ChartGetString(0,CHART_COMMENT)+"\r\n\r\n";

//--- Para cada índice de cor definir uma nova cor aleatoriamente
for(int plot_color_ind=0;plot_color_ind<plot_colors;plot_color_ind++)
{

© 2000-2018, MetaQuotes Software Corp.


1604 Indicadores Customizados

//--- 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);
}
//---
}
//+------------------------------------------------------------------+
//| 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);

//--- Um bloco para mudar o estilo da linha


number=MathRand();
//--- O divisor é igual ao tamanho do array de estilos
int size=ArraySize(styles);
//--- Obter o índice para selecionar um novo estilo como o resto da divisão inteira
int style_index=number%size;
//--- Definir a cor com a propriedade PLOT_LINE_COLOR
PlotIndexSetInteger(0,PLOT_LINE_STYLE,styles[style_index]);
//--- Escrever o estilo de linha
comm=EnumToString(styles[style_index])+", "+comm;
//--- Mostrar a informação no gráfico usando um comentário
Comment(comm);
}

© 2000-2018, MetaQuotes Software Corp.


1605 Indicadores Customizados

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_EM PTY_VALUE: 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:

//--- O valor 0 (vazio) não vai participar no desenho


PlotIndexSetDouble(index_of_plot_DRAW_COLOR_SECTION,PLOT_EMPTY_VALUE,0);

Sempre preencha explicitamente nos valores dos buffers do indicador, defina um valor vazio num
buffer para os elementos que não devem ser plotados.

O número de buffers requirido para plotagem de DR AW_COLOR_SECTION é 2.

· 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.

© 2000-2018, MetaQuotes Software Corp.


1606 Indicadores Customizados

Note que para inicializar plot1 com DRAW_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 [].

O parâmetro N é defindo nos parâmetros externos do indicador para a possibilidade de configuração


manual (na guia Parâmetros na janela Propriedades do indicador).

//+------------------------------------------------------------------+
//| 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 description "Um indicador para demonstrar DRAW_COLOR_SECTION"


#property description "Ele desenha secções coloridas com o comprimento igual ao número de barras es
#property description "A cor, a largura eo estilo de seções são alteradas aleatoriamente"
#property description "depois de cada N ticks"

#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

© 2000-2018, MetaQuotes Software Corp.


1607 Indicadores Customizados

#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[],

© 2000-2018, MetaQuotes Software Corp.


1608 Indicadores Customizados

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 utilizadas para plotar as seções
ChangeColors(colors,color_sections);
//--- 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++)
{
//--- 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);
}
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


1609 Indicadores Customizados

//| Altera a cor dos segmentos de linha  |


//+------------------------------------------------------------------+
void ChangeColors(color &cols[],int plot_colors)
{
//--- O número de cores
int size=ArraySize(cols);
//---
string comm=ChartGetString(0,CHART_COMMENT)+"\r\n\r\n";

//--- 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);

//--- Um bloco para mudar o estilo da linha


number=MathRand();
//--- O divisor é igual ao tamanho do array de estilos
int size=ArraySize(styles);
//--- Obter o índice para selecionar um novo estilo como o resto da divisão inteira
int style_index=number%size;

© 2000-2018, MetaQuotes Software Corp.


1610 Indicadores Customizados

//--- Definir a cor com a propriedade PLOT_LINE_COLOR


PlotIndexSetInteger(0,PLOT_LINE_STYLE,styles[style_index]);
//--- Escrever o estilo de linha
comm=EnumToString(styles[style_index])+", "+comm;
//--- Mostrar a informação no gráfico usando um comentário
Comment(comm);
}

© 2000-2018, MetaQuotes Software Corp.


1611 Indicadores Customizados

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,
DRAW_COLOR_HIS T OGRAM 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.

O número de buffers necessários para plotagem DR AW_COLOR_HIS T OGR AM é 2.

· 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.

© 2000-2018, MetaQuotes Software Corp.


1612 Indicadores Customizados

Por favor note que para plot1 com o estilo DRAW_COLOR_HIS T OGRAM, 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 description "Um indicador para demonstrar DRAW_COLOR_HISTOGRAM"


#property description "Ele desenha um senóide como um histograma em uma janela separada"
#property description "A cor e a largura das colunas são alterados aleatoriamente"
#property description "depois de cada N ticks"
#property description "O parâmetro de barras define o número de barras para repetir a senóide"

#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};

© 2000-2018, MetaQuotes Software Corp.


1613 Indicadores Customizados

//+------------------------------------------------------------------+
//| 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;
}

© 2000-2018, MetaQuotes Software Corp.


1614 Indicadores Customizados

//--- Calcule os valores do indicador


int start=0;
//--- Se já foi calculado durante os inícios anteriores do OnCalculate
if(prev_calculated>0) start=prev_calculated-1; // definir o início do cálculo com a penúltima ba
//--- Preencher o buffer do indicador com valores
for(int i=start;i<rates_total;i++)
{
//--- Um valor
Color_HistogramBuffer[i]=sin(i*multiplier);
//--- Cor
int color_index=i%(bars*color_sections);
color_index/=bars;
Color_HistogramColors[i]=color_index;
}
//--- Retorna o valor de prev_calculated para a próxima chamada da função
return(rates_total);
}
//+------------------------------------------------------------------+
//| Altera a cor dos segmentos de linha  |
//+------------------------------------------------------------------+
void ChangeColors(color &cols[],int plot_colors)
{
//--- O número de cores
int size=ArraySize(cols);
//---
string comm=ChartGetString(0,CHART_COMMENT)+"\r\n\r\n";

//--- 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()

© 2000-2018, MetaQuotes Software Corp.


1615 Indicadores Customizados

{
//--- 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);

//--- Um bloco para mudar o estilo da linha


number=MathRand();
//--- O divisor é igual ao tamanho do array de estilos
int size=ArraySize(styles);
//--- Obter o índice para selecionar um novo estilo como o resto da divisão inteira
int style_index=number%size;
//--- Definir a cor com a propriedade PLOT_LINE_COLOR
PlotIndexSetInteger(0,PLOT_LINE_STYLE,styles[style_index]);
//--- Escrever o estilo de linha
comm=EnumToString(styles[style_index])+", "+comm;
//--- Mostrar a informação no gráfico usando um comentário
Comment(comm);
}

© 2000-2018, MetaQuotes Software Corp.


1616 Indicadores Customizados

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
DRAW_HIS T OGRAM 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.

O número de buffers necessários para plotagem do DR AW_COLOR_HIS T OGR AM 2 é 3:

· 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 DRAW_COLOR_HIS T OGRAM 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 [].

O parâmetro N é defindo nos parâmetros externos do indicador para a possibilidade de configuração


manual (na guia Parâmetros na janela Propriedades do indicador).

© 2000-2018, MetaQuotes Software Corp.


1617 Indicadores Customizados

//+------------------------------------------------------------------+
//| 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 description "Um indicador para demonstrar DRAW_COLOR_HISTOGRAM2"


#property description "É desenhado um segmento entre a abertura e fechamento em cada barra"
#property description "A cor, a largura e o estilo são alterados aleatoriamente"
#property description "depois de cada N ticks"

#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

//--- parâmetros de entrada


input int N=5; // O número de ticks para alterar o histograma
int color_sections;
//--- Valores de buffers
double ColorHistogram_2Buffer1[];
double ColorHistogram_2Buffer2[];
//--- Um buffer de índices de cor
double ColorHistogram_2Colors[];
//--- 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,ColorHistogram_2Buffer1,INDICATOR_DATA);
SetIndexBuffer(1,ColorHistogram_2Buffer2,INDICATOR_DATA);

© 2000-2018, MetaQuotes Software Corp.


1618 Indicadores Customizados

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;
}

//--- Calcule os valores do indicador


int start=0;
//--- Para obter o dia da semana pela abertura de preço de cada barra
MqlDateTime dt;
//--- Se já foi calculado durante os inícios anteriores do OnCalculate
if(prev_calculated>0) start=prev_calculated-1; // definir o início do cálculo com a penúltima ba
//--- Preencher o buffer do indicador com valores
for(int i=start;i<rates_total;i++)
{
TimeToStruct(time[i],dt);
//--- valor
ColorHistogram_2Buffer1[i]=high[i];
ColorHistogram_2Buffer2[i]=low[i];

© 2000-2018, MetaQuotes Software Corp.


1619 Indicadores Customizados

//--- Define o índice de cores de acordo com o dia da semana


int day=dt.day_of_week;
ColorHistogram_2Colors[i]=day;
}
//--- Retorna o valor de prev_calculated para a próxima chamada da função
return(rates_total);
}
//+------------------------------------------------------------------+
//| Altera a cor dos segmentos de linha  |
//+------------------------------------------------------------------+
void ChangeColors(color &cols[],int plot_colors)
{
//--- O número de cores
int size=ArraySize(cols);
//---
string comm=ChartGetString(0,CHART_COMMENT)+"\r\n\r\n";

//--- 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

© 2000-2018, MetaQuotes Software Corp.


1620 Indicadores Customizados

comm=comm+" Width="+IntegerToString(width);

//--- Um bloco para mudar o estilo da linha


number=MathRand();
//--- O divisor é igual ao tamanho do array de estilos
int size=ArraySize(styles);
//--- Obter o índice para selecionar um novo estilo como o resto da divisão inteira
int style_index=number%size;
//--- Definir a cor com a propriedade PLOT_LINE_COLOR
PlotIndexSetInteger(0,PLOT_LINE_STYLE,styles[style_index]);
//--- Escrever o estilo de linha
comm=EnumToString(styles[style_index])+", "+comm;
//--- Mostrar a informação no gráfico usando um comentário
Comment(comm);
}

© 2000-2018, MetaQuotes Software Corp.


1621 Indicadores Customizados

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.

O código de s ímbolo é definido usando a propriedade PLOT_ARR OW .

//--- Definir o código símbolo a partir das fontes Wingdings para desenhar em PLOT_ARROW
PlotIndexSetInteger(0,PLOT_ARROW,code);

O valor padrão do PLOT_ARR OW=159 (um círculo).

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 :

//--- Definir o deslocamento vertical das setas em pixels


PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,shift);

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.

//--- Definir um valor vazio


PlotIndexSetDouble(plot_index_DRAW_COLOR_ARROW,PLOT_EMPTY_VALUE,0);

O número de buffers necessários para plotagem de DR AW_COLOR_ARR OW é 2.

· 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.

© 2000-2018, MetaQuotes Software Corp.


1622 Indicadores Customizados

Neste exemplo, para plot1 com o estilo DRAW_COLOR_ARROW , 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 description "Um indicador para demonstrar DRAW_COLOR_ARROW"


#property description "Desenha setas de diferentes cores definidas pelo caracteres Unicode, em um g
#property description "A cor, o tamanho, deslocamento e código de símbolo da seta são alterados"
#property description " aleatoriamente a cada N ticks"
#property description "O parâmetro de código define o valor da base: código = 159 (um círculo)"

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots 1
//--- plotar ColorArrow
#property indicator_label1 "ColorArrow"

© 2000-2018, MetaQuotes Software Corp.


1623 Indicadores Customizados

#property indicator_type1 DRAW_COLOR_ARROW


//--- Define 8 cores para colorir o histograma com base nos dias de semana (eles são armazenados no
#property indicator_color1 clrRed,clrBlue,clrSeaGreen,clrGold,clrDarkOrange,clrMagenta,clrYellowGr
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1

//--- parâmetros de entrada


input int N=5; // Número de ticks para mudar
input ushort code=159; // Código símbolo para desenhar em DRAW_ARROW
int color_sections;
//--- Um buffer do indicador para plotar
double ColorArrowBuffer[];
//--- Um buffer para armazenar índices de cor
double ColorArrowColors[];
//--- 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
};
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado  |
//+------------------------------------------------------------------+
int OnInit()
{
//--- mapeamento de buffers do indicador
SetIndexBuffer(0,ColorArrowBuffer,INDICATOR_DATA);
SetIndexBuffer(1,ColorArrowColors,INDICATOR_COLOR_INDEX);
//--- Definir o código símbolo para desenho em PLOT_ARROW
PlotIndexSetInteger(0,PLOT_ARROW,code);
//--- Definir o deslocamento vertical das setas em pixels
PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,5);
//--- Definir como um valor vazio 0
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[],

© 2000-2018, MetaQuotes Software Corp.


1624 Indicadores Customizados

const long &tick_volume[],


const long &volume[],
const int &spread[])
{
static int ticks=0;
//--- Calcular ticks para mudar a cor, tamanho, deslocamento e código da seta
ticks++;
//--- Se um número crítico de ticks tem sido acumulado
if(ticks>=N)
{
//--- Alterar propriedades de seta
ChangeLineAppearance();
//--- Mude as cores usadas para desenhar o histograma
ChangeColors(colors,color_sections);
//--- Redefinir o contador de ticks para zero
ticks=0;
}

//--- Bloco para cálculo dos valores do indicador


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])
ColorArrowBuffer[i]=close[i];
//--- Caso contrário, especificar o valor nulo
else
ColorArrowBuffer[i]=0;
//--- Cor da seta
int index=i%color_sections;
ColorArrowColors[i]=index;
}
//--- valor retorno de prev_calculated para a próxima chamada
return(rates_total);
}
//+------------------------------------------------------------------+
//| Altera a cor dos segmentos de linha  |
//+------------------------------------------------------------------+
void ChangeColors(color &cols[],int plot_colors)
{
//--- O número de cores
int size=ArraySize(cols);
//---
string comm=ChartGetString(0,CHART_COMMENT)+"\r\n\r\n";

//--- Para cada índice de cor definir uma nova cor aleatoriamente
for(int plot_color_ind=0;plot_color_ind<plot_colors;plot_color_ind++)

© 2000-2018, MetaQuotes Software Corp.


1625 Indicadores Customizados

{
//--- 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);

//--- Um bloco para mudar o código das setas (PLOT_ARROW)


number=MathRand();
//--- Obter o restante da divisão de número inteiro para calcular um novo código da seta(a partir d
int code_add=number%20;
//--- Definir o novo símbolo de código como o resultado de code+code_add
PlotIndexSetInteger(0,PLOT_ARROW,code+code_add);
//--- Escreva o código de símbolo PLOT_ARROW
comm="\r\n"+"PLOT_ARROW="+IntegerToString(code+code_add)+comm;

//--- Um bloco de mudança do deslocamento vertical das setas em pixels


number=MathRand();
//--- Obter o deslocamento como o restante da divisão inteira
int shift=20-number%41;
//--- Define um deslocamento a partir de
PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,shift);
//--- Escrever o deslocamento PLOT_ARROW_SHIFT
comm="\r\n"+"PLOT_ARROW_SHIFT="+IntegerToString(shift)+comm;

© 2000-2018, MetaQuotes Software Corp.


1626 Indicadores Customizados

//--- Mostrar a informação no gráfico usando um comentário


Comment(comm);
}

© 2000-2018, MetaQuotes Software Corp.


1627 Indicadores Customizados

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_EM PTY_VALUE:

//--- O valor 0 (vazio) não vai participar no desenho


PlotIndexSetDouble(index_of_plot_DRAW_COLOR_ZIGZAG,PLOT_EMPTY_VALUE,0);

Sempre preencha explicitamente nos valores dos buffers de indicador, defina um valor vazio num
buffer para saltar barras.

O número de buffers requerida para plotagem de DR AW_COLOR_ZIGZAG é 3:

· 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.

© 2000-2018, MetaQuotes Software Corp.


1628 Indicadores Customizados

Por favor note que para plot1 com o estilo DRAW_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 [].

O parâmetro N é defindo nos parâmetros externos do indicador para a possibilidade de configuração


manual (na guia Parâmetros na janela Propriedades do indicador).

//+------------------------------------------------------------------+
//| 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 description "Um indicador para demonstrar DRAW_COLOR_ZIGZAG"


#property description "Ele desenha uma linha tracejada, como uma seqüência das seções coloridas, a
#property description "A cor, a largura e tamanho dos segmentos são alterados aleatoriamente"
#property description " a cada N ticks"

#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  |

© 2000-2018, MetaQuotes Software Corp.


1629 Indicadores Customizados

//+------------------------------------------------------------------+
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;

//--- A posição inicial dos cálculos


int start=0;
//--- Se o indicador foi calculado com o tick anterior, então inicia o cálculo com o passado, mas d
if(prev_calculated!=0) start=prev_calculated-1;
//--- Calculando loop
for(int i=start;i<rates_total;i++)

© 2000-2018, MetaQuotes Software Corp.


1630 Indicadores Customizados

{
//--- Escreva o tempo de abertura da barra na estrutura
TimeToStruct(time[i],dt);

//--- Se é ainda o número de barra


if(i%2==0)
{
//--- Escrever a alta no primeiro buffer e a baixa no segundo
Color_ZigzagBuffer1[i]=high[i];
Color_ZigzagBuffer2[i]=low[i];
//--- A cor do segmento
Color_ZigzagColors[i]=dt.day_of_year%color_sections;
}
//--- o número da barra é ímpar
else
{
//--- Preencha a barra numa ordem inversa
Color_ZigzagBuffer1[i]=low[i];
Color_ZigzagBuffer2[i]=high[i];
//--- A cor do segmento
Color_ZigzagColors[i]=dt.day_of_year%color_sections;
}
}
//--- valor retorno de prev_calculated para a próxima chamada
return(rates_total);
}
//+------------------------------------------------------------------+
//| Alterar a cor do segmento zigzag |
//+------------------------------------------------------------------+
void ChangeColors(color &cols[],int plot_colors)
{
//--- O número de cores
int size=ArraySize(cols);
//---
string comm=ChartGetString(0,CHART_COMMENT)+"\r\n\r\n";

//--- 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

© 2000-2018, MetaQuotes Software Corp.


1631 Indicadores Customizados

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);

//--- Um bloco para mudar o estilo da linha


number=MathRand();
//--- O divisor é igual ao tamanho do array de estilos
int size=ArraySize(styles);
//--- Obter o índice para selecionar um novo estilo como o resto da divisão inteira
int style_index=number%size;
//--- Definir a cor com a propriedade PLOT_LINE_COLOR
PlotIndexSetInteger(0,PLOT_LINE_STYLE,styles[style_index]);
//--- Escrever o estilo de linha
comm="\r\n"+EnumToString(styles[style_index])+""+comm;
//--- Mostrar a informação no gráfico usando um comentário
Comment(comm);
}

© 2000-2018, MetaQuotes Software Corp.


1632 Indicadores Customizados

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 ig h (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_EM PTY_VALUE:

//--- O valor 0 (vazio) não vai participar no desenho


PlotIndexSetDouble(index_of_plot_DRAW_COLOR_BARS,PLOT_EMPTY_VALUE,0);

Sempre preencher explicitamente os valores dos buffers do indicador, definir um valor vazio num
buffer para ignorar barras.

O número requerido de buffers para plotagem de DR AW_COLOR_BAR S é 5:

· quatro buffers para armazenar Open, H ig h, Low e Close;


· 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 ig h, 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).

© 2000-2018, MetaQuotes Software Corp.


1633 Indicadores Customizados

Por favor note que para plot1 com o estilo DRAW_COLOR_BARS, 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 description "Um indicador para demonstrar DRAW_COLOR_BARS"


#property description "Ele desenha diferentes cores nas barras de um símbolo selecionado numa janel
#property description "A cor e a largura das barras, bem como o símbolo são alterados aleatoriament
#property description "cada N ticks"

#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

© 2000-2018, MetaQuotes Software Corp.


1634 Indicadores Customizados

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 ColorBarsBuffer1[];
double ColorBarsBuffer2[];
double ColorBarsBuffer3[];
double ColorBarsBuffer4[];
double ColorBarsColors[];
//--- Nome do símbolo
string symbol;
int bars_colors;
//--- Um array para armazenar as cores que contém 14 elementos
color colors[]=
{
clrRed,clrBlue,clrGreen,clrChocolate,clrMagenta,clrDodgerBlue,clrGoldenrod,
clrIndigo,clrLightBlue,clrAliceBlue,clrMoccasin,clrMagenta,clrCyan,clrMediumPurple
};
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado  |
//+------------------------------------------------------------------+
int OnInit()
{
//--- mapeamento de buffers do indicador
SetIndexBuffer(0,ColorBarsBuffer1,INDICATOR_DATA);
SetIndexBuffer(1,ColorBarsBuffer2,INDICATOR_DATA);
SetIndexBuffer(2,ColorBarsBuffer3,INDICATOR_DATA);
SetIndexBuffer(3,ColorBarsBuffer4,INDICATOR_DATA);
SetIndexBuffer(4,ColorBarsColors,INDICATOR_COLOR_INDEX);
//---- Número de cores para colorir as barras
bars_colors=8; // veja uma 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;
//--- Conte ticks para mudar o estilo, cor e largura da barra

© 2000-2018, MetaQuotes Software Corp.


1635 Indicadores Customizados

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

© 2000-2018, MetaQuotes Software Corp.


1636 Indicadores Customizados

);
//--- 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);

//--- 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
ColorBarsBuffer1[buffer_index]=rates[i].open;
ColorBarsBuffer2[buffer_index]=rates[i].high;
ColorBarsBuffer3[buffer_index]=rates[i].low;
ColorBarsBuffer4[buffer_index]=rates[i].close;
//---
ColorBarsColors[buffer_index]=i%bar_colors;
}
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);
}
//+------------------------------------------------------------------+
//| Alterar a cor do segmento zigzag |
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


1637 Indicadores Customizados

void ChangeColors(color &cols[],int plot_colors)


{
//--- O número de cores
int size=ArraySize(cols);
//---
string comm=ChartGetString(0,CHART_COMMENT)+"\r\n\r\n";

//--- 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="";

//--- Um bloco para alterar a largura das barras


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);

//--- Escreve o nome do símbolo


comm="\r\n"+symbol+comm;

//--- Mostrar a informação no gráfico usando um comentário


Comment(comm);
}

© 2000-2018, MetaQuotes Software Corp.


1638 Indicadores Customizados

© 2000-2018, MetaQuotes Software Corp.


1639 Indicadores Customizados

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 ig h (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 número de cores de candlestick s pode ser definido 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 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_EM PTY_VALUE:

//--- O valor 0 (vazio) não vai participar no desenho


PlotIndexSetDouble(index_of_plot_DRAW_COLOR_CANDLES,PLOT_EMPTY_VALUE,0);

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_COLOR_CANDLES é 5:

· quatro buffers para armazenar Open, H ig h, Low e Close;


· 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 ig h, 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.

Um exemplo de indicador que desenha candlestick s para um instrumento financeiro selecionado em


uma janela separada. A cor dos candlestick s 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).

© 2000-2018, MetaQuotes Software Corp.


1640 Indicadores Customizados

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 description "Um indicador para demonstrar DRAW_COLOR_CANDLES."


#property description "ele desenha candlesticks de um símbolo selecionado numa janela separada"
#property description " "
#property description "A cor e a largura dos candlesticks, bem como o símbolo são alterados"
#property description "aleatoriamente a cada N ticks"

#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

© 2000-2018, MetaQuotes Software Corp.


1641 Indicadores Customizados

//--- 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 candlesticks para mostrar
input bool messages=false; // Mostrar mensagens no log "Expert Advisors"
//--- buffers do Indicador
double ColorCandlesBuffer1[];
double ColorCandlesBuffer2[];
double ColorCandlesBuffer3[];
double ColorCandlesBuffer4[];
double ColorCandlesColors[];
int candles_colors;
//--- Nome do símbolo
string symbol;
//--- Um array para armazenar as cores que contém 14 elementos
color colors[]=
{
clrRed,clrBlue,clrGreen,clrChocolate,clrMagenta,clrDodgerBlue,clrGoldenrod,
clrIndigo,clrLightBlue,clrAliceBlue,clrMoccasin,clrMagenta,clrCyan,clrMediumPurple
};
//+------------------------------------------------------------------+
//| 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,ColorCandlesBuffer1,INDICATOR_DATA);
SetIndexBuffer(1,ColorCandlesBuffer2,INDICATOR_DATA);
SetIndexBuffer(2,ColorCandlesBuffer3,INDICATOR_DATA);
SetIndexBuffer(3,ColorCandlesBuffer4,INDICATOR_DATA);
SetIndexBuffer(4,ColorCandlesColors,INDICATOR_COLOR_INDEX);
//--- Um valor vazio
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//--- 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_COLOR_CANDLES("+symbol+")");
//---- O número de cores para a cor dos candlesticks
candles_colors=8; // Veja uma comentário para a #property indicator_color1
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


1642 Indicadores Customizados

//| 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=INT_MAX-100;
//--- Contar ticks para mudar o estilo e cor
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 a forma
ChangeLineAppearance();
//--- Mude as cores usadas para desenhar os candlesticks
ChangeColors(colors,candles_colors);

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[],

© 2000-2018, MetaQuotes Software Corp.


1643 Indicadores Customizados

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++)
{

© 2000-2018, MetaQuotes Software Corp.


1644 Indicadores Customizados

//--- 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;
//--- Definir a cor do candlestick
int color_index=i%cndl_colors;
col_buffer[buffer_index]=color_index;
}
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);
}
//+------------------------------------------------------------------+
//| Mudar a cor dos segmentos de candlestick  |
//+------------------------------------------------------------------+
void ChangeColors(color &cols[],int plot_colors)
{
//--- O número de cores
int size=ArraySize(cols);
//---
string comm=ChartGetString(0,CHART_COMMENT)+"\r\n\r\n";

//--- 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

© 2000-2018, MetaQuotes Software Corp.


1645 Indicadores Customizados

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);
}

© 2000-2018, MetaQuotes Software Corp.


1646 Indicadores Customizados

Conexão entre as propriedades de indicadores e funções


correspondentes
Cada indicador personalizado tem inúmeras propriedades, algumas das quais são obrigatórias e estão
sempre posicionadas no início da descrição. São as seguintes propriedades :

· indicação de uma janela para plotar o indicador – indicator_separate_window ou


indicator_chart_window;
· número de buffers do indicador – indicator_buffers ;
· número de plotagem do indicador – indicator_plots.
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.

Diretivas para propriedades F unções do tipo Descrição para ajustar


de sub-janela de indicador IndicatorSet...() propriedades da sub-janela
indicator_heig ht IndicatorSetInteger O valor fixo da altura da sub-
(INDICAT OR_INDICAT OR_H EIG janela
HT , nH eig ht)
indicator_minimum IndicatorSetDouble O valor mínimo do eixo
(INDICAT OR_M INIMUM, vertical
dMax Value)

indicator_maximum IndicatorSetDouble O valor máximo do eixo


(INDICAT OR_MAXIMUM, vertical
dMinValue)

indicator_levelN IndicatorSetDouble Valor de eixo vertical para N


(INDICAT OR_LEVEL VALUE, N- nível
1, nLevelValue)
nenhuma diretiva de pré IndicatorSetString Nome de um nível apresentado
processador (INDICAT OR_LEVEL T EXT , N-1,
sLevelName)

indicator_levelcolor IndicatorSetInteger Cor de N nível


(INDICAT OR_LEVELCOLOR , N-
1, nLevelColor)
indicator_levelwidth IndicatorSetInteger Largura da linha para N nível
(INDICAT OR_LEVEL WIDTH , N-
1, nLevelW idth)
indicator_levelstyle IndicatorSetInteger Estilo de linha para N nível
(INDICAT OR_LEVELS TYLE, N-1,
nLevelStyle)

Diretivas para plotagem de F unções do tipo Descrição do ajuste da


propriedades PlotIndexSet...() propriedade de plotar

© 2000-2018, MetaQuotes Software Corp.


1647 Indicadores Customizados

indicator_labelN PlotIndexSetString(N- Nome abreviado do N número


1,PLOT_LABEL,sLabel) de plotar. Ele é exibido numa
janela de dados e na dica pop-
up quando passa-se o curso
sobre ele

indicator_colorN PlotIndexSetInteger(N-1, Cor da linha para N plotagem


PLOT_LINE_COLOR, nColor)
indicator_styleN PlotIndexSetInteger(N-1, Estilo da linha para N plotagem
PLOT_LINE_S TYLE, nType)
indicator_typeN PlotIndexSetInteger(N-1, T ipo de linha para N plotagem
PLOT_DRAW_TYPE, nType)
indicator_widthN PlotIndexSetInteger(N-1, Largura da linha para N
PLOT_LINE_WIDTH , nW idth) plotagem

Propriedades comum do F unções do tipo Description


indicador IndicatorSet...()
nenhuma diretiva de pré IndicatorSetString Define o nome abreviado
processador (INDICAT OR_S H ORTNAME, conveniente do indicador, que
sS hortName) será exibido na lista de
indicadores (aberto no
terminal pressionando Ctrl+I).

nenhuma diretiva de pré IndicatorSetInteger Conjuntos necessários para


processador (INDICAT OR_DIGIT S, nDigits) precisão da exibição de
valores dos indicadores -
número de casas decimais

nenhuma diretiva de pré IndicatorSetInteger Define o número de níveis na


processador (INDICAT OR_LEVELS, nLevels) janela do indicador

indicator_applied_price Sem função, a propriedade T ipo do preço padrão usado


pode ser definida apenas pela para o cálculo de indicadores.
diretiva pré processador. Ele é especificado quando
necessário, somente quando o
OnCalculate() do primeiro tipo
é usado.
O valor da propriedade
também pode ser definido a
partir do diálogo de
propriedades do indicador na
aba "Parâmetros " - " Aplicar
para" .

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.

Existem várias diretivas, para a qual não existem funções correspondentes :

© 2000-2018, MetaQuotes Software Corp.


1648 Indicadores Customizados

Diretiva Description
indicator_chart_window Indicador é visualizado na janela principal
indicator_separate_window Indicador é visualizado numa sub-janela
separada

indicator_buffers Número necessários de buffers do indicador


indicator_plots Números de plotagem no indicador

© 2000-2018, MetaQuotes Software Corp.


1649 Indicadores Customizados

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"

© 2000-2018, MetaQuotes Software Corp.


1650 Indicadores Customizados

#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));

//--- alterar a ordem dos elementos de acesso do buffer do indicador


ArraySetAsSeries(MABuffer,AsSeries);

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[],

© 2000-2018, MetaQuotes Software Corp.


1651 Indicadores Customizados

const long &volume[],


const int &spread[])
{
//--- Copiar os valores da média móvel no buffer MABuffer
int copied=CopyBuffer(ma_handle,0,0,rates_total,MABuffer);

Print("MABuffer[0] = ",MABuffer[0]);// Dependendo dos valores AsSeries


// Receberá um valor mais antigo
// Ou para a barra atual inacabada

//--- valor retorno de prev_calculated para a próxima chamada


return(rates_total);
}
//+------------------------------------------------------------------+

Também Veja
Propriedades dos indicadores personalizados, Acesso para indicadores e timeseries

© 2000-2018, MetaQuotes Software Corp.


1652 Indicadores Customizados

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.

Chamar especificando o identificador da propriedade.


bool  IndicatorSetDouble(
int  prop_id,  // identificador
double  prop_value  // valor para ser definido
);

Chamar especificando o identificador e o modificador da propriedade.


bool  IndicatorSetDouble(
int  prop_id,  // identificador
int  prop_modifier,  // modificador
double  prop_value  // valor para ser definido
)

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 VALUE, 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.

© 2000-2018, MetaQuotes Software Corp.


1653 Indicadores Customizados

#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);

© 2000-2018, MetaQuotes Software Corp.


1654 Indicadores Customizados

//---
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

© 2000-2018, MetaQuotes Software Corp.


1655 Indicadores Customizados

Exemplos de Estilos de Indicador, Conexão entre Propriedades do Indicador e Funções, Estilos de


Desenho

© 2000-2018, MetaQuotes Software Corp.


1656 Indicadores Customizados

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.

Chamar especificando o identificador da propriedade.


bool  IndicatorSetInteger(
int  prop_id,  // identificador
int  prop_value  // valor a ser definido
);

Chamar especificando o identificador e o modificador da propriedade.


bool  IndicatorSetInteger(
int  prop_id,  // identificador
int  prop_modifier,  // modificador
int  prop_value  // valor a ser definido
)

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.

© 2000-2018, MetaQuotes Software Corp.


1657 Indicadores Customizados

#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);
}
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


1658 Indicadores Customizados

//| 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;
//--- calcular ticks
tick_counter++;
//--- e calcular as cores dos níveis horizontais, dependendo do contador de tick
ChangeLevelColor(0,tick_counter,3,6,10); // três últimos parâmetros estão comutando a cor
ChangeLevelColor(1,tick_counter,3,6,8);
ChangeLevelColor(2,tick_counter,4,7,9);
//--- modificar o estilo dos níveis horizontais
ChangeLevelStyle(0,tick_counter);
ChangeLevelStyle(1,tick_counter+5);
ChangeLevelStyle(2,tick_counter+15);
//--- obter a largura como o restante da divisão inteira por 5 ticks
int width=tick_counter%5;
//--- iteração em todos os níveis horizontais e definir espessura
for(int l=0;l<3;l++)
IndicatorSetInteger(INDICATOR_LEVELWIDTH,l,width+1);
//--- valor retorno de prev_calculated para a próxima chamada
return(rates_total);
}
//+------------------------------------------------------------------+
//| Definir a cor da linha horizontal na janela separada do indicador|
//+------------------------------------------------------------------+
void ChangeLevelColor(int level, // número de linha horizontal
int tick_number,// dividendo, para obter o número do restante da divisão
int f_trigger, // primeiro divisor de comutação de cor
int s_trigger, // segundo divisor de comutação de cor
int t_trigger) // terceiro divisor de comutação de cor
{
static color colors[3]={clrRed,clrBlue,clrGreen};
//--- índice de cor a partir do array colors[]
int index=-1;
//--- calcular o número de cor a partir do array colors[] para pintar linha horizontal
if(tick_number%f_trigger==0)
index=0; // se tick_number divide por f_trigger sem o restante
if(tick_number%s_trigger==0)
index=1; // se tick_number divide por s_trigger sem o restante

© 2000-2018, MetaQuotes Software Corp.


1659 Indicadores Customizados

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

© 2000-2018, MetaQuotes Software Corp.


1660 Indicadores Customizados

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.

Chamar especificando o identificador da propriedade.


bool  IndicatorSetString(
int  prop_id,  // identificador
string  prop_value  // valor a ser definido
);

Chamar especificando o identificador e o modificador da propriedade.


bool  IndicatorSetString(
int  prop_id,  // identificador
int  prop_modifier,  // modificador
string  prop_value  // valor a ser definido
)

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.

© 2000-2018, MetaQuotes Software Corp.


1661 Indicadores Customizados

#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  |

© 2000-2018, MetaQuotes Software Corp.


1662 Indicadores Customizados

//+------------------------------------------------------------------+
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[])
{
//---

//--- valor retorno de prev_calculated para a próxima chamada


return(rates_total);
}

Também Veja
Propriedades de Indicador Personalizado, Propriedades (#property) de Programa

© 2000-2018, MetaQuotes Software Corp.


1663 Indicadores Customizados

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_PROPERTY_DOUBLE.
prop_value
[in] O valor da propriedade.

Valor do Retorno
Se com sucesso, retorna true, do contrário false.

© 2000-2018, MetaQuotes Software Corp.


1664 Indicadores Customizados

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.

Chamar indicando o identificador da propriedade.


bool  PlotIndexSetInteger(
int  plot_index,  // plotagem do índice do estilo
int  prop_id,  // propriedade identificador
int  prop_value  // valor a ser definido
);

Chamar indicando o identificador e o modificador da propriedade.


bool  PlotIndexSetInteger(
int  plot_index,  // plotagem do índice do estilo
int  prop_id,  // propriedade identificador
int  prop_modifier,  // propriedade modificador
int  prop_value  // valor a 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_PROPERTY_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.

© 2000-2018, MetaQuotes Software Corp.


1665 Indicadores Customizados

#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  |
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


1666 Indicadores Customizados

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);

ticks++;// contando ticks


if(ticks>=5)//é hora de mudar o esquema de cores
{
ticks=0; // zerar o contador
modified++; // contador de mudanças de cor
if(modified>=3)modified=0;// zerar o contador
ResetLastError();
switch(modified)
{

© 2000-2018, MetaQuotes Software Corp.


1667 Indicadores Customizados

case 0:// primeiro esquema de cor


PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,clrRed);
PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,clrBlue);
PlotIndexSetInteger(0,PLOT_LINE_COLOR,2,clrGreen);
Print("Esquema de cor "+modified);
break;
case 1:// segundo esquema de cor
PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,clrYellow);
PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,clrPink);
PlotIndexSetInteger(0,PLOT_LINE_COLOR,2,clrLightSlateGray);
Print("Esquema de cor "+modified);
break;
default:// terceiro esquema de cor
PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,clrLightGoldenrod);
PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,clrOrchid);
PlotIndexSetInteger(0,PLOT_LINE_COLOR,2,clrLimeGreen);
Print("Esquema de cor "+modified);
}
}
else
{
//--- definir posição inicial
limit=prev_calculated-1;
//--- Agora vamos definir a cor da linha para cada barra
for(int i=limit;i<rates_total;i++)
ColorBuffer[i]=getIndexOfColor(i);
}
}
//--- valor retorno de prev_calculated para a próxima chamada
return(rates_total);
}
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


1668 Indicadores Customizados

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_PROPERTY_S TRING.
prop_value
[in] O valor da propriedade.

Valor do Retorno
Se com sucesso, retorna true, do contrário false.

© 2000-2018, MetaQuotes Software Corp.


1669 Indicadores Customizados

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.

Chamar indicando o identificador da propriedade.


int  PlotIndexGetInteger(
int  plot_index,  // plotagem do índice do estilo
int  prop_id,  // propriedade identificador
);

Chamar indicando o identificador e o modificador da propriedade.


int  PlotIndexGetInteger(
int  plot_index,  // plotagem do índice
int  prop_id,  // propriedade identificador
int  prop_modifier  // propriedade modificador
)

Parâmetros
plot_index
[in] Índice de plotagem gráfica
prop_id
[in] O valor pode ser um dos valores do enumerador ENUM _PLOT_PROPERTY_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.

© 2000-2018, MetaQuotes Software Corp.


1670 Indicadores Customizados

#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

© 2000-2018, MetaQuotes Software Corp.


1671 Indicadores Customizados

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);
}
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


1672 Funções de Objeto

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.

F unção Ação
ObjectCreate Cria um objecto de tipo específico para um
gráfico específico

ObjectName Retorna o nome de um objeto do tipo


correspondente para um gráfico específico
(gráfico de sub-janela específica)

ObjectDelete Remove o objeto com o nome específico a


partir de um gráfico específico (a partir de
gráfico de sub-janela específica)

Objects DeleteAll Remove todos os objetos com o tipo específico


a partir de um gráfico específico (a partir de
gráfico de sub-janela específica)

ObjectFind Pesquisa um objeto com o ID especificado pelo


nome

ObjectGetT imeByValue Retorna o valor de tempo ao valor do preço do


objeto especifico

ObjectGetValueByT ime Retorna o valor do preço de um objeto ao


período especificado

ObjectMove Muda as coordenadas do ponto de ancoragem


do objeto especificado

Objects T otal Retorna o número de objetos do tipo especifico


no gráfico especificado (gráfico de sub-janela
específica)

ObjectGetDouble Retorna o valor double da propriedade do


objeto correspondente

ObjectGetInteger Retorna o valor integer da propriedade do


objeto correspondente

© 2000-2018, MetaQuotes Software Corp.


1673 Funções de Objeto

ObjectGetString Retorna o valor string da propriedade do objeto


correspondente

ObjectSetDouble Define o valor da propriedade do objeto


correspondente

ObjectSetInteger Define o valor da propriedade do objeto


correspondente

ObjectSetString Define o valor da propriedade do objeto


correspondente

T extSetFont Define a fonte para exibir o texto usando


métodos de desenho (Arial 20, usado por
padrão)

T extOut T ransfere o texto para um array personalizado


(buffer) projetado para a criação de recursos
gráficos

T extGetSize Retorna a largura e a altura da string nas


configurações das fontes usadas no momento

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).

© 2000-2018, MetaQuotes Software Corp.


1674 Funções de Objeto

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.

© 2000-2018, MetaQuotes Software Corp.


1675 Funções de Objeto

Valor do Retorno
Retorna 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.

Para verificação do resultado da execução, é poss ível utilizar a função ObjectFind() ou quaisquer
funções que solicitam 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.

An object name s hould not exceed 63 characters.

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:

ID Description Pontos de Ancoragem


OBJ_VL INE Linha Vertical Um ponto de ancoragem.
Efetivamente apenas as
coordenadas de tempo são
usadas.

OBJ_H L INE Linha H orizontal Um ponto de ancoragem.


Efetivamente apenas a
coordenada de preço é usada.

OBJ_TR END Linha de T endência Dois pontos para Ancoragem.


OBJ_TR ENDBYANGLE Linha de T endência por Ângulo Dois pontos para Ancoragem.
OBJ_CYCLES Linhas de Ciclo Dois pontos para Ancoragem.
OBJ_ARR OW ED_L INE Linha de Seta Dois pontos para Ancoragem.
OBJ_CH ANNEL Canal Eqüidistante T rês pontos para Ancoragem.

© 2000-2018, MetaQuotes Software Corp.


1676 Funções de Objeto

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_PIT CHFORK Forquilha de Andrews T rês pontos para Ancoragem.
OBJ_GANNL INE Linha Gann Dois pontos para Ancoragem.
OBJ_GANNFAN Ventilador Gann Dois pontos para Ancoragem.
OBJ_GANNGRID Grade Gann Dois pontos para Ancoragem.
OBJ_FIBO Retração de Fibonacci Dois pontos para Ancoragem.
OBJ_FIBOTIMES Fusos H orários de Fibonacci Dois pontos para Ancoragem.
OBJ_FIBOFAN Fibonacci Fan Dois pontos para Ancoragem.
OBJ_FIBOAR C Arcos de Fibonacci Dois pontos para Ancoragem.
OBJ_FIBOCH ANNEL Canal de Fibonacci T rês pontos para Ancoragem.
OBJ_EXPANS ION Expansão de Fibonacci T rês 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 Rectangle Dois pontos para Ancoragem.
OBJ_TRIANGLE T riangle T rês pontos para Ancoragem.
OBJ_ELL IPSE Ellipse T rês pontos para Ancoragem.
OBJ_ARR OW_TH UM B_UP Polegares para cima Um ponto de ancoragem.

OBJ_ARR OW_TH UM B_DOWN Polegar para Baixo Um ponto de ancoragem.

OBJ_ARR OW_UP Seta para cima Um ponto de ancoragem.

OBJ_ARR OW_DOWN Seta para baixo Um ponto de ancoragem.

OBJ_ARR OW_S T OP Sinal Stop Um ponto de ancoragem.

OBJ_ARR OW_CH ECK Conferido Um ponto de ancoragem.

OBJ_ARR OW_LEFT_PRICE Etiqueta de Preço à Esquerda Um ponto de ancoragem.

OBJ_ARR OW_RIGHT_PRICE Rótulo de Preço Direito Um ponto de ancoragem.

OBJ_ARR OW_BUY Comprar Um ponto de ancoragem.

OBJ_ARR OW_SELL Vender Um ponto de ancoragem.

OBJ_ARR OW Seta Um ponto de ancoragem.

OBJ_T EXT T ext Um ponto de ancoragem.

OBJ_LABEL Rótulo Posição será definida usando


as propriedades
OBJPR OP_XDIS T ANCE e
OBJPR OP_YDIS T ANCE.

© 2000-2018, MetaQuotes Software Corp.


1677 Funções de Objeto

OBJ_BUTT ON Botão Posição será definida usando


as propriedades
OBJPR OP_XDIS T ANCE e
OBJPR OP_YDIS T ANCE.

OBJ_CH ART Gráfico Posição será definida usando


as propriedades
OBJPR OP_XDIS T ANCE e
OBJPR OP_YDIS T ANCE.

OBJ_BIT MAP Bitmap Um ponto de ancoragem.

OBJ_BIT MAP_LABEL Rótulo Bitmap Posição será definida usando


as propriedades
OBJPR OP_XDIS T ANCE e
OBJPR OP_YDIS T ANCE.

OBJ_EDIT Edit Posição será definida usando


as propriedades
OBJPR OP_XDIS T ANCE e
OBJPR OP_YDIS T ANCE.

OBJ_EVENT O objeto " Evento" Um ponto de ancoragem.


correspondendo a um evento Efetivamente apenas as
no calendário econômico coordenadas de tempo são
usadas.

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.

© 2000-2018, MetaQuotes Software Corp.


1678 Funções de Objeto

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.

© 2000-2018, MetaQuotes Software Corp.


1679 Funções de Objeto

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
Retorna 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.

Para verificação do resultado da execução, é poss ível utilizar a função ObjectFind() ou quaisquer
funções que solicitam 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.

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.

© 2000-2018, MetaQuotes Software Corp.


1680 Funções de Objeto

ObjectsDeleteAll
Remove 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
);

Remove todos os objetos do tipo especificado usando prefixo em nomes de objeto.


int  ObjectsDeleteAll(
long chart_id,  // ID do gráfico
const string prefix,  // prefixo no nome do objeto
int  sub_window=-1,  // índice da janela
int object_type=-1 // tipo do 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
Retorna 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.

© 2000-2018, MetaQuotes Software Corp.


1681 Funções de Objeto

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.

© 2000-2018, MetaQuotes Software Corp.


1682 Funções de Objeto

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_GANNLINE)
· Canal eqüidistante (OBJ_CH ANNEL) - 2 linhas
· Canal de regressão Linear (OBJ_R EGR ESS ION) - 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

© 2000-2018, MetaQuotes Software Corp.


1683 Funções 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_GANNLINE)
· Canal eqüidistante (OBJ_CH ANNEL) - 2 linhas
· Canal de regressão Linear (OBJ_R EGR ESS ION) - 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

© 2000-2018, MetaQuotes Software Corp.


1684 Funções 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
Retorna 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.

© 2000-2018, MetaQuotes Software Corp.


1685 Funções de Objeto

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.

© 2000-2018, MetaQuotes Software Corp.


1686 Funções de Objeto

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.

Define valor da propriedade, sem modificador


bool  ObjectSetDouble(
long  chart_id,  // identificador Gráfico
string  name,  // nome objeto
ENUM_OBJECT_PROPERTY_DOUBLE  prop_id,  // propriedade
double  prop_value   // valor
);

Define um valor de propriedade que indica o modificador


bool  ObjectSetDouble(
long  chart_id,  // identificador Gráfico
string  name,  // nome objeto
ENUM_OBJECT_PROPERTY_DOUBLE  prop_id,  // propriedade
int  prop_modifier,  // modificador
double  prop_value   // valor
);

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

© 2000-2018, MetaQuotes Software Corp.


1687 Funções de Objeto

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.

Exemplo de criação de um objeto Fibonacci e adicionando um novo nível nele


//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar)  |
//+------------------------------------------------------------------+
void OnStart()
{
//--- arrays auxiliares
double high[],low[],price1,price2;
datetime time[],time1,time2;
//--- Copiar os preços de abertura - 100 barras mais recentes são suficientes
int copied=CopyHigh(Symbol(),0,0,100,high);
if(copied<=0)
{
Print("Falha ao copiar os valores da série de preços de Alta");
return;
}
//--- Copiar os preço de fechamento - mais de 100 barras são suficientes
copied=CopyLow(Symbol(),0,0,100,low);
if(copied<=0)
{
Print("Falha ao copiar os valores da série de preços de Baixa");
return;
}
//--- Copiar os tempos de abertura para as últimas 100 barras
copied=CopyTime(Symbol(),0,0,100,time);
if(copied<=0)
{
Print("Falha ao copiar os valores da série de preços de tempo");
return;
}
//--- Organizar o acesso aos dados copiados como para timeseries - retrocesso
ArraySetAsSeries(high,true);
ArraySetAsSeries(low,true);
ArraySetAsSeries(time,true);

//--- Coordenadas do primeiro ponto de ancoragem do objeto Fibo


price1=high[70];
time1=time[70];
//--- Coordenadas do segundo ponto de ancoragem do objeto Fibo
price2=low[50];

© 2000-2018, MetaQuotes Software Corp.


1688 Funções de Objeto

time2=time[50];

//--- Tempo para criar o objeto Fibo


bool created=ObjectCreate(0,"Fibo",OBJ_FIBO,0,time1,price1,time2,price2);
if(created) // Se o objeto for criado com sucesso
{
//--- definir a cor dos níveis de Fibo
ObjectSetInteger(0,"Fibo",OBJPROP_LEVELCOLOR,Blue);
//--- a propósito, quanto níveis Fibo temos?
int levels=ObjectGetInteger(0,"Fibo",OBJPROP_LEVELS);
Print("Fibo levels before = ",levels);
//---saída para Jornal => número de nível: valor level_desription
for(int i=0;i<levels;i++)
{
Print(i,": ",ObjectGetDouble(0,"Fibo",OBJPROP_LEVELVALUE,i),
" ",ObjectGetString(0,"Fibo",OBJPROP_LEVELTEXT,i));
}
//--- Tentar aumentar o número de níveis por unidade
bool modified=ObjectSetInteger(0,"Fibo",OBJPROP_LEVELS,levels+1);
if(!modified) // falha ao alterar o número de níveis
{
Print("Falhou ao alterar o número de níveis da Fibo, erro ",GetLastError());
}
//--- apenas informa
Print("Níveis de Fibo depois = ",ObjectGetInteger(0,"Fibo",OBJPROP_LEVELS));
//--- definir um valor para um nível recém-criado
bool added=ObjectSetDouble(0,"Fibo",OBJPROP_LEVELVALUE,levels,133);
if(added) // conseguiu definir um valor para o nível
{
Print("Definido com sucesso mais um nível Fibo");
//--- Também não se esqueça de definir o nível da descrição
ObjectSetString(0,"Fibo",OBJPROP_LEVELTEXT,levels,"my level");
ChartRedraw(0);
//--- Obter o valor real do número de níveis no objeto Fibo
levels=ObjectGetInteger(0,"Fibo",OBJPROP_LEVELS);
Print("Níveis de Fibo depois de adicionar = ",levels);
//--- mais uma vez a saída de todos os níveis - só para ter certeza
for(int i=0;i<levels;i++)
{
Print(i,":",ObjectGetDouble(0,"Fibo",OBJPROP_LEVELVALUE,i),
" ",ObjectGetString(0,"Fibo",OBJPROP_LEVELTEXT,i));
}
}
else // Falha se você tentar aumentar o número de níveis no objeto Fibo
{
Print("Falhou ao definir mais um nível Fibo. Error ",GetLastError());
}
}
}

© 2000-2018, MetaQuotes Software Corp.


1689 Funções de Objeto

Veja Também
T ipos de Objetos, Propriedades de objeto

© 2000-2018, MetaQuotes Software Corp.


1690 Funções 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.

Define valor da propriedade, sem modificador


bool  ObjectSetInteger(
long  chart_id,  // identificador Gráfico
string  name,  // nome objeto
ENUM_OBJECT_PROPERTY_INTEGER  prop_id,  // propriedade
long  prop_value   // valor
);

Define um valor de propriedade que indica o modificador


bool  ObjectSetInteger(
long  chart_id,  // identificador Gráfico
string  name,  // nome objeto
ENUM_OBJECT_PROPERTY_INTEGER  prop_id,  // propriedade
int  prop_modifier,  // modificador
long  prop_value   // valor
);

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.

© 2000-2018, MetaQuotes Software Corp.


1691 Funções de Objeto

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.

Um exemplo de como criar uma tabela de cores da W eb

//+------------------------------------------------------------------+
//| 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,"'");

© 2000-2018, MetaQuotes Software Corp.


1692 Funções de Objeto

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

© 2000-2018, MetaQuotes Software Corp.


1693 Funções 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.

Define valor da propriedade, sem modificador


bool  ObjectSetString(
long  chart_id,  // identificador Gráfico
string  name,  // nome objeto
ENUM_OBJECT_PROPERTY_STRING  prop_id,  // propriedade
string  prop_value   // valor
);

Define um valor de propriedade que indica o modificador


bool  ObjectSetString(
long  chart_id,  // identificador Gráfico
string  name,  // nome objeto
ENUM_OBJECT_PROPERTY_STRING  prop_id,  // propriedade
int  prop_modifier,  // modificador
string  prop_value   // valor
);

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.

© 2000-2018, MetaQuotes Software Corp.


1694 Funções de Objeto

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.

© 2000-2018, MetaQuotes Software Corp.


1695 Funções de Objeto

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.

1. Imediatamente retorna o valor da propriedade.


double  ObjectGetDouble(
long  chart_id,  // identificador Gráfico
string  name,  // nome objeto
ENUM_OBJECT_PROPERTY_DOUBLE  prop_id,  // identificador propriedade
int  prop_modifier=0  // modificador propriedade, se requerida
);

2. Retorna true ou false, dependendo do sucesso da função. Se bem sucedido, o valor da


propriedade é colocado para receber uma variável passada como referência pelo último parâmetro.
bool  ObjectGetDouble(
long  chart_id,  // identificador Gráfico
string  name,  // nome objeto
ENUM_OBJECT_PROPERTY_DOUBLE  prop_id,  // identificador propriedade
int  prop_modifier, // modificador propriedade
double&  double_var  // aqui nós aceitamos o valor da propriedade
);

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().

© 2000-2018, MetaQuotes Software Corp.


1696 Funções de Objeto

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.

© 2000-2018, MetaQuotes Software Corp.


1697 Funções de Objeto

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.

1. Imediatamente retorna o valor da propriedade.


long  ObjectGetInteger(
long  chart_id,  // identificador Gráfico
string  name,  // nome objeto
ENUM_OBJECT_PROPERTY_INTEGER  prop_id,  // identificador propriedade
int  prop_modifier=0 // modificador de propriedade, se requerida
);

2. Retorna true ou false, dependendo do sucesso da função. Se bem sucedido, o valor da


propriedade é colocado para receber uma variável passada como referência pelo último parâmetro.
bool  ObjectGetInteger(
long  chart_id,  // identificador Gráfico
string  name,  // nome objeto
ENUM_OBJECT_PROPERTY_INTEGER  prop_id,  // identificador propriedade
int  prop_modifier, // modificador propriedade
long&  long_var  // aqui nós aceitamos o valor da propriedade
);

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().

© 2000-2018, MetaQuotes Software Corp.


1698 Funções de Objeto

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.

© 2000-2018, MetaQuotes Software Corp.


1699 Funções de Objeto

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.

1. Imediatamente retorna o valor da propriedade.


string  ObjectGetString(
long  chart_id,  // identificador Gráfico
string  name,  // nome objeto
ENUM_OBJECT_PROPERTY_STRING  prop_id,  // identificador propriedade
int  prop_modifier=0 // modificador de propriedade, se requisitada
);

2. Retorna true ou false, dependendo do sucesso da função. Se bem sucedido, o valor da


propriedade é colocado para receber uma variável passada como referência pelo último parâmetro.
bool  ObjectGetString(
long  chart_id,  // identificador Gráfico
string  name,  // nome objeto
ENUM_OBJECT_PROPERTY_STRING  prop_id,  // identificador propriedade
int  prop_modifier, // modificador propriedade
string&  string_var  // aqui nós aceitamos o valor da propriedade
);

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.

Retorna 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().

© 2000-2018, MetaQuotes Software Corp.


1700 Funções de Objeto

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.

© 2000-2018, MetaQuotes Software Corp.


1701 Funções de Objeto

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
Retorna 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

© 2000-2018, MetaQuotes Software Corp.


1702 Funções de Objeto

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.

Sinalizadores para especificar o estilo da fonte

F lag Description
FONT_IT ALIC Itálico
FONT_UNDERLINE Sublinhado

FONT_S TRIKEOUT Riscado

Sinalizadores para especificar a largura da fonte


F lag

FW_DONT CARE
FW_THIN
FW_EXTRALIGHT
FW_ULTRALIGHT
FW_LIGHT
FW_NORMAL
FW_REGULAR
FW_MEDIUM
FW_SEM IBOLD
FW_DEM IBOLD
FW_BOLD
FW_EXTRABOLD
FW_ULTRABOLD
FW_H EAVY
FW_BLACK

Também Veja

© 2000-2018, MetaQuotes Software Corp.


1703 Funções de Objeto

Recursos, ResourceCreate(), ResourceSave(), T extOut()

© 2000-2018, MetaQuotes Software Corp.


1704 Funções de Objeto

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_FORMAT .

Valor de retorno
Retorna true se bem sucedido, caso contrário false.

Observação

© 2000-2018, MetaQuotes Software Corp.


1705 Funções de Objeto

Ponto de ancoragem determinado por anchor é uma combinação de dois sinalizadores de


alinhamento de texto horizontal e vertical. Sinalizador de alinhamento de texto horizontal:
· T A_LEFT – ponto de ancoragem no lado esquerdo da caixa delimitada
· T A_CENT ER – ponto de ancoragem horizontal localiza-se no centro da caixa delimitada
· T A_RIGHT – ponto de ancoragem no lado direito da caixa delimitada

Sinalizador de alinhamento de texto vertical:


· T A_T OP – ponto de ancoragem no lado superior da caixa delimitada
· T A_VCENT ER – ponto de ancoragem verticais está localizado no centro da caixa delimitada
· T A_BOTT OM – ponto de ancoragem no lado inferior da caixa delimitada

Combinações poss íveis de sinalizadores e pontos de ancoragem determinados são mostrados na


imagem.

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");

//--- variáveis auxiliares


double a; // seta no canto
uint nm=2700; // minutos no canto
uint nh=2700*12; // horas no canto
uint w,h; // variáveis para receber string de tamanhos de texto

© 2000-2018, MetaQuotes Software Corp.


1706 Funções de Objeto

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);

//--- agora, definir a fonte para desenhar o ponteiro dos minutos


TextSetFont("Arial",-200,FW_EXTRABOLD,-int(nh/12%3600));
TextGetSize("==>",w,h);
//--- calcular as coordenadas do ponteiro das horas na face do relógio
a=-(nh/12%3600*M_PI)/1800.0;
x=IMG_WIDTH/2-int(sin(a)*h/2+0.5);
y=IMG_HEIGHT/2-int(cos(a)*h/2+0.5);
//--- saída do ponteiro das horas 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);

//--- atualizar o recurso gráfico


ResourceCreate("::IMG",ExtImg,IMG_WIDTH,IMG_HEIGHT,0,0,IMG_WIDTH,clr_format);
//--- forçar a atualização do gráfico
ChartRedraw();

//--- aumentar os contadores da hora e minuto


nm+=60;
nh+=60;

© 2000-2018, MetaQuotes Software Corp.


1707 Funções de Objeto

//--- mantendo uma pequena pausa entre os quadros


Sleep(10);
}
//--- excluir o objeto RELÓGIO quando completar a operação do script
ObjectDelete(0,"CLOCK");
//---
}

Também Veja
Recursos, ResourceCreate(), ResourceSave(), T extGetSize(), T extSetFont()

© 2000-2018, MetaQuotes Software Corp.


1708 Funções de Objeto

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
Retorna 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
Recursos, ResourceCreate(), ResourceSave(), T extSetFont(), T extOut()

© 2000-2018, MetaQuotes Software Corp.


1709 Indicadores Técnicos

Funções Indicadores Técnicos


T odas as funções, como iMA, iAC, iMACD, iIchimok u etc, tem uma cópia do indicador técnico
correspondente criada no cache global do terminal do cliente. Se uma cópia do indicador com esses
parâmetros já existe, a nova cópia não é criada, e o contador de referências para a cópia existente
aumenta.

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;

· tipo de indicador para criar;

· número de parâmetros de entrada do indicador;

· um array do tipo MqlParam contendo todos os parâmetros de entrada necessários.

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.

F unção Retorna o manipulador do indicador:


iAC Accelerator Oscillator

iAD Accumulation/Distribution

iADX Average Directional Index

iADXW ilder Average Directional Index by W elles W ilder

iAlligator Alligator

© 2000-2018, MetaQuotes Software Corp.


1710 Indicadores Técnicos

iAMA Adaptive Moving Average

iAO Awesome Oscillator

iATR Average T rue R ange

iBears Power Bears Power


iBands Bollinger Bands ®
iBulls Power Bulls Power
iCCI Commodity Channel Index

iChaik in Chaik in Oscillator

iCustom Custom indicator

iDEMA Double Exponential Moving Average


iDeMark er DeMark er
iEnvelopes Envelopes

iForce Force Index


iFractals Fractals
iFrAMA Fractal Adaptive Moving Average
iGator Gator Oscillator
iIchimok u Ichimok u Kink o Hyo
iBW M FI Mark et Facilitation Index by Bill W illiams

iMomentum Momentum

iM FI Money Flow Index

iMA Moving Average

iOsMA Moving Average of Oscillator (MACD histogram)

iMACD Moving Averages Convergence-Divergence

iOBV On Balance Volume

iSAR Parabolic Stop And Reverse S ystem


iR S I Relative Strength Index
iRVI Relative Vigor Index
iStdDev Standard Deviation

iStochastic Stochastic Oscillator

iT EMA T riple Exponential Moving Average


iT riX T riple Exponential Moving Averages Oscillator

© 2000-2018, MetaQuotes Software Corp.


1711 Indicadores Técnicos

iWPR W illiams ' Percent Range


iVIDyA Variable Index Dynamic Average
iVolumes Volumes

© 2000-2018, MetaQuotes Software Corp.


1712 Indicadores Técnicos

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 _TIMEFRAMES, 0 (zero)
significa o prazo corrente.

Valor de retorno
Retorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVALID_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

© 2000-2018, MetaQuotes Software Corp.


1713 Indicadores Técnicos

//+------------------------------------------------------------------+
//| 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)

© 2000-2018, MetaQuotes Software Corp.


1714 Indicadores Técnicos

{
//--- 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
{

© 2000-2018, MetaQuotes Software Corp.


1715 Indicadores Técnicos

//--- 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);
}

© 2000-2018, MetaQuotes Software Corp.


1716 Indicadores Técnicos

//+------------------------------------------------------------------+
//| Função de desinicialização do indicador |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- limpar o gráfico após excluir o indicador
Comment("");
}

© 2000-2018, MetaQuotes Software Corp.


1717 Indicadores Técnicos

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 _TIMEFRAMES, 0 (zero)
significa o prazo corrente.

applied_volume
[in] O volume utilizado. Can be any of ENUM _APPLIED_VOLUME values.

Valor de retorno
Retorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVALID_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

© 2000-2018, MetaQuotes Software Corp.


1718 Indicadores Técnicos

#property indicator_style1 STYLE_SOLID


#property indicator_width1 1
//+------------------------------------------------------------------+
//| Enumerador dos métodos de criação do manipulador  |
//+------------------------------------------------------------------+
enum Creation
{
Call_iAD, // usar iAD
Call_IndicatorCreate // usar IndicatorCreate
};
//--- parâmetros de entrada
input Creation type=Call_iAD; // tipo da função
input ENUM_APPLIED_VOLUME volumes; // volume usado
input string symbol=" "; // símbolo
input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // timeframe
//--- buffer do indicador
double iADBuffer[];
//--- variável para armazenar o manipulador do indicador iAD
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 Accumulation/Distribution
int bars_calculated=0;
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado  |
//+------------------------------------------------------------------+
int OnInit()
{
//--- atribuição de array para buffer do indicador
SetIndexBuffer(0,iADBuffer,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_iAD)
handle=iAD(name,period,volumes);
else
{
//--- preencher a estrutura com os parâmetros do indicador

© 2000-2018, MetaQuotes Software Corp.


1719 Indicadores Técnicos

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)
{

© 2000-2018, MetaQuotes Software Corp.


1720 Indicadores Técnicos

//--- 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 |

© 2000-2018, MetaQuotes Software Corp.


1721 Indicadores Técnicos

//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- limpar o gráfico após excluir o indicador
Comment("");
}

© 2000-2018, MetaQuotes Software Corp.


1722 Indicadores Técnicos

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 _TIMEFRAMES, 0 (zero) significa o prazo
corrente.

adx_period
[in] Período para calcular o índice.

Valor de retorno
Retorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVALID_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 - PLUS 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

© 2000-2018, MetaQuotes Software Corp.


1723 Indicadores Técnicos

//--- plotar ADX


#property indicator_label1 "ADX"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrLightSeaGreen
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- plotar DI_plus
#property indicator_label2 "DI_plus"
#property indicator_type2 DRAW_LINE
#property indicator_color2 clrYellowGreen
#property indicator_style2 STYLE_SOLID
#property indicator_width2 1
//--- plotar DI_minus
#property indicator_label3 "DI_minus"
#property indicator_type3 DRAW_LINE
#property indicator_color3 clrWheat
#property indicator_style3 STYLE_SOLID
#property indicator_width3 1
//+------------------------------------------------------------------+
//| Enumerador dos métodos de criação do manipulador  |
//+------------------------------------------------------------------+
enum Creation
{
Call_iADX, // usar iADX
Call_IndicatorCreate // usar IndicatorCreate
};
//--- parâmetros de entrada
input Creation type=Call_iADX; // tipo da função
input int adx_period=14; // cálculo do período
input string symbol=" "; // símbolo
input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // timeframe
//--- buffers do indicador
double ADXBuffer[];
double DI_plusBuffer[];
double DI_minusBuffer[];
//--- variável para armazenar o manipulador do indicador iADX
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 Average Directional Movement Index
int bars_calculated=0;
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado  |
//+------------------------------------------------------------------+
int OnInit()
{
//--- atribuição de arrays para buffers do indicador

© 2000-2018, MetaQuotes Software Corp.


1724 Indicadores Técnicos

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[],

© 2000-2018, MetaQuotes Software Corp.


1725 Indicadores Técnicos

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 iADX
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 iADXBuffer é maior do que o número de valores no indicador iADX 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 com valores do indicador Average Directional Movement Index
//--- se FillArraysFromBuffer retorna falso, isto significa que a informação ainda não está pronta,
if(!FillArraysFromBuffers(ADXBuffer,DI_plusBuffer,DI_minusBuffer,handle,values_to_copy)) return(
//--- 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 Average Directional Movement Index
bars_calculated=calculated;
//--- retorna o valor prev_calculated para a próxima chamada
return(rates_total);
}
//+------------------------------------------------------------------+
//| Preenchendo buffers do indicador a partir do indicador iADX |
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


1726 Indicadores Técnicos

bool FillArraysFromBuffers(double &adx_values[], // buffer do indicador da linha ADX


double &DIplus_values[], // buffer do indicador para DI+
double &DIminus_values[], // buffer do indicador para DI-
int ind_handle, // manipulador do indicador iADXWilder
int amount // número dos valores copiados
)
{
//--- redefinir o código de erro
ResetLastError();
//--- preencher uma parte do array iADXBuffer com valores a partir do buffer do indicador que tem í
if(CopyBuffer(ind_handle,0,0,amount,adx_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,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)
{
//--- limpar o gráfico após excluir o indicador
Comment("");
}

© 2000-2018, MetaQuotes Software Corp.


1727 Indicadores Técnicos

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 _TIMEFRAMES, 0 (zero) significa o prazo
corrente.

adx_period
[in] Período para calcular o índice.

Valor de retorno
Retorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVALID_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 - PLUS 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

© 2000-2018, MetaQuotes Software Corp.


1728 Indicadores Técnicos

//--- plotar ADX


#property indicator_label1 "ADX"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrLightSeaGreen
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- plotar DI_plus
#property indicator_label2 "DI_plus"
#property indicator_type2 DRAW_LINE
#property indicator_color2 clrYellowGreen
#property indicator_style2 STYLE_SOLID
#property indicator_width2 1
//--- plotar DI_minus
#property indicator_label3 "DI_minus"
#property indicator_type3 DRAW_LINE
#property indicator_color3 clrWheat
#property indicator_style3 STYLE_SOLID
#property indicator_width3 1
//+------------------------------------------------------------------+
//| Enumerador dos métodos de criação do manipulador  |
//+------------------------------------------------------------------+
enum Creation
{
Call_iADXWilder, // usar iADXWilder
Call_IndicatorCreate // usar IndicatorCreate
};
//--- parâmetros de entrada
input Creation type=Call_iADXWilder; // tipo da função
input int adx_period=14; // cálculo do período
input string symbol=" "; // símbolo
input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // timeframe
//--- buffers do indicador
double ADXBuffer[];
double DI_plusBuffer[];
double DI_minusBuffer[];
//--- variável para armazenar o manipulador do indicador iADXWilder
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 Average Directional Movement Index por Welles Wil
int bars_calculated=0;
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado  |
//+------------------------------------------------------------------+
int OnInit()
{
//--- atribuição de arrays para buffers do indicador

© 2000-2018, MetaQuotes Software Corp.


1729 Indicadores Técnicos

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[],

© 2000-2018, MetaQuotes Software Corp.


1730 Indicadores Técnicos

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 iADXWilder
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 iADXBuffer é maior do que o número de valores no indicador iADXWilder para 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 com valores do indicador Average Directional Movement Index por Welles Wild
//--- se FillArraysFromBuffer retorna falso, isto significa que a informação ainda não está pronta,
if(!FillArraysFromBuffers(ADXBuffer,DI_plusBuffer,DI_minusBuffer,handle,values_to_copy)) return(
//--- 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 Average Directional Movement Index
bars_calculated=calculated;
//--- retorna o valor prev_calculated para a próxima chamada
return(rates_total);
}
//+------------------------------------------------------------------+
//| Preenchendo buffers do indicador a partir do indicador iADXWilder|
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


1731 Indicadores Técnicos

bool FillArraysFromBuffers(double &adx_values[], // buffer do indicador da linha ADX


double &DIplus_values[], // buffer do indicador para DI+
double &DIminus_values[], // buffer do indicador para DI-
int ind_handle, // manipulador do indicador iADXWilder
int amount // número dos valores copiados
)
{
//--- redefinir o código de erro
ResetLastError();
//--- preencher uma parte do array iADXBuffer com valores a partir do buffer do indicador que tem í
if(CopyBuffer(ind_handle,0,0,amount,adx_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,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)
{
//--- limpar o gráfico após excluir o indicador
Comment("");
}

© 2000-2018, MetaQuotes Software Corp.


1732 Indicadores Técnicos

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 _TIMEFRAMES, 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 _APPLIED_PRICE ou um
manipulador de outro indicador.

© 2000-2018, MetaQuotes Software Corp.


1733 Indicadores Técnicos

Valor de retorno
Retorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVALID_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 ORLIPS _LINE.

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
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


1734 Indicadores Técnicos

//| Enumerador dos métodos de criação do manipulador  |


//+------------------------------------------------------------------+
enum Creation
{
Call_iAlligator, // usar iAlligator
Call_IndicatorCreate // usar IndicatorCreate
};
//--- parâmetros de entrada
input Creation type=Call_iAlligator; // 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 JawsBuffer[];
double TeethBuffer[];
double LipsBuffer[];
//--- variável para armazenar o manipulador do indicador
int handle;
//--- variável para armazenamento
string name=symbol;
//--- nome do indicador num gráfico
string short_name;
//--- manteremos o número de valores dentro do indicador Alligator
int bars_calculated=0;
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado  |
//+------------------------------------------------------------------+
int OnInit()
{
//--- atribuição de arrays para buffers do indicador
SetIndexBuffer(0,JawsBuffer,INDICATOR_DATA);
SetIndexBuffer(1,TeethBuffer,INDICATOR_DATA);
SetIndexBuffer(2,LipsBuffer,INDICATOR_DATA);
//--- definir o deslocamento de cada linha
PlotIndexSetInteger(0,PLOT_SHIFT,jaw_shift);
PlotIndexSetInteger(1,PLOT_SHIFT,teeth_shift);
PlotIndexSetInteger(2,PLOT_SHIFT,lips_shift);
//--- determinar o símbolo do indicador, é desenhado para
name=symbol;
//--- excluir os espaços à direita e à esquerda
StringTrimRight(name);
StringTrimLeft(name);

© 2000-2018, MetaQuotes Software Corp.


1735 Indicadores Técnicos

//--- 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_iAlligator)
handle=iAlligator(name,period,jaw_period,jaw_shift,teeth_period,
teeth_shift,lips_period,lips_shift,MA_method,applied_price);
else
{
//--- preencher a estrutura com os parâmetros do indicador
MqlParam pars[8];
  //--- períodos e deslocamentos das linhas do Alligator
pars[0].type=TYPE_INT;
pars[0].integer_value=jaw_period;
pars[1].type=TYPE_INT;
pars[1].integer_value=jaw_shift;
pars[2].type=TYPE_INT;
pars[2].integer_value=teeth_period;
pars[3].type=TYPE_INT;
pars[3].integer_value=teeth_shift;
pars[4].type=TYPE_INT;
pars[4].integer_value=lips_period;
pars[5].type=TYPE_INT;
pars[5].integer_value=lips_shift;
//--- tipo de suavização
pars[6].type=TYPE_INT;
pars[6].integer_value=MA_method;
//--- tipo de preço
pars[7].type=TYPE_INT;
pars[7].integer_value=applied_price;
//--- criar manipulador
handle=IndicatorCreate(name,period,IND_ALLIGATOR,8,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 iAlligator para o símbolo %s/%s, códig
name,
EnumToString(period),
GetLastError());
//--- o indicador é interrompido precocemente
return(INIT_FAILED);
}
//--- mostrar o símbolo/prazo do indicador Alligator calculado para
short_name=StringFormat("iAlligator(%s/%s, %d,%d,%d,%d,%d,%d)",name,EnumToString(period),

© 2000-2018, MetaQuotes Software Corp.


1736 Indicadores Técnicos

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),

© 2000-2018, MetaQuotes Software Corp.


1737 Indicadores Técnicos

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);

© 2000-2018, MetaQuotes Software Corp.


1738 Indicadores Técnicos

}
//--- está tudo bem
return(true);
}
//+------------------------------------------------------------------+
//| Função de desinicialização do indicador |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- limpar o gráfico após excluir o indicador
Comment("");
}

© 2000-2018, MetaQuotes Software Corp.


1739 Indicadores Técnicos

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 _TIMEFRAMES, 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 _APPLIED_PRICE ou um
manipulador de outro indicador.

Valor de retorno
Retorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVALID_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 |
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


1740 Indicadores Técnicos

#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 iAMA."
#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 semelhantes aos do padrão AMA."

#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  |
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


1741 Indicadores Técnicos

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

© 2000-2018, MetaQuotes Software Corp.


1742 Indicadores Técnicos

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),

© 2000-2018, MetaQuotes Software Corp.


1743 Indicadores Técnicos

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)
{
//--- limpar o gráfico após excluir o indicador
Comment("");
}

© 2000-2018, MetaQuotes Software Corp.


1744 Indicadores Técnicos

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 _TIMEFRAMES, 0 (zero) significa o prazo
corrente.

Valor de retorno
Retorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVALID_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
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


1745 Indicadores Técnicos

//| Enumerador dos métodos de criação do manipulador  |


//+------------------------------------------------------------------+
enum Creation
{
Call_iAO, // usar iAO
Call_IndicatorCreate // usar IndicatorCreate
};
//--- parâmetros de entrada
input Creation type=Call_iAO; // tipo de função
input string symbol=" "; // símbolo
input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // timeframe
//--- buffers do indicador
double iAOBuffer[];
double iAOColors[];
//--- variável para armazenar o manipulador do indicador iAO
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 Awesome 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,iAOBuffer,INDICATOR_DATA);
SetIndexBuffer(1,iAOColors,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_iAO)
handle=iAO(name,period);
else
handle=IndicatorCreate(name,period,IND_AO);
//--- se o manipulador não é criado
if(handle==INVALID_HANDLE)
{

© 2000-2018, MetaQuotes Software Corp.


1746 Indicadores Técnicos

//--- mensagem sobre a falha e a saída do código de erro


PrintFormat("Falha ao criar o manipulador do indicador iAO 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/período o indicador Awesome Oscillator é calculado para
short_name=StringFormat("iAO(%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 copiado do indicator iAO
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 no indicador fo
//--- 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 iAOBuffer é maior do que os valores no indicador iAO para símbolo/período, e
//--- 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

© 2000-2018, MetaQuotes Software Corp.


1747 Indicadores Técnicos

//--- para o cálculo não mais do que uma barra é adicionada


values_to_copy=(rates_total-prev_calculated)+1;
}
//--- preencher os arrays iAOBuffer e iAOColors com valores a partir do indicador Awesome Oscillato
//--- se FillArraysFromBuffer retorna falso, isto significa que a informação ainda não está pronta,
if(!FillArraysFromBuffer(iAOBuffer,iAOColors,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);
}
//+------------------------------------------------------------------+
//| Preencher os buffers do indicador a partir do indicador iAO  |
//+------------------------------------------------------------------+
bool FillArraysFromBuffer(double &values[], // buffer do indicador dos valores do Awesome Os
double &color_indexes[], // buffer de cor(para armazenar o índice das cor
int ind_handle, // manipulador do indicador iAO
int amount // número dos valores copiados
)
{
//--- redefinir o código de erro
ResetLastError();
//--- preencher uma parte do array iAOBuffer com valores a partir do buffer do indicador que tem ín
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 iAO, 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 do indicador iAO, 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);
}
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


1748 Indicadores Técnicos

//| Função de desinicialização do indicador |


//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- limpar o gráfico após excluir o indicador
Comment("");
}

© 2000-2018, MetaQuotes Software Corp.


1749 Indicadores Técnicos

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 _TIMEFRAMES, 0 (zero) significa o prazo
corrente.

ma_period
[in] O valor do período médio para cálculo do indicador.

Valor de retorno
Retorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVALID_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

© 2000-2018, MetaQuotes Software Corp.


1750 Indicadores Técnicos

#property indicator_style1 STYLE_SOLID


#property indicator_width1 1
//+------------------------------------------------------------------+
//| Enumerador dos métodos de criação do manipulador  |
//+------------------------------------------------------------------+
enum Creation
{
Call_iATR,// usar iATR
Call_IndicatorCreate // usar IndicatorCreate
};
//--- parâmetros de entrada
input int atr_period=14; // cálculo do período
input Creation type=Call_iATR; // tipo da função
input string symbol=" "; // símbolo
input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // timeframe
//--- buffer do indicador
double iATRBuffer[];
//--- 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;
//--- manteremos o número dos valores do indicador Average True Range indicator
int bars_calculated=0;
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado  |
//+------------------------------------------------------------------+
int OnInit()
{
//--- atribuição de array para buffer do indicador
SetIndexBuffer(0,iATRBuffer,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_iATR)
handle=iATR(name,period,atr_period);
else
{
//--- preencher a estrutura com os parâmetros do indicador

© 2000-2018, MetaQuotes Software Corp.


1751 Indicadores Técnicos

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)
{

© 2000-2018, MetaQuotes Software Corp.


1752 Indicadores Técnicos

//--- 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 |

© 2000-2018, MetaQuotes Software Corp.


1753 Indicadores Técnicos

//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- limpar o gráfico após excluir o indicador
Comment("");
}

© 2000-2018, MetaQuotes Software Corp.


1754 Indicadores Técnicos

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 _TIMEFRAMES, 0 (zero) significa o prazo
corrente.

ma_period
[in] O valor do período médio para cálculo do indicador.

Valor de retorno
Retorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVALID_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

© 2000-2018, MetaQuotes Software Corp.


1755 Indicadores Técnicos

#property indicator_style1 STYLE_SOLID


#property indicator_width1 1
//+------------------------------------------------------------------+
//| Enumerador dos métodos de criação do manipulador  |
//+------------------------------------------------------------------+
enum Creation
{
Call_iBearsPower, // usar iBearsPower
Call_IndicatorCreate // usar IndicatorCreate
};
//--- parâmetros de entrada
input Creation type=Call_iBearsPower; // tipo da função
input int ma_period=13; // período da média móvel
input string symbol=" "; // símbolo
input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // timeframe
//--- buffer do indicador
double iBearsPowerBuffer[];
//--- variável para armazenar o manipulador do indicador iBearsPower
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 Bears Power
int bars_calculated=0;
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado  |
//+------------------------------------------------------------------+
int OnInit()
{
//--- atribuição de array para buffer do indicador
SetIndexBuffer(0,iBearsPowerBuffer,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_iBearsPower)
handle=iBearsPower(name,period,ma_period);
else
{
//--- preencher a estrutura com os parâmetros do indicador

© 2000-2018, MetaQuotes Software Corp.


1756 Indicadores Técnicos

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)

© 2000-2018, MetaQuotes Software Corp.


1757 Indicadores Técnicos

{
//--- 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);
}
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


1758 Indicadores Técnicos

//| Função de desinicialização do indicador |


//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- limpar o gráfico após excluir o indicador
Comment("");
}

© 2000-2018, MetaQuotes Software Corp.


1759 Indicadores Técnicos

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 _TIMEFRAMES, 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 _APPLIED_PRICE ou um
manipulador de outro indicador.

Valor de retorno
Retorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVALID_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 |
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


1760 Indicadores Técnicos

#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 "buffers do indicador para o indicador técnico iBands."
#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 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[];

© 2000-2018, MetaQuotes Software Corp.


1761 Indicadores Técnicos

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;

© 2000-2018, MetaQuotes Software Corp.


1762 Indicadores Técnicos

//--- tipo de preço


pars[3].type=TYPE_INT;
pars[3].integer_value=applied_price;
handle=IndicatorCreate(name,period,IND_BANDS,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 iBands 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 Bollinger Bands é calculado para
short_name=StringFormat("iBands(%s/%s, %d,%d,%G,%s)",name,EnumToString(period),
bands_period,bands_shift,deviation,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 iBands
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)

© 2000-2018, MetaQuotes Software Corp.


1763 Indicadores Técnicos

{
//--- 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);
}

© 2000-2018, MetaQuotes Software Corp.


1764 Indicadores Técnicos

//--- 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)
{
//--- limpar o gráfico após excluir o indicador
Comment("");
}

© 2000-2018, MetaQuotes Software Corp.


1765 Indicadores Técnicos

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 _TIMEFRAMES, 0 (zero) significa o prazo
corrente.

ma_period
[in] O período médio para cálculo do indicador.

Valor de retorno
Retorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVALID_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

© 2000-2018, MetaQuotes Software Corp.


1766 Indicadores Técnicos

#property indicator_style1 STYLE_SOLID


#property indicator_width1 1
//+------------------------------------------------------------------+
//| Enumerador dos métodos de criação do manipulador  |
//+------------------------------------------------------------------+
enum Creation
{
Call_iBullsPower, // usar iBullsPower
Call_IndicatorCreate // usar IndicatorCreate
};
//--- parâmetros de entrada
input Creation type=Call_iBullsPower; // tipo da função
input int ma_period=13; // período da média móvel
input string symbol=" "; // símbolo
input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // timeframe
//--- buffer do indicador
double iBullsPowerBuffer[];
//--- variável para armazenar o manipulador do indicador iBullsPower
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 Bulls Power
int bars_calculated=0;
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado  |
//+------------------------------------------------------------------+
int OnInit()
{
//--- atribuição de array para buffer do indicador
SetIndexBuffer(0,iBullsPowerBuffer,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_iBullsPower)
handle=iBullsPower(name,period,ma_period);
else
{
//--- preencher a estrutura com os parâmetros do indicador

© 2000-2018, MetaQuotes Software Corp.


1767 Indicadores Técnicos

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)

© 2000-2018, MetaQuotes Software Corp.


1768 Indicadores Técnicos

{
//--- 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);
}
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


1769 Indicadores Técnicos

//| Função de desinicialização do indicador |


//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- limpar o gráfico após excluir o indicador
Comment("");
}
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


1770 Indicadores Técnicos

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 _TIMEFRAMES, 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 _APPLIED_PRICE ou um
manipulador de outro indicador.

Valor de retorno
Retorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVALID_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

© 2000-2018, MetaQuotes Software Corp.


1771 Indicadores Técnicos

#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)
{

© 2000-2018, MetaQuotes Software Corp.


1772 Indicadores Técnicos

//--- tomar o símbolo do gráfico, o indicador está anexado para


name=_Symbol;
}
//--- criar manipulador do indicador
if(type==Call_iCCI)
handle=iCCI(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;
//--- tipo de preço
pars[1].type=TYPE_INT;
pars[1].integer_value=applied_price;
handle=IndicatorCreate(name,period,IND_CCI,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 iCCI 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 iCCI é calculado para
short_name=StringFormat("iCCI(%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[])

© 2000-2018, MetaQuotes Software Corp.


1773 Indicadores Técnicos

{
//--- 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

© 2000-2018, MetaQuotes Software Corp.


1774 Indicadores Técnicos

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)
{
//--- limpar o gráfico após excluir o indicador
Comment("");
}

© 2000-2018, MetaQuotes Software Corp.


1775 Indicadores Técnicos

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 _TIMEFRAMES, 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 _APPLIED_VOLUME.

Valor de retorno
Retorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVALID_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"

© 2000-2018, MetaQuotes Software Corp.


1776 Indicadores Técnicos

#property description "de buffers do indicador para o indicador técnico iChaikin."


#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 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;

© 2000-2018, MetaQuotes Software Corp.


1777 Indicadores Técnicos

//--- 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_iChaikin)
handle=iChaikin(name,period,fast_ma_period,slow_ma_period,ma_method,applied_volume);
else
{
//--- preencher a estrutura com os parâmetros do indicador
MqlParam pars[4];
//--- período rápido da média móvel
pars[0].type=TYPE_INT;
pars[0].integer_value=fast_ma_period;
//--- período lento da média móvel
pars[1].type=TYPE_INT;
pars[1].integer_value=slow_ma_period;
//--- tipo de suavização
pars[2].type=TYPE_INT;
pars[2].integer_value=ma_method;
//--- tipo de volume
pars[3].type=TYPE_INT;
pars[3].integer_value=applied_volume;
handle=IndicatorCreate(name,period,IND_CHAIKIN,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 iChaikin 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 Chaikin Oscillator é calculado para
short_name=StringFormat("iChaikin(%s/%s, %d, %d, %s, %s)",name,EnumToString(period),
fast_ma_period,slow_ma_period,
EnumToString(ma_method),EnumToString(applied_volume));
IndicatorSetString(INDICATOR_SHORTNAME,short_name);
//--- inicialização normal do indicador
return(INIT_SUCCEEDED);
}

© 2000-2018, MetaQuotes Software Corp.


1778 Indicadores Técnicos

//+------------------------------------------------------------------+
//| 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

© 2000-2018, MetaQuotes Software Corp.


1779 Indicadores Técnicos

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)
{
//--- limpar o gráfico após excluir o indicador
Comment("");
}

© 2000-2018, MetaQuotes Software Corp.


1780 Indicadores Técnicos

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 _TIMEFRAMES, 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
Retorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVALID_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"

Se o primeiro formulário de chamada é usado no indicador, então na inicialização do indicador, na


aba "Parâmetros " , você pode escolher dados adicionais para cálculo. Se a opção " Aplicar para" do
parâmetro não é selecionada, o cálculo padrão baseia-se nos valores "Fechamento" dos preços.

© 2000-2018, MetaQuotes Software Corp.


1781 Indicadores Técnicos

Quando você chama um indicador personalizado a partir do programa MQL5, o parâmetro


Applied_Price ou um manipulador de outro indicador deve ser passado por último, depois de todas as
variáveis de entrada do indicador personalizado.

Também Veja
Propriedades de Programa, Séries T emporais e Acesso a Indicadores,IndicatorCreate(),
IndicatorRelease()

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

© 2000-2018, MetaQuotes Software Corp.


1782 Indicadores Técnicos

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);
}
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


1783 Indicadores Técnicos

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 _TIMEFRAMES, 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 _APPLIED_PRICE ou um
manipulador de outro indicador.

Valor de retorno
Retorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVALID_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,"

© 2000-2018, MetaQuotes Software Corp.


1784 Indicadores Técnicos

#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
//--- 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

© 2000-2018, MetaQuotes Software Corp.


1785 Indicadores Técnicos

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,

© 2000-2018, MetaQuotes Software Corp.


1786 Indicadores Técnicos

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 iDEMA
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 iDEMABuffer é maior do que o número de valores no indicador iDEMA 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 iDEMABuffer com valores do indicador Double Exponential Moving Average
//--- se FillArrayFromBuffer retorna falso, significa que a informação não está pronta ainda, sair
if(!FillArrayFromBuffer(iDEMABuffer,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 Double Exponential Moving Average
bars_calculated=calculated;
//--- retorna o valor prev_calculated para a próxima chamada
return(rates_total);
}
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


1787 Indicadores Técnicos

//| Preencher buffers do indicador a partir do indicador iDEMA |


//+------------------------------------------------------------------+
bool FillArrayFromBuffer(double &values[], // buffer do indicator para valores do Double Exponenti
int shift, // deslocamento
int ind_handle, // manipulador do indicador iDEMA
int amount // número de valores copiados
)
{
//--- redefinir o código de erro
ResetLastError();
//--- preencher uma parte do array iDEMABuffer com valores do buffer do indicador que tem índice 0
if(CopyBuffer(ind_handle,0,-shift,amount,values)<0)
{
//--- Se a cópia falhar, informe o código de erro
PrintFormat("Falha ao copiar dados do indicador iDEMA, 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)
{
//--- limpar o gráfico após excluir o indicador
Comment("");
}

© 2000-2018, MetaQuotes Software Corp.


1788 Indicadores Técnicos

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 _TIMEFRAMES, 0 (zero) significa o prazo
corrente.

ma_period
[in] Período médio (barras contadas) para os cálculos.

Valor de retorno
Retorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVALID_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

© 2000-2018, MetaQuotes Software Corp.


1789 Indicadores Técnicos

#property indicator_style1 STYLE_SOLID


#property indicator_width1 1
//--- níveis horizontais na janela de indicador
#property indicator_level1 0.3
#property indicator_level2 0.7
//+------------------------------------------------------------------+
//| Enumerador dos métodos de criação do manipulador  |
//+------------------------------------------------------------------+
enum Creation
{
Call_iDeMarker, // usar iDeMarker
Call_IndicatorCreate // usar IndicatorCreate
};
//--- parâmetros de entrada
input Creation type=Call_iDeMarker; // tipo de função
input int ma_period=14; // período de média móvel
input string symbol=" "; // símbolo
input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // timeframe
//--- buffer do indicador
double iDeMarkerBuffer[];
//--- variável para armazenar o manipulador do indicator iDeMarker
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 DeMarker
int bars_calculated=0;
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado  |
//+------------------------------------------------------------------+
int OnInit()
{
//--- atribuição de array para buffer do indicador
SetIndexBuffer(0,iDeMarkerBuffer,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_iDeMarker)
handle=iDeMarker(name,period,ma_period);

© 2000-2018, MetaQuotes Software Corp.


1790 Indicadores Técnicos

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);
}

© 2000-2018, MetaQuotes Software Corp.


1791 Indicadores Técnicos

//--- 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 iDeMarkerBuffer é maior do que o número de valores no indicador iDeMarker 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 iDeMarkerBuffer com valores do indicador DeMarker
//--- se FillArrayFromBuffer retorna falso, significa que a informação não está pronta ainda, sair
if(!FillArrayFromBuffer(iDeMarkerBuffer,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 DeMarker
bars_calculated=calculated;
//--- retorna o valor prev_calculated para a próxima chamada
return(rates_total);
}
//+------------------------------------------------------------------+
//| Preencher buffers do indicador a partir do indicador iDeMarker |
//+------------------------------------------------------------------+
bool FillArrayFromBuffer(double &values[], // buffer do indicator para valores do DeMarker
int ind_handle, // manipulador do indicador iDeMarker
int amount // número de valores copiados
)
{
//--- redefinir o código de erro
ResetLastError();
//--- preencher uma parte do array iDeMarkerBuffer 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 iDeMarker, código de erro %d",GetLastError())
//--- parar com resultado zero - significa que indicador é considerado como não calculado
return(false);
}
//--- está tudo bem

© 2000-2018, MetaQuotes Software Corp.


1792 Indicadores Técnicos

return(true);
}
//+------------------------------------------------------------------+
//| Função de desinicialização do indicador |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- limpar o gráfico após excluir o indicador
Comment("");
}

© 2000-2018, MetaQuotes Software Corp.


1793 Indicadores Técnicos

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 _TIMEFRAMES, 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 _APPLIED_PRICE ou um
manipulador de outro indicador.

deviation
[in] O desvio da linha principal (em porcentagem).

Valor de retorno
Retorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVALID_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:
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


1794 Indicadores Técnicos

//| 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

© 2000-2018, MetaQuotes Software Corp.


1795 Indicadores Técnicos

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

© 2000-2018, MetaQuotes Software Corp.


1796 Indicadores Técnicos

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)
{

© 2000-2018, MetaQuotes Software Corp.


1797 Indicadores Técnicos

//--- 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)
{

© 2000-2018, MetaQuotes Software Corp.


1798 Indicadores Técnicos

//--- 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);
}
//--- está tudo bem
return(true);
}
//+------------------------------------------------------------------+
//| Função de desinicialização do indicador |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- limpar o gráfico após excluir o indicador
Comment("");
}

© 2000-2018, MetaQuotes Software Corp.


1799 Indicadores Técnicos

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 _TIMEFRAMES, 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 _APPLIED_VOLUME.

Valor de retorno
Retorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVALID_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

© 2000-2018, MetaQuotes Software Corp.


1800 Indicadores Técnicos

#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)

© 2000-2018, MetaQuotes Software Corp.


1801 Indicadores Técnicos

{
//--- 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[],

© 2000-2018, MetaQuotes Software Corp.


1802 Indicadores Técnicos

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 iForce
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 iForceBuffer é maior do que o número de valores no indicador iForce 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 iForceBuffer com valores do indicador Force
//--- se FillArrayFromBuffer retorna falso, significa que a informação não está pronta ainda, sair
if(!FillArrayFromBuffer(iForceBuffer,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 Force
bars_calculated=calculated;
//--- retorna o valor prev_calculated para a próxima chamada
return(rates_total);
}
//+------------------------------------------------------------------+
//| Preencher buffers do indicador a partir do indicador iForce |
//+------------------------------------------------------------------+
bool FillArrayFromBuffer(double &values[], // buffer do indicator para valores do Force Index

© 2000-2018, MetaQuotes Software Corp.


1803 Indicadores Técnicos

int ind_handle, // manipulador do indicador iForce


int amount // número de valores copiados
)
{
//--- redefinir o código de erro
ResetLastError();
//--- preencher uma parte do array iForceBuffer 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 iForce, 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)
{
//--- limpar o gráfico após excluir o indicador
Comment("");
}

© 2000-2018, MetaQuotes Software Corp.


1804 Indicadores Técnicos

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 _TIMEFRAMES, 0 (zero) significa o prazo
corrente.

Valor de retorno
Retorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVALID_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

© 2000-2018, MetaQuotes Software Corp.


1805 Indicadores Técnicos

#property indicator_label1 "FractalUp"


#property indicator_type1 DRAW_ARROW
#property indicator_color1 clrBlue
//--- plotar FractalDown
#property indicator_label2 "FractalDown"
#property indicator_type2 DRAW_ARROW
#property indicator_color2 clrRed
//+------------------------------------------------------------------+
//| Enumerador dos métodos de criação do manipulador  |
//+------------------------------------------------------------------+
enum Creation
{
Call_iFractals, // usar iFractals
Call_IndicatorCreate // usar IndicatorCreate
};
//--- parâmetros de entrada
input Creation type=Call_iFractals; // tipo de função
input string symbol=" "; // símbolo
input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // timeframe
//--- buffers do indicador
double FractalUpBuffer[];
double FractalDownBuffer[];
//--- variável para armazenar o manipulador do indicator iFractals
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 Fractals
int bars_calculated=0;
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado  |
//+------------------------------------------------------------------+
int OnInit()
{
//--- atribuição de arrays para buffers do indicador
SetIndexBuffer(0,FractalUpBuffer,INDICATOR_DATA);
SetIndexBuffer(1,FractalDownBuffer,INDICATOR_DATA);
//--- definir códigos usando um símbolo do conjunto de caractres Wingdings para a propriedade PLOT_
PlotIndexSetInteger(0,PLOT_ARROW,217); // seta acima
PlotIndexSetInteger(1,PLOT_ARROW,218); // seta abaixo
//--- 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)
{

© 2000-2018, MetaQuotes Software Corp.


1806 Indicadores Técnicos

//--- tomar o símbolo do gráfico, o indicador está anexado para


name=_Symbol;
}
//--- criar manipulador do indicador
if(type==Call_iFractals)
handle=iFractals(name,period);
else
handle=IndicatorCreate(name,period,IND_FRACTALS);
//--- 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 iFractals 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 Fractals é calculado para
short_name=StringFormat("iFractals(%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 iFractals
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

© 2000-2018, MetaQuotes Software Corp.


1807 Indicadores Técnicos

//--- 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);
}

© 2000-2018, MetaQuotes Software Corp.


1808 Indicadores Técnicos

//--- 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)
{
//--- limpar o gráfico após excluir o indicador
Comment("");
}

© 2000-2018, MetaQuotes Software Corp.


1809 Indicadores Técnicos

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 _TIMEFRAMES, 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 _APPLIED_PRICE ou um
manipulador de outro indicador.

Valor de retorno
Retorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVALID_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."

© 2000-2018, MetaQuotes Software Corp.


1810 Indicadores Técnicos

#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);

© 2000-2018, MetaQuotes Software Corp.


1811 Indicadores Técnicos

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,

© 2000-2018, MetaQuotes Software Corp.


1812 Indicadores Técnicos

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 iFrAMA
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 iFrAMABuffer é maior do que o número de valores no indicador iFrAMA 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 iFrAMABuffer com valores do indicador Fractal Adaptive Moving Average
//--- se FillArrayFromBuffer retorna falso, significa que a informação não está pronta ainda, sair
if(!FillArrayFromBuffer(iFrAMABuffer,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 Fractal Adaptive Moving Average
bars_calculated=calculated;
//--- retorna o valor prev_calculated para a próxima chamada
return(rates_total);
}
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


1813 Indicadores Técnicos

//| Preencher buffers do indicador a partir do indicador iFrAMA |


//+------------------------------------------------------------------+
bool FillArrayFromBuffer(double &values[], // buffer do indicator para valores do Fractal Adaptive
int shift, // deslocamento
int ind_handle, // manipulador do indicador iFrAMA
int amount // número de valores copiados
)
{
//--- redefinir o código de erro
ResetLastError();
//--- preencher uma parte do array iFrAMABuffer com valores do buffer do indicador que tem índice 0
if(CopyBuffer(ind_handle,0,-shift,amount,values)<0)
{
//--- Se a cópia falhar, informe o código de erro
PrintFormat("Falha ao copiar dados do indicador iFrAMA, 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)
{
//--- limpar o gráfico após excluir o indicador
Comment("");
}

© 2000-2018, MetaQuotes Software Corp.


1814 Indicadores Técnicos

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 _TIMEFRAMES, 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.

© 2000-2018, MetaQuotes Software Corp.


1815 Indicadores Técnicos

applied_price
[in] O preço usado. Pode ser qualquer das constantes de preços ENUM _APPLIED_PRICE ou um
manipulador de outro indicador.

Valor de retorno
Retorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVALID_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 OGRAM, 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

© 2000-2018, MetaQuotes Software Corp.


1816 Indicadores Técnicos

{
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);

© 2000-2018, MetaQuotes Software Corp.


1817 Indicadores Técnicos

//--- apesar do indicador conter dois histogramas, o mesmo deslocamento é usado - esta é a execução
PlotIndexSetInteger(1,PLOT_SHIFT,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_iGator)
handle=iGator(name,period,jaw_period,jaw_shift,teeth_period,teeth_shift,
lips_period,lips_shift,MA_method,applied_price);
else
{
//--- preencher a estrutura com os parâmetros do indicador
MqlParam pars[8];
//--- períodos e deslocamentos da linhas do Alligator
pars[0].type=TYPE_INT;
pars[0].integer_value=jaw_period;
pars[1].type=TYPE_INT;
pars[1].integer_value=jaw_shift;
pars[2].type=TYPE_INT;
pars[2].integer_value=teeth_period;
pars[3].type=TYPE_INT;
pars[3].integer_value=teeth_shift;
pars[4].type=TYPE_INT;
pars[4].integer_value=lips_period;
pars[5].type=TYPE_INT;
pars[5].integer_value=lips_shift;
//--- tipo de suavização
pars[6].type=TYPE_INT;
pars[6].integer_value=MA_method;
//--- tipo de preço
pars[7].type=TYPE_INT;
pars[7].integer_value=applied_price;
//--- criando o manipulador
handle=IndicatorCreate(name,period,IND_GATOR,8,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 iGator para o símbolo %s/%s, código de

© 2000-2018, MetaQuotes Software Corp.


1818 Indicadores Técnicos

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

© 2000-2018, MetaQuotes Software Corp.


1819 Indicadores Técnicos

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);
}

© 2000-2018, MetaQuotes Software Corp.


1820 Indicadores Técnicos

//--- 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)
{
//--- limpar o gráfico após excluir o indicador
Comment("");
}

© 2000-2018, MetaQuotes Software Corp.


1821 Indicadores Técnicos

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 _TIMEFRAMES, 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
Retorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVALID_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 - SENKOUS PANA_L INE, 3 -
SENKOUS PANB_L INE, 4 - CHIKOUS PAN_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"

© 2000-2018, MetaQuotes Software Corp.


1822 Indicadores Técnicos

#property description "de buffers do indicador para o indicador técnico iIchimoku."


#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 Ichimoku Kinko Hyo."

#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

© 2000-2018, MetaQuotes Software Corp.


1823 Indicadores Técnicos

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;

© 2000-2018, MetaQuotes Software Corp.


1824 Indicadores Técnicos

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

© 2000-2018, MetaQuotes Software Corp.


1825 Indicadores Técnicos

//--- 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

© 2000-2018, MetaQuotes Software Corp.


1826 Indicadores Técnicos

PrintFormat("1.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 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 |

© 2000-2018, MetaQuotes Software Corp.


1827 Indicadores Técnicos

//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- limpar o gráfico após excluir o indicador
Comment("");
}

© 2000-2018, MetaQuotes Software Corp.


1828 Indicadores Técnicos

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 _TIMEFRAMES, 0 (zero) significa o prazo
corrente.

applied_volume
[in] O volume usado. Pode ser uma das constantes do ENUM _APPLIED_VOLUME.

Valor de retorno
Retorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVALID_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

© 2000-2018, MetaQuotes Software Corp.


1829 Indicadores Técnicos

#property indicator_style1 STYLE_SOLID


#property indicator_width1 1
//+------------------------------------------------------------------+
//| Enumerador dos métodos de criação do manipulador  |
//+------------------------------------------------------------------+
enum Creation
{
Call_iBWMFI, // usar iBWMFI
Call_IndicatorCreate // usar IndicatorCreate
};
//--- parâmetros de entrada
input Creation type=Call_iBWMFI; // tipo de funçã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 iBWMFIBuffer[];
double iBWMFIColors[];
//--- variável para armazenar o manipulador do indicator iBWMFI
int handle;
//--- variável para armazenamento
string name=symbol;
//--- nome do indicador num gráfico
string short_name;
//--- variável para armazenar o manipulador do indicador Market Facilitation Index por Bill William
int bars_calculated=0;
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado  |
//+------------------------------------------------------------------+
int OnInit()
{
//--- atribuição de arrays para buffers do indicador
SetIndexBuffer(0,iBWMFIBuffer,INDICATOR_DATA);
SetIndexBuffer(1,iBWMFIColors,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_iBWMFI)
handle=iBWMFI(name,period,applied_volume);
else

© 2000-2018, MetaQuotes Software Corp.


1830 Indicadores Técnicos

{
//--- 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);
}

© 2000-2018, MetaQuotes Software Corp.


1831 Indicadores Técnicos

//--- 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 iBWMFIBuffer é maior do que o número de valores no indicador iBWMFI 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 os arrays com os valores do indicador Market Facilitation Index por Bill Williams
//--- se FillArraysFromBuffer retorna falso, isto significa que a informação ainda não está pronta,
if(!FillArraysFromBuffers(iBWMFIBuffer,iBWMFIColors,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 Market Facilitation Index por Bill Williams
bars_calculated=calculated;
//--- retorna o valor prev_calculated para a próxima chamada
return(rates_total);
}
//+------------------------------------------------------------------+
//| Preencher buffers do indicador a partir do indicador iBWMFI |
//+------------------------------------------------------------------+
bool FillArraysFromBuffers(double &values[], // buffer do indicator para os valores do histogram
double &colors[], // buffer do indicator para cores do histograma
int ind_handle, // manipulado do indicador iBWMFI
int amount // número de valores copiado
)
{
//--- redefinir o código de erro
ResetLastError();
//--- preencher uma parte do array iBWMFIBuffer com valores do indicador buffer do indicador que te
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 iBWMFI, código de erro %d",GetLastError());
//--- parar com resultado zero - significa que indicador é considerado como não calculado
return(false);
}

© 2000-2018, MetaQuotes Software Corp.


1832 Indicadores Técnicos

//--- 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)
{
//--- limpar o gráfico após excluir o indicador
Comment("");
}

© 2000-2018, MetaQuotes Software Corp.


1833 Indicadores Técnicos

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 _TIMEFRAMES, 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 _APPLIED_PRICE ou um
manipulador de outro indicador.

Valor de retorno
Retorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVALID_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

© 2000-2018, MetaQuotes Software Corp.


1834 Indicadores Técnicos

#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;

© 2000-2018, MetaQuotes Software Corp.


1835 Indicadores Técnicos

}
//--- 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

© 2000-2018, MetaQuotes Software Corp.


1836 Indicadores Técnicos

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

© 2000-2018, MetaQuotes Software Corp.


1837 Indicadores Técnicos

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)
{
//--- limpar o gráfico após excluir o indicador
Comment("");
}

© 2000-2018, MetaQuotes Software Corp.


1838 Indicadores Técnicos

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 _TIMEFRAMES, 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 _APPLIED_VOLUME.

Valor de retorno
Retorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVALID_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

© 2000-2018, MetaQuotes Software Corp.


1839 Indicadores Técnicos

#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)
{

© 2000-2018, MetaQuotes Software Corp.


1840 Indicadores Técnicos

//--- tomar o símbolo do gráfico, o indicador está anexado para


name=_Symbol;
}
//--- criar manipulador do indicador
if(type==Call_iMFI)
handle=iMFI(name,period,ma_period,applied_volume);
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 volume
pars[1].type=TYPE_INT;
pars[1].integer_value=applied_volume;
handle=IndicatorCreate(name,period,IND_MFI,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 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 Money Flow Index é calculado para
short_name=StringFormat("iMFI(%s/%s, %d, %s)",name,EnumToString(period),
ma_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[])

© 2000-2018, MetaQuotes Software Corp.


1841 Indicadores Técnicos

{
//--- 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

© 2000-2018, MetaQuotes Software Corp.


1842 Indicadores Técnicos

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)
{
//--- limpar o gráfico após excluir o indicador
Comment("");
}

© 2000-2018, MetaQuotes Software Corp.


1843 Indicadores Técnicos

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 _TIMEFRAMES, 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 _APPLIED_PRICE ou um
manipulador de outro indicador.

Valor de retorno
Retorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVALID_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"

© 2000-2018, MetaQuotes Software Corp.


1844 Indicadores Técnicos

#property description "O indicador demonstra como obter dados"


#property description "de buffers do indicador para o indicador técnico iMA."
#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 Moving Average."

#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);

© 2000-2018, MetaQuotes Software Corp.


1845 Indicadores Técnicos

//--- 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_iMA)
handle=iMA(name,period,ma_period,ma_shift,ma_method,applied_price);
else
{
//--- preencher a estrutura com os parâmetros do indicador
MqlParam pars[4];
//--- período
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;
handle=IndicatorCreate(name,period,IND_MA,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 iMA para o símbolo %s/%s, código de er
name,
EnumToString(period),
GetLastError());
//--- o indicador é interrompido precocemente
return(INIT_FAILED);
}
//--- mostra que o símbolo/prazo do indicador Moving Average é calculado para
short_name=StringFormat("iMA(%s/%s, %d, %d, %s, %s)",name,EnumToString(period),
ma_period, ma_shift,EnumToString(ma_method),EnumToString(applied_price))
IndicatorSetString(INDICATOR_SHORTNAME,short_name);

© 2000-2018, MetaQuotes Software Corp.


1846 Indicadores Técnicos

//--- 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 iMA
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 iMABuffer é maior do que o número de valores no indicador iMA para o 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 iMABuffer com valores do indicador Adaptive Moving Average
//--- se FillArrayFromBuffer retorna falso, significa que a informação não está pronta ainda, sair
if(!FillArrayFromBuffer(iMABuffer,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);

© 2000-2018, MetaQuotes Software Corp.


1847 Indicadores Técnicos

//--- exibir a mensagem de serviço no gráfico


Comment(comm);
//--- memorizar o número de valores no indicador Moving Average
bars_calculated=calculated;
//--- retorna o valor prev_calculated para a próxima chamada
return(rates_total);
}
//+------------------------------------------------------------------+
//| Preencher buffers do indicador a partir do indicador MA |
//+------------------------------------------------------------------+
bool FillArrayFromBuffer(double &values[], // buffer do indicator para valores do Moving Average
int shift, // deslocamento
int ind_handle, // manipulador do indicador iMA
int amount // número de valores copiados
)
{
//--- redefinir o código de erro
ResetLastError();
//--- preencher uma parte do array iMABuffer com valores do buffer do indicador que tem índice 0 (z
if(CopyBuffer(ind_handle,0,-shift,amount,values)<0)
{
//--- Se a cópia falhar, informe o código de erro
PrintFormat("Falha ao copiar dados do indicador iMA, 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)
{
//--- limpar o gráfico após excluir o indicador
Comment("");
}

© 2000-2018, MetaQuotes Software Corp.


1848 Indicadores Técnicos

iOsMA
A função retorna o manipulador do indicador M oving Average of Oscillator. O oscilador Оs МА mostra 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 _TIMEFRAMES, 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 _APPLIED_PRICE ou um
manipulador de outro indicador.

Valor de retorno
Retorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVALID_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 |

© 2000-2018, MetaQuotes Software Corp.


1849 Indicadores Técnicos

//+------------------------------------------------------------------+
#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  |
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


1850 Indicadores Técnicos

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),

© 2000-2018, MetaQuotes Software Corp.


1851 Indicadores Técnicos

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),

© 2000-2018, MetaQuotes Software Corp.


1852 Indicadores Técnicos

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)
{
//--- limpar o gráfico após excluir o indicador
Comment("");
}

© 2000-2018, MetaQuotes Software Corp.


1853 Indicadores Técnicos

iMACD
A função retorna o manipulador do indicador Moving Averages Convergence/Divergence. Em sistemas
onde Оs МА é chamado Histograma M ACD, este 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 _TIMEFRAMES, 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 _APPLIED_PRICE ou um
manipulador de outro indicador.

Valor de retorno
Retorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVALID_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. |

© 2000-2018, MetaQuotes Software Corp.


1854 Indicadores Técnicos

//| ;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

© 2000-2018, MetaQuotes Software Corp.


1855 Indicadores Técnicos

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

© 2000-2018, MetaQuotes Software Corp.


1856 Indicadores Técnicos

PrintFormat("Falha ao criar o manipulador do indicador iMACD 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 Convergence/Divergence é calculado par
short_name=StringFormat("iMACD(%s/%s,%d,%d,%d,%s)",name,EnumToString(period),
fast_ema_period,slow_ema_period,signal_period,EnumToString(applied_price
IndicatorSetString(INDICATOR_SHORTNAME,short_name);
//--- 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 iMACD
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 MACDBuffer é maior do que o número de valores no indicador iMACD para o símb
//--- 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

© 2000-2018, MetaQuotes Software Corp.


1857 Indicadores Técnicos

//--- 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 iMACD
//--- se FillArraysFromBuffer retorna falso, isto significa que a informação ainda não está pronta,
if(!FillArraysFromBuffers(MACDBuffer,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 Moving Averages Convergence/Divergence
bars_calculated=calculated;
//--- retorna o valor prev_calculated para a próxima chamada
return(rates_total);
}
//+------------------------------------------------------------------+
//| Preencher buffers do indicador a partir do indicador iMACD |
//+------------------------------------------------------------------+
bool FillArraysFromBuffers(double &macd_buffer[], // buffer do indicator para valores de MACD
double &signal_buffer[], // buffer do indicator da linha de sinal do in
int ind_handle, // manipulador do indicador iMACD
int amount // número de valores copiados
)
{
//--- redefinir o código de erro
ResetLastError();
//--- preencher uma parte do array iMACDBuffer com valores do buffer do indicador que tem índice 0
if(CopyBuffer(ind_handle,0,0,amount,macd_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);
}

//--- 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);
}

© 2000-2018, MetaQuotes Software Corp.


1858 Indicadores Técnicos

//+------------------------------------------------------------------+
//| Função de desinicialização do indicador |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- limpar o gráfico após excluir o indicador
Comment("");
}

© 2000-2018, MetaQuotes Software Corp.


1859 Indicadores Técnicos

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 _TIMEFRAMES, 0 (zero) significa o prazo
corrente.

applied_volume
[in] O volume usado. Pode ser um dos valores ENUM _APPLIED_VOLUME.

Valor de retorno
Retorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVALID_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

© 2000-2018, MetaQuotes Software Corp.


1860 Indicadores Técnicos

#property indicator_style1 STYLE_SOLID


#property indicator_width1 1
//+------------------------------------------------------------------+
//| Enumerador dos métodos de criação do manipulador  |
//+------------------------------------------------------------------+
enum Creation
{
Call_iOBV , // usar iOBV
Call_IndicatorCreate // usar IndicatorCreate
};
//--- parâmetros de entrada
input Creation type=Call_iOBV; // tipo de função
input ENUM_APPLIED_VOLUME applied_volume=VOLUME_TICK; // tipo de volume
input string symbol=" "; // símbolo
input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // timeframe
//--- buffers do indicador
double iOBVBuffer[];
//--- variável para armazenar o manipulador do indicator iOBV
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 On Balance Volume
int bars_calculated=0;
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado  |
//+------------------------------------------------------------------+
int OnInit()
{
//--- atribuição de array para buffer do indicador
SetIndexBuffer(0,iOBVBuffer,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_iOBV)
handle=iOBV(name,period,applied_volume);
else
{
//--- preencher a estrutura com os parâmetros do indicador

© 2000-2018, MetaQuotes Software Corp.


1861 Indicadores Técnicos

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

© 2000-2018, MetaQuotes Software Corp.


1862 Indicadores Técnicos

if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)


{
//--- se o array iOBVBuffer é maior do que o número de valores no indicador iOBV 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 com valores do indicador iOBV
//--- se FillArrayFromBuffer retorna falso, significa que a informação não está pronta ainda, sair
if(!FillArrayFromBuffer(iOBVBuffer,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 On Balance Volume
bars_calculated=calculated;
//--- retorna o valor prev_calculated para a próxima chamada
return(rates_total);
}
//+------------------------------------------------------------------+
//| Preencher buffers do indicador a partir do indicador iOBV |
//+------------------------------------------------------------------+
bool FillArrayFromBuffer(double &obv_buffer[], // buffer do indicator para valores do OBV
int ind_handle, // manipulador do indicador iOBV
int amount // número de valores copiados
)
{
//--- redefinir o código de erro
ResetLastError();
//--- preencher uma parte do array iOBVBuffer com valores do buffer do indicador que tem índice 0 (
if(CopyBuffer(ind_handle,0,0,amount,obv_buffer)<0)
{
//--- Se a cópia falhar, informe o código de erro
PrintFormat("Falha ao copiar dados do indicador iOBV, 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);
}

© 2000-2018, MetaQuotes Software Corp.


1863 Indicadores Técnicos

//+------------------------------------------------------------------+
//| Função de desinicialização do indicador |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- limpar o gráfico após excluir o indicador
Comment("");
}

© 2000-2018, MetaQuotes Software Corp.


1864 Indicadores Técnicos

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 _TIMEFRAMES, 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
Retorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVALID_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

© 2000-2018, MetaQuotes Software Corp.


1865 Indicadores Técnicos

#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)
{

© 2000-2018, MetaQuotes Software Corp.


1866 Indicadores Técnicos

//--- tomar o símbolo do gráfico, o indicador está anexado para


name=_Symbol;
}
//--- criar manipulador do indicador
if(type==Call_iSAR)
handle=iSAR(name,period,step,maximum);
else
{
//--- preencher a estrutura com os parâmetros do indicador
MqlParam pars[2];
//--- valor do passo
pars[0].type=TYPE_DOUBLE;
pars[0].double_value=step;
//--- limite do valor do passo que pode ser usado para os cálculos
pars[1].type=TYPE_DOUBLE;
pars[1].double_value=maximum;
handle=IndicatorCreate(name,period,IND_SAR,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 iSAR 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 Parabolic SAR é calculado para
short_name=StringFormat("iSAR(%s/%s, %G, %G)",name,EnumToString(period),
step,maximum);
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[])

© 2000-2018, MetaQuotes Software Corp.


1867 Indicadores Técnicos

{
//--- 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

© 2000-2018, MetaQuotes Software Corp.


1868 Indicadores Técnicos

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)
{
//--- limpar o gráfico após excluir o indicador
Comment("");
}

© 2000-2018, MetaQuotes Software Corp.


1869 Indicadores Técnicos

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 _TIMEFRAMES, 0 (zero) significa o prazo
corrente.

ma_period
[in] Período médio para cálculo do RS I.
applied_price
[in] O preço usado. Pode ser qualquer das constantes de preços ENUM _APPLIED_PRICE ou um
manipulador de outro indicador.

Valor de retorno
Retorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVALID_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

© 2000-2018, MetaQuotes Software Corp.


1870 Indicadores Técnicos

#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);

© 2000-2018, MetaQuotes Software Corp.


1871 Indicadores Técnicos

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[],

© 2000-2018, MetaQuotes Software Corp.


1872 Indicadores Técnicos

const double &close[],


const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//--- número de valores copiados a partir do indicador iRSI
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 iRSIBuffer é maior do que o número de valores no indicador iRSI 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 com valores do indicador iRSI
//--- se FillArrayFromBuffer retorna falso, significa que a informação não está pronta ainda, sair
if(!FillArrayFromBuffer(iRSIBuffer,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 Strength 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  |
//+------------------------------------------------------------------+
bool FillArrayFromBuffer(double &rsi_buffer[], // buffer do indicator para valores do Relative Str
int ind_handle, // manipulador do indicador iRSI

© 2000-2018, MetaQuotes Software Corp.


1873 Indicadores Técnicos

int amount // número de valores copiados


)
{
//--- redefinir o código de erro
ResetLastError();
//--- preencher uma parte do array iRSIBuffer com valores do buffer do indicador que tem índice 0 (
if(CopyBuffer(ind_handle,0,0,amount,rsi_buffer)<0)
{
//--- Se a cópia falhar, informe o código de erro
PrintFormat("Falha ao copiar dados do indicador iRSI, 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)
{
//--- limpar o gráfico após excluir o indicador
Comment("");
}

© 2000-2018, MetaQuotes Software Corp.


1874 Indicadores Técnicos

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 _TIMEFRAMES, 0 (zero) significa o prazo
corrente.

ma_period
[in] Período médio para cálculo do indicador RVI.

Valor de retorno
Retorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVALID_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

© 2000-2018, MetaQuotes Software Corp.


1875 Indicadores Técnicos

#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);

© 2000-2018, MetaQuotes Software Corp.


1876 Indicadores Técnicos

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[])

© 2000-2018, MetaQuotes Software Corp.


1877 Indicadores Técnicos

{
//--- 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
)
{

© 2000-2018, MetaQuotes Software Corp.


1878 Indicadores Técnicos

//--- redefinir o código de erro


ResetLastError();
//--- preencher uma parte do array iRVIBuffer com valores do buffer do indicador que tem índice 0 (
if(CopyBuffer(ind_handle,0,0,amount,rvi_buffer)<0)
{
//--- Se a cópia falhar, informe o código de erro
PrintFormat("Falha ao copiar dados do indicador iRVI, 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,1,0,amount,signal_buffer)<0)
{
//--- Se a cópia falhar, informe o código de erro
PrintFormat("Falha ao copiar dados do indicador iRVI, 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)
{
//--- limpar o gráfico após excluir o indicador
Comment("");
}

© 2000-2018, MetaQuotes Software Corp.


1879 Indicadores Técnicos

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 _TIMEFRAMES, 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 _APPLIED_PRICE ou um
manipulador de outro indicador.

Valor de retorno
Retorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVALID_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"

© 2000-2018, MetaQuotes Software Corp.


1880 Indicadores Técnicos

#property description "O indicador demonstra como obter dados"


#property description "de buffers do indicador para o indicador técnico iStdDev."
#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 Deviation."

#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);

© 2000-2018, MetaQuotes Software Corp.


1881 Indicadores Técnicos

//--- 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_iStdDev)
handle=iStdDev(name,period,ma_period,ma_shift,ma_method,applied_price);
else
{
//--- preencher a estrutura com os parâmetros do indicador
MqlParam pars[4];
//--- período
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;
handle=IndicatorCreate(name,period,IND_STDDEV,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 iStdDev para o símbolo %s/%s, código d
name,
EnumToString(period),
GetLastError());
//--- o indicador é interrompido precocemente
return(INIT_FAILED);
}
//--- mostra que o símbolo/prazo do indicador Standard Deviation é calculado para
short_name=StringFormat("iStdDev(%s/%s, %d, %d, %s, %s)",name,EnumToString(period),
ma_period,ma_shift,EnumToString(ma_method),EnumToString(applied_price));
IndicatorSetString(INDICATOR_SHORTNAME,short_name);

© 2000-2018, MetaQuotes Software Corp.


1882 Indicadores Técnicos

//--- 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 iStdDev
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 iStdDevBuffer é maior do que o número de valores no indicador iStdDev 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 o array com valores do indicador Standard Deviation
//--- se FillArrayFromBuffer retorna falso, significa que a informação não está pronta ainda, sair
if(!FillArrayFromBuffer(iStdDevBuffer,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);

© 2000-2018, MetaQuotes Software Corp.


1883 Indicadores Técnicos

//--- exibir a mensagem de serviço no gráfico


Comment(comm);
//--- memorizar o número de valores no indicador Standard Deviation
bars_calculated=calculated;
//--- retorna o valor prev_calculated para a próxima chamada
return(rates_total);
}
//+------------------------------------------------------------------+
//| Preencher buffers do indicador a partir do indicador iStdDev |
//+------------------------------------------------------------------+
bool FillArrayFromBuffer(double &std_buffer[], // buffer do indicator para linha Standard Deviatio
int std_shift, // deslocamento da linha Standard Deviation
int ind_handle, // manipulador do indicador iStdDev
int amount // número de valores copiados
)
{
//--- redefinir o código de erro
ResetLastError();
//--- preencher uma parte do array iStdDevBuffer com valores do buffer do indicador que tem índice
if(CopyBuffer(ind_handle,0,-std_shift,amount,std_buffer)<0)
{
//--- Se a cópia falhar, informe o código de erro
PrintFormat("Falha ao copiar dados do indicador iStdDev, 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)
{
//--- limpar o gráfico após excluir o indicador
Comment("");
}

© 2000-2018, MetaQuotes Software Corp.


1884 Indicadores Técnicos

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 _TIMEFRAMES, 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
Retorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVALID_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 |

© 2000-2018, MetaQuotes Software Corp.


1885 Indicadores Técnicos

//| 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 iStochastic."
#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."

#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

© 2000-2018, MetaQuotes Software Corp.


1886 Indicadores Técnicos

input string symbol=" "; // símbolo


input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // timeframe
//--- buffers do indicador
double StochasticBuffer[];
double SignalBuffer[];
//--- variável para armazenar o manipulador do indicator iStochastic
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 Stochastic Oscillatorr
int bars_calculated=0;
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado  |
//+------------------------------------------------------------------+
int OnInit()
{
//--- atribuição de arrays para buffers do indicador
SetIndexBuffer(0,StochasticBuffer,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_iStochastic)
handle=iStochastic(name,period,Kperiod,Dperiod,slowing,ma_method,price_field);
else
{
//--- preencher a estrutura com os parâmetros do indicador
MqlParam pars[5];
//--- o período K para cálculos
pars[0].type=TYPE_INT;
pars[0].integer_value=Kperiod;
//--- o período D para suavização primária
pars[1].type=TYPE_INT;
pars[1].integer_value=Dperiod;
//--- o período K final para suavização
pars[2].type=TYPE_INT;
pars[2].integer_value=slowing;
//--- tipo de suavização

© 2000-2018, MetaQuotes Software Corp.


1887 Indicadores Técnicos

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

© 2000-2018, MetaQuotes Software Corp.


1888 Indicadores Técnicos

//--- 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

© 2000-2018, MetaQuotes Software Corp.


1889 Indicadores Técnicos

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)
{
//--- limpar o gráfico após excluir o indicador
Comment("");
}

© 2000-2018, MetaQuotes Software Corp.


1890 Indicadores Técnicos

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 _TIMEFRAMES, 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 _APPLIED_PRICE ou um
manipulador de outro indicador.

Valor de retorno
Retorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVALID_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,"

© 2000-2018, MetaQuotes Software Corp.


1891 Indicadores Técnicos

#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 Triple Exponential Moving

#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;

© 2000-2018, MetaQuotes Software Corp.


1892 Indicadores Técnicos

//--- 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_iTEMA)
handle=iTEMA(name,period,ma_period,ma_shift,applied_price);
else
{
//--- preencher a estrutura com os parâmetros do indicador
MqlParam pars[3];
//--- período
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_TEMA,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 iTEMA 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 Average é calculado para
short_name=StringFormat("iTEMA(%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,

© 2000-2018, MetaQuotes Software Corp.


1893 Indicadores Técnicos

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 iTEMA
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 iTEMABuffer é maior do que o número de valores no indicador iTEMA 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 Average
//--- se FillArrayFromBuffer retorna falso, significa que a informação não está pronta ainda, sair
if(!FillArrayFromBuffer(iTEMABuffer,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 Triple Exponential Moving Average
bars_calculated=calculated;
//--- retorna o valor prev_calculated para a próxima chamada
return(rates_total);
}

© 2000-2018, MetaQuotes Software Corp.


1894 Indicadores Técnicos

//+------------------------------------------------------------------+
//| 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)
{
//--- limpar o gráfico após excluir o indicador
Comment("");
}

© 2000-2018, MetaQuotes Software Corp.


1895 Indicadores Técnicos

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 _TIMEFRAMES, 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 _APPLIED_PRICE ou um
manipulador de outro indicador.

Valor de retorno
Retorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVALID_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

© 2000-2018, MetaQuotes Software Corp.


1896 Indicadores Técnicos

#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;

© 2000-2018, MetaQuotes Software Corp.


1897 Indicadores Técnicos

}
//--- 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

© 2000-2018, MetaQuotes Software Corp.


1898 Indicadores Técnicos

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

© 2000-2018, MetaQuotes Software Corp.


1899 Indicadores Técnicos

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)
{
//--- limpar o gráfico após excluir o indicador
Comment("");
}

© 2000-2018, MetaQuotes Software Corp.


1900 Indicadores Técnicos

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 _TIMEFRAMES, 0 (zero) significa o prazo
corrente.

calc_period
[in] Período (barras contadas) para cálculo do indicador.

Valor de retorno
Retorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVALID_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

© 2000-2018, MetaQuotes Software Corp.


1901 Indicadores Técnicos

#property indicator_style1 STYLE_SOLID


#property indicator_width1 1
//--- definir o limite dos valores do indicador
#property indicator_minimum -100
#property indicator_maximum 0
//--- níveis horizontais na janela de indicador
#property indicator_level1 -20.0
#property indicator_level2 -80.0
//+------------------------------------------------------------------+
//| Enumerador dos métodos de criação do manipulador  |
//+------------------------------------------------------------------+
enum Creation
{
Call_iWPR, // usar iWPR
Call_IndicatorCreate // usar IndicatorCreate
};
//--- parâmetros de entrada
input Creation type=Call_iWPR; // tipo de função
input int calc_period=14; // período
input string symbol=" "; // símbolo
input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // timeframe
//--- buffer do indicador
double iWPRBuffer[];
//--- variável para armazenar o manipulador do indicator iWPR
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 Larry Williams' Percent Range
int bars_calculated=0;
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado  |
//+------------------------------------------------------------------+
int OnInit()
{
//--- atribuição de array para buffer do indicador
SetIndexBuffer(0,iWPRBuffer,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;
}

© 2000-2018, MetaQuotes Software Corp.


1902 Indicadores Técnicos

//--- criar manipulador do indicador


if(type==Call_iWPR)
handle=iWPR(name,period,calc_period);
else
{
//--- preencher a estrutura com os parâmetros do indicador
MqlParam pars[1];
//--- período
pars[0].type=TYPE_INT;
pars[0].integer_value=calc_period;
handle=IndicatorCreate(name,period,IND_WPR,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 iWPR 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 Williams' Percent Range é calculado para
short_name=StringFormat("iWPR(%s/%s, %d)",name,EnumToString(period),calc_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 iWPR
int values_to_copy;
//--- determinar o número de valores calculados no indicador
int calculated=BarsCalculated(handle);
if(calculated<=0)
{

© 2000-2018, MetaQuotes Software Corp.


1903 Indicadores Técnicos

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 iWPRBuffer é maior do que o número de valores no indicador iWPR 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 com valores do indicador Williams' Percent Range
//--- se FillArrayFromBuffer retorna falso, significa que a informação não está pronta ainda, sair
if(!FillArrayFromBuffer(iWPRBuffer,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 Larry Williams' Percent Range
bars_calculated=calculated;
//--- retorna o valor prev_calculated para a próxima chamada
return(rates_total);
}
//+------------------------------------------------------------------+
//| Preencher buffers do indicador a partir do indicador iWPR |
//+------------------------------------------------------------------+
bool FillArrayFromBuffer(double &wpr_buffer[], // buffer do indicator para valores do Williams' Pe
int ind_handle, // manipulador do indicador iWPR
int amount // número de valores copiados
)
{
//--- redefinir o código de erro
ResetLastError();
//--- preencher uma parte do array iWPRBuffer com valores do buffer do indicador que tem índice 0 (
if(CopyBuffer(ind_handle,0,0,amount,wpr_buffer)<0)
{
//--- Se a cópia falhar, informe o código de erro
PrintFormat("Falha ao copiar dados do indicador iWPR, código de erro %d",GetLastError());
//--- parar com resultado zero - significa que indicador é considerado como não calculado

© 2000-2018, MetaQuotes Software Corp.


1904 Indicadores Técnicos

return(false);
}
//--- está tudo bem
return(true);
}
//+------------------------------------------------------------------+
//| Função de desinicialização do indicador |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- limpar o gráfico após excluir o indicador
Comment("");
}

© 2000-2018, MetaQuotes Software Corp.


1905 Indicadores Técnicos

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 _TIMEFRAMES, 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 _APPLIED_PRICE ou um
manipulador de outro indicador.

Valor de retorno
Retorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVALID_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"

© 2000-2018, MetaQuotes Software Corp.


1906 Indicadores Técnicos

#property description "O indicador demonstra como obter dados"


#property description "de buffers do indicador para o indicador técnico iVIDyA."
#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 Variable Index Dynamic Av

#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);

© 2000-2018, MetaQuotes Software Corp.


1907 Indicadores Técnicos

//--- 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_iVIDyA)
handle=iVIDyA(name,period,cmo_period,ema_period,ma_shift,applied_price);
else
{
//--- preencher a estrutura com os parâmetros do indicador
MqlParam pars[4];
//--- o período do indicador Chande Momentum
pars[0].type=TYPE_INT;
pars[0].integer_value=cmo_period;
//--- período do fator de suavização
pars[1].type=TYPE_INT;
pars[1].integer_value=ema_period;
//--- deslocamento
pars[2].type=TYPE_INT;
pars[2].integer_value=ma_shift;
//--- tipo de preço
pars[3].type=TYPE_INT;
pars[3].integer_value=applied_price;
handle=IndicatorCreate(name,period,IND_VIDYA,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 iVIDyA 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 Variable Index Dynamic Average é calculado para
short_name=StringFormat("iVIDyA(%s/%s, %d, %d, %d, %s)",name,EnumToString(period),
cmo_period,ema_period,ma_shift,EnumToString(applied_price));
IndicatorSetString(INDICATOR_SHORTNAME,short_name);

© 2000-2018, MetaQuotes Software Corp.


1908 Indicadores Técnicos

//--- 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 iVIDyA
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 iVIDyABuffer é maior do que o número de valores no indicador iVIDyA 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 com valores do indicador Variable Index Dynamic Average
//--- se FillArrayFromBuffer retorna falso, significa que a informação não está pronta ainda, sair
if(!FillArrayFromBuffer(iVIDyABuffer,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);

© 2000-2018, MetaQuotes Software Corp.


1909 Indicadores Técnicos

//--- exibir a mensagem de serviço no gráfico


Comment(comm);
//--- memorizar o número de valores no indicador Variable Index Dynamic Average
bars_calculated=calculated;
//--- retorna o valor prev_calculated para a próxima chamada
return(rates_total);
}
//+------------------------------------------------------------------+
//| Preencher buffers do indicador a partir do indicador iVIDyA |
//+------------------------------------------------------------------+
bool FillArrayFromBuffer(double &vidya_buffer[],// buffer do indicator para valores do Variable Ind
int v_shift, // deslocamento da linha
int ind_handle, // manipulador do indicador iVIDyA
int amount // número de valores copiados
)
{
//--- redefinir o código de erro
ResetLastError();
//--- preencher uma parte do array iVIDyABuffer com valores do buffer do indicador que tem índice 0
if(CopyBuffer(ind_handle,0,-v_shift,amount,vidya_buffer)<0)
{
//--- Se a cópia falhar, informe o código de erro
PrintFormat("Falha ao copiar dados do indicador iVIDyA, 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)
{
//--- limpar o gráfico após excluir o indicador
Comment("");
}

© 2000-2018, MetaQuotes Software Corp.


1910 Indicadores Técnicos

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 _TIMEFRAMES, 0 (zero) significa o prazo
corrente.

applied_volume
[in] O volume utilizado. Pode ser um dos valores ENUM _APPLIED_VOLUME.

Valor de retorno
Retorna o manipulador de um indicador técnico especifico, em caso de falha de retorna
INVALID_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

© 2000-2018, MetaQuotes Software Corp.


1911 Indicadores Técnicos

#property indicator_style1 STYLE_SOLID


#property indicator_width1 1
//+------------------------------------------------------------------+
//| Enumerador dos métodos de criação do manipulador  |
//+------------------------------------------------------------------+
enum Creation
{
Call_iVolumes, // usar iVolumes
Call_IndicatorCreate // usar IndicatorCreate
};
//--- parâmetros de entrada
input Creation type=Call_iVolumes; // tipo de função
input ENUM_APPLIED_VOLUME applied_volume=VOLUME_TICK; // tipo de volume
input string symbol=" "; // símbolo
input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // timeframe
//--- buffers do indicador
double iVolumesBuffer[];
double iVolumesColors[];
//--- variável para armazenar o manipulador do indicator iVolumes
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 Volumes
int bars_calculated=0;
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado  |
//+------------------------------------------------------------------+
int OnInit()
{
//--- atribuição de array para buffer do indicador
SetIndexBuffer(0,iVolumesBuffer,INDICATOR_DATA);
SetIndexBuffer(1,iVolumesColors,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_iVolumes)
handle=iVolumes(name,period,applied_volume);
else

© 2000-2018, MetaQuotes Software Corp.


1912 Indicadores Técnicos

{
//--- 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

© 2000-2018, MetaQuotes Software Corp.


1913 Indicadores Técnicos

//--- 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

© 2000-2018, MetaQuotes Software Corp.


1914 Indicadores Técnicos

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)
{
//--- limpar o gráfico após excluir o indicador
Comment("");
}

© 2000-2018, MetaQuotes Software Corp.


1915 Trabalhando com Resultados de Otimização

Trabalhando com Resultados de Otimização


Funções para organizar processamento personalizado da otimização resultando no testador de
estratégia. Elas podem ser chamadas durante a otimização de agentes de teste, bem como localmente
em Expert Advisors e scripts.

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.

F unção Ação
FrameFirst Move um ponteiro de leitura de quadro para o
início e redefine previamente um conjunto de
filtros

FrameFilter Define a estrutura do filtro de leitura e move o


ponteiro para o início

FrameNext Lê um quadro e move o ponteiro para o


próximo

FrameInputs Recebe parâmetros de entrada, no qual o


quadro é formado

FrameAdd Adiciona um quadro com dados

ParameterGetRange Recebe 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

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

Também Veja
T estando Estatísticas, Propriedades de Execução do Programa MQL5

© 2000-2018, MetaQuotes Software Corp.


1916 Trabalhando com Resultados de Otimização

FrameFirst
Move um ponteiro de leitura de quadro para o início e redefine um conjunto de filtros.
bool  FrameFirst();

Valor do Retorno
Retorna true se bem sucedido, caso contrário false. Para obter informações sobre o erro, chamar a
função GetLastError().

© 2000-2018, MetaQuotes Software Corp.


1917 Trabalhando com Resultados de Otimização

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
Retorna 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á.

Chamar FrameFilter("" , ULONG_MAX) é equivalente a chamar FrameFirst(), ou seja, igual a não


utilização de qualquer filtro.

© 2000-2018, MetaQuotes Software Corp.


1918 Trabalhando com Resultados de Otimização

FrameNext
Lê um quadro e move o ponteiro para o próximo. Existem duas variantes da função.

1. Chamando para receber um valor numérico

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
);

2. Chamando para receber todos os dados de um quadro

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
Retorna 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[].

© 2000-2018, MetaQuotes Software Corp.


1919 Trabalhando com Resultados de Otimização

FrameInputs
Recebe 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
Retorna 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.

© 2000-2018, MetaQuotes Software Corp.


1920 Trabalhando com Resultados de Otimização

FrameAdd
Adicionar um quadro com dados. Existem duas variantes da função.

1. Adicionar dados a partir de um arquivo

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
);

2. Adicionando dados a partir de um array de qualquer tipo

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
Retorna true se bem sucedido, caso contrário false. Para obter informações sobre o erro, chamar a
função GetLastError().

© 2000-2018, MetaQuotes Software Corp.


1921 Trabalhando com Resultados de Otimização

ParameterGetRange
Recebe 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.

1. Recebimento de dados do parâmetro de entrada para o tipo integer


bool  ParameterGetRange(
const string  name,  // nome do parâmetro (variável de entrada)
bool&  enable,  // parâmetro de otimização habilitado
long&  value,  // o valor do parâmetro
long&  start,  // valor inicial
long&  step,  // alterar passo
long&  stop  // valor final
);

2. Recebendo dados para o parâmetro de entrada tipo real


bool  ParameterGetRange(
const string  name,  // nome do parâmetro (variável de entrada)
bool&  enable,  // parâmetro de otimização habilitado
double&  value,  // valor do parâmetro
double&  start,  // valor inicial
double&  step,  // alterar passo
double&  stop  // valor final
);

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

© 2000-2018, MetaQuotes Software Corp.


1922 Trabalhando com Resultados de Otimização

Retorna 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;

© 2000-2018, MetaQuotes Software Corp.


1923 Trabalhando com Resultados de Otimização

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);

//--- exemplo de parâmetros de entrada tipo bool


name="Input3";
long par3,par3_start,par3_step,par3_stop;
ParameterGetRange(name,enable,par3,par3_start,par3_step,par3_stop);
Print("Terceiro parâmetro");
PrintFormat("%s=%s habilitado=%s a partir de %s para %s",
name,(string)par3,(string)enable,
(string)par3_start,(string)par3_stop);
//--- exemplo de parâmetros de entrada tipo enumerador
name="Input4";
long par4,par4_start,par4_step,par4_stop;
ParameterGetRange(name,enable,par4,par4_start,par4_step,par4_stop);
Print("Quarto parâmetro");
PrintFormat("%s=%s habilitado=%s a partir de %s para %s",
name,EnumToString((ENUM_DAY_OF_WEEK)par4),(string)enable,
EnumToString((ENUM_DAY_OF_WEEK)par4_start),
EnumToString((ENUM_DAY_OF_WEEK)par4_stop));
}
//+------------------------------------------------------------------+
//| Função TesterDeinit |
//+------------------------------------------------------------------+
void OnTesterDeinit()
{
//--- esta mensagem será mostrada após a otimização ser concluída
Print(__FUNCTION__," Otimização concluída");
}

© 2000-2018, MetaQuotes Software Corp.


1924 Trabalhando com Resultados de Otimização

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.

1. Especificando os valores para o parâmetro de entrada do tipo integer


bool  ParameterSetRange(
const string  name,  // nome do parâmetro (variável de entrada)
bool   enable,  // parâmetro de otimização habilitado
long   value,  // valor do parâmetro
long   start,  // valor inicial
long   step,  // mudar etapa
long   stop  // valor final
);

2. Especificando os valores para o parâmetro de entrada de tipo real


bool  ParameterSetRange(
const string  name,  // nome do parâmetro (variável de entrada)
bool   enable,  // parâmetro de otimização habilitado
double   value,  // valor dos parâmetros
double   start,  // valor inicial
double   step,  // mudar etapa
double   stop  // valor final
);

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

© 2000-2018, MetaQuotes Software Corp.


1925 Trabalhando com Resultados de Otimização

Retorna 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.

© 2000-2018, MetaQuotes Software Corp.


1926 Trabalhando com Eventos

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.

F unçã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

EventSetT imer Inicia o gerador de eventos do time com a


periodicidade especificada para o gráfico atual

EventKillT imer Interrompe a geração de eventos pelo timer no


quadro atual

EventChartCustom Gera um evento personalizado para o gráfico


especificado

Também Veja
T ipos de Eventos de Gráficos

© 2000-2018, MetaQuotes Software Corp.


1927 Trabalhando com Eventos

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.

© 2000-2018, MetaQuotes Software Corp.


1928 Trabalhando com Eventos

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.

© 2000-2018, MetaQuotes Software Corp.


1929 Trabalhando com Eventos

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().

© 2000-2018, MetaQuotes Software Corp.


1930 Trabalhando com Eventos

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
Retorna 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.

Evento Valor do Valor do Valor do Valor do


parâmetro id parâmetro parâmetro parâmetro
lparam dparam sparam
Evento de uma CH ART EVENT_KE código de uma Repita a O valor da string
teclada YDOWN tecla pressionada contagem (o de uma pequena
número de vezes máscara de

© 2000-2018, MetaQuotes Software Corp.


1931 Trabalhando com Eventos

que a tecla é descrever o


repetida como estado de botões
um resultado de do teclado
que o usuário
pressiona a
tecla)

Evento do mouse CH ART EVENT_MO a coordenada X a coordenada Y O valor de string


(se a USE_MOVE de uma máscara
propriedade de bites
CH ART_EVENT_ descrevendo o
MOUSE_MOVE=tr estado de botões
ue, então é de mouse
definido para o
gráfico)

Evento de CH ART EVENT_OB — — Nome do objeto


criação de JECT_CREAT E gráfico criado
objeto gráfico
(se
CH ART_EVENT_O
BJECT_CREAT E=t
rue, então é
definido para o
gráfico)

Evento de CH ART EVENT_OB — — Nome do objeto


mudança de uma JECT_CH ANGE gráfico
propriedade de modificado
objeto via janela
de diálogo de
propriedades

Caso de CH ART EVENT_OB — — Nome do objeto


apagamento JECT_DELET E gráfico excluído
objeto gráfico
(se
CH ART_EVENT_O
BJECT_DELET E=t
rue, então é
definido para o
gráfico)

Evento de um CH ART EVENT_C a coordenada X a coordenada Y —


click de mouse L I CK
no gráfico

Evento de um CH ART EVENT_OB a coordenada X a coordenada Y Nome do objeto


click de mouse JECT_CLICK gráfico, na qual
num objeto o evento ocorreu
gráfico
pertencente ao
gráfico

© 2000-2018, MetaQuotes Software Corp.


1932 Trabalhando com Eventos

Evento de um CH ART EVENT_OB — — Nome do objeto


objeto gráfico JECT_DRAG gráfico movido
arrastado usando
o mouse

Evento da edição CH ART EVENT_OB — — Nome do objeto


de texto JECT_ENDEDIT gráfico
finalizada na LabelEdit, cuja
caixa de entrada edição de texto
do objeto gráfico foi concluída
LabelEdit

Evento de CH ART EVENT_C — — —


mudança no H ART_CH ANGE
gráfico

ID do evento de CH ART EVENT_CU Valor definido Valor definido Valor definido


usuário sob N S T OM +N pela função pela função pela função
número EventChartCusto EventChartCusto EventChartCusto
m() m() m()

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");

© 2000-2018, MetaQuotes Software Corp.


1933 Trabalhando com Eventos

ObjectSetInteger(0,buttonID,OBJPROP_FONTSIZE,10);
ObjectSetInteger(0,buttonID,OBJPROP_SELECTABLE,0);

//--- Criar uma etiqueta para exibir informações


ObjectCreate(0,labelID,OBJ_LABEL,0,100,100);
ObjectSetInteger(0,labelID,OBJPROP_COLOR,clrRed);
ObjectSetInteger(0,labelID,OBJPROP_XDISTANCE,100);
ObjectSetInteger(0,labelID,OBJPROP_YDISTANCE,50);
ObjectSetString(0,labelID,OBJPROP_FONT,"Trebuchet MS");
ObjectSetString(0,labelID,OBJPROP_TEXT,"Não informado");
ObjectSetInteger(0,labelID,OBJPROP_FONTSIZE,20);
ObjectSetInteger(0,labelID,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

© 2000-2018, MetaQuotes Software Corp.


1934 Trabalhando com Eventos

Print("Botão pressionado = ",selected);


int customEventID; // Número do evento personalizado para enviar
string message; // Mensagem a ser enviada no caso
//--- Se o botão for pressionado
if(selected)
{
message="Botão pressionado";
customEventID=CHARTEVENT_CUSTOM+1;
}
else // Botão não está pressionado
{
message="Botão não está pressionado";
customEventID=CHARTEVENT_CUSTOM+999;
}
//--- Enviar um evento personalizado "nosso" gráfico
EventChartCustom(0,customEventID-CHARTEVENT_CUSTOM,0,0,message);
///--- Envie uma mensagem para todos os gráficos abertos
BroadcastEvent(ChartID(),0,"Transmissão de mensagem");
//--- Depurar mensagem
Print("Enviar um evento com ID = ",customEventID);
}
ChartRedraw();// Redesenho forçado de todos os objetos de gráfico
}

//--- Verificar o evento pertence ao evento de utilizador


if(id>CHARTEVENT_CUSTOM)
{
if(id==broadcastEventID)
{
Print("Tem transmissão de mensagem a partir de um gráfico com id = "+lparam);
}
else
{
//--- Nós lemos uma mensagem de texto no evento
string info=sparam;
Print("Manipular o evento do usuário com o ID = ",id);
//--- Exibe uma mensagem numa etiqueta
ObjectSetString(0,labelID,OBJPROP_TEXT,sparam);
ChartRedraw();// Redesenho forçado de todos os objetos de gráfico
}
}
}
//+------------------------------------------------------------------+
//| Enviar evento de transmissão para todos os gráficos abertos  |
//+------------------------------------------------------------------+
void BroadcastEvent(long lparam,double dparam,string sparam)
{
int eventID=broadcastEventID-CHARTEVENT_CUSTOM;
long currChart=ChartFirst();

© 2000-2018, MetaQuotes Software Corp.


1935 Trabalhando com Eventos

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

© 2000-2018, MetaQuotes Software Corp.


1936 Trabalhando com OpenCL

Trabalhando com OpenCL


Programas em OpenCLsão utilizados para a realização de cálculos sobre placas de v ídeo que suportam
OpenCL 1.1 ou superior. Placas de v ídeo modernas contêm centenas de pequenos processadores
especializados que podem executar simultaneamente operações matemáticas simples, com fluxos de
dados de entrada. A linguagem OpenCL organiza computação paralela e proporciona maior velocidade
para uma certa classe de tarefas.

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_khr_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ções para os programas em execução em OpenCL:

F unção Ação
CL H andleType Retorna o tipo do manipulador de OpenCL como
valor da enumeração
ENUM _OPENCL _H ANDLE_TYPE

CL GetInfoInteger Retorna o valor da propriedade de uma integer


para um objeto ou dispositivo OpenCL

CLContextCreate Cria um contexto OpenCL

CLContextFree Remove um contexto OpenCL


CL GetDeviceInfo Receives device property from OpenCL driver
CL ProgramCreate Cria um programa OpenCL a partir de um
código fonte

CL ProgramFree Remove um programa OpenCL


CL KernelCreate Cria uma função de partida OpenCL

CL KernelFree Remove uma função de partida OpenCL


CLSetKernelArg Define um parâmetro para a função OpenCL
CLSetKernelArgMem Define um buffer OpenCL como um parâmetro
da função OpenCL

CLSetKernelArgMemLocal

CL BufferCreate Cria um buffer OpenCL

CL BufferFree Exclui um buffer OpenCL

CL BufferW rite Grava um array num buffer OpenCL


CL BufferR ead Lê um buffer de OpenCL num array

© 2000-2018, MetaQuotes Software Corp.


1937 Trabalhando com OpenCL

CLExecute Executa um programa OpenCL

CLExecutionStatus

Também Veja
OpenCL, R ecursos

© 2000-2018, MetaQuotes Software Corp.


1938 Trabalhando com OpenCL

CLHandleType
Retorna 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

OPENCL _CONT EXT Um manipulador de contexto OpenCL

OPENCL _PR OGR AM Um manipulador do programa OpenCL

OPENCL _KERNEL Um manipulador do k ernel OpenCL

OPENCL _BUFFER Um manipulador do buffer OpenCL

© 2000-2018, MetaQuotes Software Corp.


1939 Trabalhando com OpenCL

CLGetInfoInteger
Retorna 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_PROPERTY_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

Identificador Descrição Tipo


CL _DEVICE_COUNT O número de dispositivos com int
suporte a OpenCL. Esta
propriedade não requer a
especificação do primeiro
parâmetro, ou seja, você pode
passar um valor zero para o
parâmetro do manipulador.

CL _DEVICE_TYPE T ipo de dispositivo ENUM _CL _DEVICE_TYPE

CL _DEVICE_VENDOR_ID Identificador único do uint


fornecedor

CL _DEVICE_MAX_COM PUT E_UN Número de tarefas paralelas uint


IT S calculados em dispositivos
OpenCL. Um grupo de trabalho
resolve uma tarefa
computacional. O menor valor
é1

CL _DEVICE_MAX_CLOCK_FR EQ Define a maior freqüência do uint


UENCY dispositivo em M H z.

CL _DEVICE_GLOBAL _MEM _S IZ T amanho da memória global ulong


E do dispositivo em bites

© 2000-2018, MetaQuotes Software Corp.


1940 Trabalhando com OpenCL

CL _DEVICE_LOCAL _MEM _S IZE T amanho dos dados uint


processados (cena) de
memória local, em bites

CL _BUFFER_S IZE Actual size of the OpenCL ulong


buffer in bytes.

CL _DEVICE_MAX_W ORK_GR OU Número total de grupos locais ulong


P_S IZE de trabalho disponíveis para
um dispositivo OpenCL.

CL _KERNEL _W ORK_GR OUP_S IZ Número total de grupos locais ulong


E de trabalho disponíveis para
um programa OpenCL.

CL _KERNEL _LOCAL _MEM _S IZE T amanho da memória local em ulong


bytes, que é usada pelo
OpenCL do programa para
todas as tarefas simultâneas
no grupo. Utilize
CL _DEVICE_LOCAL _MEM _S IZE
para obter o máximo
disponível.

CL _KERNEL _PRIVAT E_MEM _S IZ ulong


E
T amanho mínimo de memória
privada em bytes a ser usado
por cada tarefa na k ernel do
programa OpenCL.

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.

CL _DEVICE_CPU Um dispositivo OpenCL que é o processador


hospedeiro. O processador hospedeiro executa
as implementações OpenCL, sendo uma única
ou multi-core CPU.

CL _DEVICE_GPU Um dispositivo OpenCL que é uma GPU.

© 2000-2018, MetaQuotes Software Corp.


1941 Trabalhando com OpenCL

CL _DEVICE_DEFAUL T O dispositivo padrão OpenCL no sistema. O


dispositivo padrão não pode ser um dispositivo
CL _DEVICE_TYPE_CUS T OM.

CL _DEVICE_CUS T OM Aceleradores dedicados que não suportam


programas escritos em OpenCL C.

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");
//---
}

© 2000-2018, MetaQuotes Software Corp.


1942 Trabalhando com OpenCL

CLGetInfoString
Retorna 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_PROPERTY_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_PROFILE - 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 _VER S ION Versão OpenCL


CL _PLATFOR M _VENDOR Nome do fornecedor da Plataforma
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

CL _DEVICE_NAME O nome do dispositivo

© 2000-2018, MetaQuotes Software Corp.


1943 Trabalhando com OpenCL

CL _DEVICE_VENDOR Nome do fornecedor


CL _DRIVER_VER S ION Versão do driver OpenCL em formato
major_number.minor_number

CL _DEVICE_PR OFILE Perfil de dispositivo 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 _DEVICE_VER S ION OpenCL versão em formato


" OpenCL<space><major_version.minor_version><s
pace><vendor-specific information>"

CL _DEVICE_EXT ENS IONS Lista de extensões suportadas pelo dispositivo. A


lista pode conter extensões suportadas pelo
fornecedor, bem como um ou mais nomes
aprovados :
cl_khr_int64_base_atomics
cl_khr_int64_extended_atomics
cl_khr_fp16
cl_khr_gl_s haring
cl_khr_gl_event
cl_khr_d3d10_s haring
cl_khr_dx 9_media_s haring
cl_khr_d3d11_s haring

CL _DEVICE_BUIL T_IN_KERNELS A lista de k ernels suportados separados por ";" .

CL _DEVICE_OPENCL _C_VER S ION A versão máximo suportado pelo compilador para


este dispositivo. Versão formato:
" OpenCL<space>C<space><major_version.minor_v
ersion><space><vendor-specific information> "

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;
}

© 2000-2018, MetaQuotes Software Corp.


1944 Trabalhando com OpenCL

//--- Exibir informações sobre a plataforma


if(CLGetInfoString(cl_ctx,CL_PLATFORM_NAME,str))
Print("Nome da plataforma OpenCL: ");
if(CLGetInfoString(cl_ctx,CL_PLATFORM_VENDOR,str))
Print("Fornecedor da plataforma OpenCL: ",str);
if(CLGetInfoString(cl_ctx,CL_PLATFORM_VERSION,str))
Print("Versão da plataforma OpenCL: ",str);
if(CLGetInfoString(cl_ctx,CL_PLATFORM_PROFILE,str))
Print("Perfil da plataforma OpenCL: ",str);
if(CLGetInfoString(cl_ctx,CL_PLATFORM_EXTENSIONS,str))
Print("Extensão da plataforma OpenCL: ",str);
//--- Exibir informações sobre o dispositivo
if(CLGetInfoString(cl_ctx,CL_DEVICE_NAME,str))
Print("Nome do dispositivo OpenCL: ",str);
if(CLGetInfoString(cl_ctx,CL_DEVICE_PROFILE,str))
Print("Perfil do dispositivo OpenCL: ",str);
if(CLGetInfoString(cl_ctx,CL_DEVICE_BUILT_IN_KERNELS,str))
Print("Kernels dispositivo OpenCL: ",str);
if(CLGetInfoString(cl_ctx,CL_DEVICE_EXTENSIONS,str))
Print("Extensão do dispositivo OpenCL: ",str);
if(CLGetInfoString(cl_ctx,CL_DEVICE_VENDOR,str))
Print("Fornecedor do dispositivo OpenCL: ",str);
if(CLGetInfoString(cl_ctx,CL_DEVICE_VERSION,str))
Print("Versão do dispositivo OpenCL: ",str);
if(CLGetInfoString(cl_ctx,CL_DEVICE_OPENCL_C_VERSION,str))
Print("Versão do c OpenCL: ",str);
//--- Exibir informações gerais sobre o dispositivo OpenCL
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));
Print("Memória global OpenCL: ",CLGetInfoInteger(cl_ctx,CL_DEVICE_GLOBAL_MEM_SIZE));
Print("Memória local OpenCL: ",CLGetInfoInteger(cl_ctx,CL_DEVICE_LOCAL_MEM_SIZE));
//---
}

© 2000-2018, MetaQuotes Software Corp.


1945 Trabalhando com OpenCL

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 :

· CL _USE_ANY – Qualquer dispositivo disponível com suporte OpenCL é permitido;


· CL _USE_CPU_ONL Y – Somente a emulação OpenCL na CPU é permitida;
· CL _USE_GPU_ONL Y – A emulação OpenCL é proibida e somente dispositivos especializados com
suporte OpenCL (placas de v ídeo) podem ser usados.

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().

© 2000-2018, MetaQuotes Software Corp.


1946 Trabalhando com OpenCL

CLContextFree
Remove 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().

© 2000-2018, MetaQuotes Software Corp.


1947 Trabalhando com OpenCL

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.

A lista de IDs disponíveis das propriedades do dispositivo OpenCL


Descrição exata da propriedade e suas funções podem ser encontradas no site oficial do OpenCL.

Identificador Valor
CL _DEVICE_TYPE 0x 1000
CL _DEVICE_VENDOR_ID 0x 1001
CL _DEVICE_MAX_COM PUT E_UNIT S 0x 1002
CL _DEVICE_MAX_W ORK_IT EM _DIMENS IONS 0x 1003
CL _DEVICE_MAX_W ORK_GR OUP_S IZE 0x 1004
CL _DEVICE_MAX_W ORK_IT EM _S IZES 0x 1005

© 2000-2018, MetaQuotes Software Corp.


1948 Trabalhando com OpenCL

CL _DEVICE_PR EFERR ED_VECT OR_WIDTH_CH A 0x 1006


R
CL _DEVICE_PR EFERR ED_VECT OR_WIDTH_S H O 0x 1007
RT
CL _DEVICE_PR EFERR ED_VECT OR_WIDTH_INT 0x 1008
CL _DEVICE_PR EFERR ED_VECT OR_WIDTH_LON 0x 1009
G
CL _DEVICE_PR EFERR ED_VECT OR_WIDTH_FLO 0x 100A
AT

CL _DEVICE_PR EFERR ED_VECT OR_WIDTH_DOU 0x 100B


BLE
CL _DEVICE_MAX_CLOCK_FR EQUENCY 0x 100C
CL _DEVICE_ADDR ESS _BIT S 0x 100D
CL _DEVICE_MAX_R EAD_IMAGE_ARGS 0x 100E
CL _DEVICE_MAX_WRIT E_IMAGE_ARGS 0x 100F
CL _DEVICE_MAX_MEM _ALLOC_S IZE 0x 1010
CL _DEVICE_IMAGE2D_MAX_WIDTH 0x 1011
CL _DEVICE_IMAGE2D_MAX_H EIGHT 0x 1012
CL _DEVICE_IMAGE3D_MAX_WIDTH 0x 1013
CL _DEVICE_IMAGE3D_MAX_H EIGHT 0x 1014
CL _DEVICE_IMAGE3D_MAX_DEPTH 0x 1015
CL _DEVICE_IMAGE_SUPPORT 0x 1016
CL _DEVICE_MAX_PAR AMET ER_S IZE 0x 1017
CL _DEVICE_MAX_SAM PLER S 0x 1018
CL _DEVICE_MEM _BASE_ADDR_AL IGN 0x 1019
CL _DEVICE_M IN_DAT A_TYPE_AL IGN_S IZE 0x 101A
CL _DEVICE_S INGLE_FP_CONFIG 0x 101B
CL _DEVICE_GLOBAL _MEM _CACH E_TYPE 0x 101C
CL _DEVICE_GLOBAL _MEM _CACH EL INE_S IZE 0x 101D
CL _DEVICE_GLOBAL _MEM _CACH E_S IZE 0x 101E
CL _DEVICE_GLOBAL _MEM _S IZE 0x 101F
CL _DEVICE_MAX_CONS T ANT_BUFFER_S IZE 0x 1020
CL _DEVICE_MAX_CONS T ANT_ARGS 0x 1021

© 2000-2018, MetaQuotes Software Corp.


1949 Trabalhando com OpenCL

CL _DEVICE_LOCAL _MEM _TYPE 0x 1022


CL _DEVICE_LOCAL _MEM _S IZE 0x 1023
CL _DEVICE_ERR OR_CORR ECTION_SUPPORT 0x 1024
CL _DEVICE_PR OFIL ING_TIMER_R ESOLUTION 0x 1025
CL _DEVICE_ENDIAN_L ITT LE 0x 1026
CL _DEVICE_AVAILABLE 0x 1027
CL _DEVICE_COM PILER_AVAILABLE 0x 1028
CL _DEVICE_EXECUTION_CAPABIL ITIES 0x 1029
CL _DEVICE_QUEUE_PR OPERTIES 0x 102A
CL _DEVICE_NAME 0x 102B
CL _DEVICE_VENDOR 0x 102C
CL _DRIVER_VER S ION 0x 102D
CL _DEVICE_PR OFILE 0x 102E
CL _DEVICE_VER S ION 0x 102F
CL _DEVICE_EXT ENS IONS 0x 1030
CL _DEVICE_PLATFOR M 0x 1031
CL _DEVICE_DOUBLE_FP_CONFIG 0x 1032
CL _DEVICE_PR EFERR ED_VECT OR_WIDTH_H AL 0x 1034
F
CL _DEVICE_H OS T_UNIFIED_MEMORY 0x 1035
CL _DEVICE_NATIVE_VECT OR_WIDTH_CH AR 0x 1036
CL _DEVICE_NATIVE_VECT OR_WIDTH_S H ORT 0x 1037
CL _DEVICE_NATIVE_VECT OR_WIDTH_INT 0x 1038
CL _DEVICE_NATIVE_VECT OR_WIDTH_LONG 0x 1039
CL _DEVICE_NATIVE_VECT OR_WIDTH_FLOAT 0x 103A
CL _DEVICE_NATIVE_VECT OR_WIDTH_DOUBLE 0x 103B
CL _DEVICE_NATIVE_VECT OR_WIDTH_H AL F 0x 103C
CL _DEVICE_OPENCL _C_VER S ION 0x 103D
CL _DEVICE_L INKER_AVAILABLE 0x 103E
CL _DEVICE_BUIL T_IN_KERNELS 0x 103F
CL _DEVICE_IMAGE_MAX_BUFFER_S IZE 0x 1040
CL _DEVICE_IMAGE_MAX_ARR AY_S IZE 0x 1041

© 2000-2018, MetaQuotes Software Corp.


1950 Trabalhando com OpenCL

CL _DEVICE_PAR ENT_DEVICE 0x 1042


CL _DEVICE_PARTITION_MAX_SUB_DEVICES 0x 1043
CL _DEVICE_PARTITION_PR OPERTIES 0x 1044
CL _DEVICE_PARTITION_AFFINITY_DOMAIN 0x 1045
CL _DEVICE_PARTITION_TYPE 0x 1046
CL _DEVICE_R EFER ENCE_COUNT 0x 1047
CL _DEVICE_PR EFERR ED_INT ER OP_USER_S YNC 0x 1048
CL _DEVICE_PRINTF_BUFFER_S IZE 0x 1049
CL _DEVICE_IMAGE_PIT CH_AL IGNMENT 0x 104A
CL _DEVICE_IMAGE_BASE_ADDR ESS _AL IGNMEN 0x 104B
T

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

© 2000-2018, MetaQuotes Software Corp.


1951 Trabalhando com OpenCL

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_khr_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"

© 2000-2018, MetaQuotes Software Corp.


1952 Trabalhando com OpenCL

" uint local_start_offset=kernel_index*N; \r\n"


" for(int i=0; i<N; i++) \r\n"
" { \r\n"
" data[i+local_start_offset] *= 2.0; \r\n"
" } \r\n"
" } \r\n";
//+------------------------------------------------------------------+
//| Test_CPU |
//+------------------------------------------------------------------+
bool Test_CPU(double &data[],const int N,const int id,const int total_arrays)
{
//--- checar tamanho do array
if(ArraySize(data)==0) return(false);
//--- checar índice do array
if(id>total_arrays) return(false);
//--- Calcular deslocamento local para o array com id do índice
int local_start_offset=id*N;
//--- multiplicar elementos por 2
for(int i=0; i<N; i++)
{
data[i+local_start_offset]*=2.0;
}
return true;
}
//---
#define ARRAY_SIZE 100 // tamanho do array
#define TOTAL_ARRAYS 5 // total de arrays
//--- manipulador OpenCL
int cl_ctx; // contexto do manipulador OpenCL
int cl_prg; // programa do manipulador OpenCL
int cl_krn; // Kernel do manipulador OpenCL
int cl_mem; // buffer do manipulador OpenCL
//---
double DataArray1[]; // dados do array para cálculo do CPU
double DataArray2[]; // dados do array para cálculo do GPU
//+------------------------------------------------------------------+
//| Função de início do programa script |
//+------------------------------------------------------------------+
int OnStart()
{
//--- inicializar objetos do OpenCL
//--- Criar contexto do OpenCL
if((cl_ctx=CLContextCreate())==INVALID_HANDLE)
{
Print("OpenCL não encontrado. Error=",GetLastError());
return(1);
}
//--- criar programa OpenCL
if((cl_prg=CLProgramCreate(cl_ctx,cl_src))==INVALID_HANDLE)

© 2000-2018, MetaQuotes Software Corp.


1953 Trabalhando com OpenCL

{
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

© 2000-2018, MetaQuotes Software Corp.


1954 Trabalhando com OpenCL

uint offset[]={0};
//--- 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);
}

© 2000-2018, MetaQuotes Software Corp.


1955 Trabalhando com OpenCL

CLProgramFree
Remove 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().

© 2000-2018, MetaQuotes Software Corp.


1956 Trabalhando com OpenCL

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.

© 2000-2018, MetaQuotes Software Corp.


1957 Trabalhando com OpenCL

CLKernelFree
Remove 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().

© 2000-2018, MetaQuotes Software Corp.


1958 Trabalhando com OpenCL

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
Retorna 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.

© 2000-2018, MetaQuotes Software Corp.


1959 Trabalhando com 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
Retorna true se for bem sucedido, caso contrário retorna false. Para obter informações sobre o erro,
utilize a função GetLastError().

© 2000-2018, MetaQuotes Software Corp.


1960 Trabalhando com OpenCL

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
Retorna true se a execução for bem-sucedida, caso contrario, false. Para obter informações sobre o
erro utilize a função GetLastError().

© 2000-2018, MetaQuotes Software Corp.


1961 Trabalhando com OpenCL

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.

© 2000-2018, MetaQuotes Software Corp.


1962 Trabalhando com OpenCL

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().

© 2000-2018, MetaQuotes Software Corp.


1963 Trabalhando com OpenCL

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.

© 2000-2018, MetaQuotes Software Corp.


1964 Trabalhando com OpenCL

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.

© 2000-2018, MetaQuotes Software Corp.


1965 Trabalhando com OpenCL

CLExecute
A função executa um programa OpenCL. Existem três versões da função:

1. Lançamento das funções k ernel usando um k ernel


bool  CLExecute(
int  kernel   // Manipulador para o kernel de um programa OpenCL
);

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
Retorna true se for bem sucedido, caso contrário retorna false. Para obter informações sobre o erro,
utilize a função GetLastError().

Observação

© 2000-2018, MetaQuotes Software Corp.


1966 Trabalhando com OpenCL

Considerar o uso dos parâmetros no exemplo a seguir:


· work_dim especifica work_items[] da dimensão do array descrevendo as tarefas. Se work_dim=3,
array tridimensional work_items[N1, N2, N3] é usado.
· global_work_size[] contém os valores definindo o tamanho array do work_items[]. Se
work_dim=3, array do global_work_size[3] pode ser {40, 100, 320}. Então nós temos
work_items[40, 100, 320]. Assim, o número total de tarefas é 40 х 100 х 320 = 1 280 000.
· local_work_size[] define o subconjunto das tarefas que serão executadas pelo k ernel específico
de programa OpenCL. A sua dimensão é igual a dimensãowork_items[] e permite a divisão exata
da tarefa comum de subconjunto dentro de subconjuntos menores. Na verdade, os tamanhos do
array do local_work_size[] devem ser selecionados de modo a dividir a tarefa global work_items[]
definindo dentro de subconjuntos menores. local_work_size[3]={10, 10, 10} vai se encaixar no
exemplo corrente, como work_items[40, 100, 320] podem ser obtidos a partir do array do
local_items[10, 10, 10] sem excesso.

© 2000-2018, MetaQuotes Software Corp.


1967 Trabalhando com OpenCL

CLExecutionStatus
Retornar 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
Retorna o estado do programa OpenCL, o valor pode ser um dos seguintes :
· CL _COM PLET E=0 - programa concluído,
· CL _R UNNING=1 – em execução,
· CL _SUBM 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().

© 2000-2018, MetaQuotes Software Corp.


1968 Biblioteca Padrão

Biblioteca Padrão
Este grupo de capítulos contém os detalhes técnicos da Biblioteca Padrão MQL5 e as descrições de
todos os seus componentes fundamentais.

A Biblioteca Padrão MQL5 é escrita em linguagem MQL5 e projetada para facilitar a escrita de
programas (indicadores, scripts, experts) para os usuários finais. A biblioteca oferece acesso prático
para a maioria das funções internas MQL5.

A Biblioteca Padrão MQL5 é alocado no diretório de trabalho do terminal e na pasta "Include" .

Seção Localização
Matemática Include\Math\
OpenCL Include\OpenCL\
Classe base CObject Include\
Coleções de dados Include\Arrays \
Coleções de dados genéricas Include\Generic\
Arquivos Include\Files \
Linhas Include\Strings \
Objetos gráficos Include\Objects \
Gráficos personalizados Include\Canvas \
Gráficos de preços Include\Charts \
Gráficos científicos Include\Graphics \
Indicadores Include\Indicators \
Classes de negociação Include\T rade\
Módulos de estratégias Include\Expert\
Painéis e caixas de diálogo Include\Controls \

© 2000-2018, MetaQuotes Software Corp.


1969 Biblioteca Padrão

Para executar cálculos em diferentes áreas da matemática, são oferecidas várias bibliotecas :
· Estatística – funções para trabalhar com diferentes distribuições a partir da teoria da probabilidade
· Logica difusa – biblioteca de lógica fuzzy que implementa um sistema de inferência fuzzy Mamdani
e Sugeno
· AL GL IB
– análise de dados (clustering, árvores de decisão, regressão linear, redes neurais), solução
de equações diferenciais, análise de Fourier, integração numérica, otimização, análise estatística e
muito mais.

© 2000-2018, MetaQuotes Software Corp.


1970 Biblioteca Padrão

Estatísticas
A biblioteca estatística destina-se a um cômodo trabalho com as distribuições estatísticas básicas.

Para cada distribuição na biblioteca, são apresentadas 5 características :


1. Cálculo de densidade da distribuição, função do tipo MathProbabilityDensityX()
2. Cálculo de probabilidade, função do tipo MathCumulativeDistributionX()
3. Cálculo de quantis das distribuições, função do tipo MathQuantileX()
4. Geração de números aleatórios com a distribuição definida, função do tipo MathRandomX()
5. Cálculo de momentos teóricos das distribuições, função do tipo MathMoments X()

Além de calcular os valores para as variáveis ​aleatórias individuais, na biblioteca, são apresentadas
também as sobrecargas das funções, que produzem os cálculos nas matrizes.

· Características estatísticas

· Distribuição normal
· Distribuição log-normal
· Distribuição beta
· Distribuição beta não-central
· Distribuição gama
· Qui-quadrado

· Qui-quadrado não-central

· Distribuição exponencial
· Distribuição F de Fis her-Snedecor
· Distribuição F de Fis her-Snedecor não-central
· Distribuição t de Student
· Distribuição t de Student não-central
· Distribuição log ística
· Distribuição de Cauchy
· Distribuição uniforme
· Distribuição de W eibull
· Distribuição binomial
· Distribuição binomial negativa
· Distribuição geométrica
· Distribuição hipergeométrica
· Distribuição de Poisson
· Funções auxiliares

Exemplo:

© 2000-2018, MetaQuotes Software Corp.


1971 Biblioteca Padrão

//+------------------------------------------------------------------+
//| NormalDistributionExample.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"
//--- habilitamos as funções para calcular a distribuição normal
#include <Math\Stat\Normal.mqh>
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- definimos os parâmetros da distribuição normal
double mu=5.0;
double sigma=1.0;
PrintFormat("Distribuição normal com parâmetros mu=%G e sigma=%G, exemplos de cálculos:",mu,sigm
//--- definimos o intervalo
double x1=mu-sigma;
double x2=mu+sigma;
//--- variáveis para calcular a probabilidade
double cdf1,cdf2,probability;
//--- variáveis para o código de erro
int error_code1,error_code2;
//--- calculamos os valores de função da distribuição
cdf1=MathCumulativeDistributionNormal(x1,mu,sigma,error_code1);
cdf2=MathCumulativeDistributionNormal(x2,mu,sigma,error_code2);
//--- verificamos o código de erros
if(error_code1==ERR_OK && error_code2==ERR_OK)
{
//--- calculamos a probabilidade da variável aleatória no intervalo
probability=cdf2-cdf1;
//--- exibimos o resultado
PrintFormat("1. Calcular no intervalo %.5f<x<%.5f a variável aleatória",x1,x2);
PrintFormat(" Resposta: Probability = %5.8f",probability);
}

//--- Encontramos o intervalo de valores da variável aleatória x, correspondente ao 95% da probabil


probability=0.95; // definimos a probabilidade de confiança
//--- definimos a probabilidade nos limites do i intervalo
double p1=(1.0- probability)*0.5;
double p2=probability+(1.0- probability)*0.5;
//--- calculamos os limites do intervalo
x1=MathQuantileNormal(p1,mu,sigma,error_code1);
x2=MathQuantileNormal(p2,mu,sigma,error_code2);
//--- verificamos o código de erros
if(error_code1==ERR_OK && error_code2==ERR_OK)
{
//--- exibimos o resultado
PrintFormat("2. Para o intervalo de confiança = %.2f encontrar o intervalo da variável aleató
PrintFormat(" Resposta: intervalo %5.8f <= x <=%5.8f",x1,x2);
}

PrintFormat("3. Calculamos os 4 primeiros momentos calculados e teóricos da distribuição");


//--- Geramos a matriz de números aleatórios, calculamos os primeiros 4 momentos e comparamos com o
int data_count=1000000; // definimos o número de valores e preparamos a matriz
double data[];
ArrayResize(data,data_count);
//--- geramos os valores aleatórios e salvamo-los na matriz

© 2000-2018, MetaQuotes Software Corp.


1972 Biblioteca Padrão

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


{
data[i]=MathRandomNormal(mu,sigma,error_code1);
}
//--- definimos o índice do valor inicial e número de dados para o cálculo
int start=0;
int count=data_count;
//--- calculamos os primeiros 4 momentos dos valores gerados
double mean=MathMean(data,start,count);
double variance=MathVariance(data,start,count);
double skewness=MathSkewness(data,start,count);
double kurtosis=MathKurtosis(data,start,count);
//--- variáveis para os momentos teóricos
double normal_mean=0;
double normal_variance=0;
double normal_skewness=0;
double normal_kurtosis=0;
//--- exibimos os valores dos momentos calculados
PrintFormat(" Mean Variance Skewness Kurtosis");
PrintFormat("Calculated %.10f %.10f %.10f %.10f",mean,variance,skewness,kurtosis);
//--- calculamos os valores teóricos dos momentos e comparamos com os obtidos
if(MathMomentsNormal(mu,sigma,normal_mean,normal_variance,normal_skewness,normal_kurtosis,error_
{
PrintFormat("Theoretical %.10f %.10f %.10f %.10f",normal_mean,normal_variance,no
PrintFormat("Difference %.10f %.10f %.10f %.10f",mean-normal_mean,variance-norm
}
}

© 2000-2018, MetaQuotes Software Corp.


1973 Biblioteca Padrão

Características estatísticas
Este grupo de funções calcula as características estatísticas dos elementos na matriz:
· média,
· dispersão,
· obliquidade,
· curtose,
· mediana,
· Desvios padrão e
· padrão amostral

F unção Descrição
MathMean Calcula a média (primeiro momento) dos
elementos da matriz

MathVariance Calcula a dispersão (segundo momento) dos


elementos da matriz

MathS k ewness Calcula a obliquidade (terceiro momento) dos


elementos da matriz

MathKurtosis Calcula a curtose (quarto momento) dos


elementos da matriz

MathMoments Calcula os primeiros 4 momentos (média,


dispersão, obliquidade, curtose) dos elementos
da matriz

MathMedian Calcula a mediana dos elementos da matriz

MathStandardDeviation Calcula o desvio padrão dos elementos da


matriz

MathAverageDeviation Calcula o desvio médio dos elementos da matriz

© 2000-2018, MetaQuotes Software Corp.


1974 Biblioteca Padrão

MathMean
Calcula a média (primeiro momento) dos elementos da matriz. Equivalente a mean() no R .
double  MathMean(
const double&  array[] // matriz com dados
);

Parâmetros
array
[in] Matriz com os dados para calcular a média.
start=0
[in] Índice inicial para o cálculo.
count=WHOLE_ARRAY
[in] Número de elementos para o cálculo.

Valor de retorno
Média dos elementos da matriz. Em caso de erro, retorna NaN (não é um número).

© 2000-2018, MetaQuotes Software Corp.


1975 Biblioteca Padrão

MathVariance
Calcula a dispersão (segundo momento) dos elementos da matriz. Equivalente a var() no R .
double  MathVariance(
const double&  array[] // matriz com dados
);

Parâmetros
array
[in] Matriz com os dados para o cálculo.
start=0
[in] Índice inicial para o cálculo.
count=WHOLE_ARRAY
[in] Número de elementos para o cálculo.

Valor de retorno
Dispersão de elementos da matriz. Em caso de erro, retorna NaN (não é um número).

© 2000-2018, MetaQuotes Software Corp.


1976 Biblioteca Padrão

MathSkewness
Calcula a obliquidade (terceiro momento) dos elementos da matriz. Equivalente a s k ewness() no R
(biblioteca e1071).
double  MathSkewness(
const double&  array[] // matriz com dados
);

Parâmetros
array
[in] Matriz com os dados para o cálculo.
start=0
[in] Índice inicial para o cálculo.
count=WHOLE_ARRAY
[in] Número de elementos para o cálculo.

Valor de retorno
Obliquidade dos elementos da matriz. Em caso de erro, retorna NaN (não é um número).

© 2000-2018, MetaQuotes Software Corp.


1977 Biblioteca Padrão

MathKurtosis
Calcula a curtose (quarto momento) dos elementos da matriz. Equivalente a k urtosis() no R (biblioteca
e1071).
double  MathKurtosis(
const double&  array[] // matriz com dados
);

Parâmetros
array
[in] Matriz com os dados para o cálculo.
start=0
[in] Índice inicial para o cálculo.
count=WHOLE_ARRAY
[in] Número de elementos para o cálculo.

Valor de retorno
Curtose dos elementos da matriz. Em caso de erro, retorna NaN (não é um número).

Observação
O cálculo da curtose é realizado com respeito à distribuição normal (excess k urtosis =k urtosis-3), ou
seja, a curtose de uma distribuição normal é igual a zero.

Ele será positivo, se o pico da distribuição estiver perto da expectativa matemática, ou agudo e
negativo, se a parte superior for plana.

© 2000-2018, MetaQuotes Software Corp.


1978 Biblioteca Padrão

MathMoments
Calcula os primeiros 4 momentos (média, dispersão, obliquidade, curtose) dos elementos da matriz.
double  MathMoments(
const double&  array[], // matriz com dados
double&  mean, // média (primeiro momento)
double&  variance, // dispersão (segundo momento)
double&  skewness, // coeficiente de obliquidade (terceiro momento)
double&  kurtosis, // coeficiente de curtose (quarto momento)
const int   start=0, // índice inicial
const int  count=WHOLE_ARRAY  // número de elementos
);

Parâmetros
array
[in] Matriz com os dados para o cálculo.
mean
[out] Variável para a média (1 momento)
variance
[out] Variável para a dispersão (2 momento)
skewness
[out] Variável para a obliquidade (3 momento)
kurtosis
[out] Variável para a curtose (4 momento)
start=0
[in] Índice inicial para o cálculo.
count=WHOLE_ARRAY
[in] Número de elementos para o cálculo.

Valor de retorno
Retorna true, se os momentos forem calculados com sucesso, caso contrário false.

Observação
O cálculo da curtose é realizado com respeito à distribuição normal (excess k urtosis =k urtosis-3), ou
seja, a curtose de uma distribuição normal é igual a zero.

Ele será positivo, se o pico da distribuição estiver perto da expectativa matemática, ou agudo e
negativo, se a parte superior for plana.

© 2000-2018, MetaQuotes Software Corp.


1979 Biblioteca Padrão

MathMedian
Calcula a mediana dos elementos da matriz. Equivalente a median() no R .
double  MathMedian(
const double&  array[] // matriz com dados
);

Parâmetros
array
[in] Matriz com os dados para o cálculo.
start=0
[in] Índice inicial para o cálculo.
count=WHOLE_ARRAY
[in] Número de elementos para o cálculo.

Valor de retorno
Mediana dos elementos da matriz. Em caso de erro, retorna NaN (não é um número).

© 2000-2018, MetaQuotes Software Corp.


1980 Biblioteca Padrão

MathStandardDeviation
Calcula o desvio padrão dos elementos da matriz. Equivalente a sd() no R .
double  MathStandardDeviation(
const double&  array[] // matriz com dados
);

Parâmetros
array
[in] Matriz com os dados para o cálculo.
start=0
[in] Índice inicial para o cálculo.
count=WHOLE_ARRAY
[in] Número de elementos para o cálculo.

Valor de retorno
Desvio padrão dos elementos da matriz. Em caso de erro, retorna NaN (não é um número).

© 2000-2018, MetaQuotes Software Corp.


1981 Biblioteca Padrão

MathAverageDeviation
Calcula o desvio médio dos elementos da matriz. Equivalente a aad() no R .
double  MathAverageDeviation(
const double&  array[] // matriz com dados
);

Parâmetros
array
[in] Matriz com os dados para o cálculo.
start=0
[in] Índice inicial para o cálculo.
count=WHOLE_ARRAY
[in] Número de elementos para o cálculo.

Valor de retorno
Desvio médio dos elementos da matriz. Em caso de erro, retorna NaN (não é um número).

© 2000-2018, MetaQuotes Software Corp.


1982 Biblioteca Padrão

Distribuição normal
Esta seção apresenta as funções para trabalhar com a distribuição normal. Elas permitem que você
calcule a densidade, probabilidade, quantis e gere números pseudo-aleatórios de acordo com a
distribuição normal. A distribuição é descrita pela seguinte fórmula:

Onde:
· x — valor da variável aleatória
· m — valor esperado
· s — desvio padrão

Além do cálculo das variáveis ​aleatórias individuais, é poss ível trabalhar com suas matrizes.

F unção Descrição
MathProbabilityDensityNormal Calcula a função densidade de probabilidade da
distribuição normal

MathCumulativeDistributionNormal Calcula o valor da função de distribuição normal


de probabilidade

MathQuantileNormal Calcula o inverso da função de distribuição


normal para a probabilidade definida

MathR andomNormal Gera um valor/matriz pseudo-aleatório de


valores pseudo-aleatórios de acordo com a
distribuição normal

MathMoments Normal Calcula os valores numéricos teóricos dos


primeiros 4 momentos da distribuição normal

© 2000-2018, MetaQuotes Software Corp.


1983 Biblioteca Padrão

Exemplo:
#include <Graphics\Graphic.mqh>
#include <Math\Stat\Normal.mqh>
#include <Math\Stat\Math.mqh>
#property script_show_inputs
//--- input parameters
input double mean_value=0; // valor esperado (mean)
input double std_dev=1; // desvio padrão (standard deviation)
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- desativamos a exibição do gráfico de preço
ChartSetInteger(0,CHART_SHOW,false);
//--- inicializamos o gerador de números aleatórios
MathSrand(GetTickCount());
//--- geramos a amostragem da variável aleatória
long chart=0;
string name="GraphicNormal";
int n=1000000; // número de valores na amostragem
int ncells=51; // número de intervalos no gráfico de colunas
double x[]; // centros de intervalos no gráfico de colunas
double y[]; // número de valores a partir da amostragem dentro do intervalo
double data[]; // amostragem de valores aleatórios
double max,min; // valores máximo e mínimo na amostragem
//--- obtemos a amostragem a partir da distribuição normal
MathRandomNormal(mean_value,std_dev,n,data);
//--- calculamos os dados para plotagem do gráfico de colunas
CalculateHistogramArray(data,x,y,max,min,ncells);
//--- obtemos os limites de sequência e passo para plotagem da curva teórica
double step;
GetMaxMinStepValues(max,min,step);
step=MathMin(step,(max-min)/ncells);
//--- obtemos teoricamente os cálculos no intervalo [min,max]
double x2[];
double y2[];
MathSequence(min,max,step,x2);
MathProbabilityDensityNormal(x2,mean_value,std_dev,false,y2);
//--- dimensionamos
double theor_max=y2[ArrayMaximum(y2)];
double sample_max=y[ArrayMaximum(y)];
double k=sample_max/theor_max;
for(int i=0; i<ncells; i++)
y[i]/=k;
//--- imprimimos o gráfico
CGraphic graphic;
if(ObjectFind(chart,name)<0)

© 2000-2018, MetaQuotes Software Corp.


1984 Biblioteca Padrão

graphic.Create(chart,name,0,0,0,780,380);
else
graphic.Attach(chart,name);
graphic.BackgroundMain(StringFormat("Normal distribution mu=%G sigma=%G",mean_value,std_dev));
graphic.BackgroundMainSize(16);
//--- plot all curves
graphic.CurveAdd(x,y,CURVE_HISTOGRAM,"Sample").HistogramWidth(6);
//--- e agora traçamos a curva teórica de densidade da distribuição
graphic.CurveAdd(x2,y2,CURVE_LINES,"Theory");
//--- plot all curves
graphic.CurvePlotAll();
graphic.Update();
}
//+------------------------------------------------------------------+
//| Calculate frequencies for data set |
//+------------------------------------------------------------------+
bool CalculateHistogramArray(const double &data[],double &intervals[],double &frequency[],
double &maxv,double &minv,const int cells=10)
{
if(cells<=1) return (false);
int size=ArraySize(data);
if(size<cells*10) return (false);
minv=data[ArrayMinimum(data)];
maxv=data[ArrayMaximum(data)];
double range=maxv-minv;
double width=range/cells;
if(width==0) return false;
ArrayResize(intervals,cells);
ArrayResize(frequency,cells);
//--- definimos os centros dos intervalos
for(int i=0; i<cells; i++)
{
intervals[i]=minv+(i+0.5)*width;
frequency[i]=0;
}
//--- preenchemos a frequência de aparecimento no intervalo
for(int i=0; i<size; i++)
{
int ind=int((data[i]-minv)/width);
if(ind>=cells) ind=cells-1;
frequency[ind]++;
}
return (true);
}
//+------------------------------------------------------------------+
//| Calculates values for sequence generation |
//+------------------------------------------------------------------+
void GetMaxMinStepValues(double &maxv,double &minv,double &stepv)
{

© 2000-2018, MetaQuotes Software Corp.


1985 Biblioteca Padrão

//--- calculamos a magnitude da sequência para obter a precisão da normalização


double range=MathAbs(maxv-minv);
int degree=(int)MathRound(MathLog10(range));
//--- normalizamos os valores máx. e mín. com a precisão
maxv=NormalizeDouble(maxv,degree);
minv=NormalizeDouble(minv,degree);
//--- definimos o passo de geração da mesma maneira a partir da precisão definida
stepv=NormalizeDouble(MathPow(10,-degree),degree);
if((maxv-minv)/stepv<10)
stepv/=10.;
}

© 2000-2018, MetaQuotes Software Corp.


1986 Biblioteca Padrão

MathProbabilityDensityNormal
Calcula a função densidade de probabilidade da distribuição normal com parâmetros mu e sigma para a
variável aleatória x. Em caso de erro, retorna NaN.
double  MathProbabilityDensityNormal(
const double  x, // valor da variável aleatória
const double  mu, // parâmetro da distribuição mean (valor esperado)
const double  sigma, // parâmetro da distribuição sigma (desvio padrão)
const bool   log_mode, // cálculo do logaritmo do valor
int&  error_code  // variável para registro do código de erro
);

Calcula a função densidade de probabilidade da distribuição normal com parâmetros mu e sigma para a
variável aleatória x. Em caso de erro, retorna NaN.
double  MathProbabilityDensityNormal(
const double  x, // valor da variável aleatória
const double  mu, // parâmetro da distribuição mean (valor esperado)
const double  sigma, // parâmetro da distribuição sigma (desvio padrão)
int&  error_code  // variável para registro do código de erro
);

Calcula a função densidade de probabilidade da distribuição normal com parâmetros mu e sigma para a
matriz das variáveis aleatórias x []. Em caso de erro, retorna false. Equivalente a dnorm() no R .
bool  MathProbabilityDensityNormal(
const double&  x[], // matriz com valores da variável aleatória
const double  mu, // parâmetro da distribuição mean (valor esperado)
const double  sigma, // parâmetro da distribuição sigma (desvio padrão)
const bool   log_mode, // cálculo do logaritmo do valor
double&  result[]   // matriz para o valor da função densidade de probabilidade
);

Calcula a função densidade de probabilidade da distribuição normal com parâmetros mu e sigma para a
matriz das variáveis aleatórias x []. Em caso de erro, retorna false.
bool  MathProbabilityDensityNormal(
const double&  x[], // matriz com valores da variável aleatória
const double  mu, // parâmetro da distribuição mean (valor esperado)
const double  sigma, // parâmetro da distribuição sigma (desvio padrão)
double&  result[]   // matriz para o valor da função densidade de probabilidade
);

Parâmetros
x
[in] Valor da variável aleatória.
x[]
[in] Matriz com valores da variável aleatória.

© 2000-2018, MetaQuotes Software Corp.


1987 Biblioteca Padrão

mu
[in] Parâmetro da distribuição mean (valor esperado).
sigma
[in] Parâmetro da distribuição sigma (desvio padrão).
log_mode
[in] Sinalizador de cálculo do algoritmo de um valor. Se log _mode=true, retorna o logaritmo
natural da função densidade de probabilidade.

error_code
[out] Variável para obter o código de erro.
result[]
[out] Matriz para obter os valores da função densidade de probabilidade.

© 2000-2018, MetaQuotes Software Corp.


1988 Biblioteca Padrão

MathCumulativeDistributionNormal
Calcula o valor da função de distribuição normal de probabilidade com parâmetros mu e sigma para a
variável aleatória x. Em caso de erro, retorna NaN.
double  MathCumulativeDistributionNormal(
const double  x, // valor da variável aleatória
const double  mu, // valor esperado
const double  sigma, // desvio padrão
const bool   tail, // sinalizador para o cálculo da cauda (tail)
const bool   log_mode, // cálculo do logaritmo do valor
int&  error_code  // variável para registro do código de erro
);

Calcula o valor da função de distribuição normal de probabilidade com parâmetros mu e sigma para a
variável aleatória x. Em caso de erro, retorna NaN.
double  MathCumulativeDistributionNormal(
const double  x, // valor da variável aleatória
const double  mu, // valor esperado
const double  sigma, // desvio padrão
int&  error_code  // variável para registro do código de erro
);

Calcula o valor da função de distribuição normal de probabilidade com parâmetros mu e sigma para a
matriz das variáveis aleatórias x []. Em caso de erro, retorna false. Equivalente a dnorm() no R .
bool  MathCumulativeDistributionNormal(
const double& x[], // matriz com valores da variável aleatória
const double  mu, // valor esperado
const double  sigma, // desvio padrão
const bool   tail, // sinalizador para o cálculo da cauda (tail)
const bool   log_mode, // cálculo do logaritmo do valor
double&  result[]  // matriz para valores da função de probabilidade
);

Calcula o valor da função de distribuição normal de probabilidade com parâmetros mu e sigma para a
matriz das variáveis aleatórias x []. Em caso de erro, retorna false.
bool  MathCumulativeDistributionNormal(
const double& x[], // matriz com valores da variável aleatória
const double  mu, // valor esperado
const double  sigma, // desvio padrão
double&  result[]  // matriz para valores da função de probabilidade
);

Parâmetros
x
[in] Valor da variável aleatória.
x[]

© 2000-2018, MetaQuotes Software Corp.


1989 Biblioteca Padrão

[in] Matriz com valores da variável aleatória.


mu
[in] Parâmetro da distribuição mean (valor esperado).
sigma
[in] Parâmetro da distribuição sigma (desvio padrão).
tail
[in] Sinalizador de cálculo. Se tail=true, é calculada a probabilidade de que a variável aleatória
não será superior a x.

log_mode
[in] Sinalizador de cálculo do algoritmo de um valor. Se log _mode=true, retorna o logaritmo
natural da função densidade de probabilidade.

error_code
[out] Variável para obter o código de erro.
result[]
[out] Matriz para obter os valores da função de probabilidade.

© 2000-2018, MetaQuotes Software Corp.


1990 Biblioteca Padrão

MathQuantileNormal
Calcula para uma determinada probabilidade probability o inverso da função de distribuição normal
com parâmetros mu e sigma. Em caso de erro, retorna NaN.
double  MathQuantileNormal(
const double  probability, // valor da probabilidade da variável aleatória
const double  mu, // valor esperado
const double  sigma, // desvio padrão
const bool   tail, // sinalizador para o cálculo da cauda (tail)
const bool   log_mode, // cálculo do logaritmo do valor
int&  error_code  // variável para registro do código de erro
);

Calcula para uma determinada probabilidade probability o inverso da função de distribuição normal
com parâmetros mu e sigma. Em caso de erro, retorna NaN.
double  MathQuantileNormal(
const double  probability, // valor da probabilidade da variável aleatória
const double  mu, // valor esperado
const double  sigma, // desvio padrão
int&  error_code  // variável para registro do código de erro
);

Calcula para a matriz de valores de probabilidade probability[] o inverso da função de distribuição


normal com parâmetros mu e sigma. Em caso de erro, retorna false. Equivalente a qnorm() no R .
bool  MathQuantileNormal(
const double& probability[], // matriz com valores de probabilidade da variável aleatória
const double  mu, // valor esperado
const double  sigma, // desvio padrão
const bool   tail, // sinalizador para o cálculo da cauda (tail)
const bool   log_mode, // cálculo do logaritmo do valor
double&  result[]  // matriz com valores de quantis
);

Calcula para a matriz de valores de probabilidade probability[] o inverso da função de distribuição


normal com parâmetros mu e sigma. Em caso de erro, retorna false.
bool  MathQuantileNormal(
const double& probability[], // matriz com valores de probabilidade da variável aleatória
const double  mu, // valor esperado
const double  sigma, // desvio padrão
double&  result[]  // matriz com valores de quantis
);

Parâmetros
probability
[in] Valor da probabilidade da variável aleatória.
probability[]

© 2000-2018, MetaQuotes Software Corp.


1991 Biblioteca Padrão

[in] Matriz com valores da probabilidade da variável aleatória.


mu
[in] Parâmetro da distribuição mean (valor esperado).
sigma
[in] Parâmetro da distribuição sigma (desvio padrão).
tail
[in] Sinalizador de cálculo. Se for false, o cálculo será realizado para uma probabilidade de 1.0 -
probability

log_mode
[in] Sinalizador de cálculo do algoritmo de um valor. Se log _mode=true, retorna o logaritmo
natural da função densidade de probabilidade.

error_code
[out] Variável para obter o código de erro.
result[]
[out] Matriz para obter quantis.

© 2000-2018, MetaQuotes Software Corp.


1992 Biblioteca Padrão

MathRandomNormal
Gera um número pseudo-aleatório de acordo com a distribuição normal com parâmetros mu e sigma.
Em caso de erro, retorna NaN.
double  MathRandomNormal(
const double  mu, // valor esperado
const double  sigma, // desvio padrão
int&  error_code  // variável para registro do código de erro
);

Gera números pseudo-aleatórios de acordo com a distribuição normal com parâmetros mu e sigma. Em
caso de erro, retorna false. Equivalente a rnorm() no R .
bool  MathRandomNormal(
const double  mu, // valor esperado
const double  sigma, // desvio padrão
const int   data_count, // número de valores necessários
double&  result[]  // matriz para obter números pseudo-aleatórios
);

Parâmetros
mu
[in] Parâmetro da distribuição mean (valor esperado).
sigma
[in] Parâmetro da distribuição sigma (desvio padrão).
data_count
[in] Número de valores pseudo-aleatórios que é preciso obter.
error_code
[out] Variável para obter o código de erro.
result[]
[out] Matriz para obter os valores dos números pseudo-aleatórios.

© 2000-2018, MetaQuotes Software Corp.


1993 Biblioteca Padrão

MathMomentsNormal
Calcula os valores numéricos teóricos dos primeiros 4 momentos da distribuição normal.
double  MathMomentsNormal(
const double  mu, // valor esperado
const double  sigma, // desvio padrão
double&  mean, // variável para o valor médio
double&  variance, // variável para a dispersão
double&  skewness, // variável para a obliquidade
double&  kurtosis, // variável para a curtose
int&  error_code  // variável para registro do código de erro
);

Parâmetros
mu
[in] Parâmetro da distribuição mean (valor esperado).
sigma
[in] Parâmetro da distribuição sigma (desvio padrão).
mean
[out] Variável para obter o valor médio.
variance
[out] Variável para obter a dispersão.
skewness
[out] Variável para obter a obliquidade.
kurtosis
[out] Variável para obter a curtose.
error_code
[out] Variável para obter o código de erro.

Valor de retorno
Retorna true, se os momentos forem calculados com sucesso, caso contrário false.

© 2000-2018, MetaQuotes Software Corp.


1994 Biblioteca Padrão

Distribuição log-normal
Esta seção apresenta as funções para trabalhar com a distribuição log-normal. Elas permitem que você
calcule a densidade, probabilidade, quantis e gere números pseudo-aleatórios distribuídos de acordo
com a distribuição log-normal. A distribuição log-normal é descrita pela seguinte fórmula:

Onde:
· x — valor da variável aleatória
· m — logaritmo do valor esperado
· s — logaritmo do desvio padrão

Além do cálculo das variáveis ​aleatórias individuais, é poss ível trabalhar com suas matrizes.

F unção Descrição
MathProbabilityDensityLognormal Calcula a densidade de probabilidade da
distribuição log-normal

MathCumulativeDistributionLognormal Calcula o valor da função distribuição log-


normal da probabilidade

MathQuantileLognormal Calcula o inverso da função de distribuição log-


normal para a probabilidade definida

MathR andomLognormal Gera um valor/matriz pseudo-aleatório de


valores pseudo-aleatórios de acordo com a
distribuição log-normal

MathMomentsLognormal Calcula os valores numéricos teóricos dos


primeiros 4 momentos da distribuição log-
normal

© 2000-2018, MetaQuotes Software Corp.


1995 Biblioteca Padrão

Exemplo:
#include <Graphics\Graphic.mqh>
#include <Math\Stat\Lognormal.mqh>
#include <Math\Stat\Math.mqh>
#property script_show_inputs
//--- input parameters
input double mean_value=1.0; // logaritmo do valor esperado (log mean)
input double std_dev=0.25; // logaritmo do desvio padrão (log standard deviation)
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- desativamos a exibição do gráfico de preço
ChartSetInteger(0,CHART_SHOW,false);
//--- inicializamos o gerador de números aleatórios
MathSrand(GetTickCount());
//--- geramos a amostragem da variável aleatória
long chart=0;
string name="GraphicNormal";
int n=1000000; // número de valores na amostragem
int ncells=51; // número de intervalos no gráfico de colunas
double x[]; // centros de intervalos no gráfico de colunas
double y[]; // número de valores a partir da amostragem dentro do intervalo
double data[]; // amostragem de valores aleatórios
double max,min; // valores máximo e mínimo na amostragem
//--- obtemos a amostragem a partir da distribuição log-normal
MathRandomLognormal(mean_value,std_dev,n,data);
//--- calculamos os dados para plotagem do gráfico de colunas
CalculateHistogramArray(data,x,y,max,min,ncells);
//--- obtemos os limites de sequência e passo para plotagem da curva teórica
double step;
GetMaxMinStepValues(max,min,step);
step=MathMin(step,(max-min)/ncells);
//--- obtemos teoricamente os cálculos no intervalo [min,max]
double x2[];
double y2[];
MathSequence(min,max,step,x2);
MathProbabilityDensityLognormal(x2,mean_value,std_dev,false,y2);
//--- dimensionamos
double theor_max=y2[ArrayMaximum(y2)];
double sample_max=y[ArrayMaximum(y)];
double k=sample_max/theor_max;
for(int i=0; i<ncells; i++)
y[i]/=k;
//--- imprimimos o gráfico
CGraphic graphic;
if(ObjectFind(chart,name)<0)

© 2000-2018, MetaQuotes Software Corp.


1996 Biblioteca Padrão

graphic.Create(chart,name,0,0,0,780,380);
else
graphic.Attach(chart,name);
graphic.BackgroundMain(StringFormat("Lognormal distribution mu=%G sigma=%G",mean_value,std_dev))
graphic.BackgroundMainSize(16);
//--- desativamos o dimensionamento automático no eixo Y
graphic.YAxis().AutoScale(false);
graphic.YAxis().Max(theor_max);
graphic.YAxis().Min(0);
//--- plot all curves
graphic.CurveAdd(x,y,CURVE_HISTOGRAM,"Sample").HistogramWidth(6);
//--- e agora traçamos a curva teórica de densidade da distribuição
graphic.CurveAdd(x2,y2,CURVE_LINES,"Theory");
graphic.CurvePlotAll();
//--- plot all curves
graphic.Update();
}
//+------------------------------------------------------------------+
//| Calculate frequencies for data set |
//+------------------------------------------------------------------+
bool CalculateHistogramArray(const double &data[],double &intervals[],double &frequency[],
double &maxv,double &minv,const int cells=10)
{
if(cells<=1) return (false);
int size=ArraySize(data);
if(size<cells*10) return (false);
minv=data[ArrayMinimum(data)];
maxv=data[ArrayMaximum(data)];
double range=maxv-minv;
double width=range/cells;
if(width==0) return false;
ArrayResize(intervals,cells);
ArrayResize(frequency,cells);
//--- definimos os centros dos intervalos
for(int i=0; i<cells; i++)
{
intervals[i]=minv+(i+0.5)*width;
frequency[i]=0;
}
//--- preenchemos a frequência de aparecimento no intervalo
for(int i=0; i<size; i++)
{
int ind=int((data[i]-minv)/width);
if(ind>=cells) ind=cells-1;
frequency[ind]++;
}
return (true);
}
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


1997 Biblioteca Padrão

//| Calculates values for sequence generation |


//+------------------------------------------------------------------+
void GetMaxMinStepValues(double &maxv,double &minv,double &stepv)
{
//--- calculamos a magnitude da sequência para obter a precisão da normalização
double range=MathAbs(maxv-minv);
int degree=(int)MathRound(MathLog10(range));
//--- normalizamos os valores máx. e mín. com a precisão
maxv=NormalizeDouble(maxv,degree);
minv=NormalizeDouble(minv,degree);
//--- definimos o passo de geração da mesma maneira a partir da precisão definida
stepv=NormalizeDouble(MathPow(10,-degree),degree);
if((maxv-minv)/stepv<10)
stepv/=10.;
}

© 2000-2018, MetaQuotes Software Corp.


1998 Biblioteca Padrão

MathProbabilityDensityLognormal
Calcula a densidade de probabilidade da distribuição log-normal com parâmetros mu e sigma para a
variável aleatória x. Em caso de erro, retorna NaN.
double  MathProbabilityDensityLognormal(
const double  x, // valor da variável aleatória
const double  mu, // logaritmo do valor esperado (log mean)
const double  sigma, // logaritmo do desvio padrão (log standard deviation)
const bool   log_mode, // cálculo de logaritmo do valor, se log_mode=true, retorna o loga
int&  error_code  // variável para registro do código de erro
);

Calcula a densidade de probabilidade da distribuição log-normal com parâmetros mu e sigma para a


variável aleatória x. Em caso de erro, retorna NaN.
double  MathProbabilityDensityLognormal(
const double  x, // valor da variável aleatória
const double  mu, // logaritmo do valor esperado (log mean)
const double  sigma, // logaritmo do desvio padrão (log standard deviation)
int&  error_code  // variável para registro do código de erro
);

Calcula a função densidade de probabilidade da distribuição log-normal com parâmetros mu e sigma


para a matriz das variáveis aleatórias x []. Em caso de erro, retorna NaN. Equivalente a dlnorm() no
R.
bool  MathProbabilityDensityLognormal(
const double&  x[], // matriz com valores da variável aleatória
const double  mu, // logaritmo do valor esperado (log mean)
const double  sigma, // logaritmo do desvio padrão (log standard deviation)
const bool   log_mode, // cálculo de logaritmo do valor, se log_mode=true, é calculado o
double&  result[]   // matriz para o valor da função densidade de probabilidade
);

Calcula a função densidade de probabilidade da distribuição log-normal com parâmetros mu e sigma


para a matriz das variáveis aleatórias x []. Em caso de erro, retorna false.
bool  MathProbabilityDensityLognormal(
const double&  x[], // matriz com valores da variável aleatória
const double  mu, // logaritmo do valor esperado (log mean)
const double  sigma, // logaritmo do desvio padrão (log standard deviation)
double&  result[]   // matriz para o valor da função densidade de probabilidade
);

Parâmetros
x
[in] Valor da variável aleatória.
x[]

© 2000-2018, MetaQuotes Software Corp.


1999 Biblioteca Padrão

[in] Matriz com valores da variável aleatória.


mu
[in] Logaritmo do valor esperado (log _mean).
sigma
[in] Logaritmo do desvio padrão (log standard deviation).
log_mode
[in] Sinalizador de cálculo do algoritmo de um valor. Se log _mode=true, retorna o logaritmo
natural da função densidade de probabilidade.

error_code
[out] Variável para registro do código de erro.
result[]
[out] Matriz para obter os valores da função densidade de probabilidade.

© 2000-2018, MetaQuotes Software Corp.


2000 Biblioteca Padrão

MathCumulativeDistributionLognormal
Calcula a distribuição log-normal de probabilidade com parâmetros mu e sigma para a variável
aleatória x. Em caso de erro, retorna NaN.
double  MathCumulativeDistributionLognormal(
const double  x, // valor da variável aleatória
const double  mu, // logaritmo do valor esperado (log mean)
const double  sigma, // logaritmo do desvio padrão (log standard deviation)
const bool  tail, // sinalizador de cálculo, se for true, é calculada a probabilidad
const bool   log_mode, // cálculo de logaritmo do valor, se log_mode=true, retorna o loga
int&  error_code  // variável para registro do código de erro
);

Calcula a distribuição log-normal de probabilidade com parâmetros mu e sigma para a variável


aleatória x. Em caso de erro, retorna NaN.
double  MathCumulativeDistributionLognormal(
const double  x, // valor da variável aleatória
const double  mu, // logaritmo do valor esperado (log mean)
const double  sigma, // logaritmo do desvio padrão (log standard deviation)
int&  error_code  // variável para registro do código de erro
);

Calcula a distribuição log-normal das probabilidades com parâmetros mu e sigma para a matriz das
variáveis aleatórias x []. Em caso de erro, retorna false. Equivalente a plnorm() no R .
bool  MathCumulativeDistributionLognormal(
const double&  x[], // matriz com valores da variável aleatória
const double  mu, // logaritmo do valor esperado (log mean)
const double  sigma, // logaritmo do desvio padrão (log standard deviation)
const bool  tail, // sinalizador de cálculo, se for true, é calculada a probabilida
const bool   log_mode, // calcula o logaritmo do valor, se log_mode=true, é calculado o
double&  result[]   // matriz para valores da função de probabilidade
);

Calcula a distribuição log-normal das probabilidades com parâmetros mu e sigma para a matriz das
variáveis aleatórias x []. Em caso de erro, retorna false.
bool  MathCumulativeDistributionLognormal(
const double&  x[], // matriz com valores da variável aleatória
const double  mu, // logaritmo do valor esperado (log mean)
const double  sigma, // logaritmo do desvio padrão (log standard deviation)
double&  result[]   // matriz para valores da função de probabilidade
);

Parâmetros
x
[in] Valor da variável aleatória.
x[]

© 2000-2018, MetaQuotes Software Corp.


2001 Biblioteca Padrão

[in] Matriz com valores da variável aleatória.


mu
[in] Logaritmo do valor esperado (log _mean).
sigma
[in] Logaritmo do desvio padrão (log standard deviation).
tail
[in] Sinalizador de cálculo, se for true, é calculada a probabilidade de que a variável aleatória não
será superior a x.

log_mode
[in] Sinalizador de cálculo do algoritmo de um valor. Se log _mode=true, retorna o logaritmo
natural da probabilidade.

error_code
[out] Variável para registro do código de erro.
result[]
[out] Matriz para obter os valores da função de probabilidade.

© 2000-2018, MetaQuotes Software Corp.


2002 Biblioteca Padrão

MathQuantileLognormal
Calcula o inverso da função de distribuição log-normal com parâmetros mu e sigma para a
probabilidade probability. Em caso de erro, retorna NaN.
double  MathQuantileLognormal(
const double  probability, // valor da probabilidade de aparecimento de uma variável aleatóri
const double  mu, // logaritmo do valor esperado (log mean)
const double  sigma, // logaritmo do desvio padrão (log standard deviation)
const bool  tail, // sinalizador de cálculo, se for false, o cálculo será realizado
const bool   log_mode, // sinalizador de cálculo, se log_mode=true, o cálculo é realizado
int&  error_code  // variável para registro do código de erro
);

Calcula o inverso da função de distribuição log-normal com parâmetros mu e sigma para a


probabilidade probability. Em caso de erro, retorna NaN.
double  MathQuantileLognormal(
const double  probability, // valor da probabilidade de aparecimento de uma variável aleatóri
const double  mu, // logaritmo do valor esperado (log mean)
const double  sigma, // logaritmo do desvio padrão (log standard deviation)
int&  error_code  // variável para registro do código de erro
);

Calcula o inverso da função de distribuição log-normal com parâmetros mu e sigma para a matriz de
valores da probabilidade probability[]. Em caso de erro, retorna false. Equivalente a qlnorm() no R .
bool  MathQuantileLognormal(
const double&  probability[], // matriz com valores de probabilidade da variável aleatória
const double  mu, // logaritmo do valor esperado (log mean)
const double  sigma, // logaritmo do desvio padrão (log standard deviation)
const bool  tail, // sinalizador de cálculo, se for false, o cálculo será realizado
const bool   log_mode, // sinalizador de cálculo, se log_mode=true, o cálculo é realizad
double&  result[]   // matriz com valores de quantis
);

Calcula o inverso da função de distribuição log-normal com parâmetros mu e sigma para a matriz de
valores da probabilidade probability[]. Em caso de erro, retorna false.
bool  MathQuantileLognormal(
const double&  probability[], // matriz com valores de probabilidade da variável aleatória
const double  mu, // logaritmo do valor esperado (log mean)
const double  sigma, // logaritmo do desvio padrão (log standard deviation)
double&  result[]   // matriz com valores de quantis
);

Parâmetros
probability
[in] Valor da probabilidade de aparecimento da variável aleatória.
probability[]

© 2000-2018, MetaQuotes Software Corp.


2003 Biblioteca Padrão

[in] Matriz com valores da probabilidade da variável aleatória.


mu
[in] Logaritmo do valor esperado (log _mean).
sigma
[in] Logaritmo do desvio padrão (log standard deviation).
tail
[in] Sinalizador de cálculo, se for false, o cálculo é realizado para a probabilidade 1.0 - probability.
log_mode
[in] Sinalizador de cálculo, se log _mode=true, o cálculo é realizado para a probabilidade
Exp(probability).

error_code
[out] Variável para registro do código de erro.
result[]
[out] Matriz com os valores dos quantis.

© 2000-2018, MetaQuotes Software Corp.


2004 Biblioteca Padrão

MathRandomLognormal
Gera um número pseudo-aleatório de acordo com a distribuição log-normal com parâmetros mu e
sigma. Em caso de erro, retorna NaN.
double  MathRandomLognormal(
const double  mu, // logaritmo do valor esperado (log mean)
const double  sigma, // logaritmo do desvio padrão (log standard deviation)
int&  error_code  // variável para registro do código de erro
);

Gera números pseudo-aleatórios de acordo com a distribuição log-normal com parâmetros mu e sigma.
Em caso de erro, retorna false. Equivalente a rlnorm() no R .
double  MathRandomLognormal(
const double  mu, // logaritmo do valor esperado (log mean)
const double  sigma, // logaritmo do desvio padrão (log standard deviation)
const int  data_count, // número de dados necessários
double&  result[]   // matriz com os valores dos números pseudo-aleatórios
);

Parâmetros
mu
[in] Logaritmo do valor esperado (log _mean).
sigma
[in] Logaritmo do desvio padrão (log standard deviation).
data_count
[in] Número de dados necessários.
error_code
[out] Variável para registro do código de erro.
result[]
[out] Matriz com os valores dos números pseudo-aleatórios.

© 2000-2018, MetaQuotes Software Corp.


2005 Biblioteca Padrão

MathMomentsLognormal
Calcula os valores numéricos teóricos dos primeiros 4 momentos da distribuição log-normal. R etorna
true, se os momentos forem calculados com sucesso, caso contrário false.
double  MathMomentsLognormal(
const double  mu, // logaritmo do valor esperado (log mean)
const double  sigma, // logaritmo do desvio padrão (log standard deviation)
double&   mean, // variável para o valor médio
double&  variance,   // variável para a dispersão
double&  skewness, // variável para a obliquidade
double&  kurtosis,   // variável para a curtose
int&  error_code  // variável para registro do código de erro
);

Parâmetros
mu
[in] Logaritmo do valor esperado (log _mean).
sigma
[in] Logaritmo do desvio padrão (log standard deviation).
mean
[in] Variável para o valor médio.
variance
[out] Variável para a dispersão.
skewness
[out] Variável para a obliquidade.
kurtosis
[out] Variável para a curtose.
error code
[out] Variável para registro do código de erro.

Valor de retorno
Retorna true, se os momentos forem calculados com sucesso, caso contrário false.

© 2000-2018, MetaQuotes Software Corp.


2006 Biblioteca Padrão

Distribuição beta
Esta seção apresenta as funções para trabalhar com a distribuição beta. Elas permitem que você
calcule a densidade, probabilidade, quantis e gere números pseudo-aleatórios de acordo com a
distribuição correspondente. A distribuição beta é descrita pela seguinte fórmula:

Onde:
· x — valor da variável aleatória
· a — primeiro parâmetro de distribuição beta
· b — segundo parâmetro de distribuição beta

Além do cálculo das variáveis ​aleatórias individuais, é poss ível trabalhar com suas matrizes.

F unção Descrição
MathProbabilityDensityBeta Calcula a densidade de probabilidade da
distribuição beta

MathCumulativeDistributionBeta Calcula o valor da função distribuição beta de


probabilidades

MathQuantileBeta Calcula o inverso da função de distribuição beta


para a probabilidade especificada

MathR andomBeta Gera um valor/matriz pseudo-aleatório de


valores pseudo-aleatórios de acordo com a
distribuição beta

MathMoments Beta Calcula os valores numéricos teóricos dos


primeiros 4 momentos da distribuição beta

© 2000-2018, MetaQuotes Software Corp.


2007 Biblioteca Padrão

Exemplo:
#include <Graphics\Graphic.mqh>
#include <Math\Stat\Beta.mqh>
#include <Math\Stat\Math.mqh>
#property script_show_inputs
//--- input parameters
input double alpha=2; // primeiro parâmetro de distribuição beta (shape1)
input double beta=5; // segundo parâmetro de distribuição beta (shape2)
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- desativamos a exibição do gráfico de preço
ChartSetInteger(0,CHART_SHOW,false);
//--- inicializamos o gerador de números aleatórios
MathSrand(GetTickCount());
//--- geramos a amostragem da variável aleatória
long chart=0;
string name="GraphicNormal";
int n=1000000; // número de valores na amostragem
int ncells=51; // número de intervalos no gráfico de colunas
double x[]; // centros de intervalos no gráfico de colunas
double y[]; // número de valores a partir da amostragem dentro do intervalo
double data[]; // amostragem de valores aleatórios
double max,min; // valores máximo e mínimo na amostragem
//--- obtemos a amostragem a partir da distribuição beta
MathRandomBeta(alpha,beta,n,data);
//--- calculamos os dados para plotagem do gráfico de colunas
CalculateHistogramArray(data,x,y,max,min,ncells);
//--- obtemos os limites de sequência e passo para plotagem da curva teórica
double step;
GetMaxMinStepValues(max,min,step);
step=MathMin(step,(max-min)/ncells);
//--- obtemos teoricamente os cálculos no intervalo [min,max]
double x2[];
double y2[];
MathSequence(min,max,step,x2);
MathProbabilityDensityBeta(x2,alpha,beta,false,y2);
//--- dimensionamos
double theor_max=y2[ArrayMaximum(y2)];
double sample_max=y[ArrayMaximum(y)];
double k=sample_max/theor_max;
for(int i=0; i<ncells; i++)
y[i]/=k;
//--- imprimimos o gráfico
CGraphic graphic;
if(ObjectFind(chart,name)<0)

© 2000-2018, MetaQuotes Software Corp.


2008 Biblioteca Padrão

graphic.Create(chart,name,0,0,0,780,380);
else
graphic.Attach(chart,name);
graphic.BackgroundMain(StringFormat("Beta distribution alpha=%G beta=%G",alpha,beta));
graphic.BackgroundMainSize(16);
//--- plot all curves
graphic.CurveAdd(x,y,CURVE_HISTOGRAM,"Sample").HistogramWidth(6);
//--- e agora traçamos a curva teórica de densidade da distribuição
graphic.CurveAdd(x2,y2,CURVE_LINES,"Theory");
graphic.CurvePlotAll();
//--- plot all curves
graphic.Update();
}
//+------------------------------------------------------------------+
//| Calculate frequencies for data set |
//+------------------------------------------------------------------+
bool CalculateHistogramArray(const double &data[],double &intervals[],double &frequency[],
double &maxv,double &minv,const int cells=10)
{
if(cells<=1) return (false);
int size=ArraySize(data);
if(size<cells*10) return (false);
minv=data[ArrayMinimum(data)];
maxv=data[ArrayMaximum(data)];
double range=maxv-minv;
double width=range/cells;
if(width==0) return false;
ArrayResize(intervals,cells);
ArrayResize(frequency,cells);
//--- definimos os centros dos intervalos
for(int i=0; i<cells; i++)
{
intervals[i]=minv+(i+0.5)*width;
frequency[i]=0;
}
//--- preenchemos a frequência de aparecimento no intervalo
for(int i=0; i<size; i++)
{
int ind=int((data[i]-minv)/width);
if(ind>=cells) ind=cells-1;
frequency[ind]++;
}
return (true);
}
//+------------------------------------------------------------------+
//| Calculates values for sequence generation |
//+------------------------------------------------------------------+
void GetMaxMinStepValues(double &maxv,double &minv,double &stepv)
{

© 2000-2018, MetaQuotes Software Corp.


2009 Biblioteca Padrão

//--- calculamos a magnitude da sequência para obter a precisão da normalização


double range=MathAbs(maxv-minv);
int degree=(int)MathRound(MathLog10(range));
//--- normalizamos os valores máx. e mín. com a precisão
maxv=NormalizeDouble(maxv,degree);
minv=NormalizeDouble(minv,degree);
//--- definimos o passo de geração da mesma maneira a partir da precisão definida
stepv=NormalizeDouble(MathPow(10,-degree),degree);
if((maxv-minv)/stepv<10)
stepv/=10.;
}

© 2000-2018, MetaQuotes Software Corp.


2010 Biblioteca Padrão

MathProbabilityDensityBeta
Calcula a função densidade de probabilidade da distribuição beta com parâmetros a e b para a variável
aleatória x. Em caso de erro, retorna NaN.
double  MathProbabilityDensityBeta(
const double  x, // valor da variável aleatória
const double  a, // primeiro parâmetro da distribuição beta (shape1)
const double  b, // segundo parâmetro da distribuição beta (shape2)
const bool   log_mode, // cálculo de logaritmo do valor, se log_mode=true, retorna o loga
int&  error_code  // variável para registro do código de erro
);

Calcula a função densidade de probabilidade da distribuição beta com parâmetros a e b para a variável
aleatória x. Em caso de erro, retorna NaN.
double  MathProbabilityDensityBeta(
const double  x, // valor da variável aleatória
const double  a, // primeiro parâmetro da distribuição beta (shape1)
const double  b, // segundo parâmetro da distribuição beta (shape2)
int&  error_code  // variável para registro do código de erro
);

Calcula a função de densidade de probabilidade da distribuição beta com parâmetros a e b para a


matriz de variáveis aleatórias x []. Em caso de erro, retorna false. Equivalente a dbeta() no R .
bool  MathProbabilityDensityBeta(
const double& x[], // matriz com valores da variável aleatória
const double  a, // primeiro parâmetro da distribuição beta (shape1)
const double  b, // segundo parâmetro da distribuição beta (shape2)
const bool   log_mode, // sinalizador de cálculo de logaritmo do valor, se log_mode=true,
double&  result[]  // matriz para o valor da função densidade de probabilidade
);

Calcula a função de densidade de probabilidade da distribuição beta com parâmetros a e b para a


matriz de variáveis aleatórias x []. Em caso de erro, retorna false.
bool  MathProbabilityDensityBeta(
const double& x[], // matriz com valores da variável aleatória
const double  a, // primeiro parâmetro da distribuição beta (shape1)
const double  b, // segundo parâmetro da distribuição beta (shape2)
double&  result[]  // matriz para o valor da função densidade de probabilidade
);

Parâmetros
x
[in] Valor da variável aleatória.
x[]
[in] Matriz com valores da variável aleatória.

© 2000-2018, MetaQuotes Software Corp.


2011 Biblioteca Padrão

a
[in] Primeiro parâmetro da distribuição beta (s hape 1).
b
[in] Segundo parâmetro da distribuição beta (s hape 2).
log_mode
[in] Sinalizador de cálculo do algoritmo de um valor. Se log _mode=true, retorna o logaritmo
natural da função densidade de probabilidade.

error_code
[out] Variável para registro do código de erro.
result[]
[out] Matriz para o valor da função densidade de probabilidade.

© 2000-2018, MetaQuotes Software Corp.


2012 Biblioteca Padrão

MathCumulativeDistributionBeta
Calcula a distribuição de probabilidade beta com parâmetros a e b para a variável aleatória x. Em caso
de erro, retorna NaN.
double  MathCumulativeDistributionBeta(
const double  x, // valor da variável aleatória
const double  a, // primeiro parâmetro da distribuição beta (shape1)
const double  b, // segundo parâmetro da distribuição beta (shape2)
const bool   tail, // sinalizador de cálculo, se for true, é calculada a probabilidade
const bool   log_mode, // cálculo de logaritmo do valor, se log_mode=true, é retornado o l
int&  error_code  // variável para registro do código de erro
);

Calcula a distribuição de probabilidade beta com parâmetros a e b para a variável aleatória x. Em caso
de erro, retorna NaN.
double  MathCumulativeDistributionBeta(
const double  x, // valor da variável aleatória
const double  a, // primeiro parâmetro da distribuição beta (shape1)
const double  b, // segundo parâmetro da distribuição beta (shape2)
int&  error_code  // variável para registro do código de erro
);

Calcula a distribuição de probabilidade beta com parâmetros a e b para a matriz de variáveis


aleatórias x []. Em caso de erro, retorna false. Equivalente a pbeta() no R .
bool  MathCumulativeDistributionBeta(
const double& x[], // matriz com valores da variável aleatória
const double  a, // primeiro parâmetro da distribuição beta (shape1)
const double  b, // segundo parâmetro da distribuição beta (shape2)
const bool   tail, // sinalizador de cálculo, se for true, é calculada a probabilidad
const bool   log_mode, // sinalizador de cálculo de logaritmo do valor, se log_mode=true,
double&  result[]  // matriz para valores da função de probabilidade
);

Calcula a distribuição de probabilidade beta com parâmetros a e b para a matriz de variáveis


aleatórias x []. Em caso de erro, retorna false.
bool  MathCumulativeDistributionBeta(
const double& x[], // matriz com valores da variável aleatória
const double  a, // primeiro parâmetro da distribuição beta (shape1)
const double  b, // segundo parâmetro da distribuição beta (shape2)
double&  result[]  // matriz para valores da função de probabilidade
);

Parâmetros
x
[in] Valor da variável aleatória.
x[]

© 2000-2018, MetaQuotes Software Corp.


2013 Biblioteca Padrão

[in] Matriz com valores da variável aleatória.


a
[in] Primeiro parâmetro da distribuição beta (s hape 1).
b
[in] Segundo parâmetro da distribuição beta (s hape 2).
tail
[in] Sinalizador de cálculo, se for true, é calculada a probabilidade de que a variável aleatória não
será superior a x.

log_mode
[in] Sinalizador de cálculo do algoritmo de um valor. Se log _mode=true, retorna o logaritmo
natural da probabilidade.

error_code
[out] Variável para registro do código de erro.
result[]
[out] Matriz para valores da função de probabilidade.

© 2000-2018, MetaQuotes Software Corp.


2014 Biblioteca Padrão

MathQuantileBeta
Calcula - para a probabilidade probability - o inverso da função de distribuição beta com parâmetros a
e b. Em caso de erro, retorna NaN.
double  MathQuantileBeta(
const double  probability, // valor da probabilidade de aparecimento de uma variável aleatóri
const double  a, // primeiro parâmetro da distribuição beta (shape1)
const double  b, // segundo parâmetro da distribuição beta (shape2)
const bool   tail, // sinalizador de cálculo, se for false, o cálculo será realizado
const bool   log_mode, // sinalizador de cálculo, se log_mode=true, o cálculo é realizado
int&  error_code  // variável para registro do código de erro
);

Calcula - para a probabilidade probability - o inverso da função de distribuição beta com parâmetros a
e b. Em caso de erro, retorna NaN.
double  MathQuantileBeta(
const double  probability, // valor da probabilidade de aparecimento de uma variável aleatóri
const double  a, // primeiro parâmetro da distribuição beta (shape1)
const double  b, // segundo parâmetro da distribuição beta (shape2)
int&  error_code  // variável para registro do código de erro
);

Calcula - para a matriz dos valores - a probabilidade probability[] o inverso da função de distribuição
beta com os parâmetros a e b. Em caso de erro, retorna false. Equivalente a qbeta() no R .
double  MathQuantileBeta(
const double&  probability[], // matriz com valores de probabilidade da variável aleatória
const double  a, // primeiro parâmetro da distribuição beta (shape1)
const double  b, // segundo parâmetro da distribuição beta (shape2)
const bool   tail, // sinalizador de cálculo, se for false, o cálculo será realizado
const bool   log_mode, // sinalizador de cálculo, se log_mode=true, o cálculo é realizado
double&  result[]  // matriz com valores de quantis
);

Calcula - para a matriz dos valores - a probabilidade probability[] o inverso da função de distribuição
beta com os parâmetros a e b. Em caso de erro, retorna false.
bool  MathQuantileBeta(
const double& probability[], // matriz com valores de probabilidade da variável aleatória
const double  a, // primeiro parâmetro da distribuição beta (shape1)
const double  b, // segundo parâmetro da distribuição beta (shape2)
double&  result[]  // matriz com valores de quantis
);

Parâmetros
probability
[in] Valor da probabilidade da variável aleatória.
probability[]

© 2000-2018, MetaQuotes Software Corp.


2015 Biblioteca Padrão

[in] Matriz com valores da probabilidade da variável aleatória.


a
[in] Primeiro parâmetro da distribuição beta (s hape1).
b
[in] Segundo parâmetro da distribuição beta (s hape2).
tail
[in] Sinalizador de cálculo, se lower_tail=false, o cálculo é realizado para a probabilidade 1.0 -
probability.

log_mode
[in] Sinalizador de cálculo, se log _mode=true, o cálculo é realizado para a probabilidade
Exp(probability).

error_code
[out] Variável para obter o código de erro.
result[]
[out] Matriz com os valores dos quantis.

© 2000-2018, MetaQuotes Software Corp.


2016 Biblioteca Padrão

MathRandomBeta
Gera um número pseudo-aleatório distribuído de acordo com a distribuição beta com parâmetros a e
b. Em caso de erro, retorna NaN.
double  MathRandomBeta(
const double  a, // primeiro parâmetro da distribuição beta (shape1)
const double  b, // segundo parâmetro da distribuição beta (shape2)
int&  error_code  // variável para registro do código de erro
);

Gera números pseudo-aleatórios distribuídos de acordo com a distribuição beta com parâmetros a e b.
Em caso de erro, retorna false. Equivalente a rbeta() no R .
bool  MathRandomBeta(
const double  a, // primeiro parâmetro da distribuição beta (shape1)
const double  b, // segundo parâmetro da distribuição beta (shape2)
const int   data_count, // número de dados necessários
double&  result[]  // matriz para obter números pseudo-aleatórios
);

Parâmetros
a
[in] primeiro parâmetro da distribuição beta (s hape1)
b
[in] Segundo parâmetro da distribuição beta (s hape2).
data_count
[in] Número de valores pseudo-aleatórios que é preciso obter.
error_code
[out] Variável para registro do código de erro.
result[]
[out] Matriz para obter os valores dos números pseudo-aleatórios.

© 2000-2018, MetaQuotes Software Corp.


2017 Biblioteca Padrão

MathMomentsBeta
Calcula os valores numéricos teóricos dos primeiros 4 momentos da distribuição beta.
double  MathMomentsBeta(
const double  a, // primeiro parâmetro da distribuição beta (shape1)
const double  b, // segundo parâmetro da distribuição beta (shape2)
double&  mean, // variável para o valor médio
double&  variance, // variável para a dispersão
double&  skewness, // variável para a obliquidade
double&  kurtosis, // variável para a curtose
int&  error_code  // variável para o código de erro
);

Parâmetros
a
[in] Primeiro parâmetro da distribuição beta (s hape1).
b
[in] Segundo parâmetro da distribuição beta (s hape2).
mean
[out] Variável para obter o valor médio.
variance
[out] Variável para obter a dispersão.
skewness
[out] Variável para obter a obliquidade.
kurtosis
[out] Variável para obter a curtose.
error_code
[out] Variável para obter o código de erro.

Valor de retorno
Retorna true, se os momentos forem calculados com sucesso, caso contrário false.

© 2000-2018, MetaQuotes Software Corp.


2018 Biblioteca Padrão

Distribuição beta não-central


Esta seção apresenta as funções para trabalhar com a distribuição beta não-central. Elas permitem
que você calcule a densidade, probabilidade, quantis e gere números pseudo-aleatórios de acordo com
a distribuição correspondente. A distribuição beta não-central é descrita pela seguinte fórmula:

Onde:
· x — valor da variável aleatória
· a — primeiro parâmetro de distribuição beta
· b — segundo parâmetro de distribuição beta
· l — parâmetro de não-centralidade

Além do cálculo das variáveis ​aleatórias individuais, é poss ível trabalhar com suas matrizes.

F unção Descrição
MathProbabilityDensityNoncentralBeta Calcula a densidade de probabilidade da
distribuição beta não-central

MathCumulativeDistributionNoncentralBeta Calcula o valor da função distribuição beta não-


central de probabilidades

MathQuantileNoncentralBeta Calcula o inverso da função de distribuição beta


não-central para a probabilidade especificada

MathR andomNoncentralBeta Gera um valor/matriz pseudo-aleatório de


valores pseudo-aleatórios de acordo com a
distribuição beta não-central

© 2000-2018, MetaQuotes Software Corp.


2019 Biblioteca Padrão

MathMoments NoncentralBeta Calcula os valores numéricos teóricos dos


primeiros 4 momentos da distribuição beta não-
central

Exemplo:
#include <Graphics\Graphic.mqh>
#include <Math\Stat\NoncentralBeta.mqh>
#include <Math\Stat\Math.mqh>
#property script_show_inputs
//--- input parameters
input double a_par=2; // primeiro parâmetro de distribuição beta (shape1)
input double b_par=5; // segundo parâmetro de distribuição beta (shape2)
input double l_par=1; // parâmetro de não-centralidade (lambda)
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- desativamos a exibição do gráfico de preço
ChartSetInteger(0,CHART_SHOW,false);
//--- inicializamos o gerador de números aleatórios
MathSrand(GetTickCount());
//--- geramos a amostragem da variável aleatória
long chart=0;
string name="GraphicNormal";
int n=1000000; // número de valores na amostragem
int ncells=53; // número de intervalos no gráfico de colunas
double x[]; // centros de intervalos no gráfico de colunas
double y[]; // número de valores a partir da amostragem dentro do intervalo
double data[]; // amostragem de valores aleatórios
double max,min; // valores máximo e mínimo na amostragem
//--- obtemos a amostragem a partir da distribuição beta não-central
MathRandomNoncentralBeta(a_par,b_par,l_par,n,data);
//--- calculamos os dados para plotagem do gráfico de colunas
CalculateHistogramArray(data,x,y,max,min,ncells);
//--- obtemos os limites de sequência e passo para plotagem da curva teórica
double step;
GetMaxMinStepValues(max,min,step);
step=MathMin(step,(max-min)/ncells);
//--- obtemos teoricamente os cálculos no intervalo [min,max]
double x2[];
double y2[];
MathSequence(min,max,step,x2);
MathProbabilityDensityNoncentralBeta(x2,a_par,b_par,l_par,false,y2);
//--- dimensionamos
double theor_max=y2[ArrayMaximum(y2)];
double sample_max=y[ArrayMaximum(y)];

© 2000-2018, MetaQuotes Software Corp.


2020 Biblioteca Padrão

double k=sample_max/theor_max;
for(int i=0; i<ncells; i++)
y[i]/=k;
//--- imprimimos o gráfico
CGraphic graphic;
if(ObjectFind(chart,name)<0)
graphic.Create(chart,name,0,0,0,780,380);
else
graphic.Attach(chart,name);
graphic.BackgroundMain(StringFormat("Noncentral Beta distribution alpha=%G beta=%G lambda=%G",
a_par,b_par,l_par));
graphic.BackgroundMainSize(16);
//--- plot all curves
graphic.CurveAdd(x,y,CURVE_HISTOGRAM,"Sample").HistogramWidth(6);
//--- e agora traçamos a curva teórica de densidade da distribuição
graphic.CurveAdd(x2,y2,CURVE_LINES,"Theory");
graphic.CurvePlotAll();
//--- plot all curves
graphic.Update();
}
//+------------------------------------------------------------------+
//| Calculate frequencies for data set |
//+------------------------------------------------------------------+
bool CalculateHistogramArray(const double &data[],double &intervals[],double &frequency[],
double &maxv,double &minv,const int cells=10)
{
if(cells<=1) return (false);
int size=ArraySize(data);
if(size<cells*10) return (false);
minv=data[ArrayMinimum(data)];
maxv=data[ArrayMaximum(data)];
double range=maxv-minv;
double width=range/cells;
if(width==0) return false;
ArrayResize(intervals,cells);
ArrayResize(frequency,cells);
//--- definimos os centros dos intervalos
for(int i=0; i<cells; i++)
{
intervals[i]=minv+(i+0.5)*width;
frequency[i]=0;
}
//--- preenchemos a frequência de aparecimento no intervalo
for(int i=0; i<size; i++)
{
int ind=int((data[i]-minv)/width);
if(ind>=cells) ind=cells-1;
frequency[ind]++;
}

© 2000-2018, MetaQuotes Software Corp.


2021 Biblioteca Padrão

return (true);
}
//+------------------------------------------------------------------+
//| Calculates values for sequence generation |
//+------------------------------------------------------------------+
void GetMaxMinStepValues(double &maxv,double &minv,double &stepv)
{
//--- calculamos a magnitude da sequência para obter a precisão da normalização
double range=MathAbs(maxv-minv);
int degree=(int)MathRound(MathLog10(range));
//--- normalizamos os valores máx. e mín. com a precisão
maxv=NormalizeDouble(maxv,degree);
minv=NormalizeDouble(minv,degree);
//--- definimos o passo de geração da mesma maneira a partir da precisão definida
stepv=NormalizeDouble(MathPow(10,-degree),degree);
if((maxv-minv)/stepv<10)
stepv/=10.;
}

© 2000-2018, MetaQuotes Software Corp.


2022 Biblioteca Padrão

MathProbabilityDensityNoncentralBeta
Calcula a função densidade de probabilidade da distribuição beta não-central com parâmetros a, b e
lambda para a variável aleatória x. Em caso de erro, retorna NaN.
double  MathProbabilityDensityNoncentralBeta(
const double  x, // valor da variável aleatória
const double  a, // primeiro parâmetro da distribuição beta (shape1)
const double  b, // segundo parâmetro da distribuição beta (shape2)
const double  lambda, // parâmetro de não-centralidade
const bool   log_mode, // cálculo de logaritmo do valor, se log_mode=true, retorna o loga
int&  error_code  // variável para registro do código de erro
);

Calcula a função densidade de probabilidade da distribuição beta não-central com parâmetros a, b e


lambda para a variável aleatória x. Em caso de erro, retorna NaN.
double  MathProbabilityDensityNoncentralBeta(
const double  x, // valor da variável aleatória
const double  a, // primeiro parâmetro da distribuição beta (shape1)
const double  b, // segundo parâmetro da distribuição beta (shape2)
const double  lambda, // parâmetro de não-centralidade
int&  error_code  // variável para registro do código de erro
);

Calcula a função densidade de probabilidade da distribuição beta não-central com parâmetros a, b e


lambda para a matriz das variáveis aleatórias x [].. Em caso de erro, retorna false. Equivalente a
dbeta() no R .
bool  MathProbabilityDensityNoncentralBeta(
const double& x[], // matriz com valores da variável aleatória
const double  a, // primeiro parâmetro da distribuição beta (shape1)
const double  b, // segundo parâmetro da distribuição beta (shape2)
const double  lambda, // parâmetro de não-centralidade
const bool   log_mode, // sinalizador de cálculo de logaritmo do valor, se log_mode=true,
double&  result[]  // matriz para o valor da função densidade de probabilidade
);

Calcula a função densidade de probabilidade da distribuição beta não-central com parâmetros a, b e


lambda para a matriz das variáveis aleatórias x []. Em caso de erro, retorna false.
bool  MathProbabilityDensityNoncentralBeta(
const double& x[], // matriz com valores da variável aleatória
const double  a, // primeiro parâmetro da distribuição beta (shape1)
const double  b, // segundo parâmetro da distribuição beta (shape2)
const double  lambda, // parâmetro de não-centralidade
double&  result[]  // matriz para o valor da função densidade de probabilidade
);

Parâmetros

© 2000-2018, MetaQuotes Software Corp.


2023 Biblioteca Padrão

x
[in] Valor da variável aleatória.
x[]
[in] Matriz com valores da variável aleatória.
a
[in] Primeiro parâmetro da distribuição beta (s hape 1).
b
[in] Segundo parâmetro da distribuição beta (s hape 2).
lambda
[in] Parâmetro de não-centralidade
log_mode
[in] Sinalizador de cálculo do algoritmo de um valor. Se log _mode=true, retorna o logaritmo
natural da função densidade de probabilidade.

error_code
[out] Variável para registro do código de erro.
result[]
[out] Matriz para os valores da função densidade de probabilidade.

© 2000-2018, MetaQuotes Software Corp.


2024 Biblioteca Padrão

MathCumulativeDistributionNoncentralBeta
Calcula a distribuição de probabilidade beta não-central com parâmetros a, b e lambda para a variável
aleatória x. Em caso de erro, retorna NaN.
double  MathCumulativeDistributionNoncentralBeta(
const double  x, // valor da variável aleatória
const double  a, // primeiro parâmetro da distribuição beta (shape1)
const double  b, // segundo parâmetro da distribuição beta (shape2)
const double  lambda, // parâmetro de não-centralidade
const bool   tail, // sinalizador de cálculo, se for true, é calculada a probabilidade
const bool   log_mode, // cálculo de logaritmo do valor, se log_mode=true, é retornado o l
int&  error_code  // variável para registro do código de erro
);

Calcula a distribuição de probabilidade beta não-central com parâmetros a, b e lambda para a variável
aleatória x. Em caso de erro, retorna NaN.
double  MathCumulativeDistributionNoncentralBeta(
const double  x, // valor da variável aleatória
const double  a, // primeiro parâmetro da distribuição beta (shape1)
const double  b, // segundo parâmetro da distribuição beta (shape2)
const double  lambda, // parâmetro de não-centralidade
int&  error_code  // variável para registro do código de erro
);

Calcula a distribuição de probabilidade beta não-central com parâmetros a, b e lambda para a matriz
das variáveis aleatórias x []. Em caso de erro, retorna false. Equivalente a pbeta() no R .
bool  MathCumulativeDistributionNoncentralBeta(
const double& x[], // matriz com valores da variável aleatória
const double  a, // primeiro parâmetro da distribuição beta (shape1)
const double  b, // segundo parâmetro da distribuição beta (shape2)
const double  lambda, // parâmetro de não-centralidade
const bool   tail, // sinalizador de cálculo, se for true, é calculada a probabilidad
const bool   log_mode, // sinalizador de cálculo de logaritmo do valor, se log_mode=true,
double&  result[]  // matriz para valores da função de probabilidade
);

Calcula a distribuição de probabilidade beta não-central com parâmetros a, b e lambda para a matriz
das variáveis aleatórias x []. Em caso de erro, retorna false.
bool  MathCumulativeDistributionNoncentralBeta(
const double& x[], // matriz com valores da variável aleatória
const double  a, // primeiro parâmetro da distribuição beta (shape1)
const double  b, // segundo parâmetro da distribuição beta (shape2)
const double  lambda, // parâmetro de não-centralidade
double&  result[]  // matriz para valores da função de probabilidade
);

© 2000-2018, MetaQuotes Software Corp.


2025 Biblioteca Padrão

Parâmetros
x
[in] Valor da variável aleatória.
x[]
[in] Matriz com valores da variável aleatória.
a
[in] Primeiro parâmetro da distribuição beta (s hape 1).
b
[in] Segundo parâmetro da distribuição beta (s hape 2).
lambda
[in] Parâmetro de não-centralidade
tail
[in] Sinalizador de cálculo. Se for true, é calculada a probabilidade de que a variável aleatória não
será superior a x.

log_mode
[in] Sinalizador de cálculo do algoritmo de um valor. Se log _mode=true, retorna o logaritmo
natural da probabilidade.

error_code
[out] Variável para registro do código de erro.
result[]
[out] Matriz para valores da função de probabilidade.

© 2000-2018, MetaQuotes Software Corp.


2026 Biblioteca Padrão

MathQuantileNoncentralBeta
Calcula a função inversa da distribuição de probabilidades beta não-central com parâmetros a, b e
lambda para a probabilidade de aparecimento do valor da variável aleatória probability. Em caso de
erro, retorna NaN.
double  MathQuantileNoncentralBeta(
const double  probability, // valor da probabilidade de aparecimento de uma variável aleatóri
const double  a, // primeiro parâmetro da distribuição beta (shape1)
const double  b, // segundo parâmetro da distribuição beta (shape2)
const double  lambda, // parâmetro de não-centralidade
const bool   tail, // sinalizador de cálculo, se for false, o cálculo será realizado
const bool   log_mode, // sinalizador de cálculo, se log_mode=true, o cálculo é realizado
int&  error_code  // variável para registro do código de erro
);

Calcula a função inversa da distribuição de probabilidades beta não-central com parâmetros a, b e


lambda para a probabilidade de aparecimento do valor da variável aleatória probability. Em caso de
erro, retorna NaN.
double  MathQuantileNoncentralBeta(
const double  probability, // valor da probabilidade de aparecimento de uma variável aleatóri
const double  a, // primeiro parâmetro da distribuição beta (shape1)
const double  b, // segundo parâmetro da distribuição beta (shape2)
const double  lambda, // parâmetro de não-centralidade
int&  error_code  // variável para registro do código de erro
);

Calcula a função inversa da distribuição de probabilidades beta não-central com parâmetros a, b e


lambda para a matriz de valores da probabilidade probability[]. Em caso de erro, retorna false.
Equivalente a qbeta() no R .
double  MathQuantileNoncentralBeta(
const double&  probability[], // matriz com valores de probabilidade da variável aleatória
const double  a, // primeiro parâmetro da distribuição beta (shape1)
const double  b, // segundo parâmetro da distribuição beta (shape2)
const double  lambda, // parâmetro de não-centralidade
const bool   tail, // sinalizador de cálculo, se for false, o cálculo será realizado
const bool   log_mode, // sinalizador de cálculo, se log_mode=true, o cálculo é realizado
double&  result[]  // matriz com valores de quantis
);

Calcula a função inversa da distribuição de probabilidades beta não-central com parâmetros a, b e


lambda para a matriz de valores da probabilidade probability[]. Em caso de erro, retorna false.
bool  MathQuantileNoncentralBeta(
const double& probability[], // matriz com valores de probabilidade da variável aleatória
const double  a, // primeiro parâmetro da distribuição beta (shape1)
const double  b, // segundo parâmetro da distribuição beta (shape2)
const double  lambda, // parâmetro de não-centralidade

© 2000-2018, MetaQuotes Software Corp.


2027 Biblioteca Padrão

double&  result[]  // matriz com valores de quantis


);

Parâmetros
probability
[in] Valor da probabilidade da variável aleatória.
probability[]
[in] Matriz com valores da probabilidade da variável aleatória.
a
[in] Primeiro parâmetro da distribuição beta (s hape1).
b
[in] Segundo parâmetro da distribuição beta (s hape2).
lambda
[in] Parâmetro de não-centralidade.
tail
[in] Sinalizador de cálculo, se for false, o cálculo é realizado para a probabilidade 1.0 -
probability.

log_mode
[in] Sinalizador de cálculo, se log _mode=true, o cálculo é realizado para a probabilidade
Exp(probability).

error_code
[out] Variável para obter o código de erro.
result[]
[out] Matriz com os valores dos quantis.

© 2000-2018, MetaQuotes Software Corp.


2028 Biblioteca Padrão

MathRandomNoncentralBeta
Gera um número pseudo-aleatório distribuído de acordo com a distribuição beta não-central com
parâmetros a. b e lambda. Em caso de erro, retorna NaN.
double  MathRandomNoncentralBeta(
const double  a, // primeiro parâmetro da distribuição beta (shape1)
const double  b, // segundo parâmetro da distribuição beta (shape2)
const double  lambda, // parâmetro de não-centralidade
int&  error_code  // variável para registro do código de erro
);

Gera números pseudo-aleatórios distribuídos de acordo com a distribuição beta não-central com
parâmetros a, b e lambda. Em caso de erro, retorna false. Equivalente a rbeta() no R .
bool  MathRandomNoncentralBeta(
const double  a, // primeiro parâmetro da distribuição beta (shape1)
const double  b, // segundo parâmetro da distribuição beta (shape2)
const double  lambda, // parâmetro de não-centralidade
const int   data_count, // número de dados necessários
double&  result[]  // matriz para obter números pseudo-aleatórios
);

Parâmetros
a
[in] primeiro parâmetro da distribuição beta (s hape1)
b
[in] Segundo parâmetro da distribuição beta (s hape2).
lambda
[in] Parâmetro de não-centralidade
error_code
[out] Variável para registro do código de erro.
data_count
[out] Número de dados necessários.
result[]
[out] Matriz para obter os valores dos números pseudo-aleatórios.

© 2000-2018, MetaQuotes Software Corp.


2029 Biblioteca Padrão

MathMomentsNoncentralBeta
Calcula os valores numéricos teóricos dos primeiros 4 momentos da distribuição beta não-central com
parâmetros a, b e lambda
double  MathMomentsNoncentralBeta(
const double  a, // primeiro parâmetro da distribuição beta (shape1)
const double  b, // segundo parâmetro da distribuição beta (shape2)
const double  lambda, // parâmetro de não-centralidade
double&  mean, // variável para o valor médio
double&  variance, // variável para a dispersão
double&  skewness, // variável para a obliquidade
double&  kurtosis, // variável para a curtose
int&  error_code  // variável para o código de erro
);

Parâmetros
a
[in] Primeiro parâmetro da distribuição beta (s hape1).
b
[in] Segundo parâmetro da distribuição beta (s hape2).
lambda
[in] Parâmetro de não-centralidade
mean
[out] Variável para obter o valor médio.
variance
[out] Variável para obter a dispersão.
skewness
[out] Variável para obter a obliquidade.
kurtosis
[out] Variável para obter a curtose.
error_code
[out] Variável para obter o código de erro.

Valor de retorno
Retorna true, se os momentos forem calculados com sucesso, caso contrário false.

© 2000-2018, MetaQuotes Software Corp.


2030 Biblioteca Padrão

Distribuição gama
Esta seção apresenta as funções para trabalhar com a distribuição gama. Elas permitem que você
calcule a densidade, probabilidade, quantis e gere números pseudo-aleatórios de acordo com a
distribuição correspondente. A distribuição gama é descrita pela seguinte fórmula:

Onde:
· x — valor da variável aleatória
· a — primeiro parâmetro de distribuição
· b — segundo parâmetro de distribuição

Além do cálculo das variáveis ​aleatórias individuais, é poss ível trabalhar com suas matrizes.

F unção Descrição
MathProbabilityDensityGamma Calcula a densidade de probabilidade da
distribuição gama

MathCumulativeDistributionGamma Calcula o valor da função distribuição gama de


probabilidades

MathQuantileGamma Calcula o inverso da função de distribuição


gama para a probabilidade especificada

MathR andomGamma Gera um valor/matriz pseudo-aleatório de


valores pseudo-aleatórios de acordo com a
distribuição gama

MathMoments Gamma Calcula os valores numéricos teóricos dos


primeiros 4 momentos da distribuição gama

© 2000-2018, MetaQuotes Software Corp.


2031 Biblioteca Padrão

Exemplo:
#include <Graphics\Graphic.mqh>
#include <Math\Stat\Gamma.mqh>
#include <Math\Stat\Math.mqh>
#property script_show_inputs
//--- input parameters
input double alpha=9; // primeiro parâmetro de distribuição gama (shape)
input double beta=0.5; // segundo parâmetro de distribuição gama (shape)
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- desativamos a exibição do gráfico de preço
ChartSetInteger(0,CHART_SHOW,false);
//--- inicializamos o gerador de números aleatórios
MathSrand(GetTickCount());
//--- geramos a amostragem da variável aleatória
long chart=0;
string name="GraphicNormal";
int n=1000000; // número de valores na amostragem
int ncells=51; // número de intervalos no gráfico de colunas
double x[]; // centros de intervalos no gráfico de colunas
double y[]; // número de valores a partir da amostragem dentro do intervalo
double data[]; // amostragem de valores aleatórios
double max,min; // valores máximo e mínimo na amostragem
//--- obtemos a amostragem a partir da distribuição gama
MathRandomGamma(alpha,beta,n,data);
//--- calculamos os dados para plotagem do gráfico de colunas
CalculateHistogramArray(data,x,y,max,min,ncells);
//--- obtemos os limites de sequência e passo para plotagem da curva teórica
double step;
GetMaxMinStepValues(max,min,step);
step=MathMin(step,(max-min)/ncells);
//--- obtemos teoricamente os cálculos no intervalo [min,max]
double x2[];
double y2[];
MathSequence(min,max,step,x2);
MathProbabilityDensityGamma(x2,alpha,beta,false,y2);
//--- dimensionamos
double theor_max=y2[ArrayMaximum(y2)];
double sample_max=y[ArrayMaximum(y)];
double k=sample_max/theor_max;
for(int i=0; i<ncells; i++)
y[i]/=k;
//--- imprimimos o gráfico
CGraphic graphic;
if(ObjectFind(chart,name)<0)

© 2000-2018, MetaQuotes Software Corp.


2032 Biblioteca Padrão

graphic.Create(chart,name,0,0,0,780,380);
else
graphic.Attach(chart,name);
graphic.BackgroundMain(StringFormat("Gamma distribution alpha=%G beta=%G",alpha,beta));
graphic.BackgroundMainSize(16);
//--- desativamos o dimensionamento automático no eixo Y
graphic.YAxis().AutoScale(false);
graphic.YAxis().Max(NormalizeDouble(theor_max,1));
graphic.YAxis().Min(0);
//--- plot all curves
graphic.CurveAdd(x,y,CURVE_HISTOGRAM,"Sample").HistogramWidth(6);
//--- e agora traçamos a curva teórica de densidade da distribuição
graphic.CurveAdd(x2,y2,CURVE_LINES,"Theory");
graphic.CurvePlotAll();
//--- plot all curves
graphic.Update();
}
//+------------------------------------------------------------------+
//| Calculate frequencies for data set |
//+------------------------------------------------------------------+
bool CalculateHistogramArray(const double &data[],double &intervals[],double &frequency[],
double &maxv,double &minv,const int cells=10)
{
if(cells<=1) return (false);
int size=ArraySize(data);
if(size<cells*10) return (false);
minv=data[ArrayMinimum(data)];
maxv=data[ArrayMaximum(data)];
double range=maxv-minv;
double width=range/cells;
if(width==0) return false;
ArrayResize(intervals,cells);
ArrayResize(frequency,cells);
//--- definimos os centros dos intervalos
for(int i=0; i<cells; i++)
{
intervals[i]=minv+(i+0.5)*width;
frequency[i]=0;
}
//--- preenchemos a frequência de aparecimento no intervalo
for(int i=0; i<size; i++)
{
int ind=int((data[i]-minv)/width);
if(ind>=cells) ind=cells-1;
frequency[ind]++;
}
return (true);
}
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


2033 Biblioteca Padrão

//| Calculates values for sequence generation |


//+------------------------------------------------------------------+
void GetMaxMinStepValues(double &maxv,double &minv,double &stepv)
{
//--- calculamos a magnitude da sequência para obter a precisão da normalização
double range=MathAbs(maxv-minv);
int degree=(int)MathRound(MathLog10(range));
//--- normalizamos os valores máx. e mín. com a precisão
maxv=NormalizeDouble(maxv,degree);
minv=NormalizeDouble(minv,degree);
//--- definimos o passo de geração da mesma maneira a partir da precisão definida
stepv=NormalizeDouble(MathPow(10,-degree),degree);
if((maxv-minv)/stepv<10)
stepv/=10.;
}

© 2000-2018, MetaQuotes Software Corp.


2034 Biblioteca Padrão

MathProbabilityDensityNoncentralBeta
Calcula a função densidade de probabilidade da distribuição gama com parâmetros a e b para a
variável aleatória x. Em caso de erro, retorna NaN.
double  MathProbabilityDensityNoncentralBeta(
const double  x, // valor da variável aleatória
const double  a, // primeiro parâmetro da distribuição (shape)
const double  b, // segundo parâmetro da distribuição (scale)
const bool   log_mode, // cálculo de logaritmo do valor, se log_mode=true, retorna o loga
int&  error_code  // variável para registro do código de erro
);

Calcula a função densidade de probabilidade da distribuição gama com parâmetros a e b para a


variável aleatória x. Em caso de erro, retorna NaN.
double  MathProbabilityDensityNoncentralBeta(
const double  x, // valor da variável aleatória
const double  a, // primeiro parâmetro da distribuição (shape)
const double  b, // segundo parâmetro da distribuição (scale)
int&  error_code  // variável para registro do código de erro
);

Calcula a função de densidade de probabilidade da distribuição gama com parâmetros a e b para a


matriz de variáveis aleatórias x []. Em caso de erro, retorna false. Equivalente a dgamma() no R .
bool  MathProbabilityDensityNoncentralBeta(
const double& x[], // matriz com valores da variável aleatória
const double  a, // primeiro parâmetro da distribuição (shape)
const double  b, // segundo parâmetro da distribuição (scale)
const bool   log_mode, // sinalizador de cálculo de logaritmo do valor, se log_mode=true,
double&  result[]  // matriz para o valor da função densidade de probabilidade
);

«Calcula a função de densidade de probabilidade da distribuição gama com parâmetros a e b para a


matriz de variáveis aleatórias x []. Em caso de erro, retorna false.
bool  MathProbabilityDensityNoncentralBeta(
const double& x[], // matriz com valores da variável aleatória
const double  a, // primeiro parâmetro da distribuição (shape)
const double  b, // segundo parâmetro da distribuição (scale)
double&  result[]  // matriz para o valor da função densidade de probabilidade
);

Parâmetros
x
[in] Valor da variável aleatória.
x[]
[in] Matriz com valores da variável aleatória.

© 2000-2018, MetaQuotes Software Corp.


2035 Biblioteca Padrão

a
[in] Primeiro parâmetro da distribuição (s hape).
b
[in] Segundo parâmetro da distribuição (scale).
log_mode
[in] Sinalizador de cálculo do algoritmo de um valor. Se log _mode=true, retorna o logaritmo
natural da função densidade de probabilidade.

error_code
[out] Variável para registro do código de erro.
result[]
[out] Matriz para os valores da função densidade de probabilidade.

© 2000-2018, MetaQuotes Software Corp.


2036 Biblioteca Padrão

MathCumulativeDistributionGamma
Calcula a distribuição gama de probabilidades com parâmetros a e b para a variável aleatória x. Em
caso de erro, retorna NaN.
double  MathCumulativeDistributionGamma(
const double  x, // valor da variável aleatória
const double  a, // primeiro parâmetro da distribuição (shape)
const double  b, // segundo parâmetro da distribuição (scale)
const double  tail, // sinalizador de cálculo, se for true, é calculada a probabilidade
const bool   log_mode, // cálculo de logaritmo do valor, se log_mode=true, é retornado o l
int&  error_code  // variável para registro do código de erro
);

Calcula a distribuição gama de probabilidades com parâmetros a e b para a variável aleatória x. Em


caso de erro, retorna NaN.
double  MathCumulativeDistributionGamma(
const double  x, // valor da variável aleatória
const double  a, // primeiro parâmetro da distribuição (shape)
const double  b, // segundo parâmetro da distribuição (scale)
int&  error_code  // variável para registro do código de erro
);

Calcula a distribuição gama de probabilidades com parâmetros a e b para a matriz das variáveis
aleatórias x []. Em caso de erro, retorna false. Equivalente a pgamma() no R .
bool  MathCumulativeDistributionGamma(
const double& x[], // matriz com valores da variável aleatória
const double  a, // primeiro parâmetro da distribuição (shape)
const double  b, // segundo parâmetro da distribuição (scale)
const double  tail, // sinalizador de cálculo, se for true, é calculada a probabilidad
const bool   log_mode, // sinalizador de cálculo de logaritmo do valor, se log_mode=true,
double&  result[]  // matriz para valores da função de probabilidade
);

Calcula a distribuição gama de probabilidades com parâmetros a e b para a matriz das variáveis
aleatórias x []. Em caso de erro, retorna false.
bool  MathCumulativeDistributionGamma(
const double& x[], // matriz com valores da variável aleatória
const double  a, // primeiro parâmetro da distribuição (shape)
const double  b, // segundo parâmetro da distribuição (scale)
double&  result[]  // matriz para valores da função de probabilidade
);

Parâmetros
x
[in] Valor da variável aleatória.
x[]

© 2000-2018, MetaQuotes Software Corp.


2037 Biblioteca Padrão

[in] Matriz com valores da variável aleatória.


a
[in] Primeiro parâmetro da distribuição (s hape).
b
[in] Segundo parâmetro da distribuição (scale)
tail
[in] Sinalizador de cálculo. Se for true, é calculada a probabilidade de que a variável aleatória não
será superior a x.

log_mode
[in] Sinalizador de cálculo do algoritmo de um valor. Se log _mode=true, retorna o logaritmo
natural da probabilidade.

error_code
[out] Variável para registro do código de erro.
result[]
[out] Matriz para valores da função de probabilidade.

© 2000-2018, MetaQuotes Software Corp.


2038 Biblioteca Padrão

MathQuantileGamma
Calcula o inverso da função de distribuição gama com parâmetros a e b para a probabilidade
probability. Em caso de erro, retorna NaN.

double  MathQuantileGamma(
const double  probability, // valor da probabilidade de aparecimento de uma variável aleatóri
const double  a, // primeiro parâmetro da distribuição (shape)
const double  b, // segundo parâmetro da distribuição (scale)
const bool   tail, // sinalizador de cálculo, se for false, o cálculo será realizado
const bool   log_mode, // sinalizador de cálculo, se log_mode=true, o cálculo é realizado
int&  error_code  // variável para registro do código de erro
);

Calcula o inverso da função de distribuição gama com parâmetros a e b para a probabilidade


probability. Em caso de erro, retorna NaN.

double  MathQuantileGamma(
const double  probability, // valor da probabilidade de aparecimento de uma variável aleatóri
const double  a, // primeiro parâmetro da distribuição (shape)
const double  b, // segundo parâmetro da distribuição (scale)
int&  error_code  // variável para registro do código de erro
);

Calcula o inverso da função de distribuição gama com parâmetros a e b para a matriz de valores da
probabilidade probability[]. Em caso de erro, retorna false. Equivalente a qgamma() no R .
double  MathQuantileGamma(
const double& probability[], // matriz com valores de probabilidade da variável aleatória
const double  a, // primeiro parâmetro da distribuição (shape)
const double  b, // segundo parâmetro da distribuição (scale)
const bool   tail, // sinalizador de cálculo, se for false, o cálculo será realizado
const bool   log_mode, // sinalizador de cálculo, se log_mode=true, o cálculo é realizado
double&  result[]  // matriz com valores de quantis
);

Calcula o inverso da função de distribuição gama com parâmetros a e b para a matriz de valores da
probabilidade probability[]. Em caso de erro, retorna false.
bool  MathQuantileGamma(
const double& probability[], // matriz com valores de probabilidade da variável aleatória
const double  a, // primeiro parâmetro da distribuição (shape)
const double  b, // segundo parâmetro da distribuição (scale)
double&  result[]  // matriz com valores de quantis
);

Parâmetros
probability
[in] Valor da probabilidade da variável aleatória.
probability[]

© 2000-2018, MetaQuotes Software Corp.


2039 Biblioteca Padrão

[in] Matriz com valores da probabilidade da variável aleatória.


a
[in] Primeiro parâmetro da distribuição (s hape).
b
[in] Segundo parâmetro da distribuição (scale).
tail
[in] Sinalizador de cálculo, se for false, o cálculo é realizado para a probabilidade 1.0 - probability.
log_mode
[in] Sinalizador de cálculo, se log _mode=true, o cálculo é realizado para a probabilidade
Exp(probability).

error_code
[out] Variável para obter o código de erro.
result[]
[out] Matriz com os valores dos quantis.

© 2000-2018, MetaQuotes Software Corp.


2040 Biblioteca Padrão

MathRandomGamma
Gera um número pseudo-aleatório distribuído de acordo com a distribuição gama com parâmetros a e
b. Em caso de erro, retorna NaN.
double  MathRandomGamma(
const double  a, // primeiro parâmetro da distribuição (shape)
const double  b, // segundo parâmetro da distribuição (scale)
int&  error_code  // variável para registro do código de erro
);

Gera um número pseudo-aleatório distribuído de acordo com a distribuição gama com parâmetros a e
b. Em caso de erro, retorna false. Equivalente a rgamma() no R .
bool  MathRandomGamma(
const double  a, // primeiro parâmetro da distribuição (shape)
const double  b, // segundo parâmetro da distribuição (scale)
const int   data_count, // número de dados necessários
double&  result[]  // matriz com os valores dos números pseudo-aleatórios
);

Parâmetros
a
[in] Primeiro parâmetro da distribuição (s hape).
b
[in] Segundo parâmetro da distribuição (scale).
error_code
[out] Variável para registro do código de erro.
data_count
[out] Número de dados necessários.
result[]
[out] Matriz para obter os valores dos números pseudo-aleatórios.

© 2000-2018, MetaQuotes Software Corp.


2041 Biblioteca Padrão

MathMomentsGamma
Calcula os valores numéricos teóricos dos primeiros 4 momentos da distribuição gama com parâmetros
a, b.
double  MathMomentsGamma(
const double  a, // primeiro parâmetro da distribuição (shape)
const double  b, // segundo parâmetro da distribuição (scale)
double&  mean, // variável para o valor médio
double&  variance, // variável para a dispersão
double&  skewness, // variável para a obliquidade
double&  kurtosis, // variável para a curtose
int&  error_code  // variável para o código de erro
);

Parâmetros
a
[in] Primeiro parâmetro da distribuição (s hape).
b
[in] Segundo parâmetro da distribuição (scale).
mean
[out] Variável para obter o valor médio.
variance
[out] Variável para obter a dispersão.
skewness
[out] Variável para obter a obliquidade.
kurtosis
[out] Variável para obter a curtose.
error_code
[out] Variável para obter o código de erro.

Valor de retorno
Retorna true, se os momentos forem calculados com sucesso, caso contrário false.

© 2000-2018, MetaQuotes Software Corp.


2042 Biblioteca Padrão

Qui-quadrado
Esta seção contém funções para trabalhar com a distribuição qui-quadrado. Elas permitem que você
calcule a densidade, probabilidade, quantis e gere números pseudo-aleatórios de acordo com a
distribuição correspondente. A distribuição qui-quadrado é descrita pela seguinte fórmula:

Onde:
· x — valor da variável aleatória
· n — número de graus de liberdade

Além do cálculo das variáveis ​aleatórias individuais, é poss ível trabalhar com suas matrizes.

F unção Descrição
MathProbabilityDensityChiSquare Calcula a densidade de probabilidade da
distribuição qui-quadrado

MathCumulativeDistributionChiSquare Calcula o valor da função distribuição de


probabilidades qui-quadrado

MathQuantileChiSquare Calcula o inverso da função de distribuição qui-


quadrado para a probabilidade especificada

MathR andomChiSquare Gera um valor/matriz pseudo-aleatório de


valores pseudo-aleatórios de acordo com a
distribuição qui-quadrado

MathMomentsChiSquare Calcula os valores numéricos teóricos dos


primeiros 4 momentos da distribuição qui-

© 2000-2018, MetaQuotes Software Corp.


2043 Biblioteca Padrão

quadrado

Exemplo:
#include <Graphics\Graphic.mqh>
#include <Math\Stat\ChiSquare.mqh>
#include <Math\Stat\Math.mqh>
#property script_show_inputs
//--- input parameters
input double nu_par=5; // número de graus de libertade
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- desativamos a exibição do gráfico de preço
ChartSetInteger(0,CHART_SHOW,false);
//--- inicializamos o gerador de números aleatórios
MathSrand(GetTickCount());
//--- geramos a amostragem da variável aleatória
long chart=0;
string name="GraphicNormal";
int n=1000000; // número de valores na amostragem
int ncells=51; // número de intervalos no gráfico de colunas
double x[]; // centros de intervalos no gráfico de colunas
double y[]; // número de valores a partir da amostragem dentro do intervalo
double data[]; // amostragem de valores aleatórios
double max,min; // valores máximo e mínimo na amostragem
//--- obtemos a seleção a partir da distribuição qui-quadrado
MathRandomChiSquare(nu_par,n,data);
//--- calculamos os dados para plotagem do gráfico de colunas
CalculateHistogramArray(data,x,y,max,min,ncells);
//--- obtemos os limites de sequência e passo para plotagem da curva teórica
double step;
GetMaxMinStepValues(max,min,step);
step=MathMin(step,(max-min)/ncells);
//--- obtemos teoricamente os cálculos no intervalo [min,max]
double x2[];
double y2[];
MathSequence(min,max,step,x2);
MathProbabilityDensityChiSquare(x2,nu_par,false,y2);
//--- dimensionamos
double theor_max=y2[ArrayMaximum(y2)];
double sample_max=y[ArrayMaximum(y)];
double k=sample_max/theor_max;
for(int i=0; i<ncells; i++)
y[i]/=k;
//--- imprimimos o gráfico

© 2000-2018, MetaQuotes Software Corp.


2044 Biblioteca Padrão

CGraphic graphic;
if(ObjectFind(chart,name)<0)
graphic.Create(chart,name,0,0,0,780,380);
else
graphic.Attach(chart,name);
graphic.BackgroundMain(StringFormat("ChiSquare distribution nu=%G ",nu_par));
graphic.BackgroundMainSize(16);
//--- plot all curves
graphic.CurveAdd(x,y,CURVE_HISTOGRAM,"Sample").HistogramWidth(6);
//--- e agora traçamos a curva teórica de densidade da distribuição
graphic.CurveAdd(x2,y2,CURVE_LINES,"Theory");
graphic.CurvePlotAll();
//--- plot all curves
graphic.Update();
}
//+------------------------------------------------------------------+
//| Calculate frequencies for data set |
//+------------------------------------------------------------------+
bool CalculateHistogramArray(const double &data[],double &intervals[],double &frequency[],
double &maxv,double &minv,const int cells=10)
{
if(cells<=1) return (false);
int size=ArraySize(data);
if(size<cells*10) return (false);
minv=data[ArrayMinimum(data)];
maxv=data[ArrayMaximum(data)];
double range=maxv-minv;
double width=range/cells;
if(width==0) return false;
ArrayResize(intervals,cells);
ArrayResize(frequency,cells);
//--- definimos os centros dos intervalos
for(int i=0; i<cells; i++)
{
intervals[i]=minv+(i+0.5)*width;
frequency[i]=0;
}
//--- preenchemos a frequência de aparecimento no intervalo
for(int i=0; i<size; i++)
{
int ind=int((data[i]-minv)/width);
if(ind>=cells) ind=cells-1;
frequency[ind]++;
}
return (true);
}
//+------------------------------------------------------------------+
//| Calculates values for sequence generation |
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


2045 Biblioteca Padrão

void GetMaxMinStepValues(double &maxv,double &minv,double &stepv)


{
//--- calculamos a magnitude da sequência para obter a precisão da normalização
double range=MathAbs(maxv-minv);
int degree=(int)MathRound(MathLog10(range));
//--- normalizamos os valores máx. e mín. com a precisão
maxv=NormalizeDouble(maxv,degree);
minv=NormalizeDouble(minv,degree);
//--- definimos o passo de geração da mesma maneira a partir da precisão definida
stepv=NormalizeDouble(MathPow(10,-degree),degree);
if((maxv-minv)/stepv<10)
stepv/=10.;
}

© 2000-2018, MetaQuotes Software Corp.


2046 Biblioteca Padrão

MathProbabilityDensityChiSquare
Calcula a função densidade de probabilidade da distribuição qui-quadrado com parâmetro nu para a
variável aleatória x. Em caso de erro, retorna NaN.
double  MathProbabilityDensityChiSquare(
const double  x, // valor da variável aleatória
const double  nu, // parâmetro de distribuição (número de graus de liberdade)
const bool   log_mode, // cálculo de logaritmo do valor, se log_mode=true, retorna o loga
int&  error_code  // variável para registro do código de erro
);

Calcula a função densidade de probabilidade da distribuição qui-quadrado com parâmetro nu para a


variável aleatória x. Em caso de erro, retorna NaN.
double  MathProbabilityDensityChiSquare(
const double  x, // valor da variável aleatória
const double  nu, // parâmetro de distribuição (número de graus de liberdade)
int&  error_code  // variável para registro do código de erro
);

Calcula a função densidade de probabilidade da distribuição qui-quadrado com parâmetro nu para a


matriz das variáveis aleatórias x []. Em caso de erro, retorna false. Equivalente a dchisq() no R .
bool  MathProbabilityDensityChiSquare(
const double& x[], // matriz com valores da variável aleatória
const double  nu, // parâmetro de distribuição (número de graus de liberdade)
const bool   log_mode, // sinalizador de cálculo de logaritmo do valor, se log_mode=true,
double&  result[]  // matriz para o valor da função densidade de probabilidade
);

Calcula a função densidade de probabilidade da distribuição qui-quadrado com parâmetro nu para a


matriz das variáveis aleatórias x []. Em caso de erro, retorna false.
bool  MathProbabilityDensityChiSquare(
const double& x[], // matriz com valores da variável aleatória
const double  nu, // parâmetro de distribuição (número de graus de liberdade)
double&  result[]  // matriz para o valor da função densidade de probabilidade
);

Parâmetros
x
[in] Valor da variável aleatória.
x[]
[in] Matriz com valores da variável aleatória.
nu
[in] Parâmetro de distribuição (número de graus de liberdade)
log_mode

© 2000-2018, MetaQuotes Software Corp.


2047 Biblioteca Padrão

[in] Sinalizador de cálculo do algoritmo de um valor. Se log _mode=true, retorna o logaritmo


natural da função densidade de probabilidade.

error_code
[out] Variável para registro do código de erro.
result[]
[out] Matriz para os valores da função densidade de probabilidade.

© 2000-2018, MetaQuotes Software Corp.


2048 Biblioteca Padrão

MathCumulativeDistributionChiSquare
Calcula a distribuição de probabilidades qui-quadrado com parâmetros nu para a variável aleatória x.
Em caso de erro, retorna NaN.
double  MathCumulativeDistributionChiSquare(
const double  x, // valor da variável aleatória
const double  nu, // parâmetro de distribuição (número de graus de liberdade)
const double  tail, // sinalizador de cálculo, se for true, é calculada a probabilidade
const bool   log_mode, // cálculo de logaritmo do valor, se log_mode=true, é retornado o l
int&  error_code  // variável para registro do código de erro
);

Calcula a distribuição de probabilidades qui-quadrado com parâmetros nu para a variável aleatória x.


Em caso de erro, retorna NaN
double  MathCumulativeDistributionChiSquare(
const double  x, // valor da variável aleatória
const double  nu, // parâmetro de distribuição (número de graus de liberdade)
int&  error_code  // variável para registro do código de erro
);

Calcula a distribuição de probabilidades qui-quadrado com parâmetros nu para a matriz de variáveis


aleatórias x []. Em caso de erro, retorna false. Equivalente a pchisq() no R .
bool  MathCumulativeDistributionChiSquare(
const double& x[], // matriz com valores da variável aleatória
const double  nu, // parâmetro de distribuição (número de graus de liberdade)
const double  tail, // sinalizador de cálculo, se for true, é calculada a probabilidad
const bool   log_mode, // sinalizador de cálculo de logaritmo do valor, se log_mode=true,
double&  result[]  // matriz para valores da função de probabilidade
);

Calcula a distribuição de probabilidades qui-quadrado com parâmetros nu para a matriz de variáveis


aleatórias x []. Em caso de erro, retorna false.
bool  MathCumulativeDistributionChiSquare(
const double& x[], // matriz com valores da variável aleatória
const double  nu, // parâmetro de distribuição (número de graus de liberdade)
double&  result[]  // matriz para valores da função de probabilidade
);

Parâmetros
x
[in] Valor da variável aleatória.
x[]
[in] Matriz com valores da variável aleatória.
nu
[in] Parâmetro de distribuição (número de graus de liberdade).

© 2000-2018, MetaQuotes Software Corp.


2049 Biblioteca Padrão

tail
[in] Sinalizador de cálculo. Se for true, é calculada a probabilidade de que a variável aleatória não
será superior a x.

log_mode
[in] Sinalizador de cálculo do algoritmo de um valor. Se log _mode=true, retorna o logaritmo
natural da probabilidade.

error_code
[out] Variável para registro do código de erro.
result[]
[out] Matriz para valores da função de probabilidade.

© 2000-2018, MetaQuotes Software Corp.


2050 Biblioteca Padrão

MathQuantileChiSquare
Calcula o inverso da função de distribuição de probabilidades qui-quadrado para a probabilidade
probability. Em caso de erro, retorna NaN.

double  MathQuantileChiSquare(
const double  probability, // valor da probabilidade de aparecimento de uma variável aleatóri
const double  nu, // parâmetro de distribuição (número de graus de liberdade)
const bool   tail, // sinalizador de cálculo, se for false, o cálculo será realizado
const bool   log_mode, // sinalizador de cálculo, se log_mode=true, o cálculo é realizado
int&  error_code  // variável para registro do código de erro
);

Calcula o inverso da função de distribuição de probabilidades qui-quadrado para a probabilidade


probability. Em caso de erro, retorna NaN.

double  MathQuantileChiSquare(
const double  probability, // valor da probabilidade de aparecimento de uma variável aleatóri
const double  nu, // parâmetro de distribuição (número de graus de liberdade)
int&  error_code  // variável para registro do código de erro
);

Calcula o inverso da função de distribuição de probabilidades qui-quadrado para a matriz de valores da


probabilidade probability[]. Em caso de erro, retorna false. Equivalente a qchisq() no R .
double  MathQuantileChiSquare(
const double& probability[], // matriz com valores de probabilidade da variável aleatória
const double  nu, // parâmetro de distribuição (número de graus de liberdade)
const bool   tail, // sinalizador de cálculo, se for false, o cálculo será realizado
const bool   log_mode, // sinalizador de cálculo, se log_mode=true, o cálculo é realizado
double&  result[]  // matriz com valores de quantis
);

Calcula o inverso da função de distribuição de probabilidades qui-quadrado para a matriz de valores da


probabilidade probability[]. Em caso de erro, retorna false.
bool  MathQuantileChiSquare(
const double& probability[], // matriz com valores de probabilidade da variável aleatória
const double  nu, // parâmetro de distribuição (número de graus de liberdade)
double&  result[]  // matriz com valores de quantis
);

Parâmetros
probability
[in] Valor da probabilidade da variável aleatória.
probability[]
[in] Matriz com valores da probabilidade da variável aleatória.
nu
[in] Parâmetro de distribuição (número de graus de liberdade).

© 2000-2018, MetaQuotes Software Corp.


2051 Biblioteca Padrão

tail
[in] Sinalizador de cálculo, se for false, o cálculo é realizado para a probabilidade 1.0 - probability.
log_mode
[in] Sinalizador de cálculo, se log _mode=true, o cálculo é realizado para a probabilidade
Exp(probability).

error_code
[out] Variável para obter o código de erro.
result[]
[out] Matriz com os valores dos quantis.

© 2000-2018, MetaQuotes Software Corp.


2052 Biblioteca Padrão

MathRandomChiSquare
Gera um número pseudo-aleatório distribuído de acordo com a distribuição qui-quadrado com
parâmetro nu. Em caso de erro, retorna NaN.
double  MathRandomChiSquare(
const double  nu, // parâmetro de distribuição (número de graus de liberdade)
int&  error_code  // variável para registro do código de erro
);

Gera um número pseudo-aleatório distribuído de acordo com a distribuição qui-quadrado com


parâmetro nu. Em caso de erro, retorna false. Equivalente a rchisq() no R .
bool  MathRandomChiSquare(
const double  nu, // parâmetro de distribuição (número de graus de liberdade)
const int   data_count, // número de dados necessários
double&  result[]  // matriz com os valores dos números pseudo-aleatórios
);

Parâmetros
nu
[in] Parâmetro de distribuição (número de graus de liberdade).
error_code
[out] Variável para registro do código de erro.
data_count
[out] Número de dados necessários.
result[]
[out] Matriz para obter os valores dos números pseudo-aleatórios.

© 2000-2018, MetaQuotes Software Corp.


2053 Biblioteca Padrão

MathMomentsChiSquare
Calcula os valores numéricos teóricos dos primeiros 4 momentos da distribuição qui-quadrado com
parâmetro nu.
double  MathMomentsChiSquare(
const double  nu, // parâmetro de distribuição (número de graus de liberdade)
double&  mean, // variável para o valor médio
double&  variance, // variável para a dispersão
double&  skewness, // variável para a obliquidade
double&  kurtosis, // variável para a curtose
int&  error_code  // variável para o código de erro
);

Parâmetros
nu
[in] Parâmetro de distribuição (número de graus de liberdade).
mean
[out] Variável para obter o valor médio.
variance
[out] Variável para obter a dispersão.
skewness
[out] Variável para obter a obliquidade.
kurtosis
[out] Variável para obter a curtose.
error_code
[out] Variável para obter o código de erro.

Valor de retorno
Retorna true, se os momentos forem calculados com sucesso, caso contrário false.

© 2000-2018, MetaQuotes Software Corp.


2054 Biblioteca Padrão

Qui-quadrado não-central
Esta seção contém funções para trabalhar com a distribuição qui-quadrado não-central. Elas permitem
que você calcule a densidade, probabilidade, quantis e gere números pseudo-aleatórios de acordo com
a distribuição correspondente. A distribuição qui-quadrado não-central é descrita pela seguinte
fórmula:

Onde:
· x — valor da variável aleatória
· n — número de graus de liberdade
· s — parâmetro de não-centralidade

Além do cálculo das variáveis ​aleatórias individuais, é poss ível trabalhar com suas matrizes.

F unção Descrição
MathProbabilityDensityNoncentralChiSquare Calcula a densidade de probabilidade da
distribuição qui-quadrado não-central

MathCumulativeDistributionNoncentralChiSquar Calcula o valor da função distribuição de


e probabilidades qui-quadrado não-central

MathQuantileNoncentralChiSquare Calcula o inverso da função de distribuição qui-


quadrado não-central para a probabilidade
especificada

MathR andomNoncentralChiSquare Gera um valor/matriz pseudo-aleatório de


valores pseudo-aleatórios de acordo com a

© 2000-2018, MetaQuotes Software Corp.


2055 Biblioteca Padrão

distribuição qui-quadrado não-central

MathMoments NoncentralChiSquare Calcula os valores numéricos teóricos dos


primeiros 4 momentos da distribuição qui-
quadrado não-central

Exemplo:
#include <Graphics\Graphic.mqh>
#include <Math\Stat\NoncentralChiSquare.mqh>
#include <Math\Stat\Math.mqh>
#property script_show_inputs
//--- input parameters
input double nu_par=8; // número de graus de liberdade
input double si_par=1; // parâmetro de não-centralidade
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- desativamos a exibição do gráfico de preço
ChartSetInteger(0,CHART_SHOW,false);
//--- inicializamos o gerador de números aleatórios
MathSrand(GetTickCount());
//--- geramos a amostragem da variável aleatória
long chart=0;
string name="GraphicNormal";
int n=1000000; // número de valores na amostragem
int ncells=51; // número de intervalos no gráfico de colunas
double x[]; // centros de intervalos no gráfico de colunas
double y[]; // número de valores a partir da amostragem dentro do intervalo
double data[]; // amostragem de valores aleatórios
double max,min; // valores máximo e mínimo na amostragem
//--- obtemos a seleção a partir da distribuição qui-quadrado não-central
MathRandomNoncentralChiSquare(nu_par,si_par,n,data);
//--- calculamos os dados para plotagem do gráfico de colunas
CalculateHistogramArray(data,x,y,max,min,ncells);
//--- obtemos os limites de sequência e passo para plotagem da curva teórica
double step;
GetMaxMinStepValues(max,min,step);
step=MathMin(step,(max-min)/ncells);
//--- obtemos teoricamente os cálculos no intervalo [min,max]
double x2[];
double y2[];
MathSequence(min,max,step,x2);
MathProbabilityDensityNoncentralChiSquare(x2,nu_par,si_par,false,y2);
//--- dimensionamos
double theor_max=y2[ArrayMaximum(y2)];
double sample_max=y[ArrayMaximum(y)];

© 2000-2018, MetaQuotes Software Corp.


2056 Biblioteca Padrão

double k=sample_max/theor_max;
for(int i=0; i<ncells; i++)
y[i]/=k;
//--- imprimimos o gráfico
CGraphic graphic;
if(ObjectFind(chart,name)<0)
graphic.Create(chart,name,0,0,0,780,380);
else
graphic.Attach(chart,name);
graphic.BackgroundMain(StringFormat("Noncentral ChiSquare distribution nu=%G sigma=%G",nu_par,si
graphic.BackgroundMainSize(16);
//--- desativamos o dimensionamento automático no eixo X
graphic.XAxis().AutoScale(false);
graphic.XAxis().Max(NormalizeDouble(max,0));
graphic.XAxis().Min(min);
//--- plot all curves
graphic.CurveAdd(x,y,CURVE_HISTOGRAM,"Sample").HistogramWidth(6);
//--- e agora traçamos a curva teórica de densidade da distribuição
graphic.CurveAdd(x2,y2,CURVE_LINES,"Theory");
graphic.CurvePlotAll();
//--- plot all curves
graphic.Update();
}
//+------------------------------------------------------------------+
//| Calculate frequencies for data set |
//+------------------------------------------------------------------+
bool CalculateHistogramArray(const double &data[],double &intervals[],double &frequency[],
double &maxv,double &minv,const int cells=10)
{
if(cells<=1) return (false);
int size=ArraySize(data);
if(size<cells*10) return (false);
minv=data[ArrayMinimum(data)];
maxv=data[ArrayMaximum(data)];
double range=maxv-minv;
double width=range/cells;
if(width==0) return false;
ArrayResize(intervals,cells);
ArrayResize(frequency,cells);
//--- definimos os centros dos intervalos
for(int i=0; i<cells; i++)
{
intervals[i]=minv+(i+0.5)*width;
frequency[i]=0;
}
//--- preenchemos a frequência de aparecimento no intervalo
for(int i=0; i<size; i++)
{
int ind=int((data[i]-minv)/width);

© 2000-2018, MetaQuotes Software Corp.


2057 Biblioteca Padrão

if(ind>=cells) ind=cells-1;
frequency[ind]++;
}
return (true);
}
//+------------------------------------------------------------------+
//| Calculates values for sequence generation |
//+------------------------------------------------------------------+
void GetMaxMinStepValues(double &maxv,double &minv,double &stepv)
{
//--- calculamos a magnitude da sequência para obter a precisão da normalização
double range=MathAbs(maxv-minv);
int degree=(int)MathRound(MathLog10(range));
//--- normalizamos os valores máx. e mín. com a precisão
maxv=NormalizeDouble(maxv,degree);
minv=NormalizeDouble(minv,degree);
//--- definimos o passo de geração da mesma maneira a partir da precisão definida
stepv=NormalizeDouble(MathPow(10,-degree),degree);
if((maxv-minv)/stepv<10)
stepv/=10.;
}

© 2000-2018, MetaQuotes Software Corp.


2058 Biblioteca Padrão

MathProbabilityDensityNoncentralChiSquare
Calcula a função densidade de probabilidade da distribuição qui-quadrado não-central com parâmetros
nu e sigma para a variável aleatória x. Em caso de erro, retorna NaN.
double  MathProbabilityDensityNoncentralChiSquare(
const double  x, // valor da variável aleatória
const double  nu, // parâmetro de distribuição (número de graus de liberdade)
const double  sigma, // parâmetro de não-centralidade
const bool   log_mode, // cálculo de logaritmo do valor, se log_mode=true, retorna o loga
int&  error_code  // variável para registro do código de erro
);

Calcula a função densidade de probabilidade da distribuição qui-quadrado não-central com parâmetros


nu e sigma para a variável aleatória x. Em caso de erro, retorna NaN.
double  MathProbabilityDensityNoncentralChiSquare(
const double  x, // valor da variável aleatória
const double  nu, // parâmetro de distribuição (número de graus de liberdade)
const double  sigma, // parâmetro de não-centralidade
int&  error_code  // variável para registro do código de erro
);

Calcula a função densidade de probabilidade da distribuição qui-quadrado não-central com parâmetros


nu e sigma para matiz das variáveis aleatórias x []. Em caso de erro, retorna false. Equivalente a
dchisq() no R .
bool  MathProbabilityDensityNoncentralChiSquare(
const double& x[], // matriz com valores da variável aleatória
const double  nu, // parâmetro de distribuição (número de graus de liberdade)
const double  sigma, // parâmetro de não-centralidade
const bool   log_mode, // sinalizador de cálculo de logaritmo do valor, se log_mode=true,
double&  result[]  // matriz para o valor da função densidade de probabilidade
);

Calcula a função densidade de probabilidade da distribuição qui-quadrado não-central com parâmetro


nu para a matriz das variáveis aleatórias x []. Em caso de erro, retorna false.
bool  MathProbabilityDensityNoncentralChiSquare(
const double& x[], // matriz com valores da variável aleatória
const double  nu, // parâmetro de distribuição (número de graus de liberdade)
const double  sigma, // parâmetro de não-centralidade
double&  result[]  // matriz para o valor da função densidade de probabilidade
);

Parâmetros
x
[in] Valor da variável aleatória.
x[]

© 2000-2018, MetaQuotes Software Corp.


2059 Biblioteca Padrão

[in] Matriz com valores da variável aleatória.


nu
[in] Parâmetro de distribuição (número de graus de liberdade).
sigma
[in] Parâmetro de não-centralidade.
log_mode
[in] Sinalizador de cálculo do algoritmo de um valor. Se log _mode=true, retorna o logaritmo
natural da função densidade de probabilidade.

error_code
[out] Variável para registro do código de erro.
result[]
[out] Matriz para os valores da função densidade de probabilidade.

© 2000-2018, MetaQuotes Software Corp.


2060 Biblioteca Padrão

MathCumulativeDistributionNoncentralChiSquare
Calcula a distribuição de probabilidades qui-quadrado não-central com parâmetros nu e sigma para a
variável aleatória x. Em caso de erro, retorna NaN.
double  MathCumulativeDistributionNoncentralChiSquare(
const double  x, // valor da variável aleatória
const double  nu, // parâmetro de distribuição (número de graus de liberdade)
const double  sigma, // parâmetro de não-centralidade
const bool   tail, // sinalizador de cálculo, se lower_tail=true, é calculada a probab
const bool   log_mode, // cálculo de logaritmo do valor, se log_mode=true, é retornado o l
int&  error_code  // variável para registro do código de erro
);

Calcula a distribuição de probabilidades qui-quadrado não-central com parâmetros nu e sigma para a


variável aleatória x. Em caso de erro, retorna NaN.
double  MathCumulativeDistributionNoncentralChiSquare(
const double  x, // valor da variável aleatória
const double  nu, // parâmetro de distribuição (número de graus de liberdade)
const double  sigma, // parâmetro de não-centralidade
int&  error_code  // variável para registro do código de erro
);

Calcula a distribuição de probabilidades qui-quadrado não-central com parâmetros nu e sigma para a


matriz das variáveis aleatórias x []. Em caso de erro, retorna false. Equivalente a pchisq() no R .
bool  MathCumulativeDistributionNoncentralChiSquare(
const double& x[], // matriz com valores da variável aleatória
const double  nu, // parâmetro de distribuição (número de graus de liberdade)
const double  sigma, // parâmetro de não-centralidade
const bool   tail, // sinalizador de cálculo, se lower_tail=true, é calculada a proba
const bool   log_mode, // sinalizador de cálculo de logaritmo do valor, se log_mode=true,
double&  result[]  // matriz para valores da função de probabilidade
);

Calcula a distribuição de probabilidades qui-quadrado não-central com parâmetros nu e sigma para a


matriz das variáveis aleatórias x []. Em caso de erro, retorna false.
bool  MathCumulativeDistributionNoncentralChiSquare(
const double& x[], // matriz com valores da variável aleatória
const double  nu, // parâmetro de distribuição (número de graus de liberdade)
const double  sigma, // parâmetro de não-centralidade
double&  result[]  // matriz para valores da função de probabilidade
);

Parâmetros
x
[in] Valor da variável aleatória.
x[]

© 2000-2018, MetaQuotes Software Corp.


2061 Biblioteca Padrão

[in] Matriz com valores da variável aleatória.


nu
[in] Parâmetro de distribuição (número de graus de liberdade).
sigma
[in] Parâmetro de não-centralidade.
tail
[in] Sinalizador de cálculo. Se for true, é calculada a probabilidade de que a variável aleatória não
será superior a x.

log_mode
[in] Sinalizador de cálculo do algoritmo de um valor. Se log _mode=true, retorna o logaritmo
natural da probabilidade.

error_code
[out] Variável para registro do código de erro.
result[]
[out] Matriz para valores da função de probabilidade.

© 2000-2018, MetaQuotes Software Corp.


2062 Biblioteca Padrão

MathQuantileNoncentralChiSquare
Calcula o inverso da função de distribuição qui-quadrado não-central com parâmetros mu e sigma para
a probabilidade probability. Em caso de erro, retorna NaN.
double  MathQuantileNoncentralChiSquare(
const double  probability, // valor da probabilidade de aparecimento de uma variável aleatóri
const double  nu, // parâmetro de distribuição (número de graus de liberdade)
const double  sigma, // parâmetro de não-centralidade
const bool   tail, // sinalizador de cálculo, se for false, o cálculo será realizado
const bool   log_mode, // sinalizador de cálculo, se log_mode=true, o cálculo é realizado
int&  error_code  // variável para registro do código de erro
);

Calcula o inverso da função de distribuição qui-quadrado não-central com parâmetros mu e sigma para
a probabilidade probability. Em caso de erro, retorna NaN.
double  MathQuantileNoncentralChiSquare(
const double  probability, // valor da probabilidade de aparecimento de uma variável aleatóri
const double  nu, // parâmetro de distribuição (número de graus de liberdade)
const double  sigma, // parâmetro de não-centralidade
int&  error_code  // variável para registro do código de erro
);

Calcula o inverso da função de distribuição qui-quadrado não-central com parâmetros mu e sigma para
a matriz de valores da probabilidade probability[]. Em caso de erro, retorna false. Equivalente a
qchisq() no R .
double  MathQuantileNoncentralChiSquare(
const double&  probability[], // matriz com valores de probabilidade da variável aleatória
const double  nu, // parâmetro de distribuição (número de graus de liberdade)
const double  sigma, // parâmetro de não-centralidade
const bool   tail, // sinalizador de cálculo, se for false, o cálculo será realizado
const bool   log_mode, // sinalizador de cálculo, se log_mode=true, o cálculo é realizad
double&  result[]  // matriz com valores de quantis
);

Calcula o inverso da função de distribuição de probabilidades qui-quadrado não-central para a matriz


de valores da probabilidade probability[]. Em caso de erro, retorna false.
bool  MathQuantileNoncentralChiSquare(
const double& probability[], // matriz com valores de probabilidade da variável aleatória
const double  nu, // parâmetro de distribuição (número de graus de liberdade)
const double  sigma, // parâmetro de não-centralidade
double&  result[]  // matriz com valores de quantis
);

Parâmetros
probability
[in] Valor da probabilidade da variável aleatória.

© 2000-2018, MetaQuotes Software Corp.


2063 Biblioteca Padrão

probability[]
[in] Matriz com valores da probabilidade da variável aleatória.
nu
[in] Parâmetro de distribuição (número de graus de liberdade).
sigma
[in] Parâmetro de não-centralidade.
tail
[in] Sinalizador de cálculo, se for false, o cálculo é realizado para a probabilidade 1.0 - probability.
log_mode
[in] Sinalizador de cálculo, se log _mode=true, o cálculo é realizado para a probabilidade
Exp(probability).

error_code
[out] Variável para obter o código de erro.
result[]
[out] Matriz com os valores dos quantis.

© 2000-2018, MetaQuotes Software Corp.


2064 Biblioteca Padrão

MathRandomNoncentralChiSquare
Gera um número pseudo-aleatório distribuído de acordo com a distribuição qui-quadrado não-central
com parâmetros nu e sigma. Em caso de erro, retorna NaN.
double  MathRandomNoncentralChiSquare(
const double  nu, // parâmetro de distribuição (número de graus de liberdade)
const double  sigma, // parâmetro de não-centralidade
int&  error_code  // variável para registro do código de erro
);

Gera números pseudo-aleatórios distribuídos de acordo com a distribuição qui-quadrado não-central


com parâmetros nu e sigma. Em caso de erro, retorna false. Equivalente a rchisq() no R .
bool  MathRandomNoncentralChiSquare(
const double  nu, // parâmetro de distribuição (número de graus de liberdade)
const double  sigma, // parâmetro de não-centralidade
const int   data_count, // número de dados necessários
double&  result[]  // matriz com os valores dos números pseudo-aleatórios
);

Parâmetros
nu
[in] Parâmetro de distribuição (número de graus de liberdade).
sigma
[in] Parâmetro de não-centralidade.
error_code
[out] Variável para registro do código de erro.
data_count
[out] Número de dados necessários.
result[]
[out] Matriz para obter os valores dos números pseudo-aleatórios.

© 2000-2018, MetaQuotes Software Corp.


2065 Biblioteca Padrão

MathMomentsNoncentralChiSquare
Calcula os valores numéricos teóricos dos primeiros 4 momentos da distribuição qui-quadrado não-
central com parâmetros nu e sigma.
double  MathMomentsNoncentralChiSquare(
const double  nu, // parâmetro de distribuição (número de graus de liberdade)
const double  sigma, // parâmetro de não-centralidade
double&  mean, // variável para o valor médio
double&  variance, // variável para a dispersão
double&  skewness, // variável para a obliquidade
double&  kurtosis, // variável para a curtose
int&  error_code  // variável para o código de erro
);

Parâmetros
nu
[in] Parâmetro de distribuição (número de graus de liberdade).
sigma
[in] Parâmetro de não-centralidade.
mean
[out] Variável para obter o valor médio.
variance
[out] Variável para obter a dispersão.
skewness
[out] Variável para obter a obliquidade.
kurtosis
[out] Variável para obter a curtose.
error_code
[out] Variável para obter o código de erro.

Valor de retorno
Retorna true, se os momentos forem calculados com sucesso, caso contrário false.

© 2000-2018, MetaQuotes Software Corp.


2066 Biblioteca Padrão

Exponencial
Esta seção apresenta as funções para trabalhar com a distribuição exponencial. Elas permitem que
você calcule a densidade, probabilidade, quantis e gere números pseudo-aleatórios de acordo com a
distribuição exponencial. A distribuição exponencial é descrita pela seguinte fórmula:

Onde:
· x — valor da variável aleatória
· m — valor esperado

Além do cálculo das variáveis ​aleatórias individuais, é poss ível trabalhar com suas matrizes.

F unção Descrição
MathProbabilityDensityExponential Calcula a densidade de probabilidade da
distribuição exponencial

MathCumulativeDistributionExponential Calcula o valor da função distribuição


exponencial da probabilidade

MathQuantileExponential Calcula o inverso da função de distribuição


exponencial para a probabilidade especificada

MathR andomExponential Gera um valor/matriz pseudo-aleatório de


valores pseudo-aleatórios de acordo com a
distribuição exponencial

MathMomentsExponential Calcula os valores numéricos teóricos dos


primeiros 4 momentos da distribuição
exponencial

© 2000-2018, MetaQuotes Software Corp.


2067 Biblioteca Padrão

Exemplo:
#include <Graphics\Graphic.mqh>
#include <Math\Stat\Exponential.mqh>
#include <Math\Stat\Math.mqh>
#property script_show_inputs
//--- input parameters
input double mu_par=1.5; // número de graus de liberdade
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- desativamos a exibição do gráfico de preço
ChartSetInteger(0,CHART_SHOW,false);
//--- inicializamos o gerador de números aleatórios
MathSrand(GetTickCount());
//--- geramos a amostragem da variável aleatória
long chart=0;
string name="GraphicNormal";
int n=1000000; // número de valores na amostragem
int ncells=51; // número de intervalos no gráfico de colunas
double x[]; // centros de intervalos no gráfico de colunas
double y[]; // número de valores a partir da amostragem dentro do intervalo
double data[]; // amostragem de valores aleatórios
double max,min; // valores máximo e mínimo na amostragem
//--- obtemos a amostragem a partir da distribuição exponencial
MathRandomExponential(mu_par,n,data);
//--- calculamos os dados para plotagem do gráfico de colunas
CalculateHistogramArray(data,x,y,max,min,ncells);
//--- obtemos os limites de sequência e passo para plotagem da curva teórica
double step;
GetMaxMinStepValues(max,min,step);
step=MathMin(step,(max-min)/ncells);
//--- obtemos teoricamente os cálculos no intervalo [min,max]
double x2[];
double y2[];
MathSequence(min,max,step,x2);
MathProbabilityDensityExponential(x2,mu_par,false,y2);
//--- dimensionamos
double theor_max=y2[ArrayMaximum(y2)];
double sample_max=y[ArrayMaximum(y)];
double k=sample_max/theor_max;
for(int i=0; i<ncells; i++)
y[i]/=k;
//--- imprimimos o gráfico
CGraphic graphic;
if(ObjectFind(chart,name)<0)
graphic.Create(chart,name,0,0,0,780,380);

© 2000-2018, MetaQuotes Software Corp.


2068 Biblioteca Padrão

else
graphic.Attach(chart,name);
graphic.BackgroundMain(StringFormat("Exponential distribution mu=%G ",mu_par));
graphic.BackgroundMainSize(16);
//--- plot all curves
graphic.CurveAdd(x,y,CURVE_HISTOGRAM,"Sample").HistogramWidth(6);
//--- e agora traçamos a curva teórica de densidade da distribuição
graphic.CurveAdd(x2,y2,CURVE_LINES,"Theory");
graphic.CurvePlotAll();
//--- plot all curves
graphic.Update();
}
//+------------------------------------------------------------------+
//| Calculate frequencies for data set |
//+------------------------------------------------------------------+
bool CalculateHistogramArray(const double &data[],double &intervals[],double &frequency[],
double &maxv,double &minv,const int cells=10)
{
if(cells<=1) return (false);
int size=ArraySize(data);
if(size<cells*10) return (false);
minv=data[ArrayMinimum(data)];
maxv=data[ArrayMaximum(data)];
double range=maxv-minv;
double width=range/cells;
if(width==0) return false;
ArrayResize(intervals,cells);
ArrayResize(frequency,cells);
//--- definimos os centros dos intervalos
for(int i=0; i<cells; i++)
{
intervals[i]=minv+i*width;
frequency[i]=0;
}
//--- preenchemos a frequência de aparecimento no intervalo
for(int i=0; i<size; i++)
{
int ind=int((data[i]-minv)/width);
if(ind>=cells) ind=cells-1;
frequency[ind]++;
}
return (true);
}
//+------------------------------------------------------------------+
//| Calculates values for sequence generation |
//+------------------------------------------------------------------+
void GetMaxMinStepValues(double &maxv,double &minv,double &stepv)
{
//--- calculamos a magnitude da sequência para obter a precisão da normalização

© 2000-2018, MetaQuotes Software Corp.


2069 Biblioteca Padrão

double range=MathAbs(maxv-minv);
int degree=(int)MathRound(MathLog10(range));
//--- normalizamos os valores máx. e mín. com a precisão
maxv=NormalizeDouble(maxv,degree);
minv=NormalizeDouble(minv,degree);
//--- definimos o passo de geração da mesma maneira a partir da precisão definida
stepv=NormalizeDouble(MathPow(10,-degree),degree);
if((maxv-minv)/stepv<10)
stepv/=10.;
}

© 2000-2018, MetaQuotes Software Corp.


2070 Biblioteca Padrão

MathProbabilityDensityExponential
Calcula a função densidade de probabilidade da distribuição exponencial com parâmetro mu para a
variável aleatória x. Em caso de erro, retorna NaN.
double  MathProbabilityDensityExponential(
const double  x, // valor da variável aleatória
const double  mu, // parâmetro de distribuição (valor esperado)
const bool   log_mode, // cálculo de logaritmo do valor, se log_mode=true, retorna o loga
int&  error_code  // variável para registro do código de erro
);

Calcula a função densidade de probabilidade da distribuição exponencial com parâmetro mu para a


variável aleatória x. Em caso de erro, retorna NaN.
double  MathProbabilityDensityExponential(
const double  x, // valor da variável aleatória
const double  mu, // parâmetro de distribuição (valor esperado)
int&  error_code  // variável para registro do código de erro
);

Calcula a função densidade de probabilidade da distribuição exponencial com parâmetro mu para a


matriz das variáveis aleatórias x []. Em caso de erro, retorna false. Equivalente a dexp() no R .
bool  MathProbabilityDensityExponential(
const double& x[], // matriz com valores da variável aleatória
const double  mu, // parâmetro de distribuição (valor esperado)
const bool   log_mode, // sinalizador de cálculo de logaritmo do valor, se log_mode=true,
double&  result[]  // matriz para o valor da função densidade de probabilidade
);

Calcula a função densidade de probabilidade da distribuição exponencial com parâmetro mu para a


matriz das variáveis aleatórias x []. Em caso de erro, retorna false.
bool  MathProbabilityDensityExponential(
const double& x[], // matriz com valores da variável aleatória
const double  mu, // parâmetro de distribuição (valor esperado)
double&  result[]  // matriz para o valor da função densidade de probabilidade
);

Parâmetros
x
[in] Valor da variável aleatória.
x[]
[in] Matriz com valores da variável aleatória.
mu
[in] Parâmetro de distribuição (valor esperado)
log_mode

© 2000-2018, MetaQuotes Software Corp.


2071 Biblioteca Padrão

[in] Sinalizador de cálculo do algoritmo de um valor. Se log _mode=true, retorna o logaritmo


natural da função densidade de probabilidade.

error_code
[out] Variável para registro do código de erro.
result[]
[out] Matriz para os valores da função densidade de probabilidade.

© 2000-2018, MetaQuotes Software Corp.


2072 Biblioteca Padrão

MathCumulativeDistributionExponential
Calcula a distribuição exponencial de probabilidade com parâmetro mu para a variável aleatória x. Em
caso de erro, retorna NaN.
double  MathCumulativeDistributionExponential(
const double  x, // valor da variável aleatória
const double  mu, // parâmetro de distribuição (valor esperado)
const double  tail, // sinalizador de cálculo, se for true, é calculada a probabilidade
const bool   log_mode, // cálculo de logaritmo do valor, se log_mode=true, é retornado o l
int&  error_code  // variável para registro do código de erro
);

Calcula a distribuição exponencial de probabilidade com parâmetro mu para a variável aleatória x. Em


caso de erro, retorna NaN.
double  MathCumulativeDistributionExponential(
const double  x, // valor da variável aleatória
const double  mu, // parâmetro de distribuição (valor esperado)
int&  error_code  // variável para registro do código de erro
);

Calcula a distribuição exponencial de probabilidade com parâmetro mu para a matriz das variáveis
aleatórias x []. Em caso de erro, retorna false. Equivalente a pexp() no R .
bool  MathCumulativeDistributionExponential(
const double& x[], // matriz com valores da variável aleatória
const double  mu, // parâmetro de distribuição (valor esperado)
const double  tail, // sinalizador de cálculo, se for true, é calculada a probabilidad
const bool   log_mode, // sinalizador de cálculo de logaritmo do valor, se log_mode=true,
double&  result[]  // matriz para valores da função de probabilidade
);

Calcula a distribuição exponencial de probabilidade com parâmetro mu para a matriz das variáveis
aleatórias x []. Em caso de erro, retorna false.
bool  MathCumulativeDistributionExponential(
const double& x[], // matriz com valores da variável aleatória
const double  mu, // parâmetro de distribuição (valor esperado)
double&  result[]  // matriz para valores da função de probabilidade
);

Parâmetros
x
[in] Valor da variável aleatória.
x[]
[in] Matriz com valores da variável aleatória.
mu
[in] Parâmetro de distribuição (valor esperado).

© 2000-2018, MetaQuotes Software Corp.


2073 Biblioteca Padrão

tail
[in] Sinalizador de cálculo. Se for true, é calculada a probabilidade de que a variável aleatória não
será superior a x.

log_mode
[in] Sinalizador de cálculo do algoritmo de um valor. Se log _mode=true, retorna o logaritmo
natural da probabilidade.

error_code
[out] Variável para registro do código de erro.
result[]
[out] Matriz para valores da função de probabilidade.

© 2000-2018, MetaQuotes Software Corp.


2074 Biblioteca Padrão

MathQuantileExponential
Calcula o inverso da função de distribuição exponencial com parâmetro mu para a probabilidade
probability. Em caso de erro, retorna NaN.

double  MathQuantileExponential(
const double  probability, // valor da probabilidade de aparecimento de uma variável aleatóri
const double  mu, // parâmetro de distribuição (valor esperado)
const bool   tail, // sinalizador de cálculo, se for false, o cálculo será realizado
const bool   log_mode, // sinalizador de cálculo, se log_mode=true, o cálculo é realizado
int&  error_code  // variável para registro do código de erro
);

Calcula o inverso da função de distribuição exponencial com parâmetro mu para a probabilidade


probability. Em caso de erro, retorna NaN.

double  MathQuantileExponential(
const double  probability, // valor da probabilidade de aparecimento de uma variável aleatóri
const double  mu, // parâmetro de distribuição (valor esperado)
int&  error_code  // variável para registro do código de erro
);

Calcula o inverso da função de distribuição exponencial com parâmetro mu para a probabilidade para a
matriz de valores da probabilidade probability[]. Em caso de erro, retorna false. Equivalente a qexp()
no R .
double  MathQuantileExponential(
const double& probability[], // matriz com valores de probabilidade da variável aleatória
const double  mu, // parâmetro de distribuição (valor esperado)
const bool   tail, // sinalizador de cálculo, se for false, o cálculo será realizado
const bool   log_mode, // sinalizador de cálculo, se log_mode=true, o cálculo é realizado
double&  result[]  // matriz com valores de quantis
);

Calcula o inverso da função de distribuição exponencial com parâmetro mu para a probabilidade para a
matriz de valores da probabilidade probability[]. Em caso de erro, retorna false.
bool  MathQuantileExponential(
const double& probability[], // matriz com valores de probabilidade da variável aleatória
const double  mu, // parâmetro de distribuição (valor esperado)
double&  result[]  // matriz com valores de quantis
);

Parâmetros
probability
[in] Valor da probabilidade da variável aleatória.
probability[]
[in] Matriz com valores da probabilidade da variável aleatória.
mu

© 2000-2018, MetaQuotes Software Corp.


2075 Biblioteca Padrão

[in] Parâmetro de distribuição (valor esperado).


tail
[in] Sinalizador de cálculo, se for false, o cálculo é realizado para a probabilidade 1.0 - probability.
log_mode
[in] Sinalizador de cálculo, se log _mode=true, o cálculo é realizado para a probabilidade
Exp(probability).

error_code
[out] Variável para obter o código de erro.
result[]
[out] Matriz com os valores dos quantis.

© 2000-2018, MetaQuotes Software Corp.


2076 Biblioteca Padrão

MathRandomExponential
Gera um número pseudo-aleatório distribuído de acordo com a distribuição exponencial com parâmetro
mu. Em caso de erro, retorna NaN.
double  MathRandomExponential(
const double  mu, // parâmetro de distribuição (valor esperado)
int&  error_code  // variável para registro do código de erro
);

Gera um números pseudo-aleatórios distribuídos de acordo com a distribuição exponencial com


parâmetro mu. Em caso de erro, retorna false. Equivalente a rexp() no R .
bool  MathRandomExponential(
const double  mu, // parâmetro de distribuição (valor esperado)
const int   data_count, // número de dados necessários
double&  result[]  // matriz com os valores dos números pseudo-aleatórios
);

Parâmetros
mu
[in] Parâmetro de distribuição (valor esperado).
error_code
[out] Variável para registro do código de erro.
data_count
[out] Número de dados necessários.
result[]
[out] Matriz para obter os valores dos números pseudo-aleatórios.

© 2000-2018, MetaQuotes Software Corp.


2077 Biblioteca Padrão

MathMomentsExponential
Calcula os valores numéricos teóricos dos primeiros 4 momentos da distribuição exponencial com
parâmetro mu.
double  MathMomentsExponential(
const double  mu, // parâmetro de distribuição (valor esperado)
double&  mean, // variável para o valor médio
double&  variance, // variável para a dispersão
double&  skewness, // variável para a obliquidade
double&  kurtosis, // variável para a curtose
int&  error_code  // variável para o código de erro
);

Parâmetros
mu
[in] Parâmetro de distribuição (valor esperado).
mean
[out] Variável para obter o valor médio.
variance
[out] Variável para obter a dispersão.
skewness
[out] Variável para obter a obliquidade.
kurtosis
[out] Variável para obter a curtose.
error_code
[out] Variável para obter o código de erro.

Valor de retorno
Retorna true, se os momentos forem calculados com sucesso, caso contrário false.

© 2000-2018, MetaQuotes Software Corp.


2078 Biblioteca Padrão

Distribuição F de Fisher-Snedecor
Esta seção apresenta as funções para trabalhar com a distribuição F de Fis her-Snedecor. Elas
permitem que você calcule a densidade, probabilidade, quantis e gere números pseudo-aleatórios de
acordo com a distribuição F. A distribuição F de Fis her-Snedecor é descrita pela seguinte fórmula:

Onde:
· x — valor da variável aleatória
· n1 — primeiro parâmetro de distribuição (número de graus de liberdade)
· n2 — segundo parâmetro de distribuição (número de graus de liberdade)

Além do cálculo das variáveis ​aleatórias individuais, é poss ível trabalhar com suas matrizes.

F unção Descrição
MathProbabilityDensityF Calcula a densidade de probabilidade da
distribuição F de Fis her-Snedecor

MathCumulativeDistributionF Calcula o valor da função distribuição F de


Fis her-Snedecor de probabilidades
MathQuantileF Calcula o inverso da função de distribuição F de
Fis her-Snedecor para a probabilidade
especificada

MathR andomF Gera um valor/matriz pseudo-aleatório de


valores pseudo-aleatórios de acordo com a

© 2000-2018, MetaQuotes Software Corp.


2079 Biblioteca Padrão

distribuição F de Fis her-Snedecor

MathMoments F Calcula os valores numéricos teóricos dos


primeiros 4 momentos da distribuição F de
Fis her-Snedecor

Exemplo:
#include <Graphics\Graphic.mqh>
#include <Math\Stat\F.mqh>
#include <Math\Stat\Math.mqh>
#property script_show_inputs
//--- input parameters
input double nu_1=100; // primeiro número de graus de liberdade
input double nu_2=100; // segundo número de graus de liberdade
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- desativamos a exibição do gráfico de preço
ChartSetInteger(0,CHART_SHOW,false);
//--- inicializamos o gerador de números aleatórios
MathSrand(GetTickCount());
//--- geramos a amostragem da variável aleatória
long chart=0;
string name="GraphicNormal";
int n=1000000; // número de valores na amostragem
int ncells=51; // número de intervalos no gráfico de colunas
double x[]; // centros de intervalos no gráfico de colunas
double y[]; // número de valores a partir da amostragem dentro do intervalo
double data[]; // amostragem de valores aleatórios
double max,min; // valores máximo e mínimo na amostragem
//--- obtemos a amostragem a partir da distribuição F de Fisher-Snedecor
MathRandomF(nu_1,nu_2,n,data);
//--- calculamos os dados para plotagem do gráfico de colunas
CalculateHistogramArray(data,x,y,max,min,ncells);
//--- obtemos os limites de sequência e passo para plotagem da curva teórica
double step;
GetMaxMinStepValues(max,min,step);
step=MathMin(step,(max-min)/ncells);
//--- obtemos teoricamente os cálculos no intervalo [min,max]
double x2[];
double y2[];
MathSequence(min,max,step,x2);
MathProbabilityDensityF(x2,nu_1,nu_2,false,y2);
//--- dimensionamos
double theor_max=y2[ArrayMaximum(y2)];
double sample_max=y[ArrayMaximum(y)];

© 2000-2018, MetaQuotes Software Corp.


2080 Biblioteca Padrão

double k=sample_max/theor_max;
for(int i=0; i<ncells; i++)
y[i]/=k;
//--- imprimimos o gráfico
CGraphic graphic;
if(ObjectFind(chart,name)<0)
graphic.Create(chart,name,0,0,0,780,380);
else
graphic.Attach(chart,name);
graphic.BackgroundMain(StringFormat("F-distribution nu1=%G nu2=%G",nu_1,nu_2));
graphic.BackgroundMainSize(16);
//--- plot all curves
graphic.CurveAdd(x,y,CURVE_HISTOGRAM,"Sample").HistogramWidth(4);
//--- e agora traçamos a curva teórica de densidade da distribuição
graphic.CurveAdd(x2,y2,CURVE_LINES,"Theory");
graphic.CurvePlotAll();
//--- plot all curves
graphic.Update();
}
//+------------------------------------------------------------------+
//| Calculate frequencies for data set |
//+------------------------------------------------------------------+
bool CalculateHistogramArray(const double &data[],double &intervals[],double &frequency[],
double &maxv,double &minv,const int cells=10)
{
if(cells<=1) return (false);
int size=ArraySize(data);
if(size<cells*10) return (false);
minv=data[ArrayMinimum(data)];
maxv=data[ArrayMaximum(data)];
double range=maxv-minv;
double width=range/cells;
if(width==0) return false;
ArrayResize(intervals,cells);
ArrayResize(frequency,cells);
//--- definimos os centros dos intervalos
for(int i=0; i<cells; i++)
{
intervals[i]=minv+(i+0.5)*width;
frequency[i]=0;
}
//--- preenchemos a frequência de aparecimento no intervalo
for(int i=0; i<size; i++)
{
int ind=int((data[i]-minv)/width);
if(ind>=cells) ind=cells-1;
frequency[ind]++;
}
return (true);

© 2000-2018, MetaQuotes Software Corp.


2081 Biblioteca Padrão

}
//+------------------------------------------------------------------+
//| Calculates values for sequence generation |
//+------------------------------------------------------------------+
void GetMaxMinStepValues(double &maxv,double &minv,double &stepv)
{
//--- calculamos a magnitude da sequência para obter a precisão da normalização
double range=MathAbs(maxv-minv);
int degree=(int)MathRound(MathLog10(range));
//--- normalizamos os valores máx. e mín. com a precisão
maxv=NormalizeDouble(maxv,degree);
minv=NormalizeDouble(minv,degree);
//--- definimos o passo de geração da mesma maneira a partir da precisão definida
stepv=NormalizeDouble(MathPow(10,-degree),degree);
if((maxv-minv)/stepv<10)
stepv/=10.;
}

© 2000-2018, MetaQuotes Software Corp.


2082 Biblioteca Padrão

MathProbabilityDensityF
Calcula a função densidade de probabilidade da distribuição F de Fis her-Snedecor com parâmetros nu1
e nu2 para a variável aleatória x. Em caso de erro, retorna NaN.
double  MathProbabilityDensityF(
const double  x, // valor da variável aleatória
const double  nu1, // primeiro parâmetro da distribuição (número de graus de liberdade
const double  nu2, // segundo parâmetro da distribuição (número de graus de liberdade)
const bool   log_mode, // cálculo de logaritmo do valor, se log_mode=true, retorna o loga
int&  error_code  // variável para registro do código de erro
);

Calcula a função densidade de probabilidade da distribuição F de Fis her-Snedecor com parâmetros nu1
e nu2 para a variável aleatória x. Em caso de erro, retorna NaN.
double  MathProbabilityDensityF(
const double  x, // valor da variável aleatória
const double  nu1, // primeiro parâmetro da distribuição (número de graus de liberdade
const double  nu2, // segundo parâmetro da distribuição (número de graus de liberdade)
int&  error_code  // variável para registro do código de erro
);

Calcula a função densidade de probabilidade da distribuição F de Fis her-Snedecor com parâmetros nu1
e nu2 para a matriz das variáveis aleatórias x []. Em caso de erro, retorna false. Equivalente a df() no
R.
bool  MathProbabilityDensityF(
const double& x[], // matriz com valores da variável aleatória
const double  nu1, // primeiro parâmetro da distribuição (número de graus de liberdad
const double  nu2, // segundo parâmetro da distribuição (número de graus de liberdade
const bool   log_mode, // sinalizador de cálculo de logaritmo do valor, se log_mode=true,
double&  result[]  // matriz para o valor da função densidade de probabilidade
);

Calcula a função densidade de probabilidade da distribuição F de Fis her-Snedecor com parâmetros nu1
e nu2 para a matriz das variáveis aleatórias x []. Em caso de erro, retorna false.
bool  MathProbabilityDensityF(
const double& x[], // matriz com valores da variável aleatória
const double  nu1, // primeiro parâmetro da distribuição (número de graus de liberdad
const double  nu2, // segundo parâmetro da distribuição (número de graus de liberdade
double&  result[]  // matriz para o valor da função densidade de probabilidade
);

Parâmetros
x
[in] Valor da variável aleatória.
x[]

© 2000-2018, MetaQuotes Software Corp.


2083 Biblioteca Padrão

[in] Matriz com valores da variável aleatória.


nu1
[in] Primeiro parâmetro de distribuição (número de graus de liberdade).
nu2
[in] Segundo parâmetro de distribuição (número de graus de liberdade).
log_mode
[in] Sinalizador de cálculo do algoritmo de um valor. Se log _mode=true, retorna o logaritmo
natural da função densidade de probabilidade.

error_code
[out] Variável para registro do código de erro.
result[]
[out] Matriz para os valores da função densidade de probabilidade.

© 2000-2018, MetaQuotes Software Corp.


2084 Biblioteca Padrão

MathCumulativeDistributionF
Calcula a distribuição de probabilidades F de Fis her-Snedecor com parâmetros nu1 e nu2 para a
variável aleatória x. Em caso de erro, retorna NaN.
double  MathCumulativeDistributionF(
const double  x, // valor da variável aleatória
const double  nu1, // primeiro parâmetro da distribuição (número de graus de liberdade
const double  nu2, // segundo parâmetro da distribuição (número de graus de liberdade)
const double  tail, // sinalizador de cálculo, se for true, é calculada a probabilidade
const bool   log_mode, // cálculo de logaritmo do valor, se log_mode=true, é retornado o l
int&  error_code  // variável para registro do código de erro
);

Calcula a distribuição de probabilidades F de Fis her-Snedecor com parâmetros nu1 e nu2 para a
variável aleatória x. Em caso de erro, retorna NaN.
double  MathCumulativeDistributionF(
const double  x, // valor da variável aleatória
const double  nu1, // primeiro parâmetro da distribuição (número de graus de liberdade
const double  nu2, // segundo parâmetro da distribuição (número de graus de liberdade)
int&  error_code  // variável para registro do código de erro
);

Calcula a distribuição de probabilidade F de Fis her-Snedecor com parâmetros nu1 e nu2 para a matriz
das variáveis aleatórias x []. Em caso de erro, retorna false. Equivalente a pf() no R .
bool  MathCumulativeDistributionF(
const double& x[], // matriz com valores da variável aleatória
const double  nu1, // primeiro parâmetro da distribuição (número de graus de liberdad
const double  nu2, // segundo parâmetro da distribuição (número de graus de liberdade
const double  tail, // sinalizador de cálculo, se for true, é calculada a probabilidad
const bool   log_mode, // cálculo de logaritmo do valor, se log_mode=true, retorna o loga
double&  result[]  // matriz para valores da função de probabilidade
);

Calcula a distribuição de probabilidade F de Fis her-Snedecor com parâmetros nu1 e nu2 para a matriz
das variáveis aleatórias x []. Em caso de erro, retorna false.
bool  MathCumulativeDistributionF(
const double& x[], // matriz com valores da variável aleatória
const double  nu1, // primeiro parâmetro da distribuição (número de graus de liberdad
const double  nu2, // segundo parâmetro da distribuição (número de graus de liberdade
double&  result[]  // matriz para valores da função de probabilidade
);

Parâmetros
x
[in] Valor da variável aleatória.
x[]

© 2000-2018, MetaQuotes Software Corp.


2085 Biblioteca Padrão

[in] Matriz com valores da variável aleatória.


nu1
[in] Primeiro parâmetro de distribuição (número de graus de liberdade).
nu2
[in] Segundo parâmetro de distribuição (número de graus de liberdade).
tail
[in] Sinalizador de cálculo. Se for true, é calculada a probabilidade de que a variável aleatória não
será superior a x.

log_mode
[in] Sinalizador de cálculo do algoritmo de um valor. Se log _mode=true, retorna o logaritmo
natural da probabilidade.

error_code
[out] Variável para registro do código de erro.
result[]
[out] Matriz para valores da função de probabilidade.

© 2000-2018, MetaQuotes Software Corp.


2086 Biblioteca Padrão

MathQuantileF
Calcula o inverso da função de distribuição de probabilidades F de Fis her-Snedecor com parâmetros
nu1 e nu2 para a probabilidade probability. Em caso de erro, retorna NaN.
double  MathQuantileF(
const double  probability, // valor da probabilidade de aparecimento de uma variável aleatóri
const double  nu1, // primeiro parâmetro da distribuição (número de graus de liberdad
const double  nu2, // segundo parâmetro da distribuição (número de graus de liberdade
const bool   tail, // sinalizador de cálculo, se for false, o cálculo será realizado
const bool   log_mode, // sinalizador de cálculo, se log_mode=true, o cálculo é realizado
int&  error_code  // variável para registro do código de erro
);

Calcula o inverso da função de distribuição de probabilidades F de Fis her-Snedecor com parâmetros


nu1 e nu2 para a probabilidade probability. Em caso de erro, retorna NaN.
double  MathQuantileF(
const double  probability, // valor da probabilidade de aparecimento de uma variável aleatóri
const double  nu1, // primeiro parâmetro da distribuição (número de graus de liberdad
const double  nu2, // segundo parâmetro da distribuição (número de graus de liberdade
int&  error_code  // variável para registro do código de erro
);

Calcula o inverso da função de distribuição F de Fis her-Snedecor com parâmetros nu1 e nu2 para a
matriz de valores da probabilidade probability[]. Em caso de erro, retorna false. Equivalente a qf() no
R.
double  MathQuantileF(
const double& probability[], // matriz com valores de probabilidade da variável aleatória
const double  nu1, // primeiro parâmetro da distribuição (número de graus de liberdad
const double  nu2, // segundo parâmetro da distribuição (número de graus de liberdade
const bool   tail, // sinalizador de cálculo, se for false, o cálculo será realizado
const bool   log_mode, // sinalizador de cálculo, se log_mode=true, o cálculo é realizado
double&  result[]  // matriz com valores de quantis
);

Calcula o inverso da função de distribuição F de Fis her-Snedecor com parâmetros nu1 e nu2 para a
matriz de valores da probabilidade probability[]. Em caso de erro, retorna false.
bool  MathQuantileF(
const double& probability[], // matriz com valores de probabilidade da variável aleatória
const double  nu1, // primeiro parâmetro da distribuição (número de graus de liberdad
const double  nu2, // segundo parâmetro da distribuição (número de graus de liberdade
double&  result[]  // matriz com valores de quantis
);

Parâmetros
probability
[in] Valor da probabilidade da variável aleatória.

© 2000-2018, MetaQuotes Software Corp.


2087 Biblioteca Padrão

probability[]
[in] Matriz com valores da probabilidade da variável aleatória.
nu1
[in] Primeiro parâmetro de distribuição (número de graus de liberdade).
nu2
[in] Segundo parâmetro de distribuição (número de graus de liberdade).
tail
[in] Sinalizador de cálculo, se lower_tail=false, o cálculo é realizado para a probabilidade 1.0 -
probability.

log_mode
[in] Sinalizador de cálculo, se log _mode=true, o cálculo é realizado para a probabilidade
Exp(probability).

error_code
[out] Variável para obter o código de erro.
result[]
[out] Matriz com os valores dos quantis.

© 2000-2018, MetaQuotes Software Corp.


2088 Biblioteca Padrão

MathRandomF
Gera um número pseudo-aleatório distribuído de acordo com a distribuição F de Fis her-Snedecor com
parâmetros nu1 e nu2. Em caso de erro, retorna NaN.
double  MathRandomF(
const double  nu1, // primeiro parâmetro da distribuição (número de graus de liberdad
const double  nu2, // segundo parâmetro da distribuição (número de graus de liberdade
int&  error_code  // variável para registro do código de erro
);

Gera números pseudo-aleatórios distribuídos de acordo com a distribuição F de Fis her-Snedecor com
parâmetros nu1 e nu2. Em caso de erro, retorna false. Equivalente a rf() no R .
bool  MathRandomF(
const double  nu1, // primeiro parâmetro da distribuição (número de graus de liberdad
const double  nu2, // segundo parâmetro da distribuição (número de graus de liberdade
const int   data_count, // número de dados necessários
double&  result[]  // matriz com os valores dos números pseudo-aleatórios
);

Parâmetros
nu1
[in] Primeiro parâmetro de distribuição (número de graus de liberdade).
nu2
[in] Segundo parâmetro de distribuição (número de graus de liberdade).
error_code
[out] Variável para registro do código de erro.
data_count
[out] Número de dados necessários.
result[]
[out] Matriz para obter os valores dos números pseudo-aleatórios.

© 2000-2018, MetaQuotes Software Corp.


2089 Biblioteca Padrão

MathMomentsF
Calcula os valores numéricos teóricos dos primeiros 4 momentos da distribuição F de Fis her-Snedecor
com parâmetros nu1 e nu2
double  MathMomentsF(
const double  nu1, // primeiro parâmetro da distribuição (número de graus de liberdad
const double  nu2, // segundo parâmetro da distribuição (número de graus de liberdade
double&  mean, // variável para o valor médio
double&  variance, // variável para a dispersão
double&  skewness, // variável para a obliquidade
double&  kurtosis, // variável para a curtose
int&  error_code  // variável para o código de erro
);

Parâmetros
nu1
[in] Primeiro parâmetro de distribuição (número de graus de liberdade).
nu2
[in] Segundo parâmetro de distribuição (número de graus de liberdade).
mean
[out] Variável para obter o valor médio.
variance
[out] Variável para obter a dispersão.
skewness
[out] Variável para obter a obliquidade.
kurtosis
[out] Variável para obter a curtose.
error_code
[out] Variável para obter o código de erro.

Valor de retorno
Retorna true, se os momentos forem calculados com sucesso, caso contrário false.

© 2000-2018, MetaQuotes Software Corp.


2090 Biblioteca Padrão

Distribuição F de Fisher-Snedecor não-central


Esta seção apresenta as funções para trabalhar com a distribuição F de Fis her-Snedecor não-central.
Elas permitem que você calcule a densidade, probabilidade, quantis e gere números pseudo-aleatórios
de acordo com a distribuição F não central. A distribuição F de Fis her-Snedecor não-central é descrita
pela seguinte fórmula:

Onde:
· x — valor da variável aleatória
· n1 — primeiro parâmetro de distribuição (número de graus de liberdade)
· n2 — segundo parâmetro de distribuição (número de graus de liberdade)
· s — parâmetro de não-centralidade

Além do cálculo das variáveis ​aleatórias individuais, é poss ível trabalhar com suas matrizes.

F unção Descrição
MathProbabilityDensityNoncentralF Calcula a densidade de probabilidade da
distribuição F de Fis her-Snedecor não-central

MathCumulativeDistributionNoncentralF Calcula o valor da função distribuição F de


Fis her-Snedecor não-central de probabilidades
MathQuantileNoncentralF Calcula o inverso da função de distribuição F de
Fis her-Snedecor não-central para a
probabilidade especificada

© 2000-2018, MetaQuotes Software Corp.


2091 Biblioteca Padrão

MathR andomNoncentralF Gera um valor/matriz pseudo-aleatório de


valores pseudo-aleatórios de acordo com a
distribuição F de Fis her-Snedecor não-central

MathMoments NoncentralF Calcula os valores numéricos teóricos dos


primeiros 4 momentos da distribuição F de
Fis her-Snedecor não-central

Exemplo:
#include <Graphics\Graphic.mqh>
#include <Math\Stat\NoncentralF.mqh>
#include <Math\Stat\Math.mqh>
#property script_show_inputs
//--- input parameters
input double nu_1=20; // primeiro número de graus de liberdade
input double nu_2=20; // segundo número de graus de liberdade
input double sig=10; // parâmetro de não-centralidade
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- desativamos a exibição do gráfico de preço
ChartSetInteger(0,CHART_SHOW,false);
//--- inicializamos o gerador de números aleatórios
MathSrand(GetTickCount());
//--- geramos a amostragem da variável aleatória
long chart=0;
string name="GraphicNormal";
int n=1000000; // número de valores na amostragem
int ncells=51; // número de intervalos no gráfico de colunas
double x[]; // centros de intervalos no gráfico de colunas
double y[]; // número de valores a partir da amostragem dentro do intervalo
double data[]; // amostragem de valores aleatórios
double max,min; // valores máximo e mínimo na amostragem
//--- obtemos a amostragem a partir da distribuição F de Fisher-Snedecor não-central
MathRandomNoncentralF(nu_1,nu_2,sig,n,data);
//--- calculamos os dados para plotagem do gráfico de colunas
CalculateHistogramArray(data,x,y,max,min,ncells);
//--- obtemos os limites de sequência e passo para plotagem da curva teórica
double step;
GetMaxMinStepValues(max,min,step);
step=MathMin(step,(max-min)/ncells);
//--- obtemos teoricamente os cálculos no intervalo [min,max]
double x2[];
double y2[];
MathSequence(min,max,step,x2);
MathProbabilityDensityNoncentralF(x2,nu_1,nu_2,sig,false,y2);

© 2000-2018, MetaQuotes Software Corp.


2092 Biblioteca Padrão

//--- dimensionamos
double theor_max=y2[ArrayMaximum(y2)];
double sample_max=y[ArrayMaximum(y)];
double k=sample_max/theor_max;
for(int i=0; i<ncells; i++)
y[i]/=k;
//--- imprimimos o gráfico
CGraphic graphic;
if(ObjectFind(chart,name)<0)
graphic.Create(chart,name,0,0,0,780,380);
else
graphic.Attach(chart,name);
graphic.BackgroundMain(StringFormat("Noncentral F-distribution nu1=%G nu2=%G sigma=%G",nu_1,nu_2
graphic.BackgroundMainSize(16);
//--- plot all curves
graphic.CurveAdd(x,y,CURVE_HISTOGRAM,"Sample").HistogramWidth(6);
//--- e agora traçamos a curva teórica de densidade da distribuição
graphic.CurveAdd(x2,y2,CURVE_LINES,"Theory");
graphic.CurvePlotAll();
//--- plot all curves
graphic.Update();
}
//+------------------------------------------------------------------+
//| Calculate frequencies for data set |
//+------------------------------------------------------------------+
bool CalculateHistogramArray(const double &data[],double &intervals[],double &frequency[],
double &maxv,double &minv,const int cells=10)
{
if(cells<=1) return (false);
int size=ArraySize(data);
if(size<cells*10) return (false);
minv=data[ArrayMinimum(data)];
maxv=data[ArrayMaximum(data)];
double range=maxv-minv;
double width=range/cells;
if(width==0) return false;
ArrayResize(intervals,cells);
ArrayResize(frequency,cells);
//--- definimos os centros dos intervalos
for(int i=0; i<cells; i++)
{
intervals[i]=minv+(i+0.5)*width;
frequency[i]=0;
}
//--- preenchemos a frequência de aparecimento no intervalo
for(int i=0; i<size; i++)
{
int ind=int((data[i]-minv)/width);
if(ind>=cells) ind=cells-1;

© 2000-2018, MetaQuotes Software Corp.


2093 Biblioteca Padrão

frequency[ind]++;
}
return (true);
}
//+------------------------------------------------------------------+
//| Calculates values for sequence generation |
//+------------------------------------------------------------------+
void GetMaxMinStepValues(double &maxv,double &minv,double &stepv)
{
//--- calculamos a magnitude da sequência para obter a precisão da normalização
double range=MathAbs(maxv-minv);
int degree=(int)MathRound(MathLog10(range));
//--- normalizamos os valores máx. e mín. com a precisão
maxv=NormalizeDouble(maxv,degree);
minv=NormalizeDouble(minv,degree);
//--- definimos o passo de geração da mesma maneira a partir da precisão definida
stepv=NormalizeDouble(MathPow(10,-degree),degree);
if((maxv-minv)/stepv<10)
stepv/=10.;
}

© 2000-2018, MetaQuotes Software Corp.


2094 Biblioteca Padrão

MathProbabilityDensityNoncentralF
Calcula a função densidade de probabilidade da distribuição F de Fis her-Snedecor não-central com
parâmetros nu1, nu2 e sigma para a variável aleatória x. Em caso de erro, retorna NaN.
double  MathProbabilityDensityNoncentralF(
const double  x, // valor da variável aleatória
const double  nu1, // primeiro parâmetro da distribuição (número de graus de liberdade
const double  nu2, // segundo parâmetro da distribuição (número de graus de liberdade)
const double  sigma, // parâmetro de não-centralidade
const bool   log_mode, // cálculo de logaritmo do valor, se log_mode=true, retorna o loga
int&  error_code  // variável para registro do código de erro
);

Calcula a função densidade de probabilidade da distribuição F de Fis her-Snedecor não-central com


parâmetros nu1, nu2 e sigma para a variável aleatória x. Em caso de erro, retorna NaN.
double  MathProbabilityDensityNoncentralF(
const double  x, // valor da variável aleatória
const double  nu1, // primeiro parâmetro da distribuição (número de graus de liberdade
const double  nu2, // segundo parâmetro da distribuição (número de graus de liberdade)
const double  sigma, // parâmetro de não-centralidade
int&  error_code  // variável para registro do código de erro
);

Calcula a função densidade de probabilidade da distribuição F de Fis her-Snedecor não-central com


parâmetros nu1, nu2 e sigma para a matriz das variáveis aleatórias x []. Em caso de erro, retorna
false. Equivalente a df() no R .
bool  MathProbabilityDensityNoncentralF(
const double& x[], // matriz com valores da variável aleatória
const double  nu1, // primeiro parâmetro da distribuição (número de graus de liberdad
const double  nu2, // segundo parâmetro da distribuição (número de graus de liberdade
const double  sigma, // parâmetro de não-centralidade
const bool   log_mode, // sinalizador de cálculo de logaritmo do valor, se log_mode=true,
double&  result[]  // matriz para o valor da função densidade de probabilidade
);

Calcula a função densidade de probabilidade da distribuição F de Fis her-Snedecor não-central com


parâmetros nu1, nu2 e sigma para a matriz das variáveis aleatórias x []. Em caso de erro, retorna
false.
bool  MathProbabilityDensityNoncentralF(
const double& x[], // matriz com valores da variável aleatória
const double  nu1, // primeiro parâmetro da distribuição (número de graus de liberdad
const double  nu2, // segundo parâmetro da distribuição (número de graus de liberdade
const double  sigma, // parâmetro de não-centralidade
double&  result[]  // matriz para o valor da função densidade de probabilidade
);

Parâmetros

© 2000-2018, MetaQuotes Software Corp.


2095 Biblioteca Padrão

x
[in] Valor da variável aleatória.
x[]
[in] Matriz com valores da variável aleatória.
nu1
[in] Primeiro parâmetro de distribuição (número de graus de liberdade).
nu2
[in] Segundo parâmetro de distribuição (número de graus de liberdade).
sigma
[in] Parâmetro de não-centralidade.
log_mode
[in] Sinalizador de cálculo do algoritmo de um valor. Se log _mode=true, retorna o logaritmo
natural da função densidade de probabilidade.

error_code
[out] Variável para registro do código de erro.
result[]
[out] Matriz para os valores da função densidade de probabilidade.

© 2000-2018, MetaQuotes Software Corp.


2096 Biblioteca Padrão

MathCumulativeDistributionNoncentralF
Calcula a distribuição de probabilidade F de Fis her-Snedecor não-central com parâmetros nu1, nu2 e
sigma para a variável aleatória x. Em caso de erro, retorna NaN.
double  MathCumulativeDistributionNoncentralF(
const double  x, // valor da variável aleatória
const double  nu1, // primeiro parâmetro da distribuição (número de graus de liberdade
const double  nu2, // segundo parâmetro da distribuição (número de graus de liberdade)
const double  sigma, // parâmetro de não-centralidade
const double  tail, // sinalizador de cálculo, se for true, é calculada a probabilidade
const bool   log_mode, // sinalizador de cálculo de logaritmo do valor, se log_mode=true,
int&  error_code  // variável para registro do código de erro
);

Calcula a distribuição de probabilidade F de Fis her-Snedecor não-central com parâmetros nu1, nu2 e
sigma para a variável aleatória x. Em caso de erro, retorna NaN.
double  MathCumulativeDistributionNoncentralF(
const double  x, // valor da variável aleatória
const double  nu1, // primeiro parâmetro da distribuição (número de graus de liberdade
const double  nu2, // segundo parâmetro da distribuição (número de graus de liberdade)
const double  sigma, // parâmetro de não-centralidade
int&  error_code  // variável para registro do código de erro
);

Calcula a distribuição de probabilidade F de Fis her-Snedecor não-central com parâmetros nu1, nu2 e
sigma para a matriz das variáveis aleatórias x []. Em caso de erro, retorna false. Equivalente a pf() no
R.
bool  MathCumulativeDistributionNoncentralF(
const double& x[], // matriz com valores da variável aleatória
const double  nu1, // primeiro parâmetro da distribuição (número de graus de liberdad
const double  nu2, // segundo parâmetro da distribuição (número de graus de liberdade
const double  sigma, // parâmetro de não-centralidade
const double  tail, // sinalizador de cálculo, se for true, é calculada a probabilidad
const bool   log_mode, // sinalizador de cálculo de logaritmo do valor, se log_mode=true,
double&  result[]  // matriz para valores da função de probabilidade
);

Calcula a distribuição de probabilidade F de Fis her-Snedecor não-central com parâmetros nu1, nu2 e
sigma para a matriz das variáveis aleatórias x []. Em caso de erro, retorna false.
bool  MathCumulativeDistributionNoncentralF(
const double& x[], // matriz com valores da variável aleatória
const double  nu1, // primeiro parâmetro da distribuição (número de graus de liberdad
const double  nu2, // segundo parâmetro da distribuição (número de graus de liberdade
const double  sigma, // parâmetro de não-centralidade
double&  result[]  // matriz para valores da função de probabilidade
);

© 2000-2018, MetaQuotes Software Corp.


2097 Biblioteca Padrão

Parâmetros
x
[in] Valor da variável aleatória.
x[]
[in] Matriz com valores da variável aleatória.
nu1
[in] Primeiro parâmetro de distribuição (número de graus de liberdade).
nu2
[in] Segundo parâmetro de distribuição (número de graus de liberdade).
sigma
[in] Parâmetro de não-centralidade.
tail
[in] Sinalizador de cálculo. Se for true, é calculada a probabilidade de que a variável aleatória não
será superior a x.

log_mode
[in] Sinalizador de cálculo do algoritmo de um valor. Se log _mode=true, retorna o logaritmo
natural da probabilidade.

error_code
[out] Variável para registro do código de erro.
result[]
[out] Matriz para valores da função de probabilidade.

© 2000-2018, MetaQuotes Software Corp.


2098 Biblioteca Padrão

MathQuantileF
Calcula o inverso da função de distribuição F de Fis her-Snedecor não-central com parâmetros nu1, nu2
e sigma para a probabilidade probability. Em caso de erro, retorna NaN.
double  MathQuantileF(
const double  probability, // valor da probabilidade de aparecimento de uma variável aleatóri
const double  nu1, // primeiro parâmetro da distribuição (número de graus de liberdad
const double  nu2, // segundo parâmetro da distribuição (número de graus de liberdade
const double  sigma, // parâmetro de não-centralidade
const bool   tail, // sinalizador de cálculo, se for false, o cálculo será realizado
const bool   log_mode, // sinalizador de cálculo, se log_mode=true, o cálculo é realizado
int&  error_code  // variável para registro do código de erro
);

Calcula o inverso da função de distribuição F de Fis her-Snedecor não-central com parâmetros nu1, nu2
e sigma para a probabilidade probability. Em caso de erro, retorna NaN.
double  MathQuantileF(
const double  probability, // valor da probabilidade de aparecimento de uma variável aleatóri
const double  nu1, // primeiro parâmetro da distribuição (número de graus de liberdad
const double  nu2, // segundo parâmetro da distribuição (número de graus de liberdade
const double  sigma, // parâmetro de não-centralidade
int&  error_code  // variável para registro do código de erro
);

Calcula o inverso da função de distribuição F de Fis her-Snedecor não-central com parâmetros nu1, nu2
e sigma para a matriz de valores da probabilidade probability[]. Em caso de erro, retorna false.
Equivalente a qf() no R .
double  MathQuantileF(
const double& probability[], // matriz com valores de probabilidade da variável aleatória
const double  nu1, // primeiro parâmetro da distribuição (número de graus de liberdad
const double  nu2, // segundo parâmetro da distribuição (número de graus de liberdade
const double  sigma, // parâmetro de não-centralidade
const bool   tail, // sinalizador de cálculo, se for false, o cálculo será realizado
const bool   log_mode, // sinalizador de cálculo, se log_mode=true, o cálculo é realizado
double&  result[]  // matriz com valores de quantis
);

Calcula o inverso da função de distribuição F de Fis her-Snedecor não-central com parâmetros nu1, nu2
e sigma para a matriz de valores da probabilidade probability[]. Em caso de erro, retorna false.
bool  MathQuantileF(
const double& probability[], // matriz com valores de probabilidade da variável aleatória
const double  nu1, // primeiro parâmetro da distribuição (número de graus de liberdad
const double  nu2, // segundo parâmetro da distribuição (número de graus de liberdade
double&  result[]  // matriz com valores de quantis
);

Parâmetros

© 2000-2018, MetaQuotes Software Corp.


2099 Biblioteca Padrão

probability
[in] Valor da probabilidade da variável aleatória.
probability[]
[in] Matriz com valores da probabilidade da variável aleatória.
nu1
[in] Primeiro parâmetro de distribuição (número de graus de liberdade).
nu2
[in] Segundo parâmetro de distribuição (número de graus de liberdade).
sigma
[in] Parâmetro de não-centralidade.
tail
[in] Sinalizador de cálculo, se for false, o cálculo é realizado para a probabilidade 1.0 - probability.
log_mode
[in] Sinalizador de cálculo, se log _mode=true, o cálculo é realizado para a probabilidade
Exp(probability).

error_code
[out] Variável para obter o código de erro.
result[]
[out] Matriz com os valores dos quantis.

© 2000-2018, MetaQuotes Software Corp.


2100 Biblioteca Padrão

MathRandomNoncentralF
Gera um número pseudo-aleatório distribuído de acordo com a distribuição F de Fis her-Snedecor não-
central com parâmetros nu1, nu2 e sigma. Em caso de erro, retorna NaN.
double  MathRandomNoncentralF(
const double  nu1, // primeiro parâmetro da distribuição (número de graus de liberdad
const double  nu2, // segundo parâmetro da distribuição (número de graus de liberdade
const double  sigma, // parâmetro de não-centralidade
int&  error_code  // variável para registro do código de erro
);

Gera números pseudo-aleatórios distribuídos de acordo com a distribuição F de Fis her-Snedecor não-
central com parâmetros nu1, nu2 e sigma. Em caso de erro, retorna false. Equivalente a rf() no R .
bool  MathRandomNoncentralF(
const double  nu1, // primeiro parâmetro da distribuição (número de graus de liberdad
const double  nu2, // segundo parâmetro da distribuição (número de graus de liberdade
const double  sigma, // parâmetro de não-centralidade
const int   data_count, // número de dados necessários
double&  result[]  // matriz com os valores dos números pseudo-aleatórios
);

Parâmetros
nu1
[in] Primeiro parâmetro de distribuição (número de graus de liberdade).
nu2
[in] Segundo parâmetro de distribuição (número de graus de liberdade).
sigma
[in] Parâmetro de não-centralidade.
error_code
[out] Variável para registro do código de erro.
data_count
[out] Número de dados necessários.
result[]
[out] Matriz para obter os valores dos números pseudo-aleatórios.

© 2000-2018, MetaQuotes Software Corp.


2101 Biblioteca Padrão

MathMomentsNoncentralF
Calcula os valores numéricos teóricos dos primeiros 4 momentos da distribuição F de Fis her-Snedecor
não-central com parâmetros nu1, nu2 e sigma.
double  MathMomentsNoncentralF(
const double  nu1, // primeiro parâmetro da distribuição (número de graus de liberdad
const double  nu2, // segundo parâmetro da distribuição (número de graus de liberdade
const double  sigma, // parâmetro de não-centralidade
double&  mean, // variável para o valor médio
double&  variance, // variável para a dispersão
double&  skewness, // variável para a obliquidade
double&  kurtosis, // variável para a curtose
int&  error_code  // variável para o código de erro
);

Parâmetros
nu1
[in] Primeiro parâmetro de distribuição (número de graus de liberdade).
nu2
[in] Segundo parâmetro de distribuição (número de graus de liberdade).
sigma
[in] Parâmetro de não-centralidade.
mean
[out] Variável para obter o valor médio.
variance
[out] Variável para obter a dispersão.
skewness
[out] Variável para obter a obliquidade.
kurtosis
[out] Variável para obter a curtose.
error_code
[out] Variável para obter o código de erro.

Valor de retorno
Retorna true, se os momentos forem calculados com sucesso, caso contrário false.

© 2000-2018, MetaQuotes Software Corp.


2102 Biblioteca Padrão

Distribuição t de Student
Esta seção apresenta as funções para trabalhar com a distribuição t de Student. Elas permitem que
você calcule a densidade, probabilidade, quantis e gere números pseudo-aleatórios de acordo com a
distribuição t de Student. A distribuição t de Student é descrita pela seguinte fórmula:

Onde:
· x — valor da variável aleatória
· n — parâmetro de distribuição (número de graus de liberdade)

Além do cálculo das variáveis ​aleatórias individuais, é poss ível trabalhar com suas matrizes.

F unção Descrição
MathProbabilityDensityT Calcula a densidade de probabilidade da
distribuição t de Student

MathCumulativeDistributionT Calcula o valor da função distribuição t de


Student de probabilidades

MathQuantileT Calcula o inverso da função de distribuição t de


Student para a probabilidade especificada

MathR andomT Gera um valor/matriz pseudo-aleatório de


valores pseudo-aleatórios de acordo com a
distribuição t de Student

© 2000-2018, MetaQuotes Software Corp.


2103 Biblioteca Padrão

MathMoments T Calcula os valores numéricos teóricos dos


primeiros 4 momentos da distribuição t de
Student

Exemplo:
#include <Graphics\Graphic.mqh>
#include <Math\Stat\T.mqh>
#include <Math\Stat\Math.mqh>
#property script_show_inputs
//--- input parameters
input double nu_par=10; // número de graus de liberdade
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- desativamos a exibição do gráfico de preço
ChartSetInteger(0,CHART_SHOW,false);
//--- inicializamos o gerador de números aleatórios
MathSrand(GetTickCount());
//--- geramos a amostragem da variável aleatória
long chart=0;
string name="GraphicNormal";
int n=1000000; // número de valores na amostragem
int ncells=51; // número de intervalos no gráfico de colunas
double x[]; // centros de intervalos no gráfico de colunas
double y[]; // número de valores a partir da amostragem dentro do intervalo
double data[]; // amostragem de valores aleatórios
double max,min; // valores máximo e mínimo na amostragem
//--- obtemos a amostragem a partir da distribuição F de Fisher-Snedecor
MathRandomT(nu_par,n,data);
//--- calculamos os dados para plotagem do gráfico de colunas
CalculateHistogramArray(data,x,y,max,min,ncells);
//--- obtemos os limites de sequência e passo para plotagem da curva teórica
double step;
GetMaxMinStepValues(max,min,step);
step=MathMin(step,(max-min)/ncells);
//--- obtemos teoricamente os cálculos no intervalo [min,max]
double x2[];
double y2[];
MathSequence(min,max,step,x2);
MathProbabilityDensityT(x2,nu_par,false,y2);
//--- dimensionamos
double theor_max=y2[ArrayMaximum(y2)];
double sample_max=y[ArrayMaximum(y)];
double k=sample_max/theor_max;
for(int i=0; i<ncells; i++)

© 2000-2018, MetaQuotes Software Corp.


2104 Biblioteca Padrão

y[i]/=k;
//--- imprimimos o gráfico
CGraphic graphic;
if(ObjectFind(chart,name)<0)
graphic.Create(chart,name,0,0,0,780,380);
else
graphic.Attach(chart,name);
graphic.BackgroundMain(StringFormat("t-distribution nu=%G",nu_par));
graphic.BackgroundMainSize(16);
//--- plot all curves
graphic.CurveAdd(x,y,CURVE_HISTOGRAM,"Sample").HistogramWidth(6);
//--- e agora traçamos a curva teórica de densidade da distribuição
graphic.CurveAdd(x2,y2,CURVE_LINES,"Theory");
graphic.CurvePlotAll();
//--- plot all curves
graphic.Update();
}
//+------------------------------------------------------------------+
//| Calculate frequencies for data set |
//+------------------------------------------------------------------+
bool CalculateHistogramArray(const double &data[],double &intervals[],double &frequency[],
double &maxv,double &minv,const int cells=10)
{
if(cells<=1) return (false);
int size=ArraySize(data);
if(size<cells*10) return (false);
minv=data[ArrayMinimum(data)];
maxv=data[ArrayMaximum(data)];
double range=maxv-minv;
double width=range/cells;
if(width==0) return false;
ArrayResize(intervals,cells);
ArrayResize(frequency,cells);
//--- definimos os centros dos intervalos
for(int i=0; i<cells; i++)
{
intervals[i]=minv+(i+0.5)*width;
frequency[i]=0;
}
//--- preenchemos a frequência de aparecimento no intervalo
for(int i=0; i<size; i++)
{
int ind=int((data[i]-minv)/width);
if(ind>=cells) ind=cells-1;
frequency[ind]++;
}
return (true);
}
//+------------------------------------------------------------------+

© 2000-2018, MetaQuotes Software Corp.


2105 Biblioteca Padrão

//| Calculates values for sequence generation |


//+------------------------------------------------------------------+
void GetMaxMinStepValues(double &maxv,double &minv,double &stepv)
{
//--- calculamos a magnitude da sequência para obter a precisão da normalização
double range=MathAbs(maxv-minv);
int degree=(int)MathRound(MathLog10(range));
//--- normalizamos os valores máx. e mín. com a precisão
maxv=NormalizeDouble(maxv,degree);
minv=NormalizeDouble(minv,degree);
//--- definimos o passo de geração da mesma maneira a partir da precisão definida
stepv=NormalizeDouble(MathPow(10,-degree),degree);
if((maxv-minv)/stepv<10)
stepv/=10.;
}

© 2000-2018, MetaQuotes Software Corp.


2106 Biblioteca Padrão

MathProbabilityDensityT
Calcula a função densidade de probabilidade da distribuição t de Student com parâmetro nu para a
variável aleatória x. Em caso de erro, retorna NaN.
double  MathProbabilityDensityT(
const double  x, // valor da variável aleatória
const double  nu, // parâmetro de distribuição (número de graus de liberdade)
const bool   log_mode, // cálculo de logaritmo do valor, se log_mode=true, retorna o loga
int&  error_code  // variável para registro do código de erro
);

Calcula a função densidade de probabilidade da distribuição t de Student com parâmetro nu para a


variável aleatória x. Em caso de erro, retorna NaN.
double  MathProbabilityDensityT(
const double  x, // valor da variável aleatória
const double  nu, // parâmetro de distribuição (número de graus de liberdade)
int&  error_code  // variável para registro do código de erro
);

Calcula a função densidade de probabilidade da distribuição t de Student com parâmetro nu para a


matriz das variáveis aleatórias x []. Em caso de erro, retorna false. Equivalente a dt() no R .
bool  MathProbabilityDensityT(
const double& x[], // matriz com valores da variável aleatória
const double  nu, // parâmetro de distribuição (número de graus de liberdade)
const bool   log_mode, // sinalizador de cálculo de logaritmo do valor, se log_mode=true,
double&  result[]  // matriz para o valor da função densidade de probabilidade
);

Calcula a função densidade de probabilidade da distribuição t de Student com parâmetro nu para a


matriz das variáveis aleatórias x []. Em caso de erro, retorna false.
bool  MathProbabilityDensityT(
const double& x[], // matriz com valores da variável aleatória
const double  nu, // parâmetro de distribuição (número de graus de liberdade)
double&  result[]  // matriz para o valor da função densidade de probabilidade
);

Parâmetros
x
[in] Valor da variável aleatória.
x[]
[in] Matriz com valores da variável aleatória.
nu
[in] Parâmetro de distribuição (número de graus de liberdade).
log_mode

© 2000-2018, MetaQuotes Software Corp.


2107 Biblioteca Padrão

[in] Sinalizador de cálculo do algoritmo de um valor. Se log _mode=true, retorna o logaritmo


natural da função densidade de probabilidade.

error_code
[out] Variável para registro do código de erro.
result[]
[out] Matriz para os valores da função densidade de probabilidade.

© 2000-2018, MetaQuotes Software Corp.


2108 Biblioteca Padrão

MathCumulativeDistributionT
Calcula a distribuição t de Student com parâmetros nu para a variável aleatória x. Em caso de erro,
retorna NaN.
double  MathCumulativeDistributionT(
const double  x, // valor da variável aleatória
const double  nu, // parâmetro de distribuição (número de graus de liberdade)
const double  tail, // sinalizador de cálculo, se for true, é calculada a probabilidade
const bool   log_mode, // sinalizador de cálculo de logaritmo do valor, se log_mode=true,
int&  error_code  // variável para registro do código de erro
);

Calcula a distribuição t de Student com parâmetros nu para a variável aleatória x. Em caso de erro,
retorna NaN.
double  MathCumulativeDistributionT(
const double  x, // valor da variável aleatória
const double  nu, // parâmetro de distribuição (número de graus de liberdade)
int&  error_code  // variável para registro do código de erro
);

Calcula a distribuição t de Student com parâmetros nu para a matriz das variáveis aleatórias x []. Em
caso de erro, retorna false. Equivalente a pt() no R .
bool  MathCumulativeDistributionT(
const double& x[], // matriz com valores da variável aleatória
const double  nu, // parâmetro de distribuição (número de graus de liberdade)
const double  tail, // sinalizador de cálculo, se for true, é calculada a probabilidad
const bool   log_mode, // sinalizador de cálculo de logaritmo do valor, se log_mode=true,
double&  result[]  // matriz para valores da função de probabilidade
);

Calcula a distribuição t de Student com parâmetros nu para a matriz das variáveis aleatórias x []. Em
caso de erro, retorna false.
bool  MathCumulativeDistributionT(
const double& x[], // matriz com valores da variável aleatória
const double  nu, // parâmetro de distribuição (número de graus de liberdade)
double&  result[]  // matriz para valores da função de probabilidade
);

Parâmetros
x
[in] Valor da variável aleatória.
x[]
[in] Matriz com valores da variável aleatória.
nu
[in] Parâmetro de distribuição (número de graus de liberdade).

© 2000-2018, MetaQuotes Software Corp.


2109 Biblioteca Padrão

tail
[in] Sinalizador de cálculo. Se for true, é calculada a probabilidade de que a variável aleatória não
será superior a x.

log_mode
[in] Sinalizador de cálculo do algoritmo de um valor. Se log _mode=true, retorna o logaritmo
natural da probabilidade.

error_code
[out] Variável para registro do código de erro.
result[]
[out] Matriz para valores da função de probabilidade.

© 2000-2018, MetaQuotes Software Corp.


2110 Biblioteca Padrão

MathQuantileT
Calcula o inverso da função de distribuição t de Student com parâmetro nu para a probabilidade
probability. Em caso de erro, retorna NaN.

double  MathQuantileT(
const double  probability, // valor da probabilidade de aparecimento de uma variável aleatóri
const double  nu, // parâmetro de distribuição (número de graus de liberdade)
const bool   tail, // sinalizador de cálculo, se for false, o cálculo será realizado
const bool   log_mode, // sinalizador de cálculo, se log_mode=true, o cálculo é realizado
int&  error_code  // variável para registro do código de erro
);

Calcula o inverso da função de distribuição t de Student com parâmetro nu para a probabilidade


probability. Em caso de erro, retorna NaN.

double  MathQuantileT(
const double  probability, // valor da probabilidade de aparecimento de uma variável aleatóri
const double  nu, // parâmetro de distribuição (número de graus de liberdade)
int&  error_code  // variável para registro do código de erro
);

Calcula o inverso da função de distribuição t de Student com parâmetro nu para a matriz de valores
das probabilidades probability[]. Em caso de erro, retorna false. Equivalente a qt() no R .
double  MathQuantileT(
const double& probability[], // matriz com valores de probabilidade da variável aleatória
const double  nu, // parâmetro de distribuição (número de graus de liberdade)
const bool   tail, // sinalizador de cálculo, se for false, o cálculo será realizado
const bool   log_mode, // sinalizador de cálculo, se log_mode=true, o cálculo é realizado
double&  result[]  // matriz com valores de quantis
);

Calcula o inverso da função de distribuição t de Student com parâmetro nu para a matriz de valores
das probabilidades probability[]. Em caso de erro, retorna false.
bool  MathQuantileT(
const double& probability[], // matriz com valores de probabilidade da variável aleatória
const double  nu, // parâmetro de distribuição (número de graus de liberdade)
double&  result[]  // matriz com valores de quantis
);

Parâmetros
probability
[in] Valor da probabilidade da variável aleatória.
probability[]
[in] Matriz com valores da probabilidade da variável aleatória.
nu
[in] Parâmetro de distribuição (número de graus de liberdade).

© 2000-2018, MetaQuotes Software Corp.


2111 Biblioteca Padrão

tail
[in] Sinalizador de cálculo, se for false, o cálculo é realizado para a probabilidade 1.0 - probability.
log_mode
[in] Sinalizador de cálculo, se log _mode=true, o cálculo é realizado para a probabilidade
Exp(probability).

error_code
[out] Variável para obter o código de erro.
result[]
[out] Matriz com os valores dos quantis.

© 2000-2018, MetaQuotes Software Corp.


2112 Biblioteca Padrão

MathRandomT
Gera um número pseudo-aleatório distribuído de acordo com a distribuição t de Student com
parâmetro nu. Em caso de erro, retorna NaN.
double  MathRandomT(
const double  nu, // parâmetro de distribuição (número de graus de liberdade)
int&  error_code  // variável para registro do código de erro
);

Gera números pseudo-aleatórios distribuídos de acordo com a distribuição t de Student com parâmetro
nu. Em caso de erro, retorna false. Equivalente a rt() no R .
bool  MathRandomT(
const double  nu, // parâmetro de distribuição (número de graus de liberdade)
const int   data_count, // número de dados necessários
double&  result[]  // matriz com os valores dos números pseudo-aleatórios
);

Parâmetros
nu
[in] Parâmetro de distribuição (número de graus de liberdade).
error_code
[out] Variável para registro do código de erro.
data_count
[out] Número de dados necessários.
result[]
[out] Matriz para obter os valores dos números pseudo-aleatórios.

© 2000-2018, MetaQuotes Software Corp.


2113 Biblioteca Padrão

MathMomentsT
Calcula os valores numéricos teóricos dos primeiros 4 momentos da distribuição t de Student com
parâmetro nu.
double  MathMomentsT(
const double  nu, // parâmetro de distribuição (número de graus de liberdade)
double&  mean, // variável para o valor médio
double&  variance, // variável para a dispersão
double&  skewness, // variável para a obliquidade
double&  kurtosis, // variável para a curtose
int&  error_code  // variável para o código de erro
);

Parâmetros
nu
[in] Parâmetro de distribuição (número de graus de liberdade).
mean
[out] Variável para obter o valor médio.
variance
[out] Variável para obter a dispersão.
skewness
[out] Variável para obter a obliquidade.
kurtosis
[out] Variável para obter a curtose.
error_code
[out] Variável para obter o código de erro.

Valor de retorno
Retorna true, se os momentos forem calculados com sucesso, caso contrário false.

© 2000-2018, MetaQuotes Software Corp.


2114 Biblioteca Padrão

Distribuição t de Student
Esta seção apresenta as funções para trabalhar com a distribuição t de Student não-central. Elas
permitem que você calcule a densidade, probabilidade, quantis e gere números pseudo-aleatórios de
acordo com a distribuição t de Student não-central. A distribuição t de Student não-central é descrita
pela seguinte fórmula:

Onde:
· x — valor da variável aleatória
· n — parâmetro de distribuição (número de graus de liberdade)
· s — parâmetro de não-centralidade

Além do cálculo das variáveis ​aleatórias individuais, é poss ível trabalhar com suas matrizes.

F unção Descrição
MathProbabilityDensityNoncentralT Calcula a densidade de probabilidade da
distribuição t de Student não-central

MathCumulativeDistributionNoncentralT Calcula o valor da função distribuição t de


Student não-central de probabilidades

MathQuantileNoncentralT Calcula o inverso da função de distribuição t de


Student não-central para a probabilidade
especificada

MathR andomNoncentralT Gera um valor/matriz pseudo-aleatório de


valores pseudo-aleatórios de acordo com a
distribuição t de Student não-central

© 2000-2018, MetaQuotes Software Corp.


2115 Biblioteca Padrão

MathMoments NoncentralT Calcula os valores numéricos teóricos dos


primeiros 4 momentos da distribuição t de
Student não-central

Exemplo:
#include <Graphics\Graphic.mqh>
#include <Math\Stat\NoncentralT.mqh>
#include <Math\Stat\Math.mqh>
#property script_show_inputs
//--- input parameters
input double nu_par=30; // número de graus de liberdade
input double delta_par=5; // parâmetro de não-centralidade
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- desativamos a exibição do gráfico de preço
ChartSetInteger(0,CHART_SHOW,false);
//--- inicializamos o gerador de números aleatórios
MathSrand(GetTickCount());
//--- geramos a amostragem da variável aleatória
long chart=0;
string name="GraphicNormal";
int n=1000000; // número de valores na amostragem
int ncells=51; // número de intervalos no gráfico de colunas
double x[]; // centros de intervalos no gráfico de colunas
double y[]; // número de valores a partir da amostragem dentro do intervalo
double data[]; // amostragem de valores aleatórios
double max,min; // valores máximo e mínimo na amostragem
//--- obtemos a amostragem a partir da distribuição F de Fisher-Snedecor não-central
MathRandomNoncentralT(nu_par,delta_par,n,data);
//--- calculamos os dados para plotagem do gráfico de colunas
CalculateHistogramArray(data,x,y,max,min,ncells);
//--- obtemos os limites de sequência e passo para plotagem da curva teórica
double step;
GetMaxMinStepValues(max,min,step);
step=MathMin(step,(max-min)/ncells);
//--- obtemos teoricamente os cálculos no intervalo [min,max]
double x2[];
double y2[];
MathSequence(min,max,step,x2);
MathProbabilityDensityNoncentralT(x2,nu_par,delta_par,false,y2);
//--- dimensionamos
double theor_max=y2[ArrayMaximum(y2)];
double sample_max=y[ArrayMaximum(y)];
double k=sample_max/theor_max;

© 2000-2018, MetaQuotes Software Corp.


2116 Biblioteca Padrão

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


y[i]/=k;
//--- imprimimos o gráfico
CGraphic graphic;
if(ObjectFind(chart,name)<0)
graphic.Create(chart,name,0,0,0,780,380);
else
graphic.Attach(chart,name);
graphic.BackgroundMain(StringFormat("Noncentral t-distribution nu=%G delta=%G",nu_par,delta_par)
graphic.BackgroundMainSize(16);
//--- plot all curves
graphic.CurveAdd(x,y,CURVE_HISTOGRAM,"Sample").HistogramWidth(6);
//--- e agora traçamos a curva teórica de densidade da distribuição
graphic.CurveAdd(x2,y2,CURVE_LINES,"Theory");
graphic.CurvePlotAll();
//--- plot all curves
graphic.Update();
}
//+------------------------------------------------------------------+
//| Calculate frequencies for data set |
//+------------------------------------------------------------------+
bool CalculateHistogramArray(const double &data[],double &intervals[],double &frequency[],
double &maxv,double &minv,const int cells=10)
{
if(cells<=1) return (false);
int size=ArraySize(data);
if(size<cells*10) return (false);
minv=data[ArrayMinimum(data)];
maxv=data[ArrayMaximum(data)];
double range=maxv-minv;
double width=range/cells;
if(width==0) return false;
ArrayResize(intervals,cells);
ArrayResize(frequency,cells);
//--- definimos os centros dos intervalos
for(int i=0; i<cells; i++)
{
intervals[i]=minv+(i+0.5)*width;
frequency[i]=0;
}
//--- preenchemos a frequência de aparecimento no intervalo
for(int i=0; i<size; i++)
{
int ind=int((data[i]-minv)/width);
if(ind>=cells) ind=cells-1;
frequency[ind]++;
}
return (true);
}

© 2000-2018, MetaQuotes Software Corp.


2117 Biblioteca Padrão

//+------------------------------------------------------------------+
//| Calculates values for sequence generation |
//+------------------------------------------------------------------+
void GetMaxMinStepValues(double &maxv,double &minv,double &stepv)
{
//--- calculamos a magnitude da sequência para obter a precisão da normalização
double range=MathAbs(maxv-minv);
int degree=(int)MathRound(MathLog10(range));
//--- normalizamos os valores máx. e mín. com a precisão
maxv=NormalizeDouble(maxv,degree);
minv=NormalizeDouble(minv,degree);
//--- definimos o passo de geração da mesma maneira a partir da precisão definida
stepv=NormalizeDouble(MathPow(10,-degree),degree);
if((maxv-minv)/stepv<10)
stepv/=10.;
}

© 2000-2018, MetaQuotes Software Corp.


2118 Biblioteca Padrão

MathProbabilityDensityNoncentralT
Calcula a função densidade de probabilidade da distribuição t de Student não-central com parâmetros
nu e delta para a variável aleatória x. Em caso de erro, retorna NaN.
double  MathProbabilityDensityNoncentralT(
const double  x, // valor da variável aleatória
const double  nu, // parâmetro de distribuição (número de graus de liberdade)
const double  delta, // parâmetro de não-centralidade
const bool   log_mode, // cálculo de logaritmo do valor, se log_mode=true, retorna o loga
int&  error_code  // variável para o código de erro
);

Calcula a função densidade de probabilidade da distribuição t de Student não-central com parâmetros


nu e delta para a variável aleatória x. Em caso de erro, retorna NaN.
double  MathProbabilityDensityNoncentralT(
const double  x, // valor da variável aleatória
const double  nu, // parâmetro de distribuição (número de graus de liberdade)
const double  delta, // parâmetro de não-centralidade
int&  error_code  // variável para o código de erro
);

Calcula a função densidade de probabilidade da distribuição t de Student não-central com parâmetros


nu e delta para a matriz das variáveis aleatórias x []. Em caso de erro, retorna false. Equivalente a
dt() no R .
bool  MathProbabilityDensityNoncentralT(
const double& x[], // matriz com valores da variável aleatória
const double  nu, // parâmetro de distribuição (número de graus de liberdade)
const double  delta, // parâmetro de não-centralidade
const bool   log_mode, // sinalizador de cálculo de logaritmo do valor, se log_mode=true,
double&  result[]  // matriz para o valor da função densidade de probabilidade
);

Calcula a função densidade de probabilidade da distribuição t de Student não-central com parâmetros


nu e delta para a matriz das variáveis aleatórias x []. Em caso de erro, retorna false.
bool  MathProbabilityDensityNoncentralT(
const double& x[], // matriz com valores da variável aleatória
const double  nu, // parâmetro de distribuição (número de graus de liberdade)
const double  delta, // parâmetro de não-centralidade
double&  result[]  // matriz para o valor da função densidade de probabilidade
);

Parâmetros
x
[in] Valor da variável aleatória.
x[]

© 2000-2018, MetaQuotes Software Corp.


2119 Biblioteca Padrão

[in] Matriz com valores da variável aleatória.


nu
[in] Parâmetro de distribuição (número de graus de liberdade).
delta
[in] Parâmetro de não-centralidade.
log_mode
[in] Sinalizador de cálculo do algoritmo de um valor. Se log _mode=true, retorna o logaritmo
natural da função densidade de probabilidade.

error_code
[out] Variável para registro do código de erro.
result[]
[out] Matriz para os valores da função densidade de probabilidade.

© 2000-2018, MetaQuotes Software Corp.


2120 Biblioteca Padrão

MathCumulativeDistributionNoncentralT
Calcula a distribuição de probabilidades t de Student não-central com parâmetros nu e delta para a
variável aleatória x. Em caso de erro, retorna NaN.
double  MathCumulativeDistributionNoncentralT(
const double  x, // valor da variável aleatória
const double  nu, // parâmetro de distribuição (número de graus de liberdade)
const double  delta, // parâmetro de não-centralidade
const double  tail, // sinalizador de cálculo, se for true, é calculada a probabilidade
const bool   log_mode, // sinalizador de cálculo de logaritmo do valor, se log_mode=true,
int&  error_code  // variável para registro do código de erro
);

Calcula a distribuição de probabilidades t de Student não-central com parâmetros nu e delta para a


variável aleatória x. Em caso de erro, retorna NaN.
double  MathCumulativeDistributionNoncentralT(
const double  x, // valor da variável aleatória
const double  nu, // parâmetro de distribuição (número de graus de liberdade)
const double  delta, // parâmetro de não-centralidade
int&  error_code  // variável para registro do código de erro
);

Calcula a distribuição de probabilidades t de Student não-central com parâmetros nu e delta para a


matriz das variáveis aleatórias x []. Em caso de erro, retorna false. Equivalente a pt() no R .
bool  MathCumulativeDistributionNoncentralT(
const double& x[], // matriz com valores da variável aleatória
const double  nu, // parâmetro de distribuição (número de graus de liberdade)
const double  delta, // parâmetro de não-centralidade
const double  tail, // sinalizador de cálculo, se for true, é calculada a probabilidad
const bool   log_mode, // sinalizador de cálculo de logaritmo do valor, se log_mode=true,
double&  result[]  // matriz para valores da função de probabilidade
);

Calcula a distribuição de probabilidades t de Student não-central com parâmetros nu e delta para a


matriz das variáveis aleatórias x []. Em caso de erro, retorna false.
bool  MathCumulativeDistributionNoncentralT(
const double& x[], // matriz com valores da variável aleatória
const double  nu, // parâmetro de distribuição (número de graus de liberdade)
const double  delta, // parâmetro de não-centralidade
double&  result[]  // matriz para valores da função de probabilidade
);

Parâmetros
x
[in] Valor da variável aleatória.
x[]

© 2000-2018, MetaQuotes Software Corp.


2121 Biblioteca Padrão

[in] Matriz com valores da variável aleatória.


nu
[in] Parâmetro de distribuição (número de graus de liberdade).
delta
[in] Parâmetro de não-centralidade.
tail
[in] Sinalizador de cálculo. Se for true, é calculada a probabilidade de que a variável aleatória não
será superior a x.

log_mode
[in] Sinalizador de cálculo do algoritmo de um valor. Se log _mode=true, retorna o logaritmo
natural da probabilidade.

error_code
[out] Variável para registro do código de erro.
result[]
[out] Matriz para valores da função de probabilidade.

© 2000-2018, MetaQuotes Software Corp.


2122 Biblioteca Padrão

MathQuantileNoncentralT
Calcula o inverso da função de distribuição t de Student não-central com parâmetros nu e delta para a
probabilidade probability. Em caso de erro, retorna NaN.
double  MathQuantileNoncentralT(
const double  probability, // valor da probabilidade de aparecimento de uma variável aleatóri
const double  nu, // parâmetro de distribuição (número de graus de liberdade)
const double  delta, // parâmetro de não-centralidade
const bool   tail, // sinalizador de cálculo, se lower_tail=false, o cálculo será rea
const bool   log_mode, // sinalizador de cálculo, se log_mode=true, o cálculo é realizado
int&  error_code  // variável para registro do código de erro
);

Calcula o inverso da função de distribuição t de Student não-central com parâmetros nu e delta para a
probabilidade probability. Em caso de erro, retorna NaN.
double  MathQuantileNoncentralT(
const double  probability, // valor da probabilidade de aparecimento de uma variável aleatóri
const double  nu, // parâmetro de distribuição (número de graus de liberdade)
const double  delta, // parâmetro de não-centralidade
int&  error_code  // variável para registro do código de erro
);

Calcula o inverso da função de distribuição t de Student não-central com parâmetros nu e delta para a
matriz de valores da probabilidade probability[]. Em caso de erro, retorna false. Equivalente a qt() no
R.
double  MathQuantileNoncentralT(
const double& probability[], // matriz com valores de probabilidade da variável aleatória
const double  nu, // parâmetro de distribuição (número de graus de liberdade)
const double  delta, // parâmetro de não-centralidade
const bool   tail, // sinalizador de cálculo, se lower_tail=false, o cálculo será rea
const bool   log_mode, // sinalizador de cálculo, se log_mode=true, o cálculo é realizado
double&  result[]  // matriz com valores de quantis
);

Calcula o inverso da função de distribuição t de Student não-central com parâmetros nu e delta para a
matriz de valores da probabilidade probability[]. Em caso de erro, retorna false.
bool  MathQuantileNoncentralT(
const double& probability[], // matriz com valores de probabilidade da variável aleatória
const double  nu, // parâmetro de distribuição (número de graus de liberdade)
const double  delta, // parâmetro de não-centralidade
double&  result[]  // matriz com valores de quantis
);

Parâmetros
probability
[in] Valor da probabilidade da variável aleatória.

© 2000-2018, MetaQuotes Software Corp.


2123 Biblioteca Padrão

probability[]
[in] Matriz com valores da probabilidade da variável aleatória.
nu
[in] Parâmetro de distribuição (número de graus de liberdade).
delta
[in] Parâmetro de não-centralidade.
tail
[in] Sinalizador de cálculo, se for false, o cálculo é realizado para a probabilidade 1.0 - probability.
log_mode
[in] Sinalizador de cálculo, se log _mode=true, o cálculo é realizado para a probabilidade
Exp(probability).

error_code
[out] Variável para obter o código de erro.
result[]
[out] Matriz com os valores dos quantis.

© 2000-2018, MetaQuotes Software Corp.


2124 Biblioteca Padrão

MathRandomNoncentralT
Gera um número pseudo-aleatório distribuído de acordo com a distribuição t de Student não-central
com parâmetros nu e delta. Em caso de erro, retorna NaN.
double  MathRandomNoncentralT(
const double  nu, // parâmetro de distribuição (número de graus de liberdade)
const double  delta, // parâmetro de não-centralidade
int&  error_code  // variável para registro do código de erro
);

Gera números pseudo-aleatórios distribuídos de acordo com a distribuição t de Student não-central


com parâmetros nu e delta. Em caso de erro, retorna false. Equivalente a rt() no R .
bool  MathRandomNoncentralT(
const double  nu, // parâmetro de distribuição (número de graus de liberdade)
const double  delta, // parâmetro de não-centralidade
const int   data_count, // número de dados necessários
double&  result[]  // matriz com os valores dos números pseudo-aleatórios
);

Parâmetros
nu
[in] Parâmetro de distribuição (número de graus de liberdade).
delta
[in] Parâmetro de não-centralidade.
error_code
[out] Variável para registro do código de erro.
data_count
[out] Número de dados necessários.
result[]
[out] Matriz para obter os valores dos números pseudo-aleatórios.

© 2000-2018, MetaQuotes Software Corp.


2125 Biblioteca Padrão

MathMomentsNoncentralT
Calcula os valores numéricos teóricos dos primeiros 4 momentos da distribuição t de Student não-
central com parâmetros nu e delta.
double  MathMomentsNoncentralT(
const double  nu, // parâmetro de distribuição (número de graus de liberdade)
const double  delta, // parâmetro de não-centralidade
double&  mean, // variável para o valor médio
double&  variance, // variável para a dispersão
double&  skewness, // variável para a obliquidade
double&  kurtosis, // variável para a curtose
int&  error_code  // variável para o código de erro
);

Parâmetros
nu
[in] Parâmetro de distribuição (número de graus de liberdade).
delta
[in] Parâmetro de não-centralidade.
mean
[out] Variável para obter o valor médio.
variance
[out] Variável para obter a dispersão.
skewness
[out] Variável para obter a obliquidade.
kurtosis
[out] Variável para obter a curtose.
error_code
[out] Variável para obter o código de erro.

Valor de retorno
Retorna true, se os momentos forem calculados com sucesso, caso contrário false.

© 2000-2018, MetaQuotes Software Corp.


2126 Biblioteca Padrão

Distribuição logística
Esta seção apresenta as funções para trabalhar com a distribuição log ística. Elas permitem que você
calcule a densidade, probabilidade, quantis e gere números pseudo-aleatórios de acordo com a
distribuição log ística. A distribuição log ística é descrita pela seguinte fórmula:

Onde:
· x — valor da variável aleatória
· m — parâmetro de distribuição mean
· s — parâmetro de distribuição scale

Além do cálculo das variáveis ​aleatórias individuais, é poss ível trabalhar com suas matrizes.

F unção Descrição
MathProbabilityDensityLogistic Calcula a densidade de probabilidade da
distribuição log ística

MathCumulativeDistributionLogistic Calcula o valor da função distribuição log ística


de probabilidades

MathQuantileLogistic Calcula o inverso da função de distribuição


log ística para a probabilidade especificada

MathR andomLogistic Gera um valor/matriz pseudo-aleatório de


valores pseudo-aleatórios de acordo com a
distribuição log ística

© 2000-2018, MetaQuotes Software Corp.


2127 Biblioteca Padrão

MathMomentsLogistic Calcula os valores numéricos teóricos dos


primeiros 4 momentos da distribuição log ística

Exemplo:
#include <Graphics\Graphic.mqh>
#include <Math\Stat\Logistic.mqh>
#include <Math\Stat\Math.mqh>
#property script_show_inputs
//--- input parameters
input double mu_par=6; // parâmetro de distribuição mean
input double sigma_par=2; // parâmetro de distribuição scale
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- desativamos a exibição do gráfico de preço
ChartSetInteger(0,CHART_SHOW,false);
//--- inicializamos o gerador de números aleatórios
MathSrand(GetTickCount());
//--- geramos a amostragem da variável aleatória
long chart=0;
string name="GraphicNormal";
int n=1000000; // número de valores na amostragem
int ncells=51; // número de intervalos no gráfico de colunas
double x[]; // centros de intervalos no gráfico de colunas
double y[]; // número de valores a partir da amostragem dentro do intervalo
double data[]; // amostragem de valores aleatórios
double max,min; // valores máximo e mínimo na amostragem
//--- obtemos a amostragem a partir da distribuição logística
MathRandomLogistic(mu_par,sigma_par,n,data);
//--- calculamos os dados para plotagem do gráfico de colunas
CalculateHistogramArray(data,x,y,max,min,ncells);
//--- obtemos os limites de sequência e passo para plotagem da curva teórica
double step;
GetMaxMinStepValues(max,min,step);
step=MathMin(step,(max-min)/ncells);
//--- obtemos teoricamente os cálculos no intervalo [min,max]
double x2[];
double y2[];
MathSequence(min,max,step,x2);
MathProbabilityDensityLogistic(x2,mu_par,sigma_par,false,y2);
//--- dimensionamos
double theor_max=y2[ArrayMaximum(y2)];
double sample_max=y[ArrayMaximum(y)];
double k=sample_max/theor_max;
for(int i=0; i<ncells; i++)

© 2000-2018, MetaQuotes Software Corp.


2128 Biblioteca Padrão

y[i]/=k;
//--- imprimimos o gráfico
CGraphic graphic;
if(ObjectFind(chart,name)<0)
graphic.Create(chart,name,0,0,0,780,380);
else
graphic.Attach(chart,name);
graphic.BackgroundMain(StringFormat("Logistic distribution mu=%G sigma=%G",mu_par,sigma_par));
graphic.BackgroundMainSize(16);
//--- desativamos o dimensionamento automático no eixo Y
graphic.YAxis().AutoScale(false);
graphic.YAxis().Max(theor_max);
graphic.YAxis().Min(0);
//--- plot all curves
graphic.CurveAdd(x,y,CURVE_HISTOGRAM,"Sample").HistogramWidth(6);
//--- e agora traçamos a curva teórica de densidade da distribuição
graphic.CurveAdd(x2,y2,CURVE_LINES,"Theory");
graphic.CurvePlotAll();
//--- plot all curves
graphic.Update();
}
//+------------------------------------------------------------------+
//| Calculate frequencies for data set |
//+------------------------------------------------------------------+
bool CalculateHistogramArray(const double &data[],double &intervals[],double &frequency[],
double &maxv,double &minv,const int cells=10)
{
if(cells<=1) return (false);
int size=ArraySize(data);
if(size<cells*10) return (false);
minv=data[ArrayMinimum(data)];
maxv=data[ArrayMaximum(data)];
double range=maxv-minv;
double width=range/cells;
if(width==0) return false;
ArrayResize(intervals,cells);
ArrayResize(frequency,cells);
//--- definimos os centros dos intervalos
for(int i=0; i<cells; i++)
{
intervals[i]=minv+(i+0.5)*width;
frequency[i]=0;
}
//--- preenchemos a frequência de aparecimento no intervalo
for(int i=0; i<size; i++)
{
int ind=int((data[i]-minv)/width);
if(ind>=cells) ind=cells-1;
frequency[ind]++;

© 2000-2018, MetaQuotes Software Corp.


2129 Biblioteca Padrão

}
return (true);
}
//+------------------------------------------------------------------+
//| Calculates values for sequence generation |
//+------------------------------------------------------------------+
void GetMaxMinStepValues(double &maxv,double &minv,double &stepv)
{
//--- calculamos a magnitude da sequência para obter a precisão da normalização
double range=MathAbs(maxv-minv);
int degree=(int)MathRound(MathLog10(range));
//--- normalizamos os valores máx. e mín. com a precisão
maxv=NormalizeDouble(maxv,degree);
minv=NormalizeDouble(minv,degree);
//--- definimos o passo de geração da mesma maneira a partir da precisão definida
stepv=NormalizeDouble(MathPow(10,-degree),degree);
if((maxv-minv)/stepv<10)
stepv/=10.;
}

© 2000-2018, MetaQuotes Software Corp.


2130 Biblioteca Padrão

MathProbabilityDensityLogistic
Calcula a função densidade de probabilidade da distribuição log ística com parâmetros mu e sigma para
a variável aleatória x. Em caso de erro, retorna NaN.
double  MathProbabilityDensityLogistic(
const double  x, // valor da variável aleatória
const double  mu, // parâmetro da distribuição mean
const double  sigma, // parâmetro da distribuição scale
const bool   log_mode, // cálculo de logaritmo do valor, se log_mode=true, retorna o loga
int&  error_code  // variável para registro do código de erro
);

Calcula a função densidade de probabilidade da distribuição log ística com parâmetros mu e sigma para
a variável aleatória x. Em caso de erro, retorna NaN.
double  MathProbabilityDensityLogistic(
const double  x, // valor da variável aleatória
const double  mu, // parâmetro da distribuição mean
const double  sigma, // parâmetro da distribuição scale
int&  error_code  // variável para registro do código de erro
);

Calcula a função densidade de probabilidade da distribuição log ística com parâmetros mu e sigma para
a matriz das variáveis aleatórias x []. Em caso de erro, retorna false. Equivalente a dlogis() no R .
bool  MathProbabilityDensityLogistic(
const double& x[], // matriz com valores da variável aleatória
const double  mu, // parâmetro da distribuição mean
const double  sigma, // parâmetro da distribuição scale
const bool   log_mode, // sinalizador de cálculo de logaritmo do valor, se log_mode=true,
double&  result[]  // matriz para o valor da função densidade de probabilidade
);

Calcula a função densidade de probabilidade da distribuição log ística com parâmetros mu e sigma para
a matriz das variáveis aleatórias x []. Em caso de erro, retorna false.
bool  MathProbabilityDensityLogistic(
const double& x[], // matriz com valores da variável aleatória
const double  mu, // parâmetro da distribuição mean
const double  sigma, // parâmetro da distribuição scale
double&  result[]  // matriz para o valor da função densidade de probabilidade
);

Parâmetros
x
[in] Valor da variável aleatória.
x[]
[in] Matriz com valores da variável aleatória.

© 2000-2018, MetaQuotes Software Corp.


2131 Biblioteca Padrão

mu
[in] Parâmetro da distribuição mean.
sigma
[in] Parâmetro da distribuição scale.
log_mode
[in] Sinalizador de cálculo do algoritmo de um valor. Se log _mode=true, retorna o logaritmo
natural da função densidade de probabilidade.

error_code
[out] Variável para registro do código de erro.
result[]
[out] Matriz para os valores da função densidade de probabilidade.

© 2000-2018, MetaQuotes Software Corp.


2132 Biblioteca Padrão

MathCumulativeDistributionLogistic
Calcula a distribuição log ística de probabilidades com parâmetros mu e sigma para a variável aleatória
x. Em caso de erro, retorna NaN.
double  MathCumulativeDistributionLogistic(
const double  x, // valor da variável aleatória
const double  mu, // parâmetro da distribuição mean
const double  sigma, // parâmetro da distribuição scale
const double  tail, // sinalizador de cálculo, se for true, é calculada a probabilidade
const bool   log_mode, // sinalizador de cálculo de logaritmo do valor, se log_mode=true,
int&  error_code  // variável para registro do código de erro
);

Calcula a distribuição log ística de probabilidades com parâmetros mu e sigma para a variável aleatória
x. Em caso de erro, retorna NaN.
double  MathCumulativeDistributionLogistic(
const double  x, // valor da variável aleatória
const double  mu, // parâmetro da distribuição mean
const double  sigma, // parâmetro da distribuição scale
int&  error_code  // variável para registro do código de erro
);

Calcula a distribuição log ística das probabilidades com parâmetros mu e sigma para a matriz das
variáveis aleatórias x []. Em caso de erro, retorna false.
bool  MathCumulativeDistributionLogistic(
const double& x[], // matriz com valores da variável aleatória
const double  mu, // parâmetro da distribuição mean
const double  sigma, // parâmetro da distribuição scale
const double  tail, // sinalizador de cálculo, se for true, é calculada a probabilidad
const bool   log_mode, // sinalizador de cálculo de logaritmo do valor, se log_mode=true,
double&  result[]  // matriz para valores da função de probabilidade
);

Calcula a distribuição log ística das probabilidades com parâmetros mu e sigma para a matriz das
variáveis aleatórias x []. Em caso de erro, retorna false. Equivalente a plogis() no R .
bool  MathCumulativeDistributionLogistic(
const double& x[], // matriz com valores da variável aleatória
const double  mu, // parâmetro da distribuição mean
const double  sigma, // parâmetro da distribuição scale
double&  result[]  // matriz para valores da função de probabilidade
);

Parâmetros
x
[in] Valor da variável aleatória.
x[]

© 2000-2018, MetaQuotes Software Corp.


2133 Biblioteca Padrão

[in] Matriz com valores da variável aleatória.


mu
[in] Parâmetro da distribuição mean.
sigma
[in] Parâmetro da distribuição scale.
tail
[in] Sinalizador de cálculo. Se for true, é calculada a probabilidade de que a variável aleatória não
será superior a x.

log_mode
[in] Sinalizador de cálculo do algoritmo de um valor. Se log _mode=true, retorna o logaritmo
natural da probabilidade.

error_code
[out] Variável para registro do código de erro.
result[]
[out] Matriz para valores da função de probabilidade.

© 2000-2018, MetaQuotes Software Corp.


2134 Biblioteca Padrão

MathQuantileLogistic
Calcula o inverso da função de distribuição log ística com parâmetros mu e sigma para a probabilidade
probability. Em caso de erro, retorna NaN.

double  MathQuantileLogistic(
const double  probability, // valor da probabilidade de aparecimento de uma variável aleatóri
const double  mu, // parâmetro da distribuição mean
const double  sigma, // parâmetro da distribuição scale
const bool   tail, // sinalizador de cálculo, se for false, o cálculo será realizado
const bool   log_mode, // sinalizador de cálculo, se log_mode=true, o cálculo é realizado
int&  error_code  // variável para registro do código de erro
);

Calcula o inverso da função de distribuição log ística com parâmetros mu e sigma para a probabilidade
probability. Em caso de erro, retorna NaN.

double  MathQuantileLogistic(
const double  probability, // valor da probabilidade de aparecimento de uma variável aleatóri
const double  mu, // parâmetro da distribuição mean
const double  sigma, // parâmetro da distribuição scale
int&  error_code  // variável para registro do código de erro
);

Calcula o inverso da função de distribuição log-normal com parâmetros mu e sigma para a matriz de
valores da probabilidade probability. Em caso de erro, retorna false. Equivalente a qlogis() no R .
double  MathQuantileLogistic(
const double& probability[], // matriz com valores de probabilidade da variável aleatória
const double  mu, // parâmetro da distribuição mean
const double  sigma, // parâmetro da distribuição scale
const bool   tail, // sinalizador de cálculo, se for false, o cálculo será realizado
const bool   log_mode, // sinalizador de cálculo, se log_mode=true, o cálculo é realizado
double&  result[]  // matriz com valores de quantis
);

Calcula o inverso da função de distribuição log-normal com parâmetros mu e sigma para a matriz de
valores da probabilidade probability. Em caso de erro, retorna false.
bool  MathQuantileLogistic(
const double& probability[], // matriz com valores de probabilidade da variável aleatória
const double  mu, // parâmetro da distribuição mean
const double  sigma, // parâmetro da distribuição scale
double&  result[]  // matriz com valores de quantis
);

Parâmetros
probability
[in] Valor da probabilidade da variável aleatória.
probability[]

© 2000-2018, MetaQuotes Software Corp.


2135 Biblioteca Padrão

[in] Matriz com valores da probabilidade da variável aleatória.


mu
[in] Parâmetro da distribuição mean.
sigma
[in] Parâmetro da distribuição scale.
tail
[in] Sinalizador de cálculo, se for false, o cálculo é realizado para a probabilidade 1.0 - probability.
log_mode
[in] Sinalizador de cálculo, se log _mode=true, o cálculo é realizado para a probabilidade
Exp(probability).

error_code
[out] Variável para obter o código de erro.
result[]
[out] Matriz com os valores dos quantis.

© 2000-2018, MetaQuotes Software Corp.


2136 Biblioteca Padrão

MathRandomLogistic
Gera um número pseudo-aleatório distribuído de acordo com a distribuição log ística com parâmetros
mu e sigma. Em caso de erro, retorna NaN.
double  MathRandomLogistic(
const double  mu, // parâmetro da distribuição mean
const double  sigma, // parâmetro da distribuição scale
int&  error_code  // variável para registro do código de erro
);

Gera números pseudo-aleatórios distribuídos de acordo com a distribuição log ística com parâmetros
mu e sigma. Em caso de erro, retorna false. Equivalente a rlogis() no R .
bool  MathRandomLogistic(
const double  mu, // parâmetro da distribuição mean
const double  sigma, // parâmetro da distribuição scale
const int   data_count, // número de dados necessários
double&  result[]  // matriz com os valores dos números pseudo-aleatórios
);

Parâmetros
mu
[in] Parâmetro da distribuição mean.
sigma
[in] Parâmetro da distribuição scale.
error_code
[out] Variável para registro do código de erro.
data_count
[out] Número de dados necessários.
result[]
[out] Matriz para obter os valores dos números pseudo-aleatórios.

© 2000-2018, MetaQuotes Software Corp.


2137 Biblioteca Padrão

MathMomentsLogistic
Calcula os valores numéricos teóricos dos primeiros 4 momentos da distribuição log ística com
parâmetros mu e sigma.
double  MathMomentsLogistic(
const double  mu, // parâmetro da distribuição mean
const double  sigma, // parâmetro da distribuição scale
double&  mean, // variável para o valor médio
double&  variance, // variável para a dispersão
double&  skewness, // variável para a obliquidade
double&  kurtosis, // variável para a curtose
int&  error_code  // variável para o código de erro
);

Parâmetros
mu
[in] Parâmetro da distribuição mean.
sigma
[in] Parâmetro da distribuição scale.
mean
[out] Variável para obter o valor médio.
variance
[out] Variável para obter a dispersão.
skewness
[out] Variável para obter a obliquidade.
kurtosis
[out] Variável para obter a curtose.
error_code
[out] Variável para obter o código de erro.

Valor de retorno
Retorna true, se os momentos forem calculados com sucesso, caso contrário false.

© 2000-2018, MetaQuotes Software Corp.


2138 Biblioteca Padrão

Distribuição de Cauchy
Esta seção contém funções para trabalhar com a distribuição de Cauchy. Elas permitem que você
calcule a densidade, probabilidade, quantis e gere números pseudo-aleatórios de acordo com a
distribuição de Cauchy. A distribuição de Cauchy é descrita pela seguinte fórmula:

Onde:
· x — valor da variável aleatória
· a — parâmetro de distribuição mean
· b — parâmetro de distribuição scale

Além do cálculo das variáveis ​aleatórias individuais, é poss ível trabalhar com suas matrizes.

F unção Descrição
MathProbabilityDensityCauchy Calcula a densidade de probabilidade da
distribuição de Cauchy

MathCumulativeDistributionCauchy Calcula o valor da função distribuição de Cauchy


de probabilidades

MathQuantileCauchy Calcula o inverso da função de distribuição de


Cauchy para a probabilidade especificada

MathR andomCauchy Gera um valor/matriz pseudo-aleatório de


valores pseudo-aleatórios de acordo com a
distribuição de Cauchy

MathMomentsCauchy Calcula os valores numéricos teóricos dos


primeiros 4 momentos da distribuição de
Cauchy

© 2000-2018, MetaQuotes Software Corp.


2139 Biblioteca Padrão

Exemplo:
#include <Graphics\Graphic.mqh>
#include <Math\Stat\Cauchy.mqh>
#include <Math\Stat\Math.mqh>
#property script_show_inputs
//--- input parameters
input double a_par=-2; // parâmetro de distribuição mean
input double b_par=1; // parâmetro de distribuição scale
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- desativamos a exibição do gráfico de preço
ChartSetInteger(0,CHART_SHOW,false);
//--- inicializamos o gerador de números aleatórios
MathSrand(GetTickCount());
//--- geramos a amostragem da variável aleatória
long chart=0;
string name="GraphicNormal";
int n=1000000; // número de valores na amostragem
int ncells=51; // número de intervalos no gráfico de colunas
double x[]; // centros de intervalos no gráfico de colunas
double y[]; // número de valores a partir da amostragem dentro do intervalo
double data[]; // amostragem de valores aleatórios
double max,min; // valores máximo e mínimo na amostragem
//--- obtemos a amostragem a partir da distribuição de Cauchy
MathRandomCauchy(a_par,b_par,n,data);
//--- calculamos os dados para plotagem do gráfico de colunas
CalculateHistogramArray(data,x,y,max,min,ncells);
//--- obtemos os limites de sequência e passo para plotagem da curva teórica
double step;
GetMaxMinStepValues(max,min,step);
step=MathMin(step,(max-min)/ncells);
//--- obtemos teoricamente os cálculos no intervalo [min,max]
double x2[];
double y2[];
MathSequence(min,max,step,x2);
MathProbabilityDensityCauchy(x2,a_par,b_par,false,y2);
//--- dimensionamos
double theor_max=y2[ArrayMaximum(y2)];
double sample_max=y[ArrayMaximum(y)];
double k=sample_max/theor_max;
for(int i=0; i<ncells; i++)
y[i]/=k;
//--- imprimimos o gráfico
CGraphic graphic;
if(ObjectFind(chart,name)<0)

© 2000-2018, MetaQuotes Software Corp.


2140 Biblioteca Padrão

graphic.Create(chart,name,0,0,0,780,380);
else
graphic.Attach(chart,name);
graphic.BackgroundMain(StringFormat("Cauchy distribution a=%G b=%G",a_par,b_par));
graphic.BackgroundMainSize(16);
//--- plot all curves
graphic.CurveAdd(x,y,CURVE_HISTOGRAM,"Sample").HistogramWidth(6);
//--- e agora traçamos a curva teórica de densidade da distribuição
graphic.CurveAdd(x2,y2,CURVE_LINES,"Theory");
graphic.CurvePlotAll();
//--- plot all curves
graphic.Update();
}
//+------------------------------------------------------------------+
//| Calculate frequencies for data set |
//+------------------------------------------------------------------+
bool CalculateHistogramArray(const double &data[],double &intervals[],double &frequency[],
double &maxv,double &minv,const int cells=10)
{
if(cells<=1)
return(false);
int size=ArraySize(data);
if(size<cells*10)
return(false);
minv=data[ArrayMinimum(data)];
maxv=data[ArrayMaximum(data)];
Print("min=",minv," max=",maxv);
minv=-20;
maxv=20;
double range=maxv-minv;
double width=range/cells;
if(width==0)
return(false);
ArrayResize(intervals,cells);
ArrayResize(frequency,cells);
//--- definimos os centros dos intervalos
for(int i=0; i<cells; i++)
{
intervals[i]=minv+i*width;
frequency[i]=0;
}
//--- preenchemos a frequência de aparecimento no intervalo
for(int i=0; i<size; i++)
{
int ind=(int)MathRound((data[i]-minv)/width);
if(ind>=0 && ind<cells)
frequency[ind]++;
}
return(true);

© 2000-2018, MetaQuotes Software Corp.


2141 Biblioteca Padrão

}
//+------------------------------------------------------------------+
//| Calculates values for sequence generation |
//+------------------------------------------------------------------+
void GetMaxMinStepValues(double &maxv,double &minv,double &stepv)
{
//--- calculamos a magnitude da sequência para obter a precisão da normalização
double range=MathAbs(maxv-minv);
int degree=(int)MathRound(MathLog10(range));
//--- normalizamos os valores máx. e mín. com a precisão
maxv=NormalizeDouble(maxv,degree);
minv=NormalizeDouble(minv,degree);
//--- definimos o passo de geração da mesma maneira a partir da precisão definida
stepv=NormalizeDouble(MathPow(10,-degree),degree);
if((maxv-minv)/stepv<10)
stepv/=10.;
}

© 2000-2018, MetaQuotes Software Corp.


2142 Biblioteca Padrão

MathProbabilityDensityCauchy
Calcula a função densidade de probabilidade da distribuição de Cauchy com parâmetros a e b para a
variável aleatória x. Em caso de erro, retorna NaN.
double  MathProbabilityDensityCauchy(
const double  x, // valor da variável aleatória
const double  a, // parâmetro da distribuição mean
const double  b, // parâmetro da distribuição scale
const bool   log_mode, // cálculo de logaritmo do valor, se log_mode=true, retorna o loga
int&  error_code  // variável para registro do código de erro
);

Calcula a função densidade de probabilidade da distribuição de Cauchy com parâmetros a e b para a


variável aleatória x. Em caso de erro, retorna NaN.
double  MathProbabilityDensityCauchy(
const double  x, // valor da variável aleatória
const double  a, // parâmetro da distribuição mean
const double  b, // parâmetro da distribuição scale
int&  error_code  // variável para registro do código de erro
);

Calcula a função densidade de probabilidade da distribuição de Cauchy com parâmetros a e b para a


matriz das variáveis aleatórias x []. Em caso de erro, retorna false. Equivalente a dcauchy() no R .
bool  MathProbabilityDensityCauchy(
const double& x[], // matriz com valores da variável aleatória
const double  a, // parâmetro da distribuição mean
const double  b, // parâmetro da distribuição scale
const bool   log_mode, // sinalizador de cálculo de logaritmo do valor, se log_mode=true,
double&  result[]  // matriz para o valor da função densidade de probabilidade
);

Calcula a função densidade de probabilidade da distribuição de Cauchy com parâmetros a e b para a


matriz das variáveis aleatórias x []. Em caso de erro, retorna false.
bool  MathProbabilityDensityCauchy(
const double& x[], // matriz com valores da variável aleatória
const double  a, // parâmetro da distribuição mean
const double  b, // parâmetro da distribuição scale
double&  result[]  // matriz para o valor da função densidade de probabilidade
);

Parâmetros
x
[in] Valor da variável aleatória.
x[]
[in] Matriz com valores da variável aleatória.

© 2000-2018, MetaQuotes Software Corp.


2143 Biblioteca Padrão

a
[in] Parâmetro da distribuição mean.
b
[in] Parâmetro da distribuição scale.
log_mode
[in] Sinalizador de cálculo do algoritmo de um valor. Se log _mode=true, retorna o logaritmo
natural da função densidade de probabilidade.

error_code
[out] Variável para registro do código de erro.
result[]
[out] Matriz para os valores da função densidade de probabilidade.

© 2000-2018, MetaQuotes Software Corp.


2144 Biblioteca Padrão

MathCumulativeDistributionCauchy
Calcula a distribuição de probabilidades de Cauchy com parâmetros a e b para a variável aleatória x.
Em caso de erro, retorna NaN.
double  MathCumulativeDistributionCauchy(
const double  x, // valor da variável aleatória
const double  a, // parâmetro da distribuição mean
const double  b, // parâmetro da distribuição scale
const double  tail, // sinalizador de cálculo, se for true, é calculada a probabilidade
const bool   log_mode, // sinalizador de cálculo de logaritmo do valor, se log_mode=true,
int&  error_code  // variável para registro do código de erro
);

Calcula a distribuição de probabilidades de Cauchy com parâmetros a e b para a variável aleatória x.


Em caso de erro, retorna NaN.
double  MathCumulativeDistributionCauchy(
const double  x, // valor da variável aleatória
const double  a, // parâmetro da distribuição mean
const double  b, // parâmetro da distribuição scale
int&  error_code  // variável para registro do código de erro
);

Calcula a distribuição de probabilidades de Cauchy com parâmetros a e b para a matriz das variáveis
aleatórias x []. Em caso de erro, retorna false.
bool  MathCumulativeDistributionCauchy(
const double& x[], // matriz com valores da variável aleatória
const double  a, // parâmetro da distribuição mean
const double  b, // parâmetro da distribuição scale
const double  tail, // sinalizador de cálculo, se for true, é calculada a probabilidad
const bool   log_mode, // sinalizador de cálculo de logaritmo do valor, se log_mode=true,
double&  result[]  // matriz para valores da função de probabilidade
);

Calcula a distribuição de probabilidades de Cauchy com parâmetros a e b para a matriz das variáveis
aleatórias x []. Em caso de erro, retorna false. Equivalente a plogis() no R .
bool  MathCumulativeDistributionCauchy(
const double& x[], // matriz com valores da variável aleatória
const double  a, // parâmetro da distribuição mean
const double  b, // parâmetro da distribuição scale
double&  result[]  // matriz para valores da função de probabilidade
);

Parâmetros
x
[in] Valor da variável aleatória.
x[]

© 2000-2018, MetaQuotes Software Corp.


2145 Biblioteca Padrão

[in] Matriz com valores da variável aleatória.


a
[in] Parâmetro da distribuição mean.
b
[in] Parâmetro da distribuição scale.
tail
[in] Sinalizador de cálculo. Se for true, é calculada a probabilidade de que a variável aleatória não
será superior a x.

log_mode
[in] Sinalizador de cálculo do algoritmo de um valor. Se log _mode=true, retorna o logaritmo
natural da probabilidade.

error_code
[out] Variável para registro do código de erro.
result[]
[out] Matriz para valores da função de probabilidade.

© 2000-2018, MetaQuotes Software Corp.


2146 Biblioteca Padrão

MathQuantileCauchy
Calcula o inverso da função de distribuição de Cauchy com parâmetros a e b para a probabilidade
probability. Em caso de erro, retorna NaN.

double  MathQuantileCauchy(
const double  probability, // valor da probabilidade de aparecimento de uma variável aleatóri
const double  a, // parâmetro da distribuição mean
const double  b, // parâmetro da distribuição scale
const bool   tail, // sinalizador de cálculo, se for false, o cálculo será realizado
const bool   log_mode, // sinalizador de cálculo, se log_mode=true, o cálculo é realizado
int&  error_code  // variável para registro do código de erro
);

Calcula o inverso da função de distribuição de Cauchy com parâmetros a e b para a probabilidade


probability. Em caso de erro, retorna NaN.

double  MathQuantileCauchy(
const double  probability, // valor da probabilidade de aparecimento de uma variável aleatóri
const double  a, // parâmetro da distribuição mean
const double  b, // parâmetro da distribuição scale
int&  error_code  // variável para registro do código de erro
);

Calcula o inverso da função de distribuição de Cauchy com parâmetros a e b para a matriz de valores
da probabilidade probability[]. Em caso de erro, retorna false. Equivalente a qcauschy() no R .
double  MathQuantileCauchy(
const double& probability[], // matriz com valores de probabilidade da variável aleatória
const double  a, // parâmetro da distribuição mean
const double  b, // parâmetro da distribuição scale
const bool   tail, // sinalizador de cálculo, se for false, o cálculo será realizado
const bool   log_mode, // sinalizador de cálculo, se log_mode=true, o cálculo é realizado
double&  result[]  // matriz com valores de quantis
);

Calcula o inverso da função de distribuição de Cauchy com parâmetros a e b para a matriz de valores
da probabilidade probability[]. Em caso de erro, retorna false.
bool  MathQuantileCauchy(
const double& probability[], // matriz com valores de probabilidade da variável aleatória
const double  a, // parâmetro da distribuição mean
const double  b, // parâmetro da distribuição scale
double&  result[]  // matriz com valores de quantis
);

Parâmetros
probability
[in] Valor da probabilidade da variável aleatória.
probability[]

© 2000-2018, MetaQuotes Software Corp.


2147 Biblioteca Padrão

[in] Matriz com valores da probabilidade da variável aleatória.


a
[in] Parâmetro da distribuição mean.
b
[in] Parâmetro da distribuição scale.
tail
[in] Sinalizador de cálculo, se for false, o cálculo é realizado para a probabilidade 1.0 - probability.
log_mode
[in] Sinalizador de cálculo, se log _mode=true, o cálculo é realizado para a probabilidade
Exp(probability).

error_code
[out] Variável para obter o código de erro.
result[]
[out] Matriz com os valores dos quantis.

© 2000-2018, MetaQuotes Software Corp.


2148 Biblioteca Padrão

MathRandomCauchy
Gera um número pseudo-aleatório distribuído de acordo com a distribuição de Cauchy com parâmetros
a e b. Em caso de erro, retorna NaN.
double  MathRandomCauchy(
const double  a, // parâmetro da distribuição mean
const double  b, // parâmetro da distribuição scale
int&  error_code  // variável para registro do código de erro
);

Gera números pseudo-aleatórios distribuídos de acordo com a distribuição de Cauchy com parâmetros
a e b. Em caso de erro, retorna false. Equivalente a rcauchy() no R .
bool  MathRandomCauchy(
const double  a, // parâmetro da distribuição mean
const double  b, // parâmetro da distribuição scale
const int   data_count, // número de dados necessários
double&  result[]  // matriz com os valores dos números pseudo-aleatórios
);

Parâmetros
a
[in] Parâmetro da distribuição mean.
b
[in] Parâmetro da distribuição scale.
error_code
[out] Variável para registro do código de erro.
data_count
[out] Número de dados necessários.
result[]
[out] Matriz para obter os valores dos números pseudo-aleatórios.

© 2000-2018, MetaQuotes Software Corp.


2149 Biblioteca Padrão

MathMomentsCauchy
Calcula os valores numéricos teóricos dos primeiros 4 momentos da distribuição de Cauchy com
parâmetros a, b.
double  MathMomentsCauchy(
const double  a, // parâmetro da distribuição mean
const double  b, // parâmetro da distribuição scale
double&  mean, // variável para o valor médio
double&  variance, // variável para a dispersão
double&  skewness, // variável para a obliquidade
double&  kurtosis, // variável para a curtose
int&  error_code  // variável para o código de erro
);

Parâmetros
a
[in] Parâmetro da distribuição mean.
b
[in] Parâmetro da distribuição scale.
mean
[out] Variável para obter o valor médio.
variance
[out] Variável para obter a dispersão.
skewness
[out] Variável para obter a obliquidade.
kurtosis
[out] Variável para obter a curtose.
error_code
[out] Variável para obter o código de erro.

Valor de retorno
Retorna true, se os momentos forem calculados com sucesso, caso contrário false.

© 2000-2018, MetaQuotes Software Corp.


2150 Biblioteca Padrão

Distribuição uniforme
Esta seção apresenta as funções para trabalhar com a distribuição uniforme. Elas permitem que você
calcule a densidade, probabilidade, quantis e gere números pseudo-aleatórios de acordo com a
distribuição uniforme. A distribuição uniforme é descrita pela seguinte fórmula:

Onde:
· x — valor da variável aleatória
· a — parâmetro de distribuição (limite inferior)
· b — parâmetro de distribuição (limite superior)

Além do cálculo das variáveis ​aleatórias individuais, é poss ível trabalhar com suas matrizes.

F unção Descrição
MathProbabilityDensityUniform Calcula a densidade de probabilidade da
distribuição uniforme

MathCumulativeDistributionUniform Calcula o valor da função distribuição uniforme


de probabilidades

MathQuantileUniform Calcula o inverso da função de distribuição


uniforme para a probabilidade especificada

MathR andomUniform Gera um valor/matriz pseudo-aleatório de


valores pseudo-aleatórios de acordo com a
distribuição uniforme

MathMomentsUniform Calcula os valores numéricos teóricos dos


primeiros 4 momentos da distribuição uniforme

© 2000-2018, MetaQuotes Software Corp.


2151 Biblioteca Padrão

Exemplo:
#include <Graphics\Graphic.mqh>
#include <Math\Stat\Uniform.mqh>
#include <Math\Stat\Math.mqh>
#property script_show_inputs
//--- input parameters
input double a_par=0; // parâmetro de distribuição a (limite inferior)
input double b_par=10; // parâmetro de distribuição b (limite superior)
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- desativamos a exibição do gráfico de preço
ChartSetInteger(0,CHART_SHOW,false);
//--- inicializamos o gerador de números aleatórios
MathSrand(GetTickCount());
//--- geramos a amostragem da variável aleatória
long chart=0;
string name="GraphicNormal";
int n=1000000; // número de valores na amostragem
int ncells=51; // número de intervalos no gráfico de colunas
double x[]; // centros de intervalos no gráfico de colunas
double y[]; // número de valores a partir da amostragem dentro do intervalo
double data[]; // amostragem de valores aleatórios
double max,min; // valores máximo e mínimo na amostragem
//--- obtemos a amostragem a partir da distribuição uniforme
MathRandomUniform(a_par,b_par,n,data);
//--- calculamos os dados para plotagem do gráfico de colunas
CalculateHistogramArray(data,x,y,max,min,ncells);
//--- obtemos os limites de sequência e passo para plotagem da curva teórica
double step;
GetMaxMinStepValues(max,min,step);
step=MathMin(step,(max-min)/ncells);
//--- obtemos teoricamente os cálculos no intervalo [min,max]
double x2[];
double y2[];
MathSequence(min,max,step,x2);
MathProbabilityDensityUniform(x2,a_par,b_par,false,y2);
//--- dimensionamos
double theor_max=y2[ArrayMaximum(y2)];
double sample_max=y[ArrayMaximum(y)];
double k=sample_max/theor_max;
for(int i=0; i<ncells; i++)
y[i]/=k;
//--- imprimimos o gráfico
CGraphic graphic;
if(ObjectFind(chart,name)<0)

© 2000-2018, MetaQuotes Software Corp.


2152 Biblioteca Padrão

graphic.Create(chart,name,0,0,0,780,380);
else
graphic.Attach(chart,name);
graphic.BackgroundMain(StringFormat("Uniform distribution a=%G b=%G",a_par,b_par));
graphic.BackgroundMainSize(16);
//--- plot all curves
graphic.CurveAdd(x,y,CURVE_HISTOGRAM,"Sample").HistogramWidth(6);
//--- e agora traçamos a curva teórica de densidade da distribuição
graphic.CurveAdd(x2,y2,CURVE_LINES,"Theory");
graphic.CurvePlotAll();
//--- plot all curves
graphic.Update();
}
//+------------------------------------------------------------------+
//| Calculate frequencies for data set |
//+------------------------------------------------------------------+
bool CalculateHistogramArray(const double &data[],double &intervals[],double &frequency[],
double &maxv,double &minv,const int cells=10)
{
if(cells<=1) return (false);
int size=ArraySize(data);
if(size<cells*10) return (false);
minv=data[ArrayMinimum(data)];
maxv=data[ArrayMaximum(data)];
double range=maxv-minv;
double width=range/cells;
if(width==0) return false;
ArrayResize(intervals,cells);
ArrayResize(frequency,cells);
//--- definimos os centros dos intervalos
for(int i=0; i<cells; i++)
{
intervals[i]=minv+(i+0.5)*width;
frequency[i]=0;
}
//--- preenchemos a frequência de aparecimento no intervalo
for(int i=0; i<size; i++)
{
int ind=int((data[i]-minv)/width);
if(ind>=cells) ind=cells-1;
frequency[ind]++;
}
return (true);
}
//+------------------------------------------------------------------+
//| Calculates values for sequence generation |
//+------------------------------------------------------------------+
void GetMaxMinStepValues(double &maxv,double &minv,double &stepv)
{

© 2000-2018, MetaQuotes Software Corp.


2153 Biblioteca Padrão

//--- calculamos a magnitude da sequência para obter a precisão da normalização


double range=MathAbs(maxv-minv);
int degree=(int)MathRound(MathLog10(range));
//--- normalizamos os valores máx. e mín. com a precisão
maxv=NormalizeDouble(maxv,degree);
minv=NormalizeDouble(minv,degree);
//--- definimos o passo de geração da mesma maneira a partir da precisão definida
stepv=NormalizeDouble(MathPow(10,-degree),degree);
if((maxv-minv)/stepv<10)
stepv/=10.;
}

© 2000-2018, MetaQuotes Software Corp.


2154 Biblioteca Padrão

MathProbabilityDensityUniform
Calcula a função densidade de probabilidade da distribuição uniforme com parâmetros a e b para a
variável aleatória x. Em caso de erro, retorna NaN.
double  MathProbabilityDensityUniform(
const double  x, // valor da variável aleatória
const double  a, // parâmetro de distribuição a (limite inferior)
const double  b, // parâmetro de distribuição b (limite superior)
const bool   log_mode, // cálculo de logaritmo do valor, se log_mode=true, retorna o loga
int&  error_code  // variável para registro do código de erro
);

Calcula a função densidade de probabilidade da distribuição uniforme com parâmetros a e b para a


variável aleatória x. Em caso de erro, retorna NaN.
double  MathProbabilityDensityUniform(
const double  x, // valor da variável aleatória
const double  a, // parâmetro de distribuição a (limite inferior)
const double  b, // parâmetro de distribuição b (limite superior)
int&  error_code  // variável para registro do código de erro
);

Calcula a função de densidade de probabilidade da distribuição uniforme com parâmetros a e b para a


matriz de variáveis aleatórias x []. Em caso de erro, retorna false. Equivalente a dunif() no R .
bool  MathProbabilityDensityUniform(
const double& x[], // matriz com valores da variável aleatória
const double  a, // parâmetro de distribuição a (limite inferior)
const double  b, // parâmetro de distribuição b (limite superior)
const bool   log_mode, // sinalizador de cálculo de logaritmo do valor, se log_mode=true,
double&  result[]  // matriz para o valor da função densidade de probabilidade
);

Calcula a função de densidade de probabilidade da distribuição uniforme com parâmetros a e b para a


matriz de variáveis aleatórias x []. Em caso de erro, retorna false.
bool  MathProbabilityDensityUniform(
const double& x[], // matriz com valores da variável aleatória
const double  a, // parâmetro de distribuição a (limite inferior)
const double  b, // parâmetro de distribuição b (limite superior)
double&  result[]  // matriz para o valor da função densidade de probabilidade
);

Parâmetros
x
[in] Valor da variável aleatória.
x[]
[in] Matriz com valores da variável aleatória.

© 2000-2018, MetaQuotes Software Corp.


2155 Biblioteca Padrão

a
[in] Parâmetro de distribuição a (limite inferior).
b
[in] Parâmetro de distribuição b (limite superior).
log_mode
[in] Sinalizador de cálculo do algoritmo de um valor. Se log _mode=true, retorna o logaritmo
natural da função densidade de probabilidade.

error_code
[out] Variável para registro do código de erro.
result[]
[out] Matriz para os valores da função densidade de probabilidade.

© 2000-2018, MetaQuotes Software Corp.


2156 Biblioteca Padrão

MathCumulativeDistributionUniform
Calcula a distribuição uniforme de probabilidades com parâmetros a e b para a variável aleatória x.
Em caso de erro, retorna NaN.
double  MathCumulativeDistributionUniform(
const double  x, // valor da variável aleatória
const double  a, // parâmetro de distribuição a (limite inferior)
const double  b, // parâmetro de distribuição b (limite superior)
const double  tail, // sinalizador de cálculo, se for true, é calculada a probabilidade
const bool   log_mode, // sinalizador de cálculo de logaritmo do valor, se log_mode=true,
int&  error_code  // variável para registro do código de erro
);

Calcula a distribuição uniforme de probabilidades com parâmetros a e b para a variável aleatória x.


Em caso de erro, retorna NaN.
double  MathCumulativeDistributionUniform(
const double  x, // valor da variável aleatória
const double  a, // parâmetro de distribuição a (limite inferior)
const double  b, // parâmetro de distribuição b (limite superior)
int&  error_code  // variável para registro do código de erro
);

Calcula a distribuição uniforme de probabilidades com parâmetros a e b para a matriz das variáveis
aleatórias x []. Em caso de erro, retorna false.
bool  MathCumulativeDistributionUniform(
const double& x[], // matriz com valores da variável aleatória
const double  a, // parâmetro de distribuição a (limite inferior)
const double  b, // parâmetro de distribuição b (limite superior)
const double  tail, // sinalizador de cálculo, se for true, é calculada a probabilidad
const bool   log_mode, // sinalizador de cálculo de logaritmo do valor, se log_mode=true,
double&  result[]  // matriz para valores da função de probabilidade
);

Calcula a distribuição uniforme de probabilidades com parâmetros a e b para a matriz das variáveis
aleatórias x []. Em caso de erro, retorna false. Equivalente a punif() no R .
bool  MathCumulativeDistributionUniform(
const double& x[], // matriz com valores da variável aleatória
const double  a, // parâmetro de distribuição a (limite inferior)
const double  b, // parâmetro de distribuição b (limite superior)
double&  result[]  // matriz para valores da função de probabilidade
);

Parâmetros
x
[in] Valor da variável aleatória.
x[]

© 2000-2018, MetaQuotes Software Corp.


2157 Biblioteca Padrão

[in] Matriz com valores da variável aleatória.


a
[in] Parâmetro de distribuição a (limite inferior).
b
[in] Parâmetro de distribuição b (limite superior).
tail
[in] Sinalizador de cálculo. Se for true, é calculada a probabilidade de que a variável aleatória não
será superior a x.

log_mode
[in] Sinalizador de cálculo do algoritmo de um valor. Se log _mode=true, retorna o logaritmo
natural da probabilidade.

error_code
[out] Variável para registro do código de erro.
result[]
[out] Matriz para valores da função de probabilidade.

© 2000-2018, MetaQuotes Software Corp.


2158 Biblioteca Padrão

MathQuantileUniform
Calcula o inverso da função de distribuição uniforme com parâmetros a e b para a probabilidade
probability. Em caso de erro, retorna NaN.

double  MathQuantileUniform(
const double  probability, // valor da probabilidade de aparecimento de uma variável aleatóri
const double  a, // parâmetro de distribuição a (limite inferior)
const double  b, // parâmetro de distribuição b (limite superior)
const bool   tail, // sinalizador de cálculo, se for false, o cálculo será realizado
const bool   log_mode, // sinalizador de cálculo, se log_mode=true, o cálculo é realizado
int&  error_code  // variável para registro do código de erro
);

Calcula o inverso da função de distribuição uniforme com parâmetros a e b para a probabilidade


probability. Em caso de erro, retorna NaN.

double  MathQuantileUniform(
const double  probability, // valor da probabilidade de aparecimento de uma variável aleatóri
const double  a, // parâmetro de distribuição a (limite inferior)
const double  b, // parâmetro de distribuição b (limite superior)
int&  error_code  // variável para registro do código de erro
);

Calcula o inverso da função de distribuição uniforme com parâmetros a e b para a matriz de valores da
probabilidade probability[]. Em caso de erro, retorna false. Equivalente a qcauschy() no R .
double  MathQuantileUniform(
const double& probability[], // matriz com valores de probabilidade da variável aleatória
const double  a, // parâmetro de distribuição a (limite inferior)
const double  b, // parâmetro de distribuição b (limite superior)
const bool   tail, // sinalizador de cálculo, se for false, o cálculo será realizado
const bool   log_mode, // sinalizador de cálculo, se log_mode=true, o cálculo é realizado
double&  result[]  // matriz com valores de quantis
);

Calcula o inverso da função de distribuição uniforme com parâmetros a e b para a matriz de valores da
probabilidade probability[]. Em caso de erro, retorna false.
bool  MathQuantileUniform(
const double& probability[], // matriz com valores de probabilidade da variável aleatória
const double  a, // parâmetro de distribuição a (limite inferior)
const double  b, // parâmetro de distribuição b (limite superior)
double&  result[]  // matriz com valores de quantis
);

Parâmetros
probability
[in] Valor da probabilidade da variável aleatória.
probability[]

© 2000-2018, MetaQuotes Software Corp.


2159 Biblioteca Padrão

[in] Matriz com valores da probabilidade da variável aleatória.


a
[in] Parâmetro de distribuição a (limite inferior).
b
[in] Parâmetro de distribuição b (limite superior).
tail
[in] Sinalizador de cálculo, se for false, o cálculo é realizado para a probabilidade 1.0 - probability.
log_mode
[in] Sinalizador de cálculo, se log _mode=true, o cálculo é realizado para a probabilidade
Exp(probability).

error_code
[out] Variável para obter o código de erro.
result[]
[out] Matriz com os valores dos quantis.

© 2000-2018, MetaQuotes Software Corp.


2160 Biblioteca Padrão

MathRandomUniform
Gera um número pseudo-aleatório distribuído de acordo com a distribuição uniforme com parâmetros
a e b. Em caso de erro, retorna NaN.
double  MathRandomUniform(
const double  a, // parâmetro de distribuição a (limite inferior)
const double  b, // parâmetro de distribuição b (limite superior)
int&  error_code  // variável para registro do código de erro
);

Gera números pseudo-aleatórios distribuídos de acordo com a distribuição uniforme com parâmetros a
e b. Em caso de erro, retorna false. Equivalente a runif() no R .
bool  MathRandomUniform(
const double  a, // parâmetro de distribuição a (limite inferior)
const double  b, // parâmetro de distribuição b (limite superior)
const int   data_count, // número de dados necessários
double&  result[]  // matriz com os valores dos números pseudo-aleatórios
);

Parâmetros
a
[in] Parâmetro de distribuição a (limite inferior).
b
[in] Parâmetro de distribuição b (limite superior).
error_code
[out] Variável para registro do código de erro.
data_count
[out] Número de dados necessários.
result[]
[out] Matriz para obter os valores dos números pseudo-aleatórios.

© 2000-2018, MetaQuotes Software Corp.


2161 Biblioteca Padrão

MathMomentsUniform
Calcula os valores numéricos teóricos dos primeiros 4 momentos da distribuição uniforme com
parâmetros a, b.
double  MathMomentsUniform(
const double  a, // parâmetro de distribuição a (limite inferior)
const double  b, // parâmetro de distribuição b (limite superior)
double&  mean, // variável para o valor médio
double&  variance, // variável para a dispersão
double&  skewness, // variável para a obliquidade
double&  kurtosis, // variável para a curtose
int&  error_code  // variável para o código de erro
);

Parâmetros
a
[in] Parâmetro de distribuição a (limite inferior).
b
[in] Parâmetro de distribuição b (limite superior).
mean
[out] Variável para obter o valor médio.
variance
[out] Variável para obter a dispersão.
skewness
[out] Variável para obter a obliquidade.
kurtosis
[out] Variável para obter a curtose.
error_code
[out] Variável para obter o código de erro.

Valor de retorno
Retorna true, se os momentos forem calculados com sucesso, caso contrário false.

© 2000-2018, MetaQuotes Software Corp.


2162 Biblioteca Padrão

Distribuição de W eibull
Esta seção contém funções para trabalhar com a distribuição de W eibull. Elas permitem que você
calcule a densidade, probabilidade, quantis e gere números pseudo-aleatórios de acordo com a
distribuição de W eibull. A distribuição de W eibull é descrita pela seguinte fórmula:

Onde:
· x — valor da variável aleatória
· a — parâmetro de distribuição (s hape)
· b — parâmetro de distribuição (scale)

Além do cálculo das variáveis ​aleatórias individuais, é poss ível trabalhar com suas matrizes.

F unção Descrição
MathProbabilityDensityW eibull Calcula a densidade de probabilidade da
distribuição de W eibull

MathCumulativeDistributionW eibull Calcula o valor da função distribuição de


W eibull de probabilidades
MathQuantileW eibull Calcula o inverso da função de distribuição de
W eibull para a probabilidade especificada
MathR andomW eibull Gera um valor/matriz pseudo-aleatório de
valores pseudo-aleatórios de acordo com a
distribuição de W eibull

© 2000-2018, MetaQuotes Software Corp.


2163 Biblioteca Padrão

MathMoments W eibull Calcula os valores numéricos teóricos dos


primeiros 4 momentos da distribuição de
W eibull

Exemplo:
#include <Graphics\Graphic.mqh>
#include <Math\Stat\Weibull.mqh>
#include <Math\Stat\Math.mqh>
#property script_show_inputs
//--- input parameters
input double a_par=1; // parâmetro de distribuição (shape)
input double b_par=5; // parâmetro de distribuição (scale)
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- desativamos a exibição do gráfico de preço
ChartSetInteger(0,CHART_SHOW,false);
//--- inicializamos o gerador de números aleatórios
MathSrand(GetTickCount());
//--- geramos a amostragem da variável aleatória
long chart=0;
string name="GraphicNormal";
int n=1000000; // número de valores na amostragem
int ncells=51; // número de intervalos no gráfico de colunas
double x[]; // centros de intervalos no gráfico de colunas
double y[]; // número de valores a partir da amostragem dentro do intervalo
double data[]; // amostragem de valores aleatórios
double max,min; // valores máximo e mínimo na amostragem
//--- obtemos a amostragem a partir da distribuição de Weibull
MathRandomWeibull(a_par,b_par,n,data);
//--- calculamos os dados para plotagem do gráfico de colunas
CalculateHistogramArray(data,x,y,max,min,ncells);
//--- obtemos os limites de sequência e passo para plotagem da curva teórica
double step;
GetMaxMinStepValues(max,min,step);
step=MathMin(step,(max-min)/ncells);
//--- obtemos teoricamente os cálculos no intervalo [min,max]
double x2[];
double y2[];
MathSequence(min,max,step,x2);
MathProbabilityDensityWeibull(x2,a_par,b_par,false,y2);
//--- dimensionamos
double theor_max=y2[ArrayMaximum(y2)];
double sample_max=y[ArrayMaximum(y)];
double k=sample_max/theor_max;

© 2000-2018, MetaQuotes Software Corp.


2164 Biblioteca Padrão

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


y[i]/=k;
//--- imprimimos o gráfico
CGraphic graphic;
if(ObjectFind(chart,name)<0)
graphic.Create(chart,name,0,0,0,780,380);
else
graphic.Attach(chart,name);
graphic.BackgroundMain(StringFormat("Weibull distribution a=%G b=%G",a_par,b_par));
graphic.BackgroundMainSize(16);
//--- desativamos o dimensionamento automático no eixo X
graphic.XAxis().AutoScale(false);
graphic.XAxis().Max(max);
graphic.XAxis().Min(min);
//--- plot all curves
graphic.CurveAdd(x,y,CURVE_HISTOGRAM,"Sample").HistogramWidth(6);
//--- e agora traçamos a curva teórica de densidade da distribuição
graphic.CurveAdd(x2,y2,CURVE_LINES,"Theory");
graphic.CurvePlotAll();
//--- plot all curves
graphic.Update();
}
//+------------------------------------------------------------------+
//| Calculate frequencies for data set |
//+------------------------------------------------------------------+
bool CalculateHistogramArray(const double &data[],double &intervals[],double &frequency[],
double &maxv,double &minv,const int cells=10)
{
if(cells<=1) return (false);
int size=ArraySize(data);
if(size<cells*10) return (false);
minv=data[ArrayMinimum(data)];
maxv=data[ArrayMaximum(data)];
double range=maxv-minv;
double width=range/cells;
if(width==0) return false;
ArrayResize(intervals,cells);
ArrayResize(frequency,cells);
//--- definimos os centros dos intervalos
for(int i=0; i<cells; i++)
{
intervals[i]=minv+i*width;
frequency[i]=0;
}
//--- preenchemos a frequência de aparecimento no intervalo
for(int i=0; i<size; i++)
{
int ind=int((data[i]-minv)/width);
if(ind>=cells) ind=cells-1;

© 2000-2018, MetaQuotes Software Corp.


2165 Biblioteca Padrão

frequency[ind]++;
}
return (true);
}
//+------------------------------------------------------------------+
//| Calculates values for sequence generation |
//+------------------------------------------------------------------+
void GetMaxMinStepValues(double &maxv,double &minv,double &stepv)
{
//--- calculamos a magnitude da sequência para obter a precisão da normalização
double range=MathAbs(maxv-minv);
int degree=(int)MathRound(MathLog10(range));
//--- normalizamos os valores máx. e mín. com a precisão
maxv=NormalizeDouble(maxv,degree);
minv=NormalizeDouble(minv,degree);
//--- definimos o passo de geração da mesma maneira a partir da precisão definida
stepv=NormalizeDouble(MathPow(10,-degree),degree);
if((maxv-minv)/stepv<10)
stepv/=10.;
}

© 2000-2018, MetaQuotes Software Corp.


2166 Biblioteca Padrão

MathProbabilityDensityW eibull
Calcula a função densidade de probabilidade da distribuição de W eibull com parâmetros a e b para a
variável aleatória x. Em caso de erro, retorna NaN.
double  MathProbabilityDensityWeibull(
const double  x, // valor da variável aleatória
const double  a, // parâmetro de distribuição (shape)
const double  b, // parâmetro de distribuição (scale)
const bool   log_mode, // cálculo de logaritmo do valor, se log_mode=true, retorna o loga
int&  error_code  // variável para registro do código de erro
);

Calcula a função densidade de probabilidade da distribuição de W eibull com parâmetros a e b para a


variável aleatória x. Em caso de erro, retorna NaN.
double  MathProbabilityDensityWeibull(
const double  x, // valor da variável aleatória
const double  a, // parâmetro de distribuição (shape)
const double  b, // parâmetro de distribuição (scale)
int&  error_code  // variável para registro do código de erro
);

Calcula a função densidade de probabilidade da distribuição de W eibull com parâmetros a e b para a


matriz das variáveis aleatórias x []. Em caso de erro, retorna false. Equivalente a dweibull() no R .
bool  MathProbabilityDensityWeibull(
const double& x[], // matriz com valores da variável aleatória
const double  a, // parâmetro de distribuição (shape)
const double  b, // parâmetro de distribuição (scale)
const bool   log_mode, // sinalizador de cálculo de logaritmo do valor, se log_mode=true,
double&  result[]  // matriz para o valor da função densidade de probabilidade
);

Calcula a função densidade de probabilidade da distribuição de W eibull com parâmetros a e b para a


matriz das variáveis aleatórias x []. Em caso de erro, retorna false.
bool  MathProbabilityDensityWeibull(
const double& x[], // matriz com valores da variável aleatória
const double  a, // parâmetro de distribuição (shape)
const double  b, // parâmetro de distribuição (scale)
double&  result[]  // matriz para o valor da função densidade de probabilidade
);

Parâmetros
x
[in] Valor da variável aleatória.
x[]
[in] Matriz com valores da variável aleatória.

© 2000-2018, MetaQuotes Software Corp.


2167 Biblioteca Padrão

a
[in] Parâmetro de distribuição (scale).
b
[in] Parâmetro de distribuição (s hape).
log_mode
[in] Sinalizador de cálculo do algoritmo de um valor. Se log _mode=true, retorna o logaritmo
natural da função densidade de probabilidade.

error_code
[out] Variável para registro do código de erro.
result[]
[out] Matriz para os valores da função densidade de probabilidade.

© 2000-2018, MetaQuotes Software Corp.


2168 Biblioteca Padrão

MathCumulativeDistributionW eibull
Calcula a distribuição de W eibull de probabilidades com parâmetros a e b para a variável aleatória x.
Em caso de erro, retorna NaN.
double  MathCumulativeDistributionWeibull(
const double  x, // valor da variável aleatória
const double  a, // parâmetro de distribuição (shape)
const double  b, // parâmetro de distribuição (scale)
const double  tail, // sinalizador de cálculo, se for true, é calculada a probabilidade
const bool   log_mode, // sinalizador de cálculo de logaritmo do valor, se log_mode=true,
int&  error_code  // variável para registro do código de erro
);

Calcula a distribuição de W eibull de probabilidades com parâmetros a e b para a variável aleatória x.


Em caso de erro, retorna NaN.
double  MathCumulativeDistributionWeibull(
const double  x, // valor da variável aleatória
const double  a, // parâmetro de distribuição (shape)
const double  b, // parâmetro de distribuição (scale)
int&  error_code  // variável para registro do código de erro
);

Calcula a distribuição de W eibull de probabilidades com parâmetros a e b para a matriz das variáveis
aleatórias x []. Em caso de erro, retorna false. Equivalente a pweibull() no R .
bool  MathCumulativeDistributionWeibull(
const double& x[], // matriz com valores da variável aleatória
const double  a, // parâmetro de distribuição (shape)
const double  b, // parâmetro de distribuição (scale)
const double  tail, // sinalizador de cálculo, se for true, é calculada a probabilidad
const bool   log_mode, // sinalizador de cálculo de logaritmo do valor, se log_mode=true,
double&  result[]  // matriz para valores da função de probabilidade
);

Calcula a distribuição de W eibull de probabilidades com parâmetros a e b para a matriz das variáveis
aleatórias x []. Em caso de erro, retorna false.
bool  MathCumulativeDistributionWeibull(
const double& x[], // matriz com valores da variável aleatória
const double  a, // parâmetro de distribuição (shape)
const double  b, // parâmetro de distribuição (scale)
double&  result[]  // matriz para valores da função de probabilidade
);

Parâmetros
x
[in] Valor da variável aleatória.
x[]

© 2000-2018, MetaQuotes Software Corp.


2169 Biblioteca Padrão

[in] Matriz com valores da variável aleatória.


a
[in] Parâmetro de distribuição (scale).
b
[in] Parâmetro de distribuição (s hape).
tail
[in] Sinalizador de cálculo. Se for true, é calculada a probabilidade de que a variável aleatória não
será superior a x.

log_mode
[in] Sinalizador de cálculo do algoritmo de um valor. Se log _mode=true, retorna o logaritmo
natural da probabilidade.

error_code
[out] Variável para registro do código de erro.
result[]
[out] Matriz para valores da função de probabilidade.

© 2000-2018, MetaQuotes Software Corp.


2170 Biblioteca Padrão

MathQuantileW eibull
Calcula o inverso da função de distribuição de W eibull com parâmetros a e b para a probabilidade
probability. Em caso de erro, retorna NaN.

double  MathQuantileWeibull(
const double  probability, // valor da probabilidade de aparecimento de uma variável aleatóri
const double  a, // parâmetro de distribuição (shape)
const double  b, // parâmetro de distribuição (scale)
const bool   tail, // sinalizador de cálculo, se for false, o cálculo será realizado
const bool   log_mode, // sinalizador de cálculo, se log_mode=true, o cálculo é realizado
int&  error_code  // variável para registro do código de erro
);

Calcula o inverso da função de distribuição de W eibull com parâmetros a e b para a probabilidade


probability. Em caso de erro, retorna NaN.

double  MathQuantileWeibull(
const double  probability, // valor da probabilidade de aparecimento de uma variável aleatóri
const double  a, // parâmetro de distribuição (shape)
const double  b, // parâmetro de distribuição (scale)
int&  error_code  // variável para registro do código de erro
);

Calcula o inverso da função de distribuição de W eibull com parâmetros a e b para a matriz de valores
da probabilidade probability[]. Em caso de erro, retorna false. Equivalente a qweibull() no R .
double  MathQuantileWeibull(
const double& probability[], // matriz com valores de probabilidade da variável aleatória
const double  a, // parâmetro de distribuição (shape)
const double  b, // parâmetro de distribuição (scale)
const bool   tail, // sinalizador de cálculo, se for false, o cálculo será realizado
const bool   log_mode, // sinalizador de cálculo, se log_mode=true, o cálculo é realizado
double&  result[]  // matriz com valores de quantis
);

Calcula o inverso da função de distribuição de W eibull com parâmetros a e b para a matriz de valores
da probabilidade probability[]. Em caso de erro, retorna false.
bool  MathQuantileWeibull(
const double& probability[], // matriz com valores de probabilidade da variável aleatória
const double  a, // parâmetro de distribuição (shape)
const double  b, // parâmetro de distribuição (scale)
double&  result[]  // matriz com valores de quantis
);

Parâmetros
probability
[in] Valor da probabilidade da variável aleatória.
probability[]

© 2000-2018, MetaQuotes Software Corp.


2171 Biblioteca Padrão

[in] Matriz com valores da probabilidade da variável aleatória.


a
[in] Parâmetro de distribuição (scale).
b
[in] Parâmetro de distribuição (s hape).
tail
[in] Sinalizador de cálculo, se for false, o cálculo é realizado para a probabilidade 1.0 - probability.
log_mode
[in] Sinalizador de cálculo, se log _mode=true, o cálculo é realizado para a probabilidade
Exp(probability).

error_code
[out] Variável para obter o código de erro.
result[]
[out] Matriz com os valores dos quantis.

© 2000-2018, MetaQuotes Software Corp.


2172 Biblioteca Padrão

MathRandomW eibull
Gera um número pseudo-aleatório distribuído de acordo com a distribuição de W eibull com parâmetros
a e b. Em caso de erro, retorna NaN.
double  MathRandomWeibull(
const double  a, // parâmetro de distribuição (shape)
const double  b, // parâmetro de distribuição (scale)
int&  error_code  // variável para registro do código de erro
);

Gera números pseudo-aleatórios distribuídos de acordo com a distribuição de W eibull com parâmetros
a e b. Em caso de erro, retorna false. Equivalente a rweibull() no R .
bool  MathRandomWeibull(
const double  a, // parâmetro de distribuição (shape)
const double  b, // parâmetro de distribuição (scale)
const int   data_count, // número de dados necessários
double&  result[]  // matriz com os valores dos números pseudo-aleatórios
);

Parâmetros
a
[in] Parâmetro de distribuição (scale).
b
[in] Parâmetro de distribuição (s hape).
error_code
[out] Variável para registro do código de erro.
data_count
[out] Número de dados necessários.
result[]
[out] Matriz para obter os valores dos números pseudo-aleatórios.

© 2000-2018, MetaQuotes Software Corp.


2173 Biblioteca Padrão

MathMomentsW eibull
Calcula os valores numéricos teóricos dos primeiros 4 momentos da distribuição de W eibull com
parâmetros a, b.
double  MathMomentsWeibull(
const double  a, // parâmetro de distribuição (shape)
const double  b, // parâmetro de distribuição (scale)
double&  mean, // variável para o valor médio
double&  variance, // variável para a dispersão
double&  skewness, // variável para a obliquidade
double&  kurtosis, // variável para a curtose
int&  error_code  // variável para o código de erro
);

Parâmetros
a
[in] Parâmetro de distribuição (scale).
b
[in] Parâmetro de distribuição (s hape).
mean
[out] Variável para obter o valor médio.
variance
[out] Variável para obter a dispersão.
skewness
[out] Variável para obter a obliquidade.
kurtosis
[out] Variável para obter a curtose.
error_code
[out] Variável para obter o código de erro.

Valor de retorno
Retorna true, se os momentos forem calculados com sucesso, caso contrário false.

© 2000-2018, MetaQuotes Software Corp.


2174 Biblioteca Padrão

Distribuição binomial
Esta seção apresenta as funções para trabalhar com a distribuição binomial. Elas permitem que você
calcule a densidade, probabilidade, quantis e gere números pseudo-aleatórios de acordo com a
distribuição binomial. A distribuição binomial é descrita pela seguinte fórmula:

Onde:
· x — valor da variável aleatória
· n — número de testes
· p — probabilidade de sucesso para cada teste

Além do cálculo das variáveis ​aleatórias individuais, é poss ível trabalhar com suas matrizes.

F unção Descrição
MathProbabilityDensityBinomial Calcula a densidade de probabilidade da
distribuição binomial

MathCumulativeDistributionBinomial Calcula o valor da função distribuição binomial


de probabilidades

MathQuantileBinomial Calcula o inverso da função de distribuição


binomial para a probabilidade especificada

MathR andomBinomial Gera um valor/matriz pseudo-aleatório de


valores pseudo-aleatórios de acordo com a
distribuição binomial

MathMoments Binomial Calcula os valores numéricos teóricos dos


primeiros 4 momentos da distribuição binomial

© 2000-2018, MetaQuotes Software Corp.


2175 Biblioteca Padrão

Exemplo:
#include <Graphics\Graphic.mqh>
#include <Math\Stat\Binomial.mqh>
#include <Math\Stat\Math.mqh>
#property script_show_inputs
//--- input parameters
input double n_par=40; // número de tentativas
input double p_par=0.75; // probabilidade de sucesso em cada tentativa
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- desativamos a exibição do gráfico de preço
ChartSetInteger(0,CHART_SHOW,false);
//--- inicializamos o gerador de números aleatórios
MathSrand(GetTickCount());
//--- geramos a amostragem da variável aleatória
long chart=0;
string name="GraphicNormal";
int n=1000000; // número de valores na amostragem
int ncells=20; // número de intervalos no gráfico de colunas
double x[]; // centros de intervalos no gráfico de colunas
double y[]; // número de valores a partir da amostragem dentro do intervalo
double data[]; // amostragem de valores aleatórios
double max,min; // valores máximo e mínimo na amostragem
//--- obtemos a amostragem a partir da distribuição binomial
MathRandomBinomial(n_par,p_par,n,data);
//--- calculamos os dados para plotagem do gráfico de colunas
CalculateHistogramArray(data,x,y,max,min,ncells);
//--- obtemos teoricamente os cálculos no intervalo [min,max]
double x2[];
double y2[];
MathSequence(0,n_par,1,x2);
MathProbabilityDensityBinomial(x2,n_par,p_par,false,y2);
//--- dimensionamos
double theor_max=y2[ArrayMaximum(y2)];
double sample_max=y[ArrayMaximum(y)];
double k=sample_max/theor_max;
for(int i=0; i<ncells; i++)
y[i]/=k;
//--- imprimimos o gráfico
CGraphic graphic;
if(ObjectFind(chart,name)<0)
graphic.Create(chart,name,0,0,0,780,380);
else
graphic.Attach(chart,name);
graphic.BackgroundMain(StringFormat("Binomial distributionn n=%G p=%G",n_par,p_par));

© 2000-2018, MetaQuotes Software Corp.


2176 Biblioteca Padrão

graphic.BackgroundMainSize(16);
//--- plot all curves
graphic.CurveAdd(x,y,CURVE_HISTOGRAM,"Sample").HistogramWidth(6);
//--- e agora traçamos a curva teórica de densidade da distribuição
graphic.CurveAdd(x2,y2,CURVE_LINES,"Theory").LinesSmooth(true);
graphic.CurvePlotAll();
//--- plot all curves
graphic.Update();
}
//+------------------------------------------------------------------+
//| Calculate frequencies for data set |
//+------------------------------------------------------------------+
bool CalculateHistogramArray(const double &data[],double &intervals[],double &frequency[],
double &maxv,double &minv,const int cells=10)
{
if(cells<=1) return (false);
int size=ArraySize(data);
if(size<cells*10) return (false);
minv=data[ArrayMinimum(data)];
maxv=data[ArrayMaximum(data)];
double range=maxv-minv;
double width=range/cells;
if(width==0) return false;
ArrayResize(intervals,cells);
ArrayResize(frequency,cells);
//--- definimos os centros dos intervalos
for(int i=0; i<cells; i++)
{
intervals[i]=minv+(i+0.5)*width;
frequency[i]=0;
}
//--- preenchemos a frequência de aparecimento no intervalo
for(int i=0; i<size; i++)
{
int ind=int((data[i]-minv)/width);
if(ind>=cells) ind=cells-1;
frequency[ind]++;
}
return (true);
}

© 2000-2018, MetaQuotes Software Corp.


2177 Biblioteca Padrão

MathProbabilityDensityBinomial
Calcula a função de probabilidade (probability mass function) da distribuição binomial com parâmetros
n e p para a variável aleatória x. Em caso de erro, retorna NaN.
double  MathProbabilityDensityBinomial(
const double  x, // valor da variável aleatória
const double  n, // parâmetro de distribuição (número de testes)
const double  p, // parâmetro de distribuição (probabilidade de sucesso para cada te
const bool   log_mode, // cálculo de logaritmo do valor, se log_mode=true, retorna o loga
int&  error_code  // variável para registro do código de erro
);

Calcula a função de probabilidade (probability mass function) da distribuição binomial com parâmetros
n e p para a variável aleatória x. Em caso de erro, retorna NaN.
double  MathProbabilityDensityBinomial(
const double  x, // valor da variável aleatória
const double  n, // parâmetro de distribuição (número de testes)
const double  p, // parâmetro de distribuição (probabilidade de sucesso para cada te
int&  error_code  // variável para registro do código de erro
);

Calcula a função de probabilidade (probability mass function) da distribuição binomial com parâmetros
n e p para a matriz das variáveis aleatórias x []. Em caso de erro, retorna false. Equivalente a
dbinom() no R .
bool  MathProbabilityDensityBinomial(
const double& x[], // matriz com valores da variável aleatória
const double  n, // parâmetro de distribuição (número de testes)
const double  p, // parâmetro de distribuição (probabilidade de sucesso para cada t
const bool   log_mode, // sinalizador de cálculo de logaritmo do valor, se log_mode=true,
double&  result[]  // matriz para o valor da função densidade de probabilidade
);

Calcula a função de probabilidade (probability mass function) da distribuição binomial com parâmetros
n e p para a matriz das variáveis aleatórias x []. Em caso de erro, retorna false.
bool  MathProbabilityDensityBinomial(
const double& x[], // matriz com valores da variável aleatória
const double  n, // parâmetro de distribuição (número de testes)
const double  p, // parâmetro de distribuição (probabilidade de sucesso para cada t
double&  result[]  // matriz para o valor da função densidade de probabilidade
);

Parâmetros
x
[in] Valor da variável aleatória.
x[]

© 2000-2018, MetaQuotes Software Corp.


2178 Biblioteca Padrão

[in] Matriz com valores da variável aleatória.


n
[in] Parâmetro de distribuição (número de testes).
p
[in] Parâmetro de distribuição (probabilidade de sucesso para cada teste).
log_mode
[in] Sinalizador de cálculo do algoritmo de um valor. Se log _mode=true, retorna o logaritmo
natural da função densidade de probabilidade.

error_code
[out] Variável para registro do código de erro.
result[]
[out] Matriz para os valores da função densidade de probabilidade.

© 2000-2018, MetaQuotes Software Corp.


2179 Biblioteca Padrão

MathCumulativeDistributionBinomial
Calcula a distribuição binomial de probabilidade com parâmetros n e p para a variável aleatória x. Em
caso de erro, retorna NaN.
double  MathCumulativeDistributionBinomial(
const double  x, // valor da variável aleatória
const double  n, // parâmetro de distribuição (número de testes)
const double  p, // parâmetro de distribuição (probabilidade de sucesso para cada te
const bool   tail, // sinalizador de cálculo, se for true, é calculada a probabilidade
const bool   log_mode, // sinalizador de cálculo de logaritmo do valor, se log_mode=true,
int&  error_code  // variável para registro do código de erro
);

Calcula a distribuição binomial de probabilidade com parâmetros n e p para a variável aleatória x. Em


caso de erro, retorna NaN.
double  MathCumulativeDistributionBinomial(
const double  x, // valor da variável aleatória
const double  n, // parâmetro de distribuição (número de testes)
const double  p, // parâmetro de distribuição (probabilidade de sucesso para cada te
int&  error_code  // variável para registro do código de erro
);

Calcula a distribuição binomial de probabilidade com parâmetros n e p para a matriz das variáveis
aleatórias x []. Em caso de erro, retorna false. Equivalente a pweibull() no R .
bool  MathCumulativeDistributionBinomial(
const double& x[], // matriz com valores da variável aleatória
const double  n, // parâmetro de distribuição (número de testes)
const double  p, // parâmetro de distribuição (probabilidade de sucesso para cada t
const bool   tail, // sinalizador de cálculo, se for true, é calculada a probabilidad
const bool   log_mode, // sinalizador de cálculo de logaritmo do valor, se log_mode=true,
double&  result[]  // matriz para valores da função de probabilidade
);

Calcula a distribuição binomial de probabilidade com parâmetros n e p para a matriz das variáveis
aleatórias x []. Em caso de erro, retorna false.
bool  MathCumulativeDistributionBinomial(
const double& x[], // matriz com valores da variável aleatória
const double  n, // parâmetro de distribuição (número de testes)
const double  p, // parâmetro de distribuição (probabilidade de sucesso para cada t
double&  result[]  // matriz para valores da função de probabilidade
);

Parâmetros
x
[in] Valor da variável aleatória.
x[]

© 2000-2018, MetaQuotes Software Corp.


2180 Biblioteca Padrão

[in] Matriz com valores da variável aleatória.


n
[in] Parâmetro de distribuição (número de testes).
p
[in] Parâmetro de distribuição (probabilidade de sucesso para cada teste).
tail
[in] Sinalizador de cálculo. Se for true, é calculada a probabilidade de que a variável aleatória não
será superior a x.

log_mode
[in] Sinalizador de cálculo do algoritmo de um valor. Se log _mode=true, retorna o logaritmo
natural da probabilidade.

error_code
[out] Variável para registro do código de erro.
result[]
[out] Matriz para valores da função de probabilidade.

© 2000-2018, MetaQuotes Software Corp.


2181 Biblioteca Padrão

MathQuantileBinomial
Calcula o inverso da função de distribuição binomial com parâmetros n e p para a probabilidade
probability. Em caso de erro, retorna NaN.

double  MathQuantileBinomial(
const double  probability, // valor da probabilidade de aparecimento de uma variável aleatóri
const double  n, // parâmetro de distribuição (número de testes)
const double  p, // parâmetro de distribuição (probabilidade de sucesso para cada t
const bool   tail, // sinalizador de cálculo, se for false, o cálculo será realizado
const bool   log_mode, // sinalizador de cálculo, se log_mode=true, o cálculo é realizado
int&  error_code  // variável para registro do código de erro
);

Calcula o inverso da função de distribuição binomial com parâmetros n e p para a probabilidade


probability. Em caso de erro, retorna NaN.

double  MathQuantileBinomial(
const double  probability, // valor da probabilidade de aparecimento de uma variável aleatóri
const double  n, // parâmetro de distribuição (número de testes)
const double  p, // parâmetro de distribuição (probabilidade de sucesso para cada t
int&  error_code  // variável para registro do código de erro
);

Calcula o inverso da função de distribuição binomial com parâmetros n e p para a matriz de valores da
probabilidade probability[]. Em caso de erro, retorna false. Equivalente a qbinom() no R .
double  MathQuantileBinomial(
const double& probability[], // matriz com valores de probabilidade da variável aleatória
const double  n, // parâmetro de distribuição (número de testes)
const double  p, // parâmetro de distribuição (probabilidade de sucesso para cada t
const bool   tail, // sinalizador de cálculo, se for false, o cálculo será realizado
const bool   log_mode, // sinalizador de cálculo, se log_mode=true, o cálculo é realizado
double&  result[]  // matriz com valores de quantis
);

Calcula o inverso da função de distribuição binomial com parâmetros n e p para a matriz de valores da
probabilidade probability[]. Em caso de erro, retorna false.
bool  MathQuantileBinomial(
const double& probability[], // matriz com valores de probabilidade da variável aleatória
const double  n, // parâmetro de distribuição (número de testes)
const double  p, // parâmetro de distribuição (probabilidade de sucesso para cada t
double&  result[]  // matriz com valores de quantis
);

Parâmetros
probability
[in] Valor da probabilidade da variável aleatória.
probability[]

© 2000-2018, MetaQuotes Software Corp.


2182 Biblioteca Padrão

[in] Matriz com valores da probabilidade da variável aleatória.


n
[in] Parâmetro de distribuição (número de testes).
p
[in] Parâmetro de distribuição (probabilidade de sucesso para cada teste).
tail
[in] Sinalizador de cálculo, se for false, o cálculo é realizado para a probabilidade 1.0 - probability.
log_mode
[in] Sinalizador de cálculo, se log _mode=true, o cálculo é realizado para a probabilidade
Exp(probability).

error_code
[out] Variável para obter o código de erro.
result[]
[out] Matriz com os valores dos quantis.

© 2000-2018, MetaQuotes Software Corp.


2183 Biblioteca Padrão

MathRandomBinomial
Gera um número pseudo-aleatório distribuído de acordo com a distribuição binomial com parâmetros n
e p. Em caso de erro, retorna NaN.
double  MathRandomBinomial(
const double  n, // parâmetro de distribuição (número de testes)
const double  p, // parâmetro de distribuição (probabilidade de sucesso para cada t
int&  error_code  // variável para registro do código de erro
);

Gera números pseudo-aleatórios distribuídos de acordo com a distribuição binomial com parâmetros n
e p. Em caso de erro, retorna false. Equivalente a rweibull() no R .
bool  MathRandomBinomial(
const double  n, // parâmetro de distribuição (número de testes)
const double  p, // parâmetro de distribuição (probabilidade de sucesso para cada t
const int   data_count, // número de dados necessários
double&  result[]  // matriz com os valores dos números pseudo-aleatórios
);

Parâmetros
n
[in] Parâmetro de distribuição (número de testes).
p
[in] Parâmetro de distribuição (probabilidade de sucesso para cada teste).
error_code
[out] Variável para registro do código de erro.
data_count
[out] Número de dados necessários.
result[]
[out] Matriz para obter os valores dos números pseudo-aleatórios.

© 2000-2018, MetaQuotes Software Corp.


2184 Biblioteca Padrão

MathMomentsBinomial
Calcula os valores numéricos teóricos dos primeiros 4 momentos da distribuição binomial com
parâmetros n e p.
double  MathMomentsBinomial(
const double  n, // parâmetro de distribuição (número de testes)
const double  p, // parâmetro de distribuição (probabilidade de sucesso para cada t
double&  mean, // variável para o valor médio
double&  variance, // variável para a dispersão
double&  skewness, // variável para a obliquidade
double&  kurtosis, // variável para a curtose
int&  error_code  // variável para o código de erro
);

Parâmetros
n
[in] Parâmetro de distribuição (número de testes).
p
[in] Parâmetro de distribuição (probabilidade de sucesso para cada teste).
mean
[out] Variável para obter o valor médio.
variance
[out] Variável para obter a dispersão.
skewness
[out] Variável para obter a obliquidade.
kurtosis
[out] Variável para obter a curtose.
error_code
[out] Variável para obter o código de erro.

Valor de retorno
Retorna true, se os momentos forem calculados com sucesso, caso contrário false.

© 2000-2018, MetaQuotes Software Corp.


2185 Biblioteca Padrão

Distribuição binomial negativa


Esta seção apresenta as funções para trabalhar com a distribuição binomial negativa. Elas permitem
que você calcule a densidade, probabilidade, quantis e gere números pseudo-aleatórios de acordo com
a distribuição binomial negativa. A distribuição binomial negativa é descrita pela seguinte fórmula:

Onde:
· x — valor da variável aleatória
· r— número de testes bem-sucedidos
· p — probabilidade de sucesso

Além do cálculo das variáveis ​aleatórias individuais, é poss ível trabalhar com suas matrizes.

F unção Descrição
MathProbabilityDensityNegativeBinomial Calcula a densidade de probabilidade da
distribuição binomial negativa

MathCumulativeDistributionNegativeBinomial Calcula o valor da função distribuição binomial


negativa de probabilidades

MathQuantileNegativeBinomial Calcula o inverso da função de distribuição


binomial negativa para a probabilidade
especificada

MathR andomNegativeBinomial Gera um valor/matriz pseudo-aleatório de


valores pseudo-aleatórios de acordo com a
distribuição binomial negativa

MathMoments NegativeBinomial Calcula os valores numéricos teóricos dos


primeiros 4 momentos da distribuição binomial

© 2000-2018, MetaQuotes Software Corp.


2186 Biblioteca Padrão

negativa

Exemplo:
#include <Graphics\Graphic.mqh>
#include <Math\Stat\NegativeBinomial.mqh>
#include <Math\Stat\Math.mqh>
#property script_show_inputs
//--- input parameters
input double n_par=40; // número de tentativas
input double p_par=0.75; // probabilidade de sucesso em cada tentativa
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- desativamos a exibição do gráfico de preço
ChartSetInteger(0,CHART_SHOW,false);
//--- inicializamos o gerador de números aleatórios
MathSrand(GetTickCount());
//--- geramos a amostragem da variável aleatória
long chart=0;
string name="GraphicNormal";
int n=1000000; // número de valores na amostragem
int ncells=19; // número de intervalos no gráfico de colunas
double x[]; // centros de intervalos no gráfico de colunas
double y[]; // número de valores a partir da amostragem dentro do intervalo
double data[]; // amostragem de valores aleatórios
double max,min; // valores máximo e mínimo na amostragem
//--- obtemos a amostragem a partir da distribuição binomial negativa
MathRandomNegativeBinomial(n_par,p_par,n,data);
//--- calculamos os dados para plotagem do gráfico de colunas
CalculateHistogramArray(data,x,y,max,min,ncells);
//--- obtemos teoricamente os cálculos no intervalo [min,max]
double x2[];
double y2[];
MathSequence(0,n_par,1,x2);
MathProbabilityDensityNegativeBinomial(x2,n_par,p_par,false,y2);
//--- dimensionamos
double theor_max=y2[ArrayMaximum(y2)];
double sample_max=y[ArrayMaximum(y)];
double k=sample_max/theor_max;
for(int i=0; i<ncells; i++)
y[i]/=k;
//--- imprimimos o gráfico
CGraphic graphic;
if(ObjectFind(chart,name)<0)
graphic.Create(chart,name,0,0,0,780,380);

© 2000-2018, MetaQuotes Software Corp.


2187 Biblioteca Padrão

else
graphic.Attach(chart,name);
graphic.BackgroundMain(StringFormat("Negative Binomial distributionn n=%G p=%G",n_par,p_par));
graphic.BackgroundMainSize(16);
//--- plot all curves
graphic.CurveAdd(x,y,CURVE_HISTOGRAM,"Sample").HistogramWidth(6);
//--- e agora traçamos a curva teórica de densidade da distribuição
graphic.CurveAdd(x2,y2,CURVE_LINES,"Theory").LinesSmooth(true);
graphic.CurvePlotAll();
//--- plot all curves
graphic.Update();
}
//+------------------------------------------------------------------+
//| Calculate frequencies for data set |
//+------------------------------------------------------------------+
bool CalculateHistogramArray(const double &data[],double &intervals[],double &frequency[],
double &maxv,double &minv,const int cells=10)
{
if(cells<=1) return (false);
int size=ArraySize(data);
if(size<cells*10) return (false);
minv=data[ArrayMinimum(data)];
maxv=data[ArrayMaximum(data)];
double range=maxv-minv;
double width=range/cells;
if(width==0) return false;
ArrayResize(intervals,cells);
ArrayResize(frequency,cells);
//--- definimos os centros dos intervalos
for(int i=0; i<cells; i++)
{
intervals[i]=minv+(i+0.5)*width;
frequency[i]=0;
}
//--- preenchemos a frequência de aparecimento no intervalo
for(int i=0; i<size; i++)
{
int ind=int((data[i]-minv)/width);
if(ind>=cells) ind=cells-1;
frequency[ind]++;
}
return (true);
}

© 2000-2018, MetaQuotes Software Corp.


2188 Biblioteca Padrão

MathProbabilityDensityNegativeBinomial
Calcula a função de probabilidade (probability mass function) da distribuição binomial negativa com
parâmetros r e p para a variável aleatória x. Em caso de erro, retorna NaN.
double  MathProbabilityDensityNegativeBinomial(
const double  x, // valor da variável aleatória (inteiro)
const double  r, // número de testes bem-sucedidos
const double  p, // probabilidade de sucesso
const bool   log_mode, // cálculo de logaritmo do valor, se log_mode=true, retorna o loga
int&  error_code  // variável para registro do código de erro
);

Calcula a função de probabilidade (probability mass function) da distribuição binomial negativa com
parâmetros r e p para a variável aleatória x. Em caso de erro, retorna NaN.
double  MathProbabilityDensityNegativeBinomial(
const double  x, // valor da variável aleatória (inteiro)
const double  r, // número de testes bem-sucedidos
const double  p, // probabilidade de sucesso
int&  error_code  // variável para registro do código de erro
);

Calcula a função de probabilidade (probability mass function) da distribuição binomial negativa com
parâmetros r e p para a matriz das variáveis aleatórias x []. Em caso de erro, retorna false.
Equivalente a dnbinom() no R .
bool  MathProbabilityDensityNegativeBinomial(
const double& x[], // matriz com valores da variável aleatória
const double  r, // número de testes bem-sucedidos
const double  p, // probabilidade de sucesso
const bool   log_mode, // sinalizador de cálculo de logaritmo do valor, se log_mode=true,
double&  result[]  // matriz para o valor da função densidade de probabilidade
);

Calcula a função de probabilidade (probability mass function) da distribuição binomial negativa com
parâmetros r e p para a matriz das variáveis aleatórias x []. Em caso de erro, retorna false.
bool  MathProbabilityDensityNegativeBinomial(
const double& x[], // matriz com valores da variável aleatória
const double  r, // número de testes bem-sucedidos
const double  p, // probabilidade de sucesso
double&  result[]  // matriz para o valor da função densidade de probabilidade
);

Parâmetros
x
[in] Valor da variável aleatória.
x[]

© 2000-2018, MetaQuotes Software Corp.


2189 Biblioteca Padrão

[in] Matriz com valores da variável aleatória.


r
[in] Número de testes bem-sucedidos
p
[in] Probabilidade de sucesso.
log_mode
[in] Sinalizador de cálculo do algoritmo de um valor. Se log _mode=true, retorna o logaritmo
natural da função densidade de probabilidade.

error_code
[out] Variável para registro do código de erro.
result[]
[out] Matriz para os valores da função densidade de probabilidade.

© 2000-2018, MetaQuotes Software Corp.


2190 Biblioteca Padrão

MathCumulativeDistributionNegativeBinomial
Calcula a distribuição binomial negativa de probabilidade com parâmetros r e p para a variável
aleatória x. Em caso de erro, retorna NaN.
double  MathCumulativeDistributionNegativeBinomial(
const double  x, // valor da variável aleatória (inteiro)
const double  r, // número de testes bem-sucedidos
const double  p, // probabilidade de sucesso
const double  tail, // sinalizador de cálculo, se for true, é calculada a probabilidade
const bool   log_mode, // sinalizador de cálculo de logaritmo do valor, se log_mode=true,
int&  error_code  // variável para registro do código de erro
);

Calcula a distribuição binomial negativa de probabilidade com parâmetros r e p para a variável


aleatória x. Em caso de erro, retorna NaN.
double  MathCumulativeDistributionNegativeBinomial(
const double  x, // valor da variável aleatória (inteiro)
const double  r, // número de testes bem-sucedidos
const double  p, // probabilidade de sucesso
int&  error_code  // variável para registro do código de erro
);

Calcula a distribuição binomial negativa de probabilidade com parâmetros r e p para a matriz das
variáveis aleatórias x []. Em caso de erro, retorna false. Equivalente a pweibull() no R .
bool  MathCumulativeDistributionNegativeBinomial(
const double& x[], // matriz com valores da variável aleatória
const double  r, // número de testes bem-sucedidos
const double  p, // probabilidade de sucesso
const double  tail, // sinalizador de cálculo, se for true, é calculada a probabilidad
const bool   log_mode, // sinalizador de cálculo de logaritmo do valor, se log_mode=true,
double&  result[]  // matriz para valores da função de probabilidade
);

Calcula a distribuição binomial negativa de probabilidade com parâmetros r e p para a matriz das
variáveis aleatórias x []. Em caso de erro, retorna false.
bool  MathCumulativeDistributionNegativeBinomial(
const double& x[], // matriz com valores da variável aleatória
const double  r, // número de testes bem-sucedidos
const double  p, // probabilidade de sucesso
double&  result[]  // matriz para valores da função de probabilidade
);

Parâmetros
x
[in] Valor da variável aleatória.
x[]

© 2000-2018, MetaQuotes Software Corp.


2191 Biblioteca Padrão

[in] Matriz com valores da variável aleatória.


r
[in] Número de testes bem-sucedidos.
p
[in] Probabilidade de sucesso.
tail
[in] Sinalizador de cálculo, se for true, é calculada a probabilidade de que a variável aleatória não
será superior a x.

log_mode
[in] Sinalizador de cálculo de logaritmo do valor, se log _mode=true, é retornado o valor do
logaritmo natural da probabilidade.

error_code
[out] Variável para registro do código de erro.
result[]
[out] Matriz para valores da função de probabilidade.

© 2000-2018, MetaQuotes Software Corp.


2192 Biblioteca Padrão

MathQuantileNegativeBinomial
Calcula o inverso da função de distribuição binomial negativa com parâmetros r e p para a
probabilidade probability. Em caso de erro, retorna NaN.
double  MathQuantileNegativeBinomial(
const double  probability, // valor da probabilidade de aparecimento de uma variável aleatóri
const double  r, // número de testes bem-sucedidos
const double  p, // probabilidade de sucesso
const bool   tail, // sinalizador de cálculo, se for false, o cálculo será realizado
const bool   log_mode, // sinalizador de cálculo, se log_mode=true, o cálculo é realizado
int&  error_code  // variável para registro do código de erro
);

Calcula o inverso da função de distribuição binomial negativa com parâmetros r e p para a


probabilidade probability. Em caso de erro, retorna NaN.
double  MathQuantileNegativeBinomial(
const double  probability, // valor da probabilidade de aparecimento de uma variável aleatóri
const double  r, // número de testes bem-sucedidos
const double  p, // probabilidade de sucesso
int&  error_code  // variável para registro do código de erro
);

Calcula o inverso da função de distribuição binomial negativa com parâmetros r e p para a matriz de
valores da probabilidade probability[]. Em caso de erro, retorna false. Equivalente a qnbinom() no R .
double  MathQuantileNegativeBinomial(
const double& probability[], // matriz com valores de probabilidade da variável aleatória
const double  r, // número de testes bem-sucedidos
const double  p, // probabilidade de sucesso
const bool   tail, // sinalizador de cálculo, se for false, o cálculo será realizado
const bool   log_mode, // sinalizador de cálculo, se log_mode=true, o cálculo é realizado
double&  result[]  // matriz com valores de quantis
);

Calcula o inverso da função de distribuição binomial negativa com parâmetros r e p para a matriz de
valores da probabilidade probability[]. Em caso de erro, retorna false.
bool  MathQuantileNegativeBinomial(
const double& probability[], // matriz com valores de probabilidade da variável aleatória
const double  r, // número de testes bem-sucedidos
const double  p, // probabilidade de sucesso
double&  result[]  // matriz com valores de quantis
);

Parâmetros
probability
[in] Valor da probabilidade da variável aleatória.
probability[]

© 2000-2018, MetaQuotes Software Corp.


2193 Biblioteca Padrão

[in] Matriz com valores da probabilidade da variável aleatória.


r
[in] Número de testes bem-sucedidos.
p
[in] Probabilidade de sucesso.
tail
[in] Sinalizador de cálculo, se for false, o cálculo é realizado para a probabilidade 1.0 - probability.
log_mode
[in] Sinalizador de cálculo, se log _mode=true, o cálculo é realizado para a probabilidade
Exp(probability).

error_code
[out] Variável para obter o código de erro.
result[]
[out] Matriz com os valores dos quantis.

© 2000-2018, MetaQuotes Software Corp.


2194 Biblioteca Padrão

MathRandomNegativeBinomial
Gera um número pseudo-aleatório distribuído de acordo com a distribuição binomial negativa com
parâmetros r e p. Em caso de erro, retorna NaN.
double  MathRandomNegativeBinomial(
const double  r, // número de testes bem-sucedidos
const double  p, // probabilidade de sucesso
int&  error_code  // variável para registro do código de erro
);

Gera números pseudo-aleatórios distribuídos de acordo com a distribuição binomial negativa com
parâmetros r e p. Em caso de erro, retorna false. Equivalente a rweibull() no R .
bool  MathRandomNegativeBinomial(
const double  r, // número de testes bem-sucedidos
const double  p, // probabilidade de sucesso
const int   data_count, // número de dados necessários
double&  result[]  // matriz com os valores dos números pseudo-aleatórios
);

Parâmetros
r
[in] Número de testes bem-sucedidos.
p
[in] Probabilidade de sucesso.
error_code
[out] Variável para registro do código de erro.
data_count
[out] Número de dados necessários.
result[]
[out] Matriz para obter os valores dos números pseudo-aleatórios.

© 2000-2018, MetaQuotes Software Corp.


2195 Biblioteca Padrão

MathMomentsNegativeBinomial
Calcula os valores numéricos teóricos dos primeiros 4 momentos da distribuição binomial negativa
com parâmetros r e p.
double  MathMomentsNegativeBinomial(
const double  r, // número de testes bem-sucedidos
const double  p, // probabilidade de sucesso
double&  mean, // variável para o valor médio
double&  variance, // variável para a dispersão
double&  skewness, // variável para a obliquidade
double&  kurtosis, // variável para a curtose
int&  error_code  // variável para o código de erro
);

Parâmetros
r
[in] Número de testes bem-sucedidos.
p
[in] Probabilidade de sucesso.
mean
[out] Variável para obter o valor médio.
variance
[out] Variável para obter a dispersão.
skewness
[out] Variável para obter a obliquidade.
kurtosis
[out] Variável para obter a curtose.
error_code
[out] Variável para obter o código de erro.

Valor de retorno
Retorna true, se os momentos forem calculados com sucesso, caso contrário false.

© 2000-2018, MetaQuotes Software Corp.


2196 Biblioteca Padrão

Distribuição geométrica
Esta seção apresenta as funções para trabalhar com a distribuição geométrica. Elas permitem que
você calcule a densidade, probabilidade, quantis e gere números pseudo-aleatórios de acordo com a
distribuição geométrica. A distribuição geométrica é descrita pela seguinte fórmula:

Onde:
· x — valor da variável aleatória (inteiro)
· p — probabilidade de evento em uma experiência

Além do cálculo das variáveis ​aleatórias individuais, é poss ível trabalhar com suas matrizes.

F unção Descrição
MathProbabilityDensityGeometric Calcula a densidade de probabilidade da
distribuição geométrica

MathCumulativeDistributionGeometric Calcula o valor da função distribuição


geométrica de probabilidades

MathQuantileGeometric Calcula o inverso da função de distribuição


geométrica para a probabilidade especificada

MathR andomGeometric Gera um valor/matriz pseudo-aleatório de


valores pseudo-aleatórios de acordo com a
distribuição geométrica

MathMoments Geometric Calcula os valores numéricos teóricos dos


primeiros 4 momentos da distribuição
geométrica

Exemplo:

© 2000-2018, MetaQuotes Software Corp.


2197 Biblioteca Padrão

#include <Graphics\Graphic.mqh>
#include <Math\Stat\Geometric.mqh>
#include <Math\Stat\Math.mqh>
#property script_show_inputs
//--- input parameters
input double p_par=0.2; // probabilidade de evento numa experiência
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- desativamos a exibição do gráfico de preço
ChartSetInteger(0,CHART_SHOW,false);
//--- inicializamos o gerador de números aleatórios
MathSrand(GetTickCount());
//--- geramos a amostragem da variável aleatória
long chart=0;
string name="GraphicNormal";
int n=1000000; // número de valores na amostragem
int ncells=47; // número de intervalos no gráfico de colunas
double x[]; // centros de intervalos no gráfico de colunas
double y[]; // número de valores a partir da amostragem dentro do intervalo
double data[]; // amostragem de valores aleatórios
double max,min; // valores máximo e mínimo na amostragem
//--- obtemos a amostragem a partir da distribuição geométrica
MathRandomGeometric(p_par,n,data);
//--- calculamos os dados para plotagem do gráfico de colunas
CalculateHistogramArray(data,x,y,max,min,ncells);
//--- obtemos os limites de sequência e passo para plotagem da curva teórica
double step;
GetMaxMinStepValues(max,min,step);
PrintFormat("max=%G min=%G",max,min);
//--- obtemos teoricamente os cálculos no intervalo [min,max]
double x2[];
double y2[];
MathSequence(0,ncells,1,x2);
MathProbabilityDensityGeometric(x2,p_par,false,y2);
//--- dimensionamos
double theor_max=y2[ArrayMaximum(y2)];
double sample_max=y[ArrayMaximum(y)];
double k=sample_max/theor_max;
for(int i=0; i<ncells; i++)
y[i]/=k;
//--- imprimimos o gráfico
CGraphic graphic;
if(ObjectFind(chart,name)<0)
graphic.Create(chart,name,0,0,0,780,380);
else
graphic.Attach(chart,name);

© 2000-2018, MetaQuotes Software Corp.


2198 Biblioteca Padrão

graphic.BackgroundMain(StringFormat("Geometric distribution p=%G",p_par));


graphic.BackgroundMainSize(16);
//--- desativamos o dimensionamento automático no eixo X
graphic.XAxis().AutoScale(false);
graphic.XAxis().Max(max);
graphic.XAxis().Min(min);
//--- plot all curves
graphic.CurveAdd(x,y,CURVE_HISTOGRAM,"Sample").HistogramWidth(6);
//--- e agora traçamos a curva teórica de densidade da distribuição
graphic.CurveAdd(x2,y2,CURVE_LINES,"Theory");
graphic.CurvePlotAll();
//--- plot all curves
graphic.Update();
}
//+------------------------------------------------------------------+
//| Calculate frequencies for data set |
//+------------------------------------------------------------------+
bool CalculateHistogramArray(const double &data[],double &intervals[],double &frequency[],
double &maxv,double &minv,const int cells=10)
{
if(cells<=1) return (false);
int size=ArraySize(data);
if(size<cells*10) return (false);
minv=data[ArrayMinimum(data)];
maxv=data[ArrayMaximum(data)];
double range=maxv-minv;
double width=range/cells;
if(width==0) return false;
ArrayResize(intervals,cells);
ArrayResize(frequency,cells);
//--- definimos os centros dos intervalos
for(int i=0; i<cells; i++)
{
intervals[i]=minv+i*width;
frequency[i]=0;
}
//--- preenchemos a frequência de aparecimento no intervalo
for(int i=0; i<size; i++)
{
int ind=int((data[i]-minv)/width);
if(ind>=cells) ind=cells-1;
frequency[ind]++;
}
return (true);
}
//+------------------------------------------------------------------+
//| Calculates values for sequence generation |
//+------------------------------------------------------------------+
void GetMaxMinStepValues(double &maxv,double &minv,double &stepv)

© 2000-2018, MetaQuotes Software Corp.


2199 Biblioteca Padrão

{
//--- calculamos a magnitude da sequência para obter a precisão da normalização
double range=MathAbs(maxv-minv);
int degree=(int)MathRound(MathLog10(range));
//--- normalizamos os valores máx. e mín. com a precisão
maxv=NormalizeDouble(maxv,degree);
minv=NormalizeDouble(minv,degree);
//--- definimos o passo de geração da mesma maneira a partir da precisão definida
stepv=NormalizeDouble(MathPow(10,-degree),degree);
if((maxv-minv)/stepv<10)
stepv/=10.;
}

© 2000-2018, MetaQuotes Software Corp.


2200 Biblioteca Padrão

MathProbabilityDensityGeometric
Calcula a função de probabilidade (probability mass function) da distribuição geométrica com
parâmetro p para a variável aleatória x. Em caso de erro, retorna NaN.
double  MathProbabilityDensityGeometric(
const double  x, // valor da variável aleatória (inteiro)
const double  p, // parâmetro de distribuição (probabilidade de evento em uma experi
const bool   log_mode, // cálculo de logaritmo do valor, se log_mode=true, retorna o loga
int&  error_code  // variável para registro do código de erro
);

Calcula a função de probabilidade (probability mass function) da distribuição geométrica com


parâmetro p para a variável aleatória x. Em caso de erro, retorna NaN.
double  MathProbabilityDensityGeometric(
const double  x, // valor da variável aleatória (inteiro)
const double  p, // parâmetro de distribuição (probabilidade de evento em uma experi
int&  error_code  // variável para registro do código de erro
);

Calcula a função de probabilidade (probability mass function) da distribuição geométrica com


parâmetro p para a matriz das variáveis aleatórias x []. Em caso de erro, retorna false. Equivalente a
dgeom() no R .
bool  MathProbabilityDensityGeometric(
const double& x[], // matriz com valores da variável aleatória
const double  p, // parâmetro de distribuição (probabilidade de evento em uma exper
const bool   log_mode, // sinalizador de cálculo de logaritmo do valor, se log_mode=true,
double&  result[]  // matriz para o valor da função densidade de probabilidade
);

Calcula a função de probabilidade (probability mass function) da distribuição geométrica com


parâmetro p para a matriz das variáveis aleatórias x []. Em caso de erro, retorna false.
bool  MathProbabilityDensityGeometric(
const double& x[], // matriz com valores da variável aleatória
const double  p, // parâmetro de distribuição (probabilidade de evento em uma exper
double&  result[]  // matriz para o valor da função densidade de probabilidade
);

Parâmetros
x
[in] Valor da variável aleatória.
x[]
[in] Matriz com valores da variável aleatória.
p
[in] Parâmetro de distribuição (probabilidade de evento em uma experiência).
log_mode

© 2000-2018, MetaQuotes Software Corp.


2201 Biblioteca Padrão

[in] Sinalizador de cálculo do algoritmo de um valor. Se log _mode=true, retorna o logaritmo


natural da função densidade de probabilidade.

error_code
[out] Variável para registro do código de erro.
result[]
[out] Matriz para os valores da função densidade de probabilidade.

© 2000-2018, MetaQuotes Software Corp.


2202 Biblioteca Padrão

MathCumulativeDistributionGeometric
Calcula a função distribuição geométrica com parâmetro p para a variável aleatória x. Em caso de
erro, retorna NaN.
double  MathCumulativeDistributionGeometric(
const double  x, // valor da variável aleatória (inteiro)
const double  p, // parâmetro de distribuição (probabilidade de evento em uma experi
const double  tail, // sinalizador de cálculo, se for true, é calculada a probabilidade
const bool   log_mode, // sinalizador de cálculo de logaritmo do valor, se log_mode=true,
int&  error_code  // variável para registro do código de erro
);

Calcula a função distribuição geométrica com parâmetro p para a variável aleatória x. Em caso de
erro, retorna NaN.
double  MathCumulativeDistributionGeometric(
const double  x, // valor da variável aleatória (inteiro)
const double  p, // parâmetro de distribuição (probabilidade de evento em uma experi
int&  error_code  // variável para registro do código de erro
);

Calcula a função distribuição geométrica com parâmetro p para a matriz das variáveis aleatórias x [].
Em caso de erro, retorna false. Equivalente a pgeom() no R .
bool  MathCumulativeDistributionGeometric(
const double& x[], // matriz com valores da variável aleatória
const double  p, // parâmetro de distribuição (probabilidade de evento em uma exper
const double  tail, // sinalizador de cálculo, se for true, é calculada a probabilidad
const bool   log_mode, // sinalizador de cálculo de logaritmo do valor, se log_mode=true,
double&  result[]  // matriz para valores da função de probabilidade
);

Calcula a função distribuição geométrica com parâmetro p para a matriz das variáveis aleatórias x [].
Em caso de erro, retorna false.
bool  MathCumulativeDistributionGeometric(
const double& x[], // matriz com valores da variável aleatória
const double  p, // parâmetro de distribuição (probabilidade de evento em uma exper
double&  result[]  // matriz para valores da função de probabilidade
);

Parâmetros
x
[in] Valor da variável aleatória.
x[]
[in] Matriz com valores da variável aleatória.
p
[in] Parâmetro de distribuição (probabilidade de evento em uma experiência).

© 2000-2018, MetaQuotes Software Corp.


2203 Biblioteca Padrão

tail
[in] Sinalizador de cálculo, se tail=true, é calculada a probabilidade de que a variável aleatória não
será superior a x.

log_mode
[in] Sinalizador de cálculo de logaritmo do valor, se log _mode=true, é retornado o logaritmo
natural da probabilidade.

error_code
[out] Variável para registro do código de erro.
result[]
[out] Matriz para valores da função de probabilidade.

© 2000-2018, MetaQuotes Software Corp.


2204 Biblioteca Padrão

MathQuantileGeometric
Calcula o inverso da função de distribuição geométrica com parâmetro p para a probabilidade
probability. Em caso de erro, retorna NaN.

double  MathQuantileGeometric(
const double  probability, // valor da probabilidade de aparecimento de uma variável aleatóri
const double  p, // parâmetro de distribuição (probabilidade de evento em uma exper
const bool   tail, // sinalizador de cálculo, se for false, o cálculo será realizado
const bool   log_mode, // sinalizador de cálculo, se log_mode=true, o cálculo é realizado
int&  error_code  // variável para registro do código de erro
);

Calcula o inverso da função de distribuição geométrica com parâmetro p para a probabilidade


probability. Em caso de erro, retorna NaN.

double  MathQuantileGeometric(
const double  probability, // valor da probabilidade de aparecimento de uma variável aleatóri
const double  p, // parâmetro de distribuição (probabilidade de evento em uma exper
int&  error_code  // variável para registro do código de erro
);

Calcula o inverso da função de distribuição geométrica com parâmetro p para a matriz de valores da
probabilidade probability[]. Em caso de erro, retorna false. Equivalente a qgeom() no R .
double  MathQuantileGeometric(
const double& probability[], // matriz com valores de probabilidade da variável aleatória
const double  p, // parâmetro de distribuição (probabilidade de evento em uma exper
const bool   tail, // sinalizador de cálculo, se for false, o cálculo será realizado
const bool   log_mode, // sinalizador de cálculo, se log_mode=true, o cálculo é realizado
double&  result[]  // matriz com valores de quantis
);

Calcula o inverso da função de distribuição geométrica com parâmetro p para a matriz de valores da
probabilidade probability[]. Em caso de erro, retorna false.
bool  MathQuantileGeometric(
const double& probability[], // matriz com valores de probabilidade da variável aleatória
const double  p, // parâmetro de distribuição (probabilidade de evento em uma exper
double&  result[]  // matriz com valores de quantis
);

Parâmetros
probability
[in] Valor da probabilidade da variável aleatória.
probability[]
[in] Matriz com valores da probabilidade da variável aleatória.
p
[in] Parâmetro de distribuição (probabilidade de evento em uma experiência).

© 2000-2018, MetaQuotes Software Corp.


2205 Biblioteca Padrão

tail
[in] Sinalizador de cálculo, se for false, o cálculo é realizado para a probabilidade 1.0 - probability.
log_mode
[in] Sinalizador de cálculo, se log _mode=true, o cálculo é realizado para a probabilidade
Exp(probability).

error_code
[out] Variável para obter o código de erro.
result[]
[out] Matriz com os valores dos quantis.

© 2000-2018, MetaQuotes Software Corp.


2206 Biblioteca Padrão

MathRandomGeometric
Gera um número pseudo-aleatório distribuído de acordo com a distribuição geométrica com parâmetro
p. Em caso de erro, retorna NaN.
double  MathRandomGeometric(
const double  p, // parâmetro de distribuição (probabilidade de evento em uma exper
int&  error_code  // variável para registro do código de erro
);

Gera números pseudo-aleatórios distribuídos de acordo com a distribuição geométrica com parâmetro
p. Em caso de erro, retorna false. Equivalente a rgeom() no R .
bool  MathRandomGeometric(
const double  p, // parâmetro de distribuição (probabilidade de evento em uma exper
const int   data_count, // número de dados necessários
double&  result[]  // matriz com os valores dos números pseudo-aleatórios
);

Parâmetros
p
[in] Parâmetro de distribuição (probabilidade de evento em uma experiência).
error_code
[out] Variável para registro do código de erro.
data_count
[out] Número de dados necessários.
result[]
[out] Matriz para obter os valores dos números pseudo-aleatórios.

© 2000-2018, MetaQuotes Software Corp.


2207 Biblioteca Padrão

MathMomentsGeometric
Calcula os valores numéricos teóricos dos primeiros 4 momentos da distribuição geométrica com
parâmetro p.
double  MathMomentsGeometric(
const double  p, // parâmetro de distribuição (probabilidade de evento em uma exper
double&  mean, // variável para o valor médio
double&  variance, // variável para a dispersão
double&  skewness, // variável para a obliquidade
double&  kurtosis, // variável para a curtose
int&  error_code  // variável para o código de erro
);

Parâmetros
p
[in] Parâmetro de distribuição (probabilidade de evento em uma experiência).
mean
[out] Variável para obter o valor médio.
variance
[out] Variável para obter a dispersão.
skewness
[out] Variável para obter a obliquidade.
kurtosis
[out] Variável para obter a curtose.
error_code
[out] Variável para obter o código de erro.

Valor de retorno
Retorna true, se os momentos forem calculados com sucesso, caso contrário false.

© 2000-2018, MetaQuotes Software Corp.


2208 Biblioteca Padrão

Distribuição hipergeométrica
Esta seção apresenta as funções para trabalhar com a distribuição hipergeométrica. Elas permitem
que você calcule a densidade, probabilidade, quantis e gere números pseudo-aleatórios de acordo com
a distribuição hipergeométrica. A distribuição hipergeométrica é descrita pela seguinte fórmula:

Onde:
· x — valor da variável aleatória (inteiro)
· m — número total de objetos
· k — número de objetos com a caraterística desejada
· n — número de objetos tomados

Além do cálculo das variáveis ​aleatórias individuais, é poss ível trabalhar com suas matrizes.

F unção Descrição
MathProbabilityDensityHypergeometric Calcula a densidade de probabilidade da
distribuição hipergeométrica

MathCumulativeDistributionHypergeometric Calcula o valor da função distribuição


hipergeométrica de probabilidades
MathQuantileHypergeometric Calcula o inverso da função de distribuição
hipergeométrica para a probabilidade
especificada

MathR andomHypergeometric Gera um valor/matriz pseudo-aleatório de


valores pseudo-aleatórios de acordo com a

© 2000-2018, MetaQuotes Software Corp.


2209 Biblioteca Padrão

distribuição hipergeométrica

MathMoments Hypergeometric Calcula os valores numéricos teóricos dos


primeiros 4 momentos da distribuição
hipergeométrica

Exemplo:
#include <Graphics\Graphic.mqh>
#include <Math\Stat\Hypergeometric.mqh>
#include <Math\Stat\Math.mqh>
#property script_show_inputs
//--- input parameters
input double m_par=60; // número total de objetos
input double k_par=30; // número de objetos com a caraterística desejada
input double n_par=30; // número de objetos tomados
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- desativamos a exibição do gráfico de preço
ChartSetInteger(0,CHART_SHOW,false);
//--- inicializamos o gerador de números aleatórios
MathSrand(GetTickCount());
//--- geramos a amostragem da variável aleatória
long chart=0;
string name="GraphicNormal";
int n=1000000; // número de valores na amostragem
int ncells=15; // número de intervalos no gráfico de colunas
double x[]; // centros de intervalos no gráfico de colunas
double y[]; // número de valores a partir da amostragem dentro do intervalo
double data[]; // amostragem de valores aleatórios
double max,min; // valores máximo e mínimo na amostragem
//--- obtemos a amostragem a partir da distribuição hipergeométrica
MathRandomHypergeometric(m_par,k_par,n_par,n,data);
//--- calculamos os dados para plotagem do gráfico de colunas
CalculateHistogramArray(data,x,y,max,min,ncells);
//--- obtemos os limites de sequência e passo para plotagem da curva teórica
double step;
GetMaxMinStepValues(max,min,step);
PrintFormat("max=%G min=%G",max,min);
//--- obtemos teoricamente os cálculos no intervalo [min,max]
double x2[];
double y2[];
MathSequence(0,n_par,1,x2);
MathProbabilityDensityHypergeometric(x2,m_par,k_par,n_par,false,y2);
//--- dimensionamos
double theor_max=y2[ArrayMaximum(y2)];

© 2000-2018, MetaQuotes Software Corp.


2210 Biblioteca Padrão

double sample_max=y[ArrayMaximum(y)];
double k=sample_max/theor_max;
for(int i=0; i<ncells; i++)
y[i]/=k;
//--- imprimimos o gráfico
CGraphic graphic;
if(ObjectFind(chart,name)<0)
graphic.Create(chart,name,0,0,0,780,380);
else
graphic.Attach(chart,name);
graphic.BackgroundMain(StringFormat("Hypergeometric distribution m=%G k=%G n=%G",m_par,k_par,n_p
graphic.BackgroundMainSize(16);
//--- plot all curves
graphic.CurveAdd(x,y,CURVE_HISTOGRAM,"Sample").HistogramWidth(6);
//--- e agora traçamos a curva teórica de densidade da distribuição
graphic.CurveAdd(x2,y2,CURVE_LINES,"Theory").LinesSmooth(true);
graphic.CurvePlotAll();
//--- plot all curves
graphic.Update();
}
//+------------------------------------------------------------------+
//| Calculate frequencies for data set |
//+------------------------------------------------------------------+
bool CalculateHistogramArray(const double &data[],double &intervals[],double &frequency[],
double &maxv,double &minv,const int cells=10)
{
if(cells<=1) return (false);
int size=ArraySize(data);
if(size<cells*10) return (false);
minv=data[ArrayMinimum(data)];
maxv=data[ArrayMaximum(data)];
double range=maxv-minv;
double width=range/cells;
if(width==0) return false;
ArrayResize(intervals,cells);
ArrayResize(frequency,cells);
//--- definimos os centros dos intervalos
for(int i=0; i<cells; i++)
{
intervals[i]=minv+(i+0.5)*width;
frequency[i]=0;
}
//--- preenchemos a frequência de aparecimento no intervalo
for(int i=0; i<size; i++)
{
int ind=int((data[i]-minv)/width);
if(ind>=cells) ind=cells-1;
frequency[ind]++;
}

© 2000-2018, MetaQuotes Software Corp.


2211 Biblioteca Padrão

return (true);
}
//+------------------------------------------------------------------+
//| Calculates values for sequence generation |
//+------------------------------------------------------------------+
void GetMaxMinStepValues(double &maxv,double &minv,double &stepv)
{
//--- calculamos a magnitude da sequência para obter a precisão da normalização
double range=MathAbs(maxv-minv);
int degree=(int)MathRound(MathLog10(range));
//--- normalizamos os valores máx. e mín. com a precisão
maxv=NormalizeDouble(maxv,degree);
minv=NormalizeDouble(minv,degree);
//--- definimos o passo de geração da mesma maneira a partir da precisão definida
stepv=NormalizeDouble(MathPow(10,-degree),degree);
if((maxv-minv)/stepv<10)
stepv/=10.;
}

© 2000-2018, MetaQuotes Software Corp.


2212 Biblioteca Padrão

MathProbabilityDensityHypergeometric
Calcula a função de probabilidade (probability mass function) da distribuição hipergeométrica com
parâmetros m, k e n para a variável aleatória x. Em caso de erro, retorna NaN.
double  MathProbabilityDensityHypergeometric(
const double  x, // valor da variável aleatória (inteiro)
const double  m, // número total de objetos (inteiro)
const double  k, // número de objetos com a caraterística desejada (inteiro)
const double  n, // número de objetos tomados (inteiro)
const bool   log_mode, // cálculo de logaritmo do valor, se log_mode=true, retorna o loga
int&  error_code  // variável para registro do código de erro
);

Calcula a função de probabilidade (probability mass function) da distribuição hipergeométrica com


parâmetros m, k e n para a variável aleatória x. Em caso de erro, retorna NaN.
double  MathProbabilityDensityHypergeometric(
const double  x, // valor da variável aleatória (inteiro)
const double  m, // número total de objetos (inteiro)
const double  k, // número de objetos com a caraterística desejada (inteiro)
const double  n, // número de objetos tomados (inteiro)
int&  error_code  // variável para registro do código de erro
);

Calcula a função de probabilidade (probability mass function) da distribuição hipergeométrica com


parâmetros m, k e n para a matriz das variáveis aleatórias x []. Em caso de erro, retorna false.
Equivalente a dhyper() no R .
bool  MathProbabilityDensityHypergeometric(
const double& x[], // matriz com valores da variável aleatória
const double  m, // número total de objetos (inteiro)
const double  k, // número de objetos com a caraterística desejada (inteiro)
const double  n, // número de objetos tomados (inteiro)
const bool   log_mode, // sinalizador de cálculo de logaritmo do valor, se log_mode=true,
double&  result[]  // matriz para o valor da função densidade de probabilidade
);

Calcula a função de probabilidade (probability mass function) da distribuição hipergeométrica com


parâmetros m, k e n para a matriz das variáveis aleatórias x []. Em caso de erro, retorna false.
bool  MathProbabilityDensityHypergeometric(
const double& x[], // matriz com valores da variável aleatória
const double  m, // número total de objetos (inteiro)
const double  k, // número de objetos com a caraterística desejada (inteiro)
const double  n, // número de objetos tomados (inteiro)
double&  result[]  // matriz para o valor da função densidade de probabilidade
);

Parâmetros

© 2000-2018, MetaQuotes Software Corp.


2213 Biblioteca Padrão

x
[in] Valor da variável aleatória.
x[]
[in] Matriz com valores da variável aleatória.
m
[in] Número total de objetos (inteiro).
k
[in] Número de objetos com a caraterística desejada (inteiro)
n
[in] Número de objetos tomados (inteiro)
log_mode
[in] Sinalizador de cálculo do algoritmo de um valor. Se log _mode=true, retorna o logaritmo
natural da função densidade de probabilidade.

error_code
[out] Variável para registro do código de erro.
result[]
[out] Matriz para os valores da função densidade de probabilidade.

© 2000-2018, MetaQuotes Software Corp.


2214 Biblioteca Padrão

MathCumulativeDistributionHypergeometric
Calcula a função distribuição hipergeométrica com parâmetros m, k e n para a variável aleatória x. Em
caso de erro, retorna NaN.
double  MathCumulativeDistributionHypergeometric(
const double  x, // valor da variável aleatória (inteiro)
const double  m, // número total de objetos (inteiro)
const double  k, // número de objetos com a caraterística desejada (inteiro)
const double  n, // número de objetos tomados (inteiro)
const double  tail, // sinalizador de cálculo, se for true, é calculada a probabilidade
const bool   log_mode, // sinalizador de cálculo de logaritmo do valor, se log_mode=true,
int&  error_code  // variável para registro do código de erro
);

Calcula a função distribuição hipergeométrica com parâmetros m, k e n para a variável aleatória x. Em


caso de erro, retorna NaN.
double  MathCumulativeDistributionHypergeometric(
const double  x, // valor da variável aleatória (inteiro)
const double  m, // número total de objetos (inteiro)
const double  k, // número de objetos com a caraterística desejada (inteiro)
const double  n, // número de objetos tomados (inteiro)
int&  error_code  // variável para registro do código de erro
);

Calcula a função distribuição hipergeométrica com parâmetros m, k e n para a matriz das variáveis
aleatórias x []. Em caso de erro, retorna false. Equivalente a dhyper() no R .
bool  MathCumulativeDistributionHypergeometric(
const double& x[], // matriz com valores da variável aleatória
const double  m, // número total de objetos (inteiro)
const double  k, // número de objetos com a caraterística desejada (inteiro)
const double  n, // número de objetos tomados (inteiro)
const double  tail, // sinalizador de cálculo, se for true, é calculada a probabilidad
const bool   log_mode, // sinalizador de cálculo de logaritmo do valor, se log_mode=true,
double&  result[]  // matriz para os valores da função de distribuição
);

Calcula a função distribuição hipergeométrica com parâmetros m, k e n para a matriz das variáveis
aleatórias x []. Em caso de erro, retorna false.
bool  MathCumulativeDistributionHypergeometric(
const double& x[], // matriz com valores da variável aleatória
const double  m, // número total de objetos (inteiro)
const double  k, // número de objetos com a caraterística desejada (inteiro)
const double  n, // número de objetos tomados (inteiro)
double&  result[]  // matriz para os valores da função de distribuição
);

© 2000-2018, MetaQuotes Software Corp.


2215 Biblioteca Padrão

Parâmetros
x
[in] Valor da variável aleatória.
x[]
[in] Matriz com valores da variável aleatória.
m
[in] Número total de objetos (inteiro).
k
[in] Número de objetos com a caraterística desejada (inteiro)
n
[in] Número de objetos tomados (inteiro)
tail
[in] Sinalizador de cálculo, se for true, é calculada a probabilidade de que a variável aleatória não
será superior a x.

log_mode
[in] Sinalizador de cálculo de logaritmo do valor, se log _mode=true, é retornado o valor do
logaritmo natural da probabilidade.

error_code
[out] Variável para registro do código de erro.
result[]
[out] Matriz para os valores da função de distribuição.

© 2000-2018, MetaQuotes Software Corp.


2216 Biblioteca Padrão

MathQuantileHypergeometric
Calcula o inverso da função de distribuição hipergeométrica com parâmetros m, k e n para a
probabilidade probability. Em caso de erro, retorna NaN.
double  MathQuantileHypergeometric(
const double  probability, // valor da probabilidade de aparecimento de uma variável aleatóri
const double  m, // número total de objetos (inteiro)
const double  k, // número de objetos com a caraterística desejada (inteiro)
const double  n, // número de objetos tomados (inteiro)
const bool   tail, // sinalizador de cálculo, se for false, o cálculo será realizado
const bool   log_mode, // sinalizador de cálculo, se log_mode=true, o cálculo é realizado
int&  error_code  // variável para registro do código de erro
);

Calcula o inverso da função de distribuição hipergeométrica com parâmetros m, k e n para a


probabilidade probability. Em caso de erro, retorna NaN.
double  MathQuantileHypergeometric(
const double  probability, // valor da probabilidade de aparecimento de uma variável aleatóri
const double  m, // número total de objetos (inteiro)
const double  k, // número de objetos com a caraterística desejada (inteiro)
const double  n, // número de objetos tomados (inteiro)
int&  error_code  // variável para registro do código de erro
);

Calcula o inverso da função de distribuição hipergeométrica com parâmetros m, k e n para a matriz de


valores da probabilidade probability[]. Em caso de erro, retorna false. Equivalente a qhyper() no R .
double  MathQuantileHypergeometric(
const double& probability[], // matriz com valores de probabilidade da variável aleatória
const double  m, // número total de objetos (inteiro)
const double  k, // número de objetos com a caraterística desejada (inteiro)
const double  n, // número de objetos tomados (inteiro)
const bool   tail, // sinalizador de cálculo, se for false, o cálculo será realizado
const bool   log_mode, // sinalizador de cálculo, se log_mode=true, o cálculo é realizado
double&  result[]  // matriz com valores de quantis
);

Calcula o inverso da função de distribuição hipergeométrica com parâmetros m, k e n para a matriz de


valores da probabilidade probability[]. Em caso de erro, retorna false.
bool  MathQuantileHypergeometric(
const double& probability[], // matriz com valores de probabilidade da variável aleatória
const double  m, // número total de objetos (inteiro)
const double  k, // número de objetos com a caraterística desejada (inteiro)
const double  n, // número de objetos tomados (inteiro)
double&  result[]  // matriz com valores de quantis
);

© 2000-2018, MetaQuotes Software Corp.


2217 Biblioteca Padrão

Parâmetros
probability
[in] Valor da probabilidade da variável aleatória.
probability[]
[in] Matriz com valores da probabilidade da variável aleatória.
m
[in] Número total de objetos (inteiro).
k
[in] Número de objetos com a caraterística desejada (inteiro)
n
[in] Número de objetos tomados (inteiro)
tail
[in] Sinalizador de cálculo, se tail=false, o cálculo é realizado para a probabilidade 1.0 -
probability.

log_mode
[in] Sinalizador de cálculo, se log _mode=true, o cálculo é realizado para a probabilidade
Exp(probability).

error_code
[out] Variável para obter o código de erro.
result[]
[out] Matriz com os valores dos quantis.

© 2000-2018, MetaQuotes Software Corp.


2218 Biblioteca Padrão

MathRandomHypergeometric
Gera um número pseudo-aleatório distribuído de acordo com a distribuição hipergeométrica com
parâmetros m, n e k . Em caso de erro, retorna NaN.
double  MathRandomHypergeometric(
const double  m, // número total de objetos (inteiro)
const double  k, // número de objetos com a caraterística desejada (inteiro)
const double  n, // número de objetos tomados (inteiro)
int&  error_code  // variável para registro do código de erro
);

Gera números pseudo-aleatórios distribuídos de acordo com a distribuição hipergeométrica com


parâmetros m, n e k . Em caso de erro, retorna false. Equivalente a rgeom() no R .
bool  MathRandomHypergeometric(
const double  m, // número total de objetos (inteiro)
const double  k, // número de objetos com a caraterística desejada (inteiro)
const double  n, // número de objetos tomados (inteiro)
const int   data_count, // número de dados necessários
double&  result[]  // matriz com os valores dos números pseudo-aleatórios
);

Parâmetros
m
[in] Número total de objetos (inteiro).
k
[in] Número de objetos com a caraterística desejada (inteiro)
n
[in] Número de objetos tomados (inteiro)
error_code
[out] Variável para registro do código de erro.
data_count
[out] Número de dados necessários.
result[]
[out] Matriz para obter os valores dos números pseudo-aleatórios.

© 2000-2018, MetaQuotes Software Corp.


2219 Biblioteca Padrão

MathMomentsHypergeometric
Calcula os valores numéricos teóricos dos primeiros 4 momentos da distribuição hipergeométrica com
parâmetros m, n e k .
double  MathMomentsHypergeometric(
const double  m, // número total de objetos (inteiro)
const double  k, // número de objetos com a caraterística desejada (inteiro)
const double  n, // número de objetos tomados (inteiro)
double&  mean, // variável para o valor médio
double&  variance, // variável para a dispersão
double&  skewness, // variável para a obliquidade
double&  kurtosis, // variável para a curtose
int&  error_code  // variável para o código de erro
);

Parâmetros
m
[in] Número total de objetos (inteiro).
k
[in] Número de objetos com a caraterística desejada (inteiro)
n
[in] Número de objetos tomados (inteiro)
mean
[out] Variável para obter o valor médio.
variance
[out] Variável para obter a dispersão.
skewness
[out] Variável para obter a obliquidade.
kurtosis
[out] Variável para obter a curtose.
error_code
[out] Variável para obter o código de erro.

Valor de retorno
Retorna true, se os momentos forem calculados com sucesso, caso contrário false.

© 2000-2018, MetaQuotes Software Corp.


2220 Biblioteca Padrão

Distribuição de Poisson
Esta seção contém funções para trabalhar com a distribuição de Poisson. Elas permitem que você
calcule a densidade, probabilidade, quantis e gere números pseudo-aleatórios de acordo com a
distribuição de Poisson. A distribuição de Poisson é descrita pela seguinte fórmula:

Onde:
· x — valor da variável aleatória
· l — parâmetro de distribuição (mean)

Além do cálculo das variáveis ​aleatórias individuais, é poss ível trabalhar com suas matrizes.

F unção Descrição
MathProbabilityDensityPoisson Calcula a densidade de probabilidade da
distribuição de Poisson

MathCumulativeDistributionPoisson Calcula o valor da função distribuição de


Poisson de probabilidades
MathQuantilePoisson Calcula o inverso da função de distribuição de
Poisson para a probabilidade especificada
MathR andomPoisson Gera um valor/matriz pseudo-aleatório de
valores pseudo-aleatórios de acordo com a
distribuição de Poisson

MathMoments Poisson Calcula os valores numéricos teóricos dos


primeiros 4 momentos da distribuição de
Poisson

© 2000-2018, MetaQuotes Software Corp.


2221 Biblioteca Padrão

Exemplo:
#include <Graphics\Graphic.mqh>
#include <Math\Stat\Poisson.mqh>
#include <Math\Stat\Math.mqh>
#property script_show_inputs
//--- input parameters
input double lambda_par=10; // parâmetro de distribuição (mean)
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- desativamos a exibição do gráfico de preço
ChartSetInteger(0,CHART_SHOW,false);
//--- inicializamos o gerador de números aleatórios
MathSrand(GetTickCount());
//--- geramos a amostragem da variável aleatória
long chart=0;
string name="GraphicNormal";
int n=100000; // número de valores na amostragem
int ncells=13; // número de intervalos no gráfico de colunas
double x[]; // centros de intervalos no gráfico de colunas
double y[]; // número de valores a partir da amostragem dentro do intervalo
double data[]; // amostragem de valores aleatórios
double max,min; // valores máximo e mínimo na amostragem
//--- obtemos a amostragem a partir da distribuição de Poisson
MathRandomPoisson(lambda_par,n,data);
//--- calculamos os dados para plotagem do gráfico de colunas
CalculateHistogramArray(data,x,y,max,min,ncells);
//--- obtemos os limites de sequência e passo para plotagem da curva teórica
double step;
GetMaxMinStepValues(max,min,step);
PrintFormat("max=%G min=%G",max,min);
//--- obtemos teoricamente os cálculos no intervalo [min,max]
double x2[];
double y2[];
MathSequence(0,int(MathCeil(max)),1,x2);
MathProbabilityDensityPoisson(x2,lambda_par,false,y2);
//--- dimensionamos
double theor_max=y2[ArrayMaximum(y2)];
double sample_max=y[ArrayMaximum(y)];
double k=sample_max/theor_max;
for(int i=0; i<ncells; i++)
y[i]/=k;
//--- imprimimos o gráfico
CGraphic graphic;
if(ObjectFind(chart,name)<0)
graphic.Create(chart,name,0,0,0,780,380);

© 2000-2018, MetaQuotes Software Corp.


2222 Biblioteca Padrão

else
graphic.Attach(chart,name);
graphic.BackgroundMain(StringFormat("Poisson distribution lambda=%G",lambda_par));
graphic.BackgroundMainSize(16);
//--- desativamos o dimensionamento automático no eixo Y
graphic.YAxis().AutoScale(false);
graphic.YAxis().Max(NormalizeDouble(theor_max,2));
graphic.YAxis().Min(0);
//--- plot all curves
graphic.CurveAdd(x,y,CURVE_HISTOGRAM,"Sample").HistogramWidth(6);
//--- e agora traçamos a curva teórica de densidade da distribuição
graphic.CurveAdd(x2,y2,CURVE_LINES,"Theory").LinesSmooth(true);
graphic.CurvePlotAll();
//--- plot all curves
graphic.Update();
}
//+------------------------------------------------------------------+
//| Calculate frequencies for data set |
//+------------------------------------------------------------------+
bool CalculateHistogramArray(const double &data[],double &intervals[],double &frequency[],
double &maxv,double &minv,const int cells=10)
{
if(cells<=1) return (false);
int size=ArraySize(data);
if(size<cells*10) return (false);
minv=data[ArrayMinimum(data)];
maxv=data[ArrayMaximum(data)];
double range=maxv-minv;
double width=range/cells;
if(width==0) return false;
ArrayResize(intervals,cells);
ArrayResize(frequency,cells);
//--- definimos os centros dos intervalos
for(int i=0; i<cells; i++)
{
intervals[i]=minv+(i+0.5)*width;
frequency[i]=0;
}
//--- preenchemos a frequência de aparecimento no intervalo
for(int i=0; i<size; i++)
{
int ind=int((data[i]-minv)/width);
if(ind>=cells) ind=cells-1;
frequency[ind]++;
}
return (true);
}
//+------------------------------------------------------------------+
//| Calculates values for sequence generation |

© 2000-2018, MetaQuotes Software Corp.


2223 Biblioteca Padrão

//+------------------------------------------------------------------+
void GetMaxMinStepValues(double &maxv,double &minv,double &stepv)
{
//--- calculamos a magnitude da sequência para obter a precisão da normalização
double range=MathAbs(maxv-minv);
int degree=(int)MathRound(MathLog10(range));
//--- normalizamos os valores máx. e mín. com a precisão
maxv=NormalizeDouble(maxv,degree);
minv=NormalizeDouble(minv,degree);
//--- definimos o passo de geração da mesma maneira a partir da precisão definida
stepv=NormalizeDouble(MathPow(10,-degree),degree);
if((maxv-minv)/stepv<10)
stepv/=10.;
}

© 2000-2018, MetaQuotes Software Corp.


2224 Biblioteca Padrão

MathProbabilityDensityPoisson
Calcula a função de probabilidade (probability mass function) da distribuição de Poisson com
parâmetro lambda para a variável aleatória x. Em caso de erro, retorna NaN.
double  MathProbabilityDensityPoisson(
const double  x, // valor da variável aleatória (inteiro)
const double  lambda, // parâmetro de distribuição (mean)
const bool   log_mode, // cálculo de logaritmo do valor, se log_mode=true, retorna o loga
int&  error_code  // variável para registro do código de erro
);

Calcula a função de probabilidade (probability mass function) da distribuição de Poisson com


parâmetro lambda para a variável aleatória x. Em caso de erro, retorna NaN.
double  MathProbabilityDensityPoisson(
const double  x, // valor da variável aleatória (inteiro)
const double  lambda, // parâmetro de distribuição (mean)
int&  error_code  // variável para registro do código de erro
);

Calcula a função de probabilidade (probability mass function) da distribuição de Poisson com


parâmetro lambda para a matriz das variáveis aleatórias x []. Em caso de erro, retorna false.
Equivalente a dhyper() no R .
bool  MathProbabilityDensityPoisson(
const double& x[], // matriz com valores da variável aleatória
const double  lambda, // parâmetro de distribuição (mean)
const bool   log_mode, // sinalizador de cálculo de logaritmo do valor, se log_mode=true,
double&  result[]  // matriz para o valor da função densidade de probabilidade
);

Calcula a função de probabilidade (probability mass function) da distribuição de Poisson com


parâmetro lambda para a matriz das variáveis aleatórias x []. Em caso de erro, retorna false.
bool  MathProbabilityDensityPoisson(
const double& x[], // matriz com valores da variável aleatória
const double  lambda, // parâmetro de distribuição (mean)
double&  result[]  // matriz para o valor da função densidade de probabilidade
);

Parâmetros
x
[in] Valor da variável aleatória.
x[]
[in] Matriz com valores da variável aleatória.
lambda
[in] Parâmetro de distribuição (mean).
log_mode

© 2000-2018, MetaQuotes Software Corp.


2225 Biblioteca Padrão

[in] Sinalizador de cálculo do algoritmo de um valor. Se log _mode=true, retorna o logaritmo


natural da função densidade de probabilidade.

error_code
[out] Variável para registro do código de erro.
result[]
[out] Matriz para os valores da função densidade de probabilidade.

© 2000-2018, MetaQuotes Software Corp.


2226 Biblioteca Padrão

MathCumulativeDistributionPoisson
Calcula o valor da função de distribuição de Poisson com parâmetro lambda para a variável aleatória x.
Em caso de erro, retorna NaN.
double  MathCumulativeDistributionPoisson(
const double  x, // valor da variável aleatória (inteiro)
const double  lambda, // parâmetro de distribuição (mean)
const double  tail, // sinalizador de cálculo, se for true, é calculada a probabilidade
const bool   log_mode, // sinalizador de cálculo de logaritmo do valor, se log_mode=true,
int&  error_code  // variável para registro do código de erro
);

Calcula o valor da função de distribuição de Poisson com parâmetro lambda para a variável aleatória x.
Em caso de erro, retorna NaN.
double  MathCumulativeDistributionPoisson(
const double  x, // valor da variável aleatória (inteiro)
const double  lambda, // parâmetro de distribuição (mean)
int&  error_code  // variável para registro do código de erro
);

Calcula o valor da função de distribuição de Poisson com parâmetro lambda para a matriz das
variáveis aleatórias x []. Em caso de erro, retorna false. Equivalente a dhyper() no R .
bool  MathCumulativeDistributionPoisson(
const double& x[], // matriz com valores da variável aleatória
const double  lambda, // parâmetro de distribuição (mean)
const double  tail, // sinalizador de cálculo, se for true, é calculada a probabilidad
const bool   log_mode, // sinalizador de cálculo de logaritmo do valor, se log_mode=true,
double&  result[]  // matriz para os valores da função de distribuição
);

Calcula o valor da função de distribuição de Poisson com parâmetro lambda para a matriz das
variáveis aleatórias x []. Em caso de erro, retorna false.
bool  MathCumulativeDistributionPoisson(
const double& x[], // matriz com valores da variável aleatória
const double  lambda, // parâmetro de distribuição (mean)
double&  result[]  // matriz para os valores da função de distribuição
);

Parâmetros
x
[in] Valor da variável aleatória.
x[]
[in] Matriz com valores da variável aleatória.
lambda
[in] Parâmetro de distribuição (mean).

© 2000-2018, MetaQuotes Software Corp.


2227 Biblioteca Padrão

tail
[in] Sinalizador de cálculo, se for true, é calculada a probabilidade de que a variável aleatória não
será superior a x.

log_mode
[in] Sinalizador de cálculo de logaritmo do valor, se log _mode=true, é retornado o valor do
logaritmo natural da probabilidade.

error_code
[out] Variável para registro do código de erro.
result[]
[out] Matriz para os valores da função de distribuição.

© 2000-2018, MetaQuotes Software Corp.


2228 Biblioteca Padrão

MathQuantilePoisson
Calcula o inverso da função de distribuição de Poisson com parâmetro lambda para a probabilidade
probability. Em caso de erro, retorna NaN.

double  MathQuantilePoisson(
const double  probability, // valor da probabilidade de aparecimento de uma variável aleatóri
const double  lambda, // parâmetro de distribuição (mean)
const bool   tail, // sinalizador de cálculo, se for false, o cálculo será realizado
const bool   log_mode, // sinalizador de cálculo, se log_mode=true, o cálculo é realizado
int&  error_code  // variável para registro do código de erro
);

Calcula o inverso da função de distribuição de Poisson com parâmetro lambda para a probabilidade
probability. Em caso de erro, retorna NaN.

double  MathQuantilePoisson(
const double  probability, // valor da probabilidade de aparecimento de uma variável aleatóri
const double  lambda, // parâmetro de distribuição (mean)
int&  error_code  // variável para registro do código de erro
);

Calcula o inverso da função de distribuição de Poisson com parâmetro lambda para a matriz de valores
da probabilidade probability[]. Em caso de erro, retorna false. Equivalente a qhyper() no R .
double  MathQuantilePoisson(
const double& probability[], // matriz com valores de probabilidade da variável aleatória
const double  lambda, // parâmetro de distribuição (mean)
const bool   tail, // sinalizador de cálculo, se for false, o cálculo será realizado
const bool   log_mode, // sinalizador de cálculo, se log_mode=true, o cálculo é realizado
double&  result[]  // matriz com valores de quantis
);

Calcula o inverso da função de distribuição de Poisson com parâmetro lambda para a matriz de valores
da probabilidade probability[]. Em caso de erro, retorna false.
bool  MathQuantilePoisson(
const double& probability[], // matriz com valores de probabilidade da variável aleatória
const double  lambda, // parâmetro de distribuição (mean)
double&  result[]  // matriz com valores de quantis
);

Parâmetros
probability
[in] Valor da probabilidade da variável aleatória.
probability[]
[in] Matriz com valores da probabilidade da variável aleatória.
lambda
[in] Parâmetro de distribuição (mean).

© 2000-2018, MetaQuotes Software Corp.


2229 Biblioteca Padrão

tail
[in] Sinalizador de cálculo, se tail=false, o cálculo é realizado para a probabilidade 1.0 -
probability.

log_mode
[in] Sinalizador de cálculo, se log _mode=true, o cálculo é realizado para a probabilidade
Exp(probability).

error_code
[out] Variável para obter o código de erro.
result[]
[out] Matriz com os valores dos quantis.

© 2000-2018, MetaQuotes Software Corp.


2230 Biblioteca Padrão

MathRandomPoisson
Gera um número pseudo-aleatório distribuído de acordo com a distribuição de Poisson com parâmetro
lambda. Em caso de erro, retorna NaN.
double  MathRandomPoisson(
const double  lambda, // parâmetro de distribuição (mean)
int&  error_code  // variável para registro do código de erro
);

Gera números pseudo-aleatórios distribuídos de acordo com a distribuição de Poisson com parâmetro
lambda. Em caso de erro, retorna false. Equivalente a rgeom() no R .
bool  MathRandomPoisson(
const double  lambda, // parâmetro de distribuição (mean)
const int   data_count, // número de dados necessários
double&  result[]  // matriz com os valores dos números pseudo-aleatórios
);

Parâmetros
lambda
[in] Parâmetro de distribuição (mean).
error_code
[out] Variável para registro do código de erro.
data_count
[out] Número de dados necessários.
result[]
[out] Matriz para obter os valores dos números pseudo-aleatórios.

© 2000-2018, MetaQuotes Software Corp.


2231 Biblioteca Padrão

MathMomentsPoisson
Calcula os valores numéricos teóricos dos primeiros 4 momentos da distribuição de Poisson com
parâmetro lambda.
double  MathMomentsPoisson(
const double  lambda, // parâmetro de distribuição (mean)
double&  mean, // variável para o valor médio
double&  variance, // variável para a dispersão
double&  skewness, // variável para a obliquidade
double&  kurtosis, // variável para a curtose
int&  error_code  // variável para o código de erro
);

Parâmetros
lambda
[in] Parâmetro de distribuição (mean).
mean
[out] Variável para obter o valor médio.
variance
[out] Variável para obter a dispersão.
skewness
[out] Variável para obter a obliquidade.
kurtosis
[out] Variável para obter a curtose.
error_code
[out] Variável para obter o código de erro.

Valor de retorno
Retorna true, se os momentos forem calculados com sucesso, caso contrário false.

© 2000-2018, MetaQuotes Software Corp.


2232 Biblioteca Padrão

Funções auxiliares
Grupo de funções que executam operações matemáticas básicas : cálculo da função gama, função beta,
fatoriais, exponenciais, logaritmos com diferentes bases, raiz quadrada, etc.

Fornecidas possibilidades de processamento como valores numéricos separados (reais e inteiros), bem
como suas matizes (com resultados registrados na matriz original ou numa separada).

F unção Descrição
MathR andomNonZero Retorna um número aleatório entre 0,0 a 1,0
com v írgula flutuante.

MathMoments Calcula os primeiros 4 momentos dos elementos


da matriz: média, dispersão, obliquidade,
curtose.

MathPowInt Gera um número na potência inteira


especificada.

MathFactorial Calcula o fatorial do número inteiro


especificado.

MathT runc Calcula a parte integrante do número


especificado ou os elementos da matriz.

MathR ound Arredonda um número ou uma matriz de


números para um número especificado de casas
decimais.

MathArctan2 Calcula o ângulo cuja tangente é a relação entre


dois números no intervalo [-pi, pi].

MathGamma Calcula o valor da função gama.

MathGammaLog Calcula o logaritmo da função gama.

MathBeta Calcula o valor da função beta.

MathBetaLog Calcula o valor do logaritmo da função beta.

MathBetaIncomplete Ele calcula o valor da função beta incompleta.

MathGammaIncomplete Ele calcula o valor da função gama incompleta.

MathBinomialCoefficient Calcula o coeficiente binomial.

MathBinomialCoefficientLog Calcula o logaritmo do coeficiente binomial.

MathHypergeometric2F2 Calcula o valor da função hipergeométrica.

MathSequence Gera uma sequência de valores com base em: o


primeiro elemento, o último elemento, o passo
da sequência.

MathSequenceByCount Gera uma sequência de valores com base em: o


primeiro elemento, o segundo elemento, o

© 2000-2018, MetaQuotes Software Corp.


2233 Biblioteca Padrão

número de elementos na sequência.

MathR eplicate Gera uma sequência repetitiva de valores.


MathR everse Gera uma matriz de valores com os elementos
na ordem inversa.

MathIdentical Compara dois matrizes de valores e retorna


true, se todos os elementos são os mesmos.

MathUnique Gera uma matriz apenas com valores distintos.


MathQuick SortAscending Função para classificação crescente.
MathQuick SortDescending Função para classificação decrescente.
MathQuick Sort Função de classificação.
MathOrder Cria uma matiz com um rearranjo na ordem dos
elementos da matriz após a classificação.

MathBitwiseNot Calcula o resultado da operação binária NOT


para elementos de matriz.

MathBitwiseAnd Calcula o resultado da operação binária AND


para elementos de matriz.

MathBitwiseOr Calcula o resultado da operação binária OR para


elementos de matriz.

MathBitwiseXor Calcula o resultado da operação binária XOR


para elementos de matriz.

MathBitwiseS hiftL Calcula o resultado da operação binária S H L


para elementos de matriz.

MathBitwiseS hiftR Calcula o resultado da operação binária S HR


para elementos de matriz.

MathCumulativeSum Gera uma matriz com o valor acumulado.


MathCumulativeProduct Gera uma matriz com o produto acumulado.
MathCumulativeMin Gera uma matriz de valores mínimos
acumulados.

MathCumulativeMax Gera uma matriz de valores máximos


acumulados.

MathSin Calcula o valor da função sin(x) para os


elementos da matriz.

MathCos Calcula o valor da função cos(x) para os


elementos da matriz.

MathT an Calcula o valor da função tan(x) para os


elementos da matriz.

© 2000-2018, MetaQuotes Software Corp.


2234 Biblioteca Padrão

MathArcsin Calcula o valor da função arcsin(x) para os


elementos da matriz.

MathArccos Calcula o valor da função arccos(x) para os


elementos da matriz.

MathArctan Calcula o valor da função arctan(x) para os


elementos da matriz.

MathSinPi Calcula o valor da função sin(pi*x) para os


elementos da matriz.

MathCos Pi Calcula o valor da função cos(pi*x) para os


elementos da matriz.

MathT anPi Calcula o valor da função tan(pi*x) para os


elementos da matriz.

MathAbs Calcula o valor absoluto dos elementos da


matriz.

MathCeil Retorna o valor de número inteiro mais próximo


- desde cima - para os elementos da matriz.

MathFloor Retorna o valor de número inteiro mais próximo


- desde baixo - para os elementos da matriz.

MathSqrt Calcula a raiz quadrada para os elementos da


matriz.

MathExp Calcula o valor da função exp(x) para os


elementos da matriz.

MathPow Calcula o valor da função pow(x, power) para os


elementos da matriz.

MathLog Calcula o valor da função log(x) para os


elementos da matriz.

MathLog 2 Calcula o valor do logaritmo na base 2 para


elementos da matriz.

MathLog 10 Calcula o valor do logaritmo na base 10 para


elementos da matriz.

MathDifference Gera uma matriz com diferenças de elementos


y[i]=x [i+lag ]-x [i].
MathSample Gera uma amostragem aleatória de elementos
da matriz.

MathT uk eySummary Calcula o resumo de cinco números de T uk ey


para os elementos da matriz.

MathR ange Calcula os valores mínimos e máximos dos


elementos da matriz.

© 2000-2018, MetaQuotes Software Corp.


2235 Biblioteca Padrão

MathMin Retorna o valor mínimo de todos os elementos


na matriz.

MathMax Retorna o valor máximo de todos os elementos


da matriz.

MathSum Retorna a soma dos elementos da matriz.


MathProduct Retorna o produto dos elementos da matriz.
MathStandardDeviation Calcula o desvio padrão dos elementos da
matriz.

MathAverageDeviation Calcula o desvio médio dos elementos da


matriz.

MathMedian Calcula o valor de mediana dos elementos da


matriz.

MathMean Calcula o valor médio dos elementos da matriz.

MathVariance Calcula a dispersão dos elementos da matriz.

MathS k ewness Calcula a obliquidade dos elementos da matriz.

MathKurtosis Calcula a curtose dos elementos da matriz.

MathLog 1p Calcula o valor da função de log(1+x) para os


elementos da matriz.

MathExpm1 Calcula o valor da função exp(x)-1 para os


elementos da matriz.

MathSinh Calcula o valor da função sinh(x) para os


elementos da matriz.

MathCos h Calcula o valor da função cos h(x) para os


elementos da matriz.

MathT anh Calcula o valor da função tanh(x) para os


elementos da matriz.

MathArcsinh Calcula o valor da função arcsinh(x) para os


elementos da matriz.

MathArccos h Calcula o valor da função arccos h(x) para os


elementos da matriz.

MathArctanh Calcula o valor da função arctanh(x) para os


elementos da matriz.

MathSignif Arredonda um valor para o número especificado


de dígitos na mantissa.

MathR ank Calcula a posição dos elementos da matriz.

MathCorrelationPearson Calcula o coeficiente de correlação de Pearson.

© 2000-2018, MetaQuotes Software Corp.


2236 Biblioteca Padrão

MathCorrelationSpearman Calcula o coeficiente de correlação de


Spearman.

MathCorrelationKendall Calcula o coeficiente de correlação de Kendall.

MathQuantile Calcula o quantis seletivos que corresponde às


probabilidades definidas.

MathProbabilityDensityEmpirical Calcula a função densidade de probabilidade


empírica para os valores aleatórios.

MathCumulativeDistributionEmpirical Calcula a distribuição cumulativa empírica para


os valores aleatórios.

© 2000-2018, MetaQuotes Software Corp.


2237 Biblioteca Padrão

MathRandomNonZero
Retorna um número aleatório entre 0,0 a 1,0 com v írgula flutuante.
double  MathRandomNonZero()

Valor de retorno
Número aleatório entre 0,0 a 1,0 com v írgula flutuante.

© 2000-2018, MetaQuotes Software Corp.


2238 Biblioteca Padrão

MathMoments
Calcula os primeiros 4 momentos dos elementos da matriz: média, dispersão, obliquidade, curtose.
bool  MathMoments(
const double&  array[],  // matriz de valores
double&  mean,  // variável para média
double&  variance,  // variável para dispersão
double&  skewness,  // variável para obliquidade
double&  kurtosis,  // variável para curtose
const int  start=0,  // índice inicial
const int  count=WHOLE_ARRAY // número de elementos
)

Parâmetros
array[]
[in] Matriz de valores.
mean
[out] Variável para a média (1 momento).
variance
[out] Variável para dispersão (2 momento).
skewness
[out] Variável para a obliquidade (3 momento).
kurtosis
[out] Variável para a curtose (4 momento).
start=0
[in] Índice inicial para o cálculo.
count=WHOLE_ARRAY
[in] Número de elementos para o cálculo.

Valor de retorno
Retorna true, se os momentos forem calculados com sucesso, caso contrário false.

© 2000-2018, MetaQuotes Software Corp.


2239 Biblioteca Padrão

MathPowInt
Gera um número na potência inteira especificada.
double  MathPowInt(
const double  x,  // valor do número
const int  power // exponenciação
)

Parâmetros
x
[in] Número de precisão dupla com ponto flutuante e raiz quadrada.
power
[in] Inteiro que especifica a exponenciação. 

Valor de retorno
Número x elevado à potência especificada.

© 2000-2018, MetaQuotes Software Corp.


2240 Biblioteca Padrão

MathFactorial
Calcula o fatorial do número inteiro especificado.
double  MathFactorial(
const int  n // valor de um número
)

Parâmetros
n
[in] Número inteiro cujo fatorial é necessário para calcular. 

Valor de retorno
Fatorial de um número.

© 2000-2018, MetaQuotes Software Corp.


2241 Biblioteca Padrão

MathTrunc
Calcula a parte integrante do número especificado ou os elementos da matriz.

Versão para trabalhar com um número de precisão dupla e ponto flutuante:


double  MathTrunc(
const double  x // valor do número
)

Valor de retorno
Parte inteira do número definido.

Versão para trabalhar com uma matriz de números de precisão dupla e ponto flutuante. Os resultados
são registrados numa nova matriz:
bool  MathTrunc(
const double&  array[],  // matriz de valores
double&  result[] // matriz de resultado
)

Valor de retorno
Retorna true em caso de sucesso, caso contrário, false.

Versão para trabalhar com uma matriz de números de precisão dupla e ponto flutuante. Os resultados
são registrados na mesma matriz:
bool  MathTrunc(
double&  array[] // matriz de valores
)

Valor de retorno
Retorna true em caso de sucesso, caso contrário, false.

Parâmetros
x
[in] Número de precisão dupla com ponto flutuante cuja parte inteira é necessário obter.
array[]
[in] Matriz de números de precisão dupla com ponto flutuante cuja parte inteira é necessário
obter.

array[]
[out] Matriz de valores de saída.
result[]
[out] Matriz de valores de saída.

© 2000-2018, MetaQuotes Software Corp.


2242 Biblioteca Padrão

MathRound
Arredonda um número de precisão dupla com ponto flutuante ou uma matriz de números para um
número especificado de casas decimais.

Versão para arredondamento de um número de precisão dupla com ponto flutuante para um número
especificado de casas decimais.
double  MathRound(
const double  x,  // valor do número
const int  digits // número de dígitos após o ponto decimal
)

Valor de retorno
Número mais próximo do parâmetro x, número de cifras da parte decimal que é igual a digits.

Versão para arredondamento da matriz de números de precisão dupla com ponto flutuante para um
número especificado de casas decimais. Os resultados são registrados numa nova matriz.
bool  MathRound(
const double&  array[],  // matriz de valores
int  digits,  // número de dígitos após o ponto decimal
double&  result[] // matriz de resultado
)

Valor de retorno
Retorna true em caso de sucesso, caso contrário, false.

Versão para arredondamento da matriz de números de precisão dupla com ponto flutuante para um
número especificado de casas decimais. Os resultados são registrados na mesma matriz.
bool  MathRound(
double&  array[],  // matriz de valores
int  digits // número de dígitos após o ponto decimal
)

Valor de retorno
Retorna true em caso de sucesso, caso contrário, false.

Parâmetros
x
[in] Número - a ser arredondado - de precisão dupla com ponto flutuante. 
digits
[in] Número de dígitos da parte decimal no valor a ser retornado.
array[]
[in] Matriz de números - a ser arredondados - de precisão dupla com ponto flutuante. 
array[]

© 2000-2018, MetaQuotes Software Corp.


2243 Biblioteca Padrão

[out] Matriz de valores de saída. 


result[]
[out] Matriz de valores de saída. 

© 2000-2018, MetaQuotes Software Corp.


2244 Biblioteca Padrão

MathArctan2
Retorna o arco tangente do quociente de dois argumentos (x, y).

Versão para trabalhar com a relação entre dois números especificados (x, y): 
double  MathArctan2(
const double  y,  // coordenada y
const double  x // coordenada x
)

Valor de retorno
Ângulo θ, medido em radianos, de tal modo que -π≤θ≤π, e tan (θ) = y ou x, onde (x, y) é um ponto
no sistema de coordenadas cartesianas.

Versão para trabalhar com a relação entre um par de elementos das matrizes x e y:
bool  MathArctan2(
const double&  x[],  // matriz de valores x
const double&  y[],  // matriz de valores y
double&  result[] // matriz de resultado
)

Valor de retorno
Retorna true em caso de sucesso, caso contrário, false.

Parâmetros
y
[in] Coordenada y do ponto. 
x
[in] Coordenada x do ponto. 
x[]
[in] Matriz das coordenadas x dos pontos.
y[]
[in] Matriz de coordenadas y dos pontos. 
result[]
[out] Matriz para registro de resultados  

Comentário:
Observe o seguinte.

· Para (x, y) no quadrante 1 o valor retornado será: 0 < θ < π/2.

· Para (x, y) no quadrante 2 o valor retornado será: π/2 < θ≤π.

· Para (x, y) no quadrante 3 o valor retornado será: -π < θ <-π/2.

· Para (x, y) no quadrante 4 o valor retornado será: -π/2 < θ < 0.

© 2000-2018, MetaQuotes Software Corp.


2245 Biblioteca Padrão

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, θ = π.

· Se y é um número positivo, e x é igual a 0, θ = π/2.

· Se y é negativo e x é igual a 0, θ = -π/2.

· Se y é igual a 0 e x é igual a 0, θ = -π/2.

Quer se o valor do parâmetro x ou y é igual a NaN, quer se os valores dos parâmetros x e y são
iguais ao valor PositiveInfinity ou NegativeInfinity, o método retorna o valor NaN.

© 2000-2018, MetaQuotes Software Corp.


2246 Biblioteca Padrão

MathGamma
Calcula o valor da função gama para o argumento real x .
double  MathGamma(
const double  x // argumento da função
)

Parâmetros
x
[in] Argumento real da função. 

Valor de retorno
Valor de uma função gama.

© 2000-2018, MetaQuotes Software Corp.


2247 Biblioteca Padrão

MathGammaLog
Calcula o valor da função gama para o argumento real x.
double  MathGammaLog(
const double  x // argumento da função
)

Parâmetros
x
[in] Argumento real da função. 

Valor de retorno
O valor do logaritmo da função.

© 2000-2018, MetaQuotes Software Corp.


2248 Biblioteca Padrão

MathBeta
Calcula o valor da função beta para os argumentos reais a e b.
double  MathBeta(
const double  a,  // primeiro argumento da função
const double  b // segundo argumento da função
)

Parâmetros
a
[in] Argumento da função a. 
b
[in] Argumento da função b. 

Valor de retorno
Valor da função.

© 2000-2018, MetaQuotes Software Corp.


2249 Biblioteca Padrão

MathBetaLog
Calcula o valor do logaritmo da função beta para os argumentos reais a e b.
double  MathBetaLog(
const double  a,  // primeiro argumento da função
const double  b // segundo argumento da função
)

Parâmetros
a
[in] Argumento da função a. 
b
[in] Argumento da função b. 

Valor de retorno
O valor do logaritmo da função.

© 2000-2018, MetaQuotes Software Corp.


2250 Biblioteca Padrão

MathBetaIncomplete
Ele calcula o valor da função beta incompleta.
double  MathBetaIncomplete(
const double  x,  // argumento da função
const double  p,  // primeiro parâmetro da função
const double  q // segundo parâmetro da função
)

Parâmetros
x
[in] Argumento da função. 
p
[in] O primeiro parâmetro da função beta deve ser >0.0.   
q
[in] O segundo parâmetro da função beta deve ser >0.0.   

Valor de retorno
Valor da função.

© 2000-2018, MetaQuotes Software Corp.


2251 Biblioteca Padrão

MathGammaIncomplete
 
Calcula o valor da função gama incompleta.
double  MathGammaIncomplete(
double  x,  // argumento da função
double  alpha // parâmetro da função
)

Parâmetros
x
[in] Argumento da função. 
alpha
[in] Parâmetro da função gama incompleta.

Valor de retorno
Valor da função.

© 2000-2018, MetaQuotes Software Corp.


2252 Biblioteca Padrão

MathBinomialCoefficient
Calcula o coeficiente binomial: C(n,k )=n!/(k!*(n-k )!).
long  MathBinomialCoefficient(
const int  n,  // número total de elementos
const int  k // número de elementos combinados
)

Parâmetros
n
[in] Número de elementos. 
k
[in] Número de elementos para cada combinação. 

Valor de retorno
Número de combinações a partir de N de acordo com K.

© 2000-2018, MetaQuotes Software Corp.


2253 Biblioteca Padrão

MathBinomialCoefficientLog
Calcula o logaritmo do coeficiente binomial: Log(C(n,k ))=Log(n!/(k!*(n-k )!)) 

Versão para argumentos inteiros :


double  MathBinomialCoefficientLog(
const int  n,  // número total de elementos
const int  k // número de elementos combinados
)

Versão para argumentos reais :


double  MathBinomialCoefficientLog(
const double  n,  // número total de elementos
const double  k // número de elementos combinados
)

Parâmetros
n
[in] Número de elementos. 
k
[in] Número de elementos para cada combinação.

Valor de retorno
Logaritmo de C(n,k ).

© 2000-2018, MetaQuotes Software Corp.


2254 Biblioteca Padrão

MathHypergeometric2F2
Calcula o valor da função Hypergeometric_2F2 (a, b, c, d, z), usando o método de T aylor. 

double  MathHypergeometric2F2(
const double  a,  // primeiro parâmetro da função
const double  b,  // segundo parâmetro da função
const double  c,  // terceiro parâmetro da função
const double  d,  // quarto parâmetro da função
const double  z // quinto parâmetro da função
)

Parâmetros
a
[in] Primeiro parâmetro da função.
b
[in] Segundo parâmetro da função. 
c
[in] T erceiro parâmetro da função. 
d
[in] Quarto parâmetro da função. 
z
[in] Quinto parâmetro da função. 

Valor de retorno
Valor da função.

© 2000-2018, MetaQuotes Software Corp.


2255 Biblioteca Padrão

MathSequence
Gera uma sequência de valores com base em: o primeiro elemento, o último elemento, o passo da
sequência.

Versão para trabalhar com valores reais :


bool  MathSequence(
const double  from,  // valor inicial
const double  to,  // valor final
const double  step,  // passo
double&  result[] // matriz de resultado
)

Versão para trabalhar com valores inteiros :


bool  MathSequence(
const int  from,  // valor inicial
const int  to,  // valor final
const int  step,  // passo
int&  result[] // matriz de resultado
)

Parâmetros
from
[in] Primeiro valor da sequência 
to
[in] Último valor da sequência 
step
[in] Passo da sequência. 
result[]
[out] Matriz para registro de sequência. 

Valor de retorno
Retorna true em caso de sucesso, caso contrário, false.

© 2000-2018, MetaQuotes Software Corp.


2256 Biblioteca Padrão

MathSequenceByCount
Gera uma sequência de valores com base em: o primeiro elemento, o último elemento, o passo da
sequência.

Versão para trabalhar com valores reais :


bool  MathSequenceByCount(
const double  from,  // valor inicial
const double  to,  // valor final
const int  count,  // quantidade
double&  result[] // matriz de resultado
)

Versão para trabalhar com valores inteiros :


bool  MathSequenceByCount(
const int  from,  // valor inicial
const int  to,  // valor final
const int  count,  // quantidade
int&  result[] // matriz de resultado
)

Parâmetros
from
[in] Primeiro valor da sequência. 
to
[in] Último valor da sequência. 
count
[in] Número de elementos da sequência. 
result[]
[out] Matriz para registro de sequência. 

Valor de retorno
Retorna true em caso de sucesso, caso contrário, false.

© 2000-2018, MetaQuotes Software Corp.


2257 Biblioteca Padrão

MathReplicate
Gera uma sequência repetitiva de valores.

Versão para trabalhar com valores reais :


bool  MathReplicate(
const double&  array[],  // matriz de valores
const int  count,  // número de vezes
double&  result[] // matriz de resultado
)

Versão para trabalhar com valores inteiros :


bool  MathReplicate(
const int&  array[],  // matriz de valores
const int  count,  // número de vezes
int& result[] // matriz de resultado
)

Parâmetros
array[]
[in] Matriz para geração de sequência.
count
[in] Número de repetições de matriz na sequência. 
result[]
[out] Matriz para registro de sequência. 

Valor de retorno
Retorna true em caso de sucesso, caso contrário, false.

© 2000-2018, MetaQuotes Software Corp.


2258 Biblioteca Padrão

MathReverse
Gera uma matriz de valores com os elementos na ordem inversa.

Versão para trabalhar com valores reais e armazenamento de resultados numa nova matriz:
bool  MathReverse(
const double&  array[],  // matriz de valores
double&  result[] // matriz de resultado
)

Versão para trabalhar com valores inteiros e armazenamento de resultados numa nova matriz:
bool  MathReverse(
const int&  array[],  // matriz de valores
int&  result[] // matriz de resultado
)

Versão para trabalhar com valores reais e armazenamento de resultados na mesma matriz.
bool  MathReverse(
double&  array[] // matriz de valores
)

Versão para trabalhar com valores inteiros e armazenamento de resultados na mesma matriz.
bool  MathReverse(
int&  array[] // matriz de valores
)

Parâmetros
array[]
[in] Matriz de valores. 
array[]
[out] Matriz de saída com valores na ordem inversa.
result[]
[out] Matriz de saída com valores na ordem inversa. 

Valor de retorno
Retorna true em caso de sucesso, caso contrário, false.

© 2000-2018, MetaQuotes Software Corp.


2259 Biblioteca Padrão

MathIdentical
Compara dois matrizes de valores e retorna true, se todos os elementos são os mesmos.

Versão para trabalhar com matrizes de valores reais :


bool  MathIdentical(
const double&  array1[],  // primeira matriz de valores
const double&  array2[] // segunda matriz de valores
)

Versão para trabalhar com matrizes de valores inteiros :


bool  MathIdentical(
const int&  array1[],  // primeira matriz de valores
const int&  array2[] // segunda matriz de valores
)

Parâmetros
array1[]
[in] Primeira matriz para comparação. 
array2[]
[in] Segunda matriz para comparação. 

Valor de retorno
Retorna true, se as matrizes são iguais, caso contrário, false.

© 2000-2018, MetaQuotes Software Corp.


2260 Biblioteca Padrão

MathUnique
Gera uma matriz apenas com valores distintos.

Versão para trabalhar com valores reais :


bool  MathUnique(
const double&  array[],  // matriz de valores
double&  result[] // matriz de resultado
)

Versão para trabalhar com valores inteiros :


bool  MathUnique(
const int&  array[],  // matriz de valores
int&  result[] // matriz de resultado
)

Parâmetros
array[]
[in] Matriz de origem. 
result[]
[out] Matriz para registro de valores exclusivos. 

Valor de retorno
Retorna true em caso de sucesso, caso contrário, false.

© 2000-2018, MetaQuotes Software Corp.


2261 Biblioteca Padrão

MathQuickSortAscending
Função para classificação ascendente simultânea de matrizes array[] e indices [], usando o algoritmo
Quick Sort. 
void  MathQuickSortAscending(
double&  array[],  // matriz de valores
int&  indices[],  // matriz de índices
int  first,  // valor inicial
int  last // valor final
)

Parâmetros
array[]
[in][out] Matriz para classificação. 
indices[]
[in][out] Matriz para armazenar índices da matriz de origem.
first
[in] Índice do elemento a partir do qual é necessário começar a classificação.
last
[in] Índice do elemento no qual é necessário acabar a classificação.

© 2000-2018, MetaQuotes Software Corp.


2262 Biblioteca Padrão

MathQuickSortDescending
Função para classificação descendente simultânea de matrizes array[] e indices [], usando o algoritmo
Quick Sort. 
void  MathQuickSortDescending(
double&  array[],  // matriz de valores
int&  indices[],  // matriz de índices
int  first,  // valor inicial
int  last // valor final
)

Parâmetros
array[]
[in][out] Matriz para classificação. 
indices[]
[in][out] Matriz para armazenar índices da matriz de origem. 
first
[in] Índice do elemento a partir do qual é necessário começar a classificação. 
last
[in] Índice do elemento no qual é necessário acabar a classificação. 

© 2000-2018, MetaQuotes Software Corp.


2263 Biblioteca Padrão

MathQuickSort
Função para classificação simultânea de matrizes array[] e indices [], usando o algoritmo Quick Sort. 

void  MathQuickSort(
double&  array[],  // matriz de valores
int&  indices[],  // matriz de índices
int  first,  // valor inicial
int  last,  // valor final
int  mode // direção
)

Parâmetros
array[]
[in][out] Matriz para classificação. 
indices[]
[in][out] Matriz para armazenar índices da matriz de origem. 
first
[in] Índice do elemento a partir do qual é necessário começar a classificação. 
last
[in] Índice do elemento no qual é necessário acabar a classificação. 
mode
[in] Direção da classificação (>0 ascendente, caso contrário, descendente).  

© 2000-2018, MetaQuotes Software Corp.


2264 Biblioteca Padrão

MathOrder
Cria uma matiz inteira com um rearranjo na ordem dos elementos da matriz após a classificação.

Versão para trabalhar com uma matriz de valores reais :


bool  MathOrder(
const double&  array[],  // matriz de valores
int&  result[] // matriz de resultado
)

Versão para trabalhar com uma matriz de valores inteiros :


bool  MathOrder(
const int&  array[],  // matriz de valores
int&  result[] // matriz de resultado
)

Parâmetros
array[]
[in] Matriz de valores. 
result[]
[out] Matriz para registro de índices classificados.

Valor de retorno
Retorna true em caso de sucesso, caso contrário, false.

© 2000-2018, MetaQuotes Software Corp.


2265 Biblioteca Padrão

MathBitwiseNot
Calcula o resultado da operação binária NOT para elementos de matriz.

Versão com registro de resultados numa nova matriz:


bool  MathBitwiseNot(
const int&  array[],  // matriz de valores
int&  result[] // matriz de resultado
)

Versão com registro de resultados na matriz original:


bool  MathBitwiseNot(
int& array[] // matriz de valores
)

Parâmetros
array[]
[in] Matriz de valores. 
array[]
[out] Matriz de valores de saída. 
result[]
[out] Matriz de valores de saída.

Valor de retorno
Retorna true em caso de sucesso, caso contrário, false.

© 2000-2018, MetaQuotes Software Corp.


2266 Biblioteca Padrão

MathBitwiseAnd
Calcula o resultado da operação binária AND para as matrizes especificadas.
bool  MathBitwiseAnd(
const int&  array1[],  // primeira matriz de valores
const int&  array2[],  // segunda matriz de valores
int&  result[] // matriz de resultado
)

Parâmetros
array1[]
[in] Primeira matriz de valores. 
array2[]
[in] Segunda matriz de valores.
result[]
[out] Matriz para registrar resultados.

Valor de retorno
Retorna true em caso de sucesso, caso contrário, false.

© 2000-2018, MetaQuotes Software Corp.


2267 Biblioteca Padrão

MathBitwiseOr
Calcula o resultado da operação binária OR para as matrizes especificadas.
bool  MathBitwiseOr(
const int&  array1[],  // primeira matriz de valores
const int&  array2[],  // segunda matriz de valores
int&  result[] // matriz de resultado
)

Parâmetros
array1[]
[in] Primeira matriz de valores. 
array2[]
[in] Segunda matriz de valores.
result[]
[out] Matriz para registrar resultados.

Valor de retorno
Retorna true em caso de sucesso, caso contrário, false.

© 2000-2018, MetaQuotes Software Corp.


2268 Biblioteca Padrão

MathBitwiseXor
Calcula o resultado da operação binária XOR para as matrizes especificadas.
bool  MathBitwiseXor(
const int&  array1[],  // primeira matriz de valores
const int&  array2[],  // segunda matriz de valores 
int&  result[] // matriz de resultado
)

Parâmetros
array1[]
[in] Primeira matriz de valores. 
array2[]
[in] Segunda matriz de valores.
result[]
[out] Matriz para registrar resultados.

Valor de retorno
Retorna true em caso de sucesso, caso contrário, false.

© 2000-2018, MetaQuotes Software Corp.


2269 Biblioteca Padrão

MathBitwiseShiftL
Calcula o resultado da operação binária S H L (deslocamento em bits para a esquerda) para elementos
de matriz.

Versão com registro de resultados numa nova matriz:


bool  MathBitwiseShiftL(
const int&  array[],  // matriz de valores
const int  n,  // valor do deslocamento
int&  result[] // matriz de resultado
)

Versão com registro de resultados na matriz original:


bool  MathBitwiseShiftL(
int&  array[],  // matriz de valores
const int  n // valor do deslocamento
)

Parâmetros
array[]
[in] Matriz de valores.
n
[in] Números de bits para deslocamento.
array[]
[out] Matriz de valores de saída.
result[]
[out] Matriz de valores de saída.

Valor de retorno
Retorna true em caso de sucesso, caso contrário, false.

© 2000-2018, MetaQuotes Software Corp.


2270 Biblioteca Padrão

MathBitwiseShiftR
Calcula o resultado da operação binária S HR (deslocamento em bits para a direita) para elementos de
matriz.

Versão com registro de resultados numa nova matriz:


bool  MathBitwiseShiftR(
const int&  array[],  // matriz de valores
const int  n,  // valor do deslocamento
int&  result[] // matriz de resultado
)

Versão com registro de resultados na matriz original:


bool  MathBitwiseShiftR(
int&  array[],  // matriz de valores
const int  n // valor do deslocamento
)

Parâmetros
array[]
[in] Matriz de valores.
n
[in] Números de bits para deslocamento.
array[]
[out] Matriz de valores de saída.
result[]
[out] Matriz de valores de saída.

Valor de retorno
Retorna true em caso de sucesso, caso contrário, false.

© 2000-2018, MetaQuotes Software Corp.


2271 Biblioteca Padrão

MathCumulativeSum
Gera uma matriz com o valor acumulado.

Versão com registro de resultados numa nova matriz:


bool  MathCumulativeSum(
const double&  array[],  // matriz de valores
double&  result[] // matriz de resultado
)

Versão com registro de resultados na matriz original:


bool  MathCumulativeSum(
double&  array[] // matriz de valores
)

Parâmetros
array[]
[in] Matriz de valores. 
array[]
[out] Matriz de valores de saída.
result[]
[out] Matriz de valores de saída. 

Valor de retorno
Retorna true em caso de sucesso, caso contrário, false.

© 2000-2018, MetaQuotes Software Corp.


2272 Biblioteca Padrão

MathCumulativeProduct
Gera uma matriz com o produto acumulado.

Versão com registro de resultados numa nova matriz:


bool  MathCumulativeProduct(
const double&  array[],  // matriz de valores
double&  result[] // matriz de resultado
)

Versão com registro de resultados na matriz original:


bool  MathCumulativeProduct(
double&  array[] // matriz de valores
)

Parâmetros
array[]
[in] Matriz de valores. 
result[]
[out] Matriz de valores de saída. 
array[]
[out] Matriz de valores de saída. 

Valor de retorno
Retorna true em caso de sucesso, caso contrário, false.

© 2000-2018, MetaQuotes Software Corp.


2273 Biblioteca Padrão

MathCumulativeMin
Gera uma matriz de valores mínimos acumulados.

Versão com registro de resultados numa nova matriz:


bool  MathCumulativeMin(
const double&  array[],  // matriz de valores
double&  result[] // matriz de resultado
)

Versão com registro de resultados na matriz original:


bool  MathCumulativeMin(
double&  array[] // matriz de valores
)

Parâmetros
array[]
[in] Matriz de valores. 
result[]
[out] Matriz de valores de saída.
array[]
[out] Matriz de valores de saída. 

Valor de retorno
Retorna true em caso de sucesso, caso contrário, false.

© 2000-2018, MetaQuotes Software Corp.


2274 Biblioteca Padrão

MathCumulativeMax
Gera uma matriz de valores máximos acumulados.

Versão com registro de resultados numa nova matriz:


bool  MathCumulativeMax(
const double&  array[],  // matriz de valores
double&  result[] // matriz de resultado
)

Versão com registro de resultados na matriz original:


bool  MathCumulativeMax(
double&  array[] // matriz de valores
)

Parâmetros
array[]
[in] Matriz de valores. 
result[]
[out] Matriz de valores de saída. 
array[]
[out] Matriz de valores de saída. 

Valor de retorno
Retorna true em caso de sucesso, caso contrário, false.

© 2000-2018, MetaQuotes Software Corp.


2275 Biblioteca Padrão

MathSin
Calcula o valor da função sin(x) para os elementos da matriz.

Versão com registro de resultados numa nova matriz:


bool  MathSin(
const double&  array[],  // matriz de valores
double&  result[] // matriz de resultado
)

Versão com registro de resultados na matriz original:


bool  MathSin(
double&  array[] // matriz de valores
)

Parâmetros
array[]
[in] Matriz de valores. 
result[]
[out] Matriz de valores de saída. 
array[]
[out] Matriz de valores de saída. 

Valor de retorno
Retorna true em caso de sucesso, caso contrário, false.

© 2000-2018, MetaQuotes Software Corp.


2276 Biblioteca Padrão

MathCos
Calcula o valor da função cos(x) para os elementos da matriz.

Versão com registro de resultados numa nova matriz:


bool  MathCos(
const double&  array[],  // matriz de valores
double&  result[] // matriz de resultado
)

Versão com registro de resultados na matriz original:


bool  MathCos(
double&  array[] // matriz de valores
)

Parâmetros
array[]
[in] Matriz de valores. 
result[]
[out] Matriz de valores de saída. 
array[]
[out] Matriz de valores de saída. 

Valor de retorno
Retorna true em caso de sucesso, caso contrário, false.

© 2000-2018, MetaQuotes Software Corp.


2277 Biblioteca Padrão

MathTan
Calcula o valor da função tan(x) para os elementos da matriz.

Versão com registro de resultados numa nova matriz:


bool  MathTan(
const double&  array[],  // matriz de valores
double&  result[] // matriz de resultado
)

Versão com registro de resultados na matriz original:


bool  MathTan(
double&  array[] // matriz de valores
)

Parâmetros
array[]
[in] Matriz de valores. 
result[]
[out] Matriz de valores de saída. 
array[]
[out] Matriz de valores de saída. 

Valor de retorno
Retorna true em caso de sucesso, caso contrário, false.

© 2000-2018, MetaQuotes Software Corp.


2278 Biblioteca Padrão

MathArcsin
Calcula o valor da função arcsin(x) para os elementos da matriz.

Versão com registro de resultados numa nova matriz:


bool  MathArcsin(
const double&  array[],  // matriz de valores
double&  result[] // matriz de resultado
)

Versão com registro de resultados na matriz original:


bool  MathArcsin(
double&  array[] // matriz de valores
)

Parâmetros
array[]
[in] Matriz de valores. 
result[]
[out] Matriz de valores de saída. 
array[]
[out] Matriz de valores de saída. 

Valor de retorno
Retorna true em caso de sucesso, caso contrário, false.

© 2000-2018, MetaQuotes Software Corp.


2279 Biblioteca Padrão

MathArccos
Calcula o valor da função arccos(x) para os elementos da matriz.

Versão com registro de resultados numa nova matriz:


bool  MathArccos(
const double&  array[],  // matriz de valores
double&  result[] // matriz de resultado
)

Versão com registro de resultados na matriz original:


bool  MathArccos(
double&  array[] // matriz de valores
)

Parâmetros
array[]
[in] Matriz de valores. 
result[]
[out] Matriz de valores de saída. 
array[]
[out] Matriz de valores de saída. 

Valor de retorno
Retorna true em caso de sucesso, caso contrário, false.

© 2000-2018, MetaQuotes Software Corp.


2280 Biblioteca Padrão

MathArctan
Calcula o valor da função arctan(x) para os elementos da matriz.

Versão com registro de resultados numa nova matriz:


bool  MathArctan(
const double&  array[],  // matriz de valores
double&  result[] // matriz de resultado
)

Versão com registro de resultados na matriz original:


bool  MathArctan(
double&  array[] // matriz de valores
)

Parâmetros
array[]
[in] Matriz de valores. 
result[]
[out] Matriz de valores de saída. 
array[]
[out] Matriz de valores de saída. 

Valor de retorno
Retorna true em caso de sucesso, caso contrário, false.

© 2000-2018, MetaQuotes Software Corp.


2281 Biblioteca Padrão

MathSinPi
Calcula o valor da função sin(pi*x) para os elementos da matriz.

Versão com registro de resultados numa nova matriz:


bool  MathSinPi(
const double&  array[],  // matriz de valores
double&  result[] // matriz de resultado
)

Versão com registro de resultados na matriz original:


bool  MathSinPi(
double&  array[] // matriz de valores
)

Parâmetros
array[]
[in] Matriz de valores. 
result[]
[out] Matriz de valores de saída. 
array[]
[out] Matriz de valores de saída. 

Valor de retorno
Retorna true em caso de sucesso, caso contrário, false.

© 2000-2018, MetaQuotes Software Corp.


2282 Biblioteca Padrão

MathCosPi
Calcula o valor da função cos(pi*x) para os elementos da matriz.

Versão com registro de resultados numa nova matriz:


bool  MathCosPi(
const double&  array[],  // matriz de valores
double&  result[] // matriz de resultado
)

Versão com registro de resultados na matriz original:


bool  MathCosPi(
double&  array[] // matriz de valores
)

Parâmetros
array[]
[in] Matriz de valores. 
result[]
[out] Matriz de valores de saída. 
array[]
[out] Matriz de valores de saída. 

Valor de retorno
Retorna true em caso de sucesso, caso contrário, false.

© 2000-2018, MetaQuotes Software Corp.


2283 Biblioteca Padrão

MathTanPi
Calcula o valor da função tan(pi*x) para os elementos da matriz.

Versão com registro de resultado numa nova matriz:


bool  MathTanPi(
const double&  array[],  // matriz de valores
double&  result[] // matriz de resultado
)

Versão com registro de resultado na matriz original:


bool  MathTanPi(
double&  array[] // matriz de valores
)

Parâmetros
array[]
[in] Matriz de valores. 
result[]
[out] Matriz de valores de saída. 
array[]
[out] Matriz de valores de saída. 

Valor de retorno
Retorna true em caso de sucesso, caso contrário, false.

© 2000-2018, MetaQuotes Software Corp.


2284 Biblioteca Padrão

MathAbs
Calcula o valor absoluto dos elementos da matriz.

Versão com registro de resultados numa nova matriz:


bool  MathAbs(
const double&  array[],  // matriz de valores
double&  result[] // matriz de resultado
)

Versão com registro de resultados na matriz original:


bool  MathAbs(
double&  array[] // matriz de valores
)

Parâmetros
array[]
[in] Matriz de valores. 
result[]
[out] Matriz de valores de saída. 
array[]
[out] Matriz de valores de saída. 

Valor de retorno
Retorna true em caso de sucesso, caso contrário, false.

© 2000-2018, MetaQuotes Software Corp.


2285 Biblioteca Padrão

MathCeil
Retorna o valor de número inteiro mais próximo - desde cima - para os elementos da matriz.

Versão com registro de resultados numa nova matriz:


bool  MathCeil(
const double&  array[],  // matriz de valores
double&  result[] // matriz de resultado
)

Versão com registro de resultados na matriz original:


bool  MathCeil(
double&  array[] // matriz de valores
)

Parâmetros
array[]
[in] Matriz de valores. 
result[]
[out] Matriz de valores de saída. 
array[]
[out] Matriz de valores de saída. 

Valor de retorno
Retorna true em caso de sucesso, caso contrário, false.

© 2000-2018, MetaQuotes Software Corp.


2286 Biblioteca Padrão

MathFloor
Retorna o valor de número inteiro mais próximo - desde baixo - para os elementos da matriz.

Versão com registro de resultados numa nova matriz:


bool  MathFloor(
const double&  array[],  // matriz de valores
double&  result[] // matriz de resultado
)

Versão com registro de resultados na matriz original:


bool  MathFloor(
double&  array[] // matriz de valores
)

Parâmetros
array[]
[in] Matriz de valores. 
result[]
[out] Matriz de valores de saída. 
array[]
[out] Matriz de valores de saída. 

Valor de retorno
Retorna true em caso de sucesso, caso contrário, false.

© 2000-2018, MetaQuotes Software Corp.


2287 Biblioteca Padrão

MathSqrt
Calcula a raiz quadrada para os elementos da matriz.

Versão com registro de resultados numa nova matriz:


bool  MathSqrt(
const double&  array[],  // matriz de valores
double&  result[] // matriz de resultado
)

Versão com registro de resultados na matriz original:


bool  MathSqrt(
double&  array[] // matriz de valores
)

Parâmetros
array[]
[in] Matriz de valores. 
result[]
[out] Matriz de valores de saída. 
array[]
[out] Matriz de valores de saída. 

Valor de retorno
Retorna true em caso de sucesso, caso contrário, false.

© 2000-2018, MetaQuotes Software Corp.


2288 Biblioteca Padrão

MathExp
Calcula o valor da função exp(x) para os elementos da matriz.

Versão com registro de resultados numa nova matriz:


bool  MathExp(
const double&  array[],  // matriz de valores
double&  result[] // matriz de resultado
)

Versão com registro de resultados na matriz original:


bool  MathExp(
double&  array[] // matriz de valores
)

Parâmetros
array[]
[in] Matriz de valores. 
result[]
[out] Matriz de valores de saída. 
array[]
[out] Matriz de valores de saída. 

Valor de retorno
Retorna true em caso de sucesso, caso contrário, false.

© 2000-2018, MetaQuotes Software Corp.


2289 Biblioteca Padrão

MathPow
Calcula o valor da função pow(x, power) para os elementos da matriz. 

Versão com registro de resultados numa nova matriz:


bool  MathPow(
const double&  array[],  // matriz de valores
const double  power,  // potência
double&  result[]  // matriz de resultado
)

Versão com registro de resultados na matriz original:


bool  MathPow(
double&  array[],  // matriz de valores
const double  power   // potência
)

Parâmetros
array[]
[in] Matriz de valores. 
result[]
[out] Matriz de valores de saída. 
array[]
[out] Matriz de valores de saída. 

Valor de retorno
Retorna true em caso de sucesso, caso contrário, false.

© 2000-2018, MetaQuotes Software Corp.


2290 Biblioteca Padrão

MathLog
Calcula o valor da função log(x) para os elementos da matriz. 

Versão para calcular o logaritmo natural com registro de resultados numa nova matriz.
bool  MathLog(
const double&  array[],  // matriz de valores
double&  result[] // matriz de resultado
)

Versão para calcular o logaritmo natural com registro de resultados na matriz original.
bool  MathLog(
double&  array[] // matriz de valores
)

Versão para calcular o logaritmo de acordo com a base especificada com registro de resultados numa
nova matriz. 
bool  MathLog(
const double&  array[],  // matriz de valores
const double  base,  // base do logaritmo
double&  result[] // matriz de resultado
)

Versão para calcular o logaritmo de acordo com a base especificada com registro de resultados na
matriz original. 
bool  MathLog(
double&  array[],  // matriz de valores
const double  base // base do logaritmo
)

Parâmetros
array[]
[in] Matriz de valores. 
base
[in] Base do logaritmo.
array[]
[out] Matriz de valores de saída.
result[]
[out] Matriz de valores de saída. 

Valor de retorno
Retorna true em caso de sucesso, caso contrário, false.

© 2000-2018, MetaQuotes Software Corp.


2291 Biblioteca Padrão

MathLog2
Calcula o valor do logaritmo na base 2 para elementos da matriz. 

Versão com registro de resultados numa nova matriz:


bool  MathLog2(
const double&  array[],  // matriz de valores
double&  result[] // matriz de resultado
)

Versão com registro de resultados na matriz original:


bool  MathLog2(
double&  array[] // matriz de valores
)

Parâmetros
array[]
[in] Matriz de valores. 
result[]
[out] Matriz de valores de saída. 
array[]
[out] Matriz de valores de saída. 

Valor de retorno
Retorna true em caso de sucesso, caso contrário, false.

© 2000-2018, MetaQuotes Software Corp.


2292 Biblioteca Padrão

MathLog10
Calcula o valor do logaritmo na base 10 para elementos da matriz. 

Versão com registro de resultados numa nova matriz:


bool  MathLog10(
const double&  array[],  // matriz de valores
double&  result[] // matriz de resultado
)

Versão com registro de resultados na matriz original:


bool  MathLog10(
double&  array[] // matriz de valores
)

Parâmetros
array[]
[in] Matriz de valores. 
result[]
[out] Matriz de valores de saída. 
array[]
[out] Matriz de valores de saída. 

Valor de retorno
Retorna true em caso de sucesso, caso contrário, false.

© 2000-2018, MetaQuotes Software Corp.


2293 Biblioteca Padrão

MathLog1p
Calcula o valor da função de log(1+x) para os elementos da matriz.

Versão com registro de resultados numa nova matriz:


bool  MathLog1p(
const double&  array[],  // matriz de valores
double&  result[] // matriz de resultado
)

Versão com registro de resultados na matriz original:


bool  MathLog1p(
double&  array[] // matriz de valores
)

Parâmetros
array[]
[in] Matriz de valores. 
result[]
[out] Matriz de valores de saída. 
array[]
[out] Matriz de valores de saída. 

Valor de retorno
Retorna true em caso de sucesso, caso contrário, false.

© 2000-2018, MetaQuotes Software Corp.


2294 Biblioteca Padrão

MathDifference
Gera uma matriz com diferenças de elementos y[i]=x [i+lag ]-x [i].

Versão para geração única de matrizes de valores reais :


bool  MathDifference(
const double  &array[],  // matriz de valores
const int  lag,  // latência
double  &result[] // matriz de resultado
)

Versão para geração única de matrizes de valores inteiros :


bool  MathDifference(
const int  &array[],  // matriz de valores
const int  lag,  // latência
int  &result[] // matriz de resultado
)

Versão para geração repetida de uma matriz de valores reais (o número de iterações é definido nos
parâmetros de entrada):
bool  MathDifference(
const double  &array[],  // matriz de valores
const int  lag,  // latência
const int  differences,  // número de iterações
double  &result[] // matriz de resultado
)

Versão para geração repetida de uma matriz de valores inteiros (o número de iterações é definido nos
parâmetros de entrada):
bool  MathDifference(
const int&  array[],  // matriz de valores
const int  lag,  // latência
const int  differences,  // número de iterações
int&  result[] // matriz de resultado
)

Parâmetros
array[]
[in] Matriz de valores. 
lag
[in] Parâmetro de latência. 
differences
[in] Número de iterações.
result[]

© 2000-2018, MetaQuotes Software Corp.


2295 Biblioteca Padrão

[out] Matriz para registrar resultados. 

Valor de retorno
Retorna true em caso de sucesso, caso contrário, false.

© 2000-2018, MetaQuotes Software Corp.


2296 Biblioteca Padrão

MathSample
Gera uma amostragem aleatória de elementos da matriz.

Versão para trabalhar com uma matriz de valores reais :


bool  MathSample(
const double&  array[],  // matriz de valores
const int  count,  // quantidade
double&  result[] // matriz de resultado
)

Versão para trabalhar com uma matriz de valores inteiros :


bool  MathSample(
const int&  array[],  // matriz de valores
const int  count,  // quantidade
int&  result[] // matriz de resultado
)

Versão para trabalhar com uma matriz de valores reais. É poss ível obter uma amostragem de retorno:

bool  MathSample(
const double&  array[],  // matriz de valores
const int  count,  // quantidade
const bool  replace,  // sinalizador
double&  result[],  // matriz de resultado
)

Versão para trabalhar com uma matriz de valores inteiros. É poss ível obter uma amostragem de
retorno:
bool  MathSample(
const int&  array[],  // matriz de valores
const int  count,  // quantidade
const bool  replace,  // sinalizador
int&  result[] // matriz de resultado
)

Versão para trabalhar com uma matriz de valores reais para os quais são definidas as probabilidades
na amostragem.
bool  MathSample(
const double&  array[],  // matriz de valores
double&  probabilities[],  // matriz de probabilidades
const int  count,  // quantidade
double&  result[] // matriz de resultado
)

Versão para trabalhar com uma matriz de valores inteiros para os quais são definidas as
probabilidades na amostragem.

© 2000-2018, MetaQuotes Software Corp.


2297 Biblioteca Padrão

bool  MathSample(
const int&  array[],  // matriz de valores
double&  probabilities[],  // matriz de probabilidades
const int  count,  // quantidade
int&  result[] // matriz de resultado
)

Versão para trabalhar com uma matriz de valores reais para os quais são definidas as probabilidades
na amostragem. É poss ível obter uma amostragem de retorno:
bool  MathSample(
const double&  array[],  // matriz de valores
double&  probabilities[],  // matriz de probabilidades
const int  count,  // quantidade
const bool  replace,  // sinalizador
double&  result[] // matriz de resultado
)

Versão para trabalhar com uma matriz de valores inteiros para os quais são definidas as
probabilidades na amostragem. É poss ível obter uma amostragem de retorno:
bool  MathSample(
const int&  array[],  // matriz de valores
double&  probabilities[],  // matriz de probabilidades
const int  count,  // quantidade
const bool  replace,  // sinalizador
int&  result[] // matriz de resultado
)

Parâmetros
array[]
[in] Matriz de valores inteiros. 
probabilities[]
[in] Matriz de probabilidades com as quais é realizada a amostragem de elementos.
count
[in] Número de elementos. 
replace
[in] Parâmetro que permite realizar a seleção com retorno.
result[]
[out] Matriz para registro de resultados.

Valor de retorno
Retorna true em caso de sucesso, caso contrário, false.

Observação

© 2000-2018, MetaQuotes Software Corp.


2298 Biblioteca Padrão

O argumento replace=true permite realizar a seleção aleatória com seu retorno para o conjunto
inicial.

© 2000-2018, MetaQuotes Software Corp.


2299 Biblioteca Padrão

MathTukeySummary
Calcula o resumo de cinco números de T uk ey (mínimo, quartil inferior, média, quartil superior,
máximo) para os elementos da matriz.
bool  MathTukeySummary(
const double&  array[],  // matriz de valores
const bool  removeNAN,  // sinalizador
double&  minimum,  // valor mínimo
double&  lower_hinge,  // quartil inferior
double&  median,  // valor médio
double&  upper_hinge, // quartil superior
double&  maximum // valor máximo
)

Parâmetros
array[]
[in] Matriz de valores reais.
removeNAN
[in] Sinalizador que indica se é necessário apagar os valores não numéricos.
minimum
[out] Variável para registro do valor mínimo. 
lower_hinge
[out] Variável para registro do quartil inferior. 
median
[out] Variável para registro do valor médio. 
upper_hinge
[out] Variável para registro do quartil superior. 
maximum
[out] Variável para registro do valor máximo. 

Valor de retorno
Retorna true em caso de sucesso, caso contrário, false.

© 2000-2018, MetaQuotes Software Corp.


2300 Biblioteca Padrão

MathRange
Calcula os valores mínimos e máximos dos elementos da matriz.
bool  MathRange(
const double& array[],  // matriz de valores
double&  min,  // valor mínimo
double&  max // valor máximo
)

Parâmetros
array[]
[in] Matriz de valores. 
min
[out] Variável para registro do valor mínimo.
max
[out] Variável para registro do valor máximo.

Valor de retorno
Retorna true em caso de sucesso, caso contrário, false.

© 2000-2018, MetaQuotes Software Corp.


2301 Biblioteca Padrão

MathMin
Retorna o valor mínimo de todos os elementos na matriz.
double  MathMin(
const double&  array[] // matriz de valores
)

Parâmetros
array[]
[in] Matriz de valores. 

Valor de retorno
Valor mínimo.

© 2000-2018, MetaQuotes Software Corp.


2302 Biblioteca Padrão

MathMax
Retorna o valor máximo de todos os elementos da matriz.
double  MathMax(
const double&  array[] // matriz de valores
)

Parâmetros
array[]
[in] Matriz de valores. 

Valor de retorno
Valor máximo.

© 2000-2018, MetaQuotes Software Corp.


2303 Biblioteca Padrão

MathSum
Retorna a soma dos elementos da matriz.
double  MathSum(
const double&  array[] // matriz de valores
)

Parâmetros
array[]
[in] Matriz de valores. 

Valor de retorno
Soma de elementos.

© 2000-2018, MetaQuotes Software Corp.


2304 Biblioteca Padrão

MathProduct
Retorna o produto dos elementos da matriz.
double  MathProduct(
const double&  array[] // matriz de valores
)

Parâmetros
array[]
[in] Matriz de valores. 

Valor de retorno
Produto de elementos.

© 2000-2018, MetaQuotes Software Corp.


2305 Biblioteca Padrão

MathStandardDeviation
Calcula o desvio padrão dos elementos da matriz.
double  MathStandardDeviation(
const double&  array[]   // matriz de valores
)

Parâmetros
array[]
[in] Matriz de valores. 

Valor de retorno
Desvio padrão.

© 2000-2018, MetaQuotes Software Corp.


2306 Biblioteca Padrão

MathAverageDeviation
A função calcula o desvio médio dos elementos na matriz.
double  MathAverageDeviation(
const double&  array[]   // matriz de valores
)

Parâmetros
array[]
[in] Matriz de valores. 

Valor de retorno
Desvio médio dos elementos da matriz.

© 2000-2018, MetaQuotes Software Corp.


2307 Biblioteca Padrão

MathMedian
Calcula o valor de mediana dos elementos da matriz.
double  MathMedian(
double&  array[]   // matriz de valores
)

Parâmetros
array[]
[in] Matriz de valores. 

Valor de retorno
Valor de mediana.

© 2000-2018, MetaQuotes Software Corp.


2308 Biblioteca Padrão

MathMean
Calcula o valor médio dos elementos da matriz.
double  MathMean(
const double&  array[]   // matriz de valores
)

Parâmetros
array[]
[in] Matriz de valores. 

Valor de retorno
Valor médio.

© 2000-2018, MetaQuotes Software Corp.


2309 Biblioteca Padrão

MathVariance
A função calcula a dispersão (segundo momento) dos elementos da matriz.
double  MathVariance(
const double&  array[]   // matriz de valores
)

Parâmetros
array[]
[in] Matriz de valores. 

Valor de retorno
Valor da dispersão.

© 2000-2018, MetaQuotes Software Corp.


2310 Biblioteca Padrão

MathSkewness
A função calcula a obliquidade dos elementos da matriz (terceiro momento).
double  MathSkewness(
const double&  array[]   // matriz de valores
)

Parâmetros
array[]
[in] Matriz de valores. 

Valor de retorno
Obliquidade.

© 2000-2018, MetaQuotes Software Corp.


2311 Biblioteca Padrão

MathKurtosis
Calcula a curtose (quarto momento) dos elementos da matriz.
double  MathKurtosis(
const double&  array[]   // matriz de valores
)

Parâmetros
array[]
[in] Matriz de valores. 

Valor de retorno
Coeficiente de curtose.

© 2000-2018, MetaQuotes Software Corp.


2312 Biblioteca Padrão

MathExpm1
Calcula o valor da função exp(x)-1 para os elementos da matriz.

Versão com registro de resultados numa nova matriz:


bool  MathExpm1(
const double&  array[],  // matriz de valores
double&  result[]   // matriz de resultado
)

Versão com registro de resultados na matriz original:


bool  MathExpm1(
double&  array[]   // matriz de valores
)

Parâmetros
array[]
[in] Matriz de valores. 
result[]
[out] Matriz de valores de saída. 
array[]
[out] Matriz de valores de saída. 

Valor de retorno
Retorna true em caso de sucesso, caso contrário, false.

© 2000-2018, MetaQuotes Software Corp.


2313 Biblioteca Padrão

MathSinh
Calcula o valor da função sinh(x) para os elementos da matriz.

Versão com registro de resultados numa nova matriz:


bool  MathSinh(
const double&  array[],  // matriz de valores
double&  result[]   // matriz de resultado
)

Versão com registro de resultados na matriz original:


bool  MathSinh(
double&  array[]   // matriz de valores
)

Parâmetros
array[]
[in] Matriz de valores. 
result[]
[out] Matriz de valores de saída. 
array[]
[out] Matriz de valores de saída. 

Valor de retorno
Retorna true em caso de sucesso, caso contrário, false.

© 2000-2018, MetaQuotes Software Corp.


2314 Biblioteca Padrão

MathCosh
Calcula o valor da função cos h(x) para os elementos da matriz.

Versão com registro de resultados numa nova matriz:


bool  MathCosh(
const double&  array[],  // matriz de valores
double&  result[]   // matriz de resultado
)

Versão com registro de resultados na matriz original:


bool  MathCosh(
double&  array[]   // matriz de valores
)

Parâmetros
array[]
[in] Matriz de valores. 
result[]
[out] Matriz de valores de saída. 
array[]
[out] Matriz de valores de saída. 

Valor de retorno
Retorna true em caso de sucesso, caso contrário, false.

© 2000-2018, MetaQuotes Software Corp.


2315 Biblioteca Padrão

MathTanh
Calcula o valor da função tanh(x) para os elementos da matriz.

Versão com registro de resultados numa nova matriz:


bool  MathTanh(
const double&  array[],  // matriz de valores
double&  result[]   // matriz de resultado
)

Versão com registro de resultados na matriz original:


bool  MathTanh(
double&  array[]   // matriz de valores
)

Parâmetros
array[]
[in] Matriz de valores. 
result[]
[out] Matriz de valores de saída. 
array[]
[out] Matriz de valores de saída. 

Valor de retorno
Retorna true em caso de sucesso, caso contrário, false.

© 2000-2018, MetaQuotes Software Corp.


2316 Biblioteca Padrão

MathArcsinh
Calcula o valor da função arcsinh(x) para os elementos da matriz.

Versão com registro de resultados numa nova matriz:


bool  MathArcsinh(
const double&  array[],  // matriz de valores
double&  result[]   // matriz de resultado
)

Versão com registro de resultados na matriz original:


bool  MathArcsinh(
double&  array[]   // matriz de valores
)

Parâmetros
array[]
[in] Matriz de valores. 
result[]
[out] Matriz de valores de saída. 
array[]
[out] Matriz de valores de saída. 

Valor de retorno
Retorna true em caso de sucesso, caso contrário, false.

© 2000-2018, MetaQuotes Software Corp.


2317 Biblioteca Padrão

MathArccosh
Calcula o valor da função arccos h(x) para os elementos da matriz.

Versão com registro de resultados numa nova matriz:


bool  MathArccosh(
const double&  array[],  // matriz de valores
double&  result[]   // matriz de resultado
)

Versão com registro de resultados na matriz original:


bool  MathArccosh(
double&  array[]   // matriz de valores
)

Parâmetros
array[]
[in] Matriz de valores. 
result[]
[out] Matriz de valores de saída. 
array[]
[out] Matriz de valores de saída. 

Valor de retorno
Retorna true em caso de sucesso, caso contrário, false.

© 2000-2018, MetaQuotes Software Corp.


2318 Biblioteca Padrão

MathArctanh
Calcula o valor da função arctanh(x) para os elementos da matriz.

Versão com registro de resultados numa nova matriz:


bool  MathArctanh(
const double&  array[],  // matriz de valores
double&  result[]   // matriz de resultado
)

Versão com registro de resultados na matriz original:


bool  MathArctanh(
double&  array[]   // matriz de valores
)

Parâmetros
array[]
[in] Matriz de valores. 
result[]
[out] Matriz de valores de saída. 
array[]
[out] Matriz de valores de saída. 

Valor de retorno
Retorna true em caso de sucesso, caso contrário, false.

© 2000-2018, MetaQuotes Software Corp.


2319 Biblioteca Padrão

MathSignif
Arredonda um valor para o número especificado de dígitos na mantissa.

Versão para trabalhar com valores reais :


double  MathSignif(
const double  x,  // valor
const int  digits   // número de dígitos
)

Valor de retorno
Valor arredondado.

Versão para trabalhar com uma matriz de valores reais com registro de resultados numa matriz
separada:
bool  MathSignif(
const double&  array[],  // matriz de valores
int  digits,  // número de dígitos
double  result[]   // matriz de resultado
)

Valor de retorno
Retorna true em caso de sucesso, caso contrário, false.

Versão para trabalhar com uma matriz de valores reais com registro de resultados na matriz de
origem:
bool  MathSignif(
double&  array[],  // matriz de valores
int  digits   // número de dígitos
)

Valor de retorno
Retorna true em caso de sucesso, caso contrário, false.

Parâmetros
x
[in] Valor real para arredondamento.
digits
[in] Número de dígitos.
array[]
[in] Matriz de valores reais. 
array[]
[out] Matriz de valores de saída.
result[]

© 2000-2018, MetaQuotes Software Corp.


2320 Biblioteca Padrão

[out] Matriz de valores de saída. 

© 2000-2018, MetaQuotes Software Corp.


2321 Biblioteca Padrão

MathRank
Calcula a posição dos elementos da matriz.

Versão para trabalhar com uma matriz de valores reais :


bool  MathRank(
const double&  array[],  // matriz de valores
double&  rank[]   // matriz de rankings
)

Versão para trabalhar com uma matriz de valores inteiros :


bool  MathRank(
const int&  array[],  // matriz de valores
double&  rank[]   // matriz de rankings
)

Parâmetros
array[]
[in] Matriz de valores. 
rank[]
[out] Matriz para registro de rank ings. 

Valor de retorno
Retorna true em caso de sucesso, caso contrário, false.

© 2000-2018, MetaQuotes Software Corp.


2322 Biblioteca Padrão

MathCorrelationPearson
Calcula o coeficiente de correlação de Pearson.

Versão para trabalhar com matrizes de valores reais :


bool  MathCorrelationPearson(
const double&  array1[],  // primeira matriz de valores
const double&  array2[],  // segunda matriz de valores
double&  r   // coeficiente de correlação
)

Versão para trabalhar com matrizes de valores inteiros :


bool  MathCorrelationPearson(
const int&  array1[],  // primeira matriz de valores
const int&  array2[],  // segunda matriz de valores
double&  r   // coeficiente de correlação
)

Parâmetros
array1[]
[in] Primeira matriz de valores.
array2[]
[in] Segunda matriz de valores.
r
[out] Variável para registro do coeficiente de correlação. 

Valor de retorno
Retorna true em caso de sucesso, caso contrário, false.

© 2000-2018, MetaQuotes Software Corp.


2323 Biblioteca Padrão

MathCorrelationSpearman
Calcula o coeficiente de correlação de Spearman.

Versão para trabalhar com matrizes de valores reais :


bool  MathCorrelationSpearman(
const double&  array1[],  // primeira matriz de valores
const double&  array2[],  // segunda matriz de valores
double&  r  // coeficiente de correlação
)

Versão para trabalhar com matrizes de valores inteiros :


bool  MathCorrelationSpearman(
const int&  array1[],  // primeira matriz de valores
const int&  array2[],  // segunda matriz de valores
double&  r  // coeficiente de correlação
)

Parâmetros
array1[]
[in] Primeira matriz de valores. 
array2[]
[in] Segunda matriz de valores. 
r
[out] Variável para registro do coeficiente de correlação. 

Valor de retorno
Retorna true em caso de sucesso, caso contrário, false.

© 2000-2018, MetaQuotes Software Corp.


2324 Biblioteca Padrão

MathCorrelationKendall
Calcula o coeficiente de correlação de Kendall.

Versão para trabalhar com matrizes de valores reais :


bool  MathCorrelationKendall(
const double&  array1[],  // primeira matriz de valores
const double&  array2[],  // segunda matriz de valores
double&  tau   // coeficiente de correlação
)

Versão para trabalhar com matrizes de valores inteiros :


bool  MathCorrelationKendall(
const int&  array1[],  // primeira matriz de valores
const int&  array2[],  // segunda matriz de valores
double&  tau   // coeficiente de correlação
)

Parâmetros
array1[]
[in] Primeira matriz de valores. 
array2[]
[in] Segunda matriz de valores. 
tau
[out] Variável para registro do coeficiente de correlação. 

Valor de retorno
Retorna true em caso de sucesso, caso contrário, false.

© 2000-2018, MetaQuotes Software Corp.


2325 Biblioteca Padrão

MathQuantile
Calcula o quantis seletivos que corresponde às probabilidades definidas : Q[i](p) = (1 - gamma)
*x [j] + gamma*x [j+1]
bool  MathQuantile(
const double&  array[],  // matriz de valores
const double&  probs[],  // matriz de probabilidades
double&  quantile[]  // matriz para registro de quantis
)

Parâmetros
array[]
[in] Matriz de valores.
probs[]
[in] Matriz de probabilidades.
quantile[]
[out] Matriz para registro de quantis.

Valor de retorno
Retorna true em caso de sucesso, caso contrário, false.

© 2000-2018, MetaQuotes Software Corp.


2326 Biblioteca Padrão

MathProbabilityDensityEmpirical
A função calcula a função densidade de probabilidade empírica (pdf) para os valores aleatórios.
bool  MathProbabilityDensityEmpirical(
const double&  array[],  // matriz de valores aleatórios
const int  count,  // número de pares
double&  x[],  // matriz de valores x
double&  pdf[]  // matriz de valores pdf
)

Parâmetros
array[]
[in] Matriz de valores aleatórios.
count
[in] Número de pares (x, pdf(x)).
x[]
[out] Matriz para registro de valores x.
pdf[]
[out] Matriz para registro de valores pdf(x).

Valor de retorno
Retorna true em caso de sucesso, caso contrário, false.

© 2000-2018, MetaQuotes Software Corp.


2327 Biblioteca Padrão

MathCumulativeDistributionEmpirical
Calcula a distribuição cumulativa empírica (cdf) para os valores aleatórios da matriz.
bool  MathCumulativeDistributionEmpirical(
const double&  array[],  // matriz de valores aleatórios
const int  count,  // número de pares
double&  x[],  // matriz de valores x
double&  cdf[]  // matriz de valores cdf
)

Parâmetros
array[]
[in] Matriz de valores aleatórios. 
count
[in] Número de pares (x, cdf(x)). 
x[]
[out] Matriz para registro de valores x. 
cdf[]
[out] Matriz para registro de valores cdf(x). 

Valor de retorno
Retorna true em caso de sucesso, caso contrário, false.

© 2000-2018, MetaQuotes Software Corp.


2328 Biblioteca Padrão

A Fuzzy consiste na biblioteca para trabalhar com lógica


difusa
A lógica difusa é uma generalização da lógica aristotélica tradicional para o caso quando a verdade é
vista como uma variável linguística. Como na lógica clássica, para a lógica difusa, são definidas suas
operações de lógica difusa sobre os conjuntos difusos. Para os conjuntos difusos, existem todas as
mesmas operações que para os conjuntos convencionais, com a particularidade de serem mais
complexas. Observe que a composição dos conjuntos difusos também abrange um conjunto difuso.

A aproximação real ao refletir a realidade e um elevado nível de subjetividade que pode levar a erros
significativos nos resultados dos cálculos durante seu uso são uma das principais características da
lógica difusa que a distinguem da clássica.

O modelo (ou sistema) difuso é um modelo matemático, cuja base de cálculo é o fundamento da lógica
difusa. R ecorre-se à plotagem de tais modelos em caso de o objeto de estudo ter uma formalização
muito fraca e sua descrição matemática ser muito complicada ou desconhecida. A qualidade das
saídas desses modelos (erro de modelo) depende diretamente de perito que elaborou e definir o
modelo. Para minimizar os erros, a melhor opção consiste em compilar o modelo mais completo e
abrangente e, em seguida, configurá-lo usando as ferramentas de aprendizado de máquina, numa
grande amostragem de treinamento.

O progresso na plotagem do modelo pode ser dividida em três fases principais :

1. Determinação dos parâmetros de entrada e de saída do modelo.


2. Construção de uma base de conhecimento.
3. Seleção de um dos métodos de inferência difusa (Mamdani ou Sugeno ou Sugeno).
Os outros dois dependem da primeira fase, uma vez que ela define o funcionamento futuro do modelo.
A base de conhecimentos ou, como é também é chamada, a base de regras abrange o conjunto de
regras difusas do tipo: " se, então" que definem a relação entre as entradas e saídas do objeto
pesquisado. No sistema, o número de regras é determinado pelo Expert Advisor e também não é
restrito. Formato generalizado de regras difusas :

Se há condição (envio) de regra, então há conclusão quanto à regra.

Se a condição da regra caracteriza o estado atual do objeto, a conclusão é como essa condição irá
afetar o objeto. A visão geral das condições e conclusões não pode ser separada, uma vez que eles são
determinados pela inferência difusa.

Cada regra tem um peso no sistema, é este parâmetro que caracteriza a importância da regra no
modelo. Os fatores de ponderação são atribuídos à regra no intervalo [0, 1]. Em muitos dos exemplos
sobre modelos difusos, que podem ser encontrados na literatura, os dados de peso não são
especificados, mas isso não quer dizer que eles não existam, por outro lado

Você também pode gostar