
Simulação de mercado: Position View (V)
Introdução
Olá pessoal, e sejam bem-vindos a mais um artigo da série sobre como construir um sistema de replay/simulação.
No artigo anterior Simulação de mercado: Position View (IV), começamos a unir o indicador de posição, as outras três aplicações de base que já existiam no serviço de replay/simulador. Se bem, que neste primeiro momento, estaremos voltados a fazer uso destas quatro aplicações em uma conta demo ou conta real. Se bem, que eu não recomendo você fazer uso destas aplicações em uma conta real. Pelo menos por hora. Já que as mesmas ainda precisarão passar por alguns retoques. Mas o principal motivo de eu não recomendar usar estas aplicações em conta real. É justamente pelo fato de que o Expert Advisor e o indicador de posição, não estarem suficientemente estáveis para serem usados com tranquilidade.
Já no caso do Chart Trade e do Indicador de Mouse, não há problemas em usá-los em uma conta real. Se bem, que o Chart Trade, sem um Expert Advisor que o auxilie. Não serve para absolutamente nada.
Muito bem, neste artigo iremos tratar de um assunto, que em grande parte das vezes, é o que realmente um programador faz. Diferente do que muitos imaginam ser o trabalho de um programador real. Quando o assunto é programação. Passamos grande parte do tempo estudando e analisando informações. E somente uma pequena fração do tempo, realmente programado de fato.
Mas por que estou dizendo isto? O motivo é que muitos tem a ilusão, de que programar, é ficar digitando códigos e mais códigos. Quando na verdade isto somente é feito, depois de termos analisado diversas informações e pensado em um tipo de solução. Não é raro um programador, passar um bom tempo analisando arquivos que ele possa ter criado. A fim de procurar entender como as coisas estão acontecendo. Em alguns momentos, estes tais arquivos, que são arquivos de log. São substituídos por um processo de debug. Isto quando existe tal possibilidade.
Mas quando a quantidade de informações pode ser grande, e a analise demorada. É preferível fazer uso dos tais arquivos de log. E aqui vou explicar, como você pode usar tais arquivos a fim de produzir um tipo de solução para um problema. Mas primeiro vamos entender os problemas.
Os primeiros problemas
Apesar do que foi visto no artigo anterior, se algo aparentemente simples. Ali, temos diversos problemas e muitas coisas a serem resolvidas e feita. Você caro leitor, pode imaginar que tudo é fácil e simples. E de maneira inocente, vai simplesmente aceitando o que lhe é apresentado. Isto é uma falha, na qual você, caro leitor, deverá tentar se livrar. Mas pior do que aceitar, é simplesmente, não entender e tentar usar algo sem de fato compreender o que está sendo usado.
Não é raro, entre iniciantes, a fase de cópia e cola. Porém, caso você não queira ficar sempre nesta, é bom aprender como usar certas ferramentas. E uma das ferramentas mais utilizadas por programadores é a documentação. E a segunda ferramenta é os testes e arquivos de log.
Então vamos entender o seguinte problema que temos em mãos. O Expert Advisor, consegue, pelo que foi visto no artigo anterior. Colocar o indicador de posição no gráfico. E este indicador, procura os dados da posição a fim de apresentar as linhas no gráfico. Onde a posição, ou preços se encontram. Ok, até neste ponto, não temos problemas à primeira vista. Já que o trabalho está sendo executado como o esperado. Mas existem algumas falhas no código. Ou melhor, na forma como as coisas estão sendo feitas.
Suponhamos, e isto muitos bons programadores fazem. Ou seja, suposições. Que o operador encerre o Expert Advisor. Ou que esteja indicando ao Expert Advisor, que estava observando um contrato cheio, de que agora, o tal operador deseja observar posições abertas no mini contrato. Em ambos cenários, o que acontece no gráfico? Lembrando que estamos apenas começando a fazer as coisas. Bem, nos dois casos mencionados, teremos problemas com o indicador de posição. Já que no primeiro caso, onde o Expert Advisor, venha a ser removido do gráfico. Todos indicadores de posição que estiverem presentes, permanecerão no gráfico. O que é uma falha, já que não temos o Expert Advisor para auxiliar o sistema, caso o operador deseje encerrar uma posição. Ainda não foi implementado, os meios de se fazer isto, ao interagir diretamente com o indicador de posição. Mas isto será feito em breve. E temos que pensar nesta possibilidade desde agora. Isto por que quando tal funcionalidade for de fato implementada. O sistema, já estará sendo testado sobre outras coisas, igualmente importantes. Como é este caso do Expert Advisor ser removido do gráfico.
Já no segundo caso, onde o operador pede para mudar o tipo de contrato. A falha pode ser até mais grave. Já que ele leva o operador a uma falsa ideia sobre o que de fato esteja acontecendo na conta de negociação. A solução para ambos os casos é basicamente, remover todos os indicadores de posição, assim que o Expert Advisor sofrer alguma intervenção por parte do operador. Tal intervenção fará com que o MetaTrader 5, venha a disparar um evento DeInit, que será capturado pelo Expert Advisor, na função OnDeinit. Assim a solução é basicamente mudar o código anterior do Expert Advisor para um novo. Porém, como grande parte do código precisa ser modificado. Bastará mudar o fragmento mostrado abaixo, no código do Expert Advisor, que ambos problemas estarão solucionados.
54. //+------------------------------------------------------------------+ 55. void OnDeinit(const int reason) 56. { 57. ulong ul; 58. 59. switch (reason) 60. { 61. case REASON_REMOVE: 62. case REASON_INITFAILED: 63. EventChartCustom(0, evEA_At_ChartTrade, -1, 0, ""); 64. break; 65. } 66. if (Terminal != NULL) for (int count = PositionsTotal() - 1; count >= 0; count--) 67. { 68. ul = PositionGetTicket(count); 69. if (PositionGetString(POSITION_SYMBOL) != (*Terminal).GetInfoTerminal().szSymbol) continue; 70. ChartIndicatorDelete(0, 0, IntegerToString(ul)); 71. } 72. delete Orders; 73. delete Terminal; 74. } 75. //+------------------------------------------------------------------+
Fragmento do Expert Advisor
Note que neste código, foram feitas algumas mudanças, como é vista na linha 63. Originalmente, era indicado o ID do gráfico receber os eventos customizados. No entanto, consultando a documentação a fim de reduzir a quantidade de testes no código. Foi verificado, que ao passarmos o parâmetro ZERO como ID do gráfico. Os eventos customizados, serão dirigidos ao gráfico atual, onde a chamada do evento se originou. Com isto não precisaremos testar o ponteiro a fim de verificar se ele foi ou não inicializado. Porém, a mesma coisa não acontece, na linha 66. Neste ponto, precisamos nos certificar que de fato o ponteiro foi inicializado. E caso não tenha sido, ignoramos o código entre as linhas 66 e 71.
Agora a pergunta: O que este código faz? Este código resolve justamente os dois problemas mencionados acima. Observe que quando temos alguma posição em aberto. Teremos um indicador de posição no gráfico. E quando o Expert Advisor, recebe do MetaTrader 5, um evento DeInit, esta função vista no fragmento acima, será chamada. E na linha 68, capturamos os dados da posição com base no índex da mesma. Feito isto, na linha 69, verificamos se o ativo que contém a posição é o mesmo esperado pelo Expert Advisor. E por isto precisamos que a variável Terminal, tenha sido inicializada. Caso contrário, não conseguiríamos obter o nome correto do ativo.
Caso o ativo seja o esperado, na linha 70, dizemos ao MetaTrader 5, para remover do gráfico, o indicador cujo nome é o valor do bilhete da posição. Mas espera um pouco. Ao abrir a lista de indicadores, não estou vendo nenhum indicador com este nome. Ou seja, não existe nenhum ali, cujo nome é o valor do bilhete da posição. Você está correto, meu caro leitor. Mas acontece que no indicador de posição, informamos um nome que o MetaTrader 5, de fato entenderá como sendo a do indicador. E é justamente este mesmo nome que devemos informar aqui na linha 70.
Muito bem, este problema foi solucionado. Mas, apesar de ele ter sido solucionado. Por conta de um detalhe, que eu não havia notado. Temos uma falha em potencial, caso o operador, troque o tempo gráfico com o Expert Advisor no gráfico. Tal falha, irá disparar um erro de RUN TIME. Fazendo com que o Expert Advisor seja expulso do gráfico e um erro é informado no terminal do MetaTrader 5.
Normalmente, e é bem comum, que venhamos a obter o mesmo erro em programas C/C++, ao fazer uso de ponteiros. E tentar usar um ponteiro que não foi inicializado. Mas espera. No artigo anterior, menciono que os ponteiros são inicializados com um valor NULL. De fato, eles são inicializados com tal valor. Porém, se você mudar o tempo gráfico, a aplicação não se inicia do zero novamente. Como seria esperado. Ela se inicia na função OnInit. E ao fazer isto, o ponteiro, que estava sendo inicializado, em uma condição global, não estará mais sendo corretamente inicializado.
Desta forma, toda a aplicação corre sérios riscos. Pois temos um ponteiro fazendo uso de uma posição desconhecida na memória. Por isto, o MQL5 restringir o uso de ponteiros. Para evitar justamente este tipo de falha. Mas como realmente queremos e precisamos usar ponteiros. Temos de corrigir esta falha também. Porém ela é bem simples se ser sanada como pode ser visto no fragmento abaixo.
13. //+------------------------------------------------------------------+ 14. input eTypeContract user00 = MINI; //Cross order in contract 15. //+------------------------------------------------------------------+ 16. C_Orders *Orders; 17. C_Terminal *Terminal; 18. //+------------------------------------------------------------------+ 19. int OnInit() 20. { 21. Terminal = NULL; 22. Orders = new C_Orders(0xC0DEDAFE78514269); 23. 24. return INIT_SUCCEEDED; 25. } 26. //+------------------------------------------------------------------+
Fragmento do Expert Advisor
Note a linha 21. É justamente ela que corrige o problema. Compare este fragmento mostrado acima com o código original visto no artigo anterior, e você entenderá o que mudou aqui. Um detalhe, as linhas estão no mesmo ponto do original. Legal, três falhas em potencial corrigidas. Mas ainda não chegamos aos problemas realmente complicados. E para separar um pouco as coisas, vamos ver o primeiro destes problemas em um novo tópico.
Um problema com muitas soluções
Muito bem, o que foi visto até neste ponto. Tem como objetivo solucionar problemas simples, porém chatos pelo transtorno que podem nos causar. Agora começaremos a ver os problemas realmente complicados de serem solucionados. O primeiro deles envolve o fato de que uma posição pode sofrer mudanças no seu preço médio. Se você não tem familiaridade com este termo. Vou explicar o que ele significa. Isto para que você entenda o real problema que temos em mãos.
Em contas do tipo HEDGING, o termo preço médio, não existe no servidor de negociação. Ele se aplica apenas ao operador. Já que você pode ter diversas posições em aberto. Sendo que algumas em modo vendido, enquanto outras no modo comprado. Ok. Cada uma destas posições, pode ter um volume completamente distinto. Assim como um preço de abertura da posição. Ao efetuar um cálculo sobre o preço e o volume de cada uma das posições, você irá encontrar um valor. Este é o valor de preço e volume médio. Isto tem que ser efetuado pelo operador quando a conta é do tipo HEDGING.
Porém em contas do tipo NETTING, a coisa é um pouco diferente. Neste caso o preço médio, assim como o volume médio, é informado e mantido pelo servidor de negociação. Note o tamanho do problema que temos em mãos, ao tentar criar um replay/simulador. Pois seria muito mais simples criar ele, voltando todas as operações a serem feitas em contas do tipo NETTING. O fato de desejarmos cobrir ambos tipos de contas, nos traz uma série de complicações, que vem nos forçando a adiar o termino do projeto.
Pois bem, qual é o problema aqui? O problema é que diferente de uma nova posição sendo aberta em uma conta HEDGING. Quando fazemos isto em uma conta NETTING, o preço médio, assim como o volume, muda. No caso do volume a solução é simples. Apesar de não estarmos lidado com ela ainda. Mas para o problema do preço, a coisa é um pouco mais complicada. Isto por que, é complicado, manter o indicador de posição travado em um preço. Talvez esta frase tenha ficado estranha. Mas pense o seguinte: Quando o preço médio da posição muda no servidor. O Expert Advisor toma conhecimento do fato. No entanto, o indicador de posição não. Este é o nosso primeiro problema.
Existem outros. Mas vamos lidar com este primeiro. Você pode pensar: Bem, mas basta fazer o indicador de posição ficar acompanhando o que acontece na posição. É simples. Porém, meu caro leitor, as coisas não são bem assim na prática. Se você colocar o indicador de posição acompanhar o que acontece na posição. Terá que fazer isto, usando o evento OnTime, que é totalmente desaconselhável, ou usando o evento OnCalculate, que também é desaconselhável. Não estou dizendo que você não pode fazer isto. Apenas estou dizendo que não é aconselhável. Já que pode correr alguma falha e deixar o indicador travado. E isto poderá travar, todos demais, indicadores no gráfico do ativo. Resumindo: É uma péssima escolha.
Bem, neste caso, você pode pensar um pouco, e dizer: Podemos acessar o objeto HLINE e mudar a posição do mesmo dentro do código do Expert Advisor. Seria uma solução. Seria, mas existe um outro problema nesta solução. O objeto HLINE é apenas um dos objetos que precisaremos e iremos fazer uso dentro do indicador de posição. Então esta solução deve ser descartada. Quem deverá mexer nos objetos deverá ser o indicador de posição e ninguém mais.
Neste ponto, acredito que você já deva estar pensando: Cara mas você é chato. Por que complicar tanto as coisas? Faça o simples e pronto. Até cogito em alguns momentos fazer isto. Mas gosto de desafios. Então a minha proposta, pode fazer sua cabeça doer, meu caro leitor. Já que agora vamos entrar em um mundo diferente para muitos, que estão começando. Porém é um mundo familiar para quem vive disto. Vamos ver como criar e interpretar arquivos de log. Já que a proposta, mais simples é usar a função OnTradeTransaction, para solucionar o nosso problema. Isto por que ela somente é chamada quando algo acontece. E o servidor nos diz exatamente o que aconteceu. Não precisando assim que façamos uma pesquisa a fim de procurar saber o que aconteceu.
Mas como a função OnTradeTransaction, é bastante complicada. Precisamos criar um arquivo de log. Para entender o que acontece, quando aumentamos uma posição. Preste atenção a isto. O que irei mostrar, acontece quando uma posição é aberta, e pouco depois aumentamos o volume da mesma. E no final fechamos completamente a posição. Isto usando o Expert Advisor, o Indicador de mouse e o Chart Trade que já foram desenvolvidos. Não iremos neste primeiro momento nos preocupar com o Indicador de posição.
Porém, o código do Expert Advisor que vem sendo mostrado, não é adequado ao que precisamos fazer. Assim se torna necessário mudar o mesmo, para o código que pode ser visto logo abaixo.
01. //+------------------------------------------------------------------+ 02. #property copyright "Daniel Jose" 03. #property icon "/Images/Market Replay/Icons/Replay - EA.ico" 04. #property description "Demo version between interaction" 05. #property description "of Chart Trade and Expert Advisor" 06. #property version "1.117" 07. #property link "https://www.mql5.com/pt/articles/13176" 08. //+------------------------------------------------------------------+ 09. #include <Market Replay\Order System\C_Orders.mqh> 10. #include <Market Replay\Auxiliar\C_Terminal.mqh> 11. //+------------------------------------------------------------------+ 12. enum eTypeContract {MINI, FULL}; 13. //+------------------------------------------------------------------+ 14. input eTypeContract user00 = MINI; //Cross order in contract 15. //+------------------------------------------------------------------+ 16. C_Orders *Orders; 17. C_Terminal *Terminal; 18. //+------------------------------------------------------------------+ 19. void AddIndicatorPosition(ulong arg) 20. { 21. int handle = iCustom(_Symbol, PERIOD_CURRENT, "\\Indicators\\Position View.ex5", arg); 22. ChartIndicatorAdd(0, 0, handle); 23. IndicatorRelease(handle); 24. } 25. //+------------------------------------------------------------------+ 26. int OnInit() 27. { 28. Print("Initializing the Expert Advisor..."); 29. Terminal = NULL; 30. Orders = new C_Orders(0); 31. 32. return INIT_SUCCEEDED; 33. } 34. //+------------------------------------------------------------------+ 35. void OnTick() {} 36. //+------------------------------------------------------------------+ 37. void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) 38. { 39. (*Orders).DispatchMessage(id, lparam, dparam, sparam); 40. switch (id) 41. { 42. case CHARTEVENT_CHART_CHANGE: 43. if (Terminal != NULL) break; 44. else 45. { 46. ulong ul; 47. Terminal = new C_Terminal(0, 0, user00); 48. for (int count = PositionsTotal() - 1; count >= 0; count--) 49. { 50. ul = PositionGetTicket(count); 51. if (PositionGetString(POSITION_SYMBOL) != (*Terminal).GetInfoTerminal().szSymbol) continue; 52. AddIndicatorPosition(ul); 53. } 54. } 55. case CHARTEVENT_CUSTOM + evChartTrade_At_EA: 56. EventChartCustom(0, evEA_At_ChartTrade, user00, 0, ""); 57. break; 58. } 59. } 60. //+------------------------------------------------------------------+ 61. void OnTradeTransaction(const MqlTradeTransaction &trans, const MqlTradeRequest &request, const MqlTradeResult &result) 62. { 63. Print(__FUNCTION__); 64. 65. MqlTradeTransaction ts[1]; 66. ts[0] = trans; 67. ArrayPrint(ts); 68. 69. MqlTradeRequest tr[1]; 70. tr[0] = request; 71. ArrayPrint(tr); 72. 73. MqlTradeResult rs[1]; 74. rs[0] = result; 75. ArrayPrint(rs); 76. } 77. //+------------------------------------------------------------------+ 78. void OnDeinit(const int reason) 79. { 80. ulong ul; 81. 82. switch (reason) 83. { 84. case REASON_REMOVE: 85. case REASON_INITFAILED: 86. EventChartCustom(0, evEA_At_ChartTrade, -1, 0, ""); 87. break; 88. } 89. if (Terminal != NULL) for (int count = PositionsTotal() - 1; count >= 0; count--) 90. { 91. ul = PositionGetTicket(count); 92. if (PositionGetString(POSITION_SYMBOL) != (*Terminal).GetInfoTerminal().szSymbol) continue; 93. ChartIndicatorDelete(0, 0, IntegerToString(ul)); 94. } 95. delete Orders; 96. delete Terminal; 97. } 98. //+------------------------------------------------------------------+
Expert Advisor para criar log
Olhando este código, você caro leitor, pode estar pensando: Cara você é maluco. Não tem nenhum tipo de informação sendo gerada neste código para entender o que se passa na função OnTradeTransaction. Bem, será mesmo? Pois depois de executar este código no MetaTrader 5, eis que foi gerado o seguinte arquivo de log mostrado abaixo.
OK 0 12:05:36.509 Expert Advisor (WDO$,M30) Initializing the Expert Advisor... HO 0 12:05:48.773 Chart Trade (WDO$,M30) Send evChartTradeBuy - Args ( 10?WDO$?WDOU23?D?1?0.00?0.00 ) QH 0 12:05:48.773 Expert Advisor (WDO$,M30) [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time] [expiration] [comment] [position] [position_by] [reserved] FK 0 12:05:48.774 Expert Advisor (WDO$,M30) [0] 1 0 0 "WDOU23" 1.000 4975.000 0.000 0.00 0.00 1000 0 2 1 1970.01.01 00:00:00 "Order Generated by Experts Advisor." 0 0 ... QM 0 12:05:48.797 Expert Advisor (WDO$,M30) OnTradeTransaction GF 0 12:05:48.797 Expert Advisor (WDO$,M30) [deal] [order] [symbol] [type] [order_type] [order_state] [deal_type] [time_type] [time_expiration] [price] [price_trigger] [price_sl] [price_tp] [volume] [position] [position_by] [reserved] DS 0 12:05:48.797 Expert Advisor (WDO$,M30) [0] 0 1612507881 "WDOU23" 0 0 0 0 1 1970.01.01 00:00:00 0.000 0.000 0.000 0.000 1.000 0 0 ... GQ 0 12:05:48.797 Expert Advisor (WDO$,M30) [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time] [expiration] [comment] [position] [position_by] [reserved] OL 0 12:05:48.797 Expert Advisor (WDO$,M30) [0] 0 0 0 "" 0.000 0.000 0.000 0.00 0.00 0 0 0 0 1970.01.01 00:00:00 "" 0 0 ... CO 0 12:05:48.797 Expert Advisor (WDO$,M30) [retcode] [deal] [order] [volume] [price] [bid] [ask] [comment] [request_id] [retcode_external] [reserved] DL 0 12:05:48.797 Expert Advisor (WDO$,M30) [0] 0 0 0 0.000 0.000 0.000 0.000 "" 0 0 ... ER 0 12:05:48.797 Expert Advisor (WDO$,M30) OnTradeTransaction KK 0 12:05:48.797 Expert Advisor (WDO$,M30) [deal] [order] [symbol] [type] [order_type] [order_state] [deal_type] [time_type] [time_expiration] [price] [price_trigger] [price_sl] [price_tp] [volume] [position] [position_by] [reserved] JI 0 12:05:48.797 Expert Advisor (WDO$,M30) [0] 1191195305 1612507881 "WDOU23" 6 0 0 0 0 1970.01.01 00:00:00 4975.000 0.000 0.000 0.000 1.000 1612507881 0 ... GI 0 12:05:48.797 Expert Advisor (WDO$,M30) [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time] [expiration] [comment] [position] [position_by] [reserved] OD 0 12:05:48.797 Expert Advisor (WDO$,M30) [0] 0 0 0 "" 0.000 0.000 0.000 0.00 0.00 0 0 0 0 1970.01.01 00:00:00 "" 0 0 ... CG 0 12:05:48.797 Expert Advisor (WDO$,M30) [retcode] [deal] [order] [volume] [price] [bid] [ask] [comment] [request_id] [retcode_external] [reserved] DD 0 12:05:48.797 Expert Advisor (WDO$,M30) [0] 0 0 0 0.000 0.000 0.000 0.000 "" 0 0 ... EJ 0 12:05:48.797 Expert Advisor (WDO$,M30) OnTradeTransaction KQ 0 12:05:48.797 Expert Advisor (WDO$,M30) [deal] [order] [symbol] [type] [order_type] [order_state] [deal_type] [time_type] [time_expiration] [price] [price_trigger] [price_sl] [price_tp] [volume] [position] [position_by] [reserved] PP 0 12:05:48.797 Expert Advisor (WDO$,M30) [0] 0 1612507881 "WDOU23" 2 0 4 0 1 1970.01.01 00:00:00 0.000 0.000 0.000 0.000 0.000 1612507881 0 ... CP 0 12:05:48.797 Expert Advisor (WDO$,M30) [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time] [expiration] [comment] [position] [position_by] [reserved] CN 0 12:05:48.797 Expert Advisor (WDO$,M30) [0] 0 0 0 "" 0.000 0.000 0.000 0.00 0.00 0 0 0 0 1970.01.01 00:00:00 "" 0 0 ... GH 0 12:05:48.797 Expert Advisor (WDO$,M30) [retcode] [deal] [order] [volume] [price] [bid] [ask] [comment] [request_id] [retcode_external] [reserved] HM 0 12:05:48.797 Expert Advisor (WDO$,M30) [0] 0 0 0 0.000 0.000 0.000 0.000 "" 0 0 ... IS 0 12:05:48.797 Expert Advisor (WDO$,M30) OnTradeTransaction OH 0 12:05:48.797 Expert Advisor (WDO$,M30) [deal] [order] [symbol] [type] [order_type] [order_state] [deal_type] [time_type] [time_expiration] [price] [price_trigger] [price_sl] [price_tp] [volume] [position] [position_by] [reserved] KI 0 12:05:48.797 Expert Advisor (WDO$,M30) [0] 0 1612507881 "WDOU23" 3 0 4 0 1 1970.01.01 00:00:00 0.000 0.000 0.000 0.000 0.000 1612507881 0 ... OG 0 12:05:48.797 Expert Advisor (WDO$,M30) [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time] [expiration] [comment] [position] [position_by] [reserved] GG 0 12:05:48.797 Expert Advisor (WDO$,M30) [0] 0 0 0 "" 0.000 0.000 0.000 0.00 0.00 0 0 0 0 1970.01.01 00:00:00 "" 0 0 ... KR 0 12:05:48.797 Expert Advisor (WDO$,M30) [retcode] [deal] [order] [volume] [price] [bid] [ask] [comment] [request_id] [retcode_external] [reserved] LF 0 12:05:48.797 Expert Advisor (WDO$,M30) [0] 0 0 0 0.000 0.000 0.000 0.000 "" 0 0 ... MI 0 12:05:48.797 Expert Advisor (WDO$,M30) OnTradeTransaction CP 0 12:05:48.797 Expert Advisor (WDO$,M30) [deal] [order] [symbol] [type] [order_type] [order_state] [deal_type] [time_type] [time_expiration] [price] [price_trigger] [price_sl] [price_tp] [volume] [position] [position_by] [reserved] PM 0 12:05:48.797 Expert Advisor (WDO$,M30) [0] 0 0 "" 10 0 0 0 0 1970.01.01 00:00:00 0.000 0.000 0.000 0.000 0.000 0 0 ... OO 0 12:05:48.797 Expert Advisor (WDO$,M30) [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time] [expiration] [comment] [position] [position_by] [reserved] EQ 0 12:05:48.797 Expert Advisor (WDO$,M30) [0] 1 0 1612507881 "WDOU23" 1.000 0.000 0.000 0.00 0.00 1000 0 2 1 1970.01.01 00:00:00 "Order Generated by Experts Advi" 0 0 ... OM 0 12:05:48.797 Expert Advisor (WDO$,M30) [retcode] [deal] [order] [volume] [price] [bid] [ask] [comment] [request_id] [retcode_external] [reserved] MP 0 12:05:48.797 Expert Advisor (WDO$,M30) [0] 10009 1191195305 1612507881 1.000 4975.000 4974.500 4975.000 "" 3531297432 0 ... EK 0 12:05:53.264 Chart Trade (WDO$,M30) Send evChartTradeBuy - Args ( 10?WDO$?WDOU23?D?1?0.00?0.00 ) HG 0 12:05:53.264 Expert Advisor (WDO$,M30) [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time] [expiration] [comment] [position] [position_by] [reserved] RF 0 12:05:53.264 Expert Advisor (WDO$,M30) [0] 1 0 0 "WDOU23" 1.000 4974.500 0.000 0.00 0.00 1000 0 2 1 1970.01.01 00:00:00 "Order Generated by Experts Advisor." 0 0 ... EF 0 12:05:53.287 Expert Advisor (WDO$,M30) OnTradeTransaction KM 0 12:05:53.287 Expert Advisor (WDO$,M30) [deal] [order] [symbol] [type] [order_type] [order_state] [deal_type] [time_type] [time_expiration] [price] [price_trigger] [price_sl] [price_tp] [volume] [position] [position_by] [reserved] EN 0 12:05:53.287 Expert Advisor (WDO$,M30) [0] 0 1612507912 "WDOU23" 0 0 0 0 1 1970.01.01 00:00:00 0.000 0.000 0.000 0.000 1.000 0 0 ... KL 0 12:05:53.287 Expert Advisor (WDO$,M30) [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time] [expiration] [comment] [position] [position_by] [reserved] CI 0 12:05:53.287 Expert Advisor (WDO$,M30) [0] 0 0 0 "" 0.000 0.000 0.000 0.00 0.00 0 0 0 0 1970.01.01 00:00:00 "" 0 0 ... OD 0 12:05:53.287 Expert Advisor (WDO$,M30) [retcode] [deal] [order] [volume] [price] [bid] [ask] [comment] [request_id] [retcode_external] [reserved] PI 0 12:05:53.287 Expert Advisor (WDO$,M30) [0] 0 0 0 0.000 0.000 0.000 0.000 "" 0 0 ... QO 0 12:05:53.287 Expert Advisor (WDO$,M30) OnTradeTransaction GF 0 12:05:53.287 Expert Advisor (WDO$,M30) [deal] [order] [symbol] [type] [order_type] [order_state] [deal_type] [time_type] [time_expiration] [price] [price_trigger] [price_sl] [price_tp] [volume] [position] [position_by] [reserved] HF 0 12:05:53.287 Expert Advisor (WDO$,M30) [0] 1191195326 1612507912 "WDOU23" 6 0 0 0 0 1970.01.01 00:00:00 4974.500 0.000 0.000 0.000 1.000 1612507881 0 ... KD 0 12:05:53.287 Expert Advisor (WDO$,M30) [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time] [expiration] [comment] [position] [position_by] [reserved] CQ 0 12:05:53.287 Expert Advisor (WDO$,M30) [0] 0 0 0 "" 0.000 0.000 0.000 0.00 0.00 0 0 0 0 1970.01.01 00:00:00 "" 0 0 ... OL 0 12:05:53.287 Expert Advisor (WDO$,M30) [retcode] [deal] [order] [volume] [price] [bid] [ask] [comment] [request_id] [retcode_external] [reserved] PQ 0 12:05:53.287 Expert Advisor (WDO$,M30) [0] 0 0 0 0.000 0.000 0.000 0.000 "" 0 0 ... QG 0 12:05:53.287 Expert Advisor (WDO$,M30) OnTradeTransaction GL 0 12:05:53.287 Expert Advisor (WDO$,M30) [deal] [order] [symbol] [type] [order_type] [order_state] [deal_type] [time_type] [time_expiration] [price] [price_trigger] [price_sl] [price_tp] [volume] [position] [position_by] [reserved] IL 0 12:05:53.287 Expert Advisor (WDO$,M30) [0] 0 1612507912 "WDOU23" 2 0 4 0 1 1970.01.01 00:00:00 0.000 0.000 0.000 0.000 0.000 1612507881 0 ... OK 0 12:05:53.287 Expert Advisor (WDO$,M30) [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time] [expiration] [comment] [position] [position_by] [reserved] OK 0 12:05:53.287 Expert Advisor (WDO$,M30) [0] 0 0 0 "" 0.000 0.000 0.000 0.00 0.00 0 0 0 0 1970.01.01 00:00:00 "" 0 0 ... KE 0 12:05:53.287 Expert Advisor (WDO$,M30) [retcode] [deal] [order] [volume] [price] [bid] [ask] [comment] [request_id] [retcode_external] [reserved] LJ 0 12:05:53.287 Expert Advisor (WDO$,M30) [0] 0 0 0 0.000 0.000 0.000 0.000 "" 0 0 ... ML 0 12:05:53.287 Expert Advisor (WDO$,M30) OnTradeTransaction CG 0 12:05:53.287 Expert Advisor (WDO$,M30) [deal] [order] [symbol] [type] [order_type] [order_state] [deal_type] [time_type] [time_expiration] [price] [price_trigger] [price_sl] [price_tp] [volume] [position] [position_by] [reserved] NR 0 12:05:53.287 Expert Advisor (WDO$,M30) [0] 0 1612507912 "WDOU23" 3 0 4 0 1 1970.01.01 00:00:00 0.000 0.000 0.000 0.000 0.000 1612507881 0 ... CR 0 12:05:53.287 Expert Advisor (WDO$,M30) [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time] [expiration] [comment] [position] [position_by] [reserved] KL 0 12:05:53.287 Expert Advisor (WDO$,M30) [0] 0 0 0 "" 0.000 0.000 0.000 0.00 0.00 0 0 0 0 1970.01.01 00:00:00 "" 0 0 ... GO 0 12:05:53.287 Expert Advisor (WDO$,M30) [retcode] [deal] [order] [volume] [price] [bid] [ask] [comment] [request_id] [retcode_external] [reserved] HS 0 12:05:53.287 Expert Advisor (WDO$,M30) [0] 0 0 0 0.000 0.000 0.000 0.000 "" 0 0 ... IR 0 12:05:53.287 Expert Advisor (WDO$,M30) OnTradeTransaction OK 0 12:05:53.287 Expert Advisor (WDO$,M30) [deal] [order] [symbol] [type] [order_type] [order_state] [deal_type] [time_type] [time_expiration] [price] [price_trigger] [price_sl] [price_tp] [volume] [position] [position_by] [reserved] DH 0 12:05:53.287 Expert Advisor (WDO$,M30) [0] 0 0 "" 10 0 0 0 0 1970.01.01 00:00:00 0.000 0.000 0.000 0.000 0.000 0 0 ... CJ 0 12:05:53.287 Expert Advisor (WDO$,M30) [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time] [expiration] [comment] [position] [position_by] [reserved] LE 0 12:05:53.287 Expert Advisor (WDO$,M30) [0] 1 0 1612507912 "WDOU23" 1.000 0.000 0.000 0.00 0.00 1000 0 2 1 1970.01.01 00:00:00 "Order Generated by Experts Advi" 0 0 ... CJ 0 12:05:53.287 Expert Advisor (WDO$,M30) [retcode] [deal] [order] [volume] [price] [bid] [ask] [comment] [request_id] [retcode_external] [reserved] KM 0 12:05:53.287 Expert Advisor (WDO$,M30) [0] 10009 1191195326 1612507912 1.000 4974.500 4974.000 4974.500 "" 3531297433 0 ... JI 0 12:06:04.628 Chart Trade (WDO$,M30) Send evChartTradeSell - Args ( 11?WDO$?WDOU23?D?2?0.00?0.00 ) GS 0 12:06:04.628 Expert Advisor (WDO$,M30) [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time] [expiration] [comment] [position] [position_by] [reserved] LR 0 12:06:04.628 Expert Advisor (WDO$,M30) [0] 1 0 0 "WDOU23" 2.000 4974.000 0.000 0.00 0.00 1000 1 2 1 1970.01.01 00:00:00 "Order Generated by Experts Advisor." 0 0 ... NS 0 12:06:04.652 Expert Advisor (WDO$,M30) OnTradeTransaction DH 0 12:06:04.652 Expert Advisor (WDO$,M30) [deal] [order] [symbol] [type] [order_type] [order_state] [deal_type] [time_type] [time_expiration] [price] [price_trigger] [price_sl] [price_tp] [volume] [position] [position_by] [reserved] HI 0 12:06:04.652 Expert Advisor (WDO$,M30) [0] 0 1612508010 "WDOU23" 0 1 0 0 1 1970.01.01 00:00:00 0.000 0.000 0.000 0.000 2.000 0 0 ... LH 0 12:06:04.652 Expert Advisor (WDO$,M30) [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time] [expiration] [comment] [position] [position_by] [reserved] LF 0 12:06:04.652 Expert Advisor (WDO$,M30) [0] 0 0 0 "" 0.000 0.000 0.000 0.00 0.00 0 0 0 0 1970.01.01 00:00:00 "" 0 0 ... PQ 0 12:06:04.652 Expert Advisor (WDO$,M30) [retcode] [deal] [order] [volume] [price] [bid] [ask] [comment] [request_id] [retcode_external] [reserved] OE 0 12:06:04.652 Expert Advisor (WDO$,M30) [0] 0 0 0 0.000 0.000 0.000 0.000 "" 0 0 ... RH 0 12:06:04.652 Expert Advisor (WDO$,M30) OnTradeTransaction HQ 0 12:06:04.652 Expert Advisor (WDO$,M30) [deal] [order] [symbol] [type] [order_type] [order_state] [deal_type] [time_type] [time_expiration] [price] [price_trigger] [price_sl] [price_tp] [volume] [position] [position_by] [reserved] OS 0 12:06:04.652 Expert Advisor (WDO$,M30) [0] 1191195411 1612508010 "WDOU23" 6 0 0 1 0 1970.01.01 00:00:00 4974.000 0.000 0.000 0.000 2.000 1612507881 0 ... LP 0 12:06:04.652 Expert Advisor (WDO$,M30) [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time] [expiration] [comment] [position] [position_by] [reserved] LN 0 12:06:04.652 Expert Advisor (WDO$,M30) [0] 0 0 0 "" 0.000 0.000 0.000 0.00 0.00 0 0 0 0 1970.01.01 00:00:00 "" 0 0 ... PI 0 12:06:04.652 Expert Advisor (WDO$,M30) [retcode] [deal] [order] [volume] [price] [bid] [ask] [comment] [request_id] [retcode_external] [reserved] OM 0 12:06:04.652 Expert Advisor (WDO$,M30) [0] 0 0 0 0.000 0.000 0.000 0.000 "" 0 0 ... RP 0 12:06:04.652 Expert Advisor (WDO$,M30) OnTradeTransaction HK 0 12:06:04.652 Expert Advisor (WDO$,M30) [deal] [order] [symbol] [type] [order_type] [order_state] [deal_type] [time_type] [time_expiration] [price] [price_trigger] [price_sl] [price_tp] [volume] [position] [position_by] [reserved] MI 0 12:06:04.652 Expert Advisor (WDO$,M30) [0] 0 1612508010 "WDOU23" 2 1 4 0 1 1970.01.01 00:00:00 0.000 0.000 0.000 0.000 0.000 1612507881 0 ... HF 0 12:06:04.652 Expert Advisor (WDO$,M30) [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time] [expiration] [comment] [position] [position_by] [reserved] PG 0 12:06:04.652 Expert Advisor (WDO$,M30) [0] 0 0 0 "" 0.000 0.000 0.000 0.00 0.00 0 0 0 0 1970.01.01 00:00:00 "" 0 0 ... DR 0 12:06:04.652 Expert Advisor (WDO$,M30) [retcode] [deal] [order] [volume] [price] [bid] [ask] [comment] [request_id] [retcode_external] [reserved] CG 0 12:06:04.652 Expert Advisor (WDO$,M30) [0] 0 0 0 0.000 0.000 0.000 0.000 "" 0 0 ... FI 0 12:06:04.652 Expert Advisor (WDO$,M30) OnTradeTransaction LR 0 12:06:04.652 Expert Advisor (WDO$,M30) [deal] [order] [symbol] [type] [order_type] [order_state] [deal_type] [time_type] [time_expiration] [price] [price_trigger] [price_sl] [price_tp] [volume] [position] [position_by] [reserved] RN 0 12:06:04.652 Expert Advisor (WDO$,M30) [0] 0 1612508010 "WDOU23" 3 1 4 0 1 1970.01.01 00:00:00 0.000 0.000 0.000 0.000 0.000 1612507881 0 ... DM 0 12:06:04.652 Expert Advisor (WDO$,M30) [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time] [expiration] [comment] [position] [position_by] [reserved] DI 0 12:06:04.652 Expert Advisor (WDO$,M30) [0] 0 0 0 "" 0.000 0.000 0.000 0.00 0.00 0 0 0 0 1970.01.01 00:00:00 "" 0 0 ... HK 0 12:06:04.652 Expert Advisor (WDO$,M30) [retcode] [deal] [order] [volume] [price] [bid] [ask] [comment] [request_id] [retcode_external] [reserved] GH 0 12:06:04.652 Expert Advisor (WDO$,M30) [0] 0 0 0 0.000 0.000 0.000 0.000 "" 0 0 ... JN 0 12:06:04.652 Expert Advisor (WDO$,M30) OnTradeTransaction PG 0 12:06:04.652 Expert Advisor (WDO$,M30) [deal] [order] [symbol] [type] [order_type] [order_state] [deal_type] [time_type] [time_expiration] [price] [price_trigger] [price_sl] [price_tp] [volume] [position] [position_by] [reserved] KG 0 12:06:04.652 Expert Advisor (WDO$,M30) [0] 0 0 "" 10 0 0 0 0 1970.01.01 00:00:00 0.000 0.000 0.000 0.000 0.000 0 0 ... DQ 0 12:06:04.652 Expert Advisor (WDO$,M30) [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time] [expiration] [comment] [position] [position_by] [reserved] IH 0 12:06:04.652 Expert Advisor (WDO$,M30) [0] 1 0 1612508010 "WDOU23" 2.000 0.000 0.000 0.00 0.00 1000 1 2 1 1970.01.01 00:00:00 "Order Generated by Experts Advi" 0 0 ... LG 0 12:06:04.652 Expert Advisor (WDO$,M30) [retcode] [deal] [order] [volume] [price] [bid] [ask] [comment] [request_id] [retcode_external] [reserved] RI 0 12:06:04.652 Expert Advisor (WDO$,M30) [0] 10009 1191195411 1612508010 2.000 4974.000 4974.000 4974.500 "" 3531297434 0 ...
Arquivo de Log das operações
E então, gostou do que está vendo? Sei que este arquivo de log parece uma bagunça. Algo completamente insano e sem sentido algum. Mas acredite, aqui estamos fazendo apenas três operações como menciono acima. E cada um destes valores visto neste log, tem um significado. Então antes de você, meu caro leitor e entusiasta, entregar os pontos. Vamos ver como este arquivo foi gerado. Observe que a primeira linha no log é justamente a linha 28 de código do Expert Advisor. Ou seja, estamos gravando tudo que é jogado no terminal do MetaTrader 5. Apesar de tudo, não sou eu que estou fazendo isto. E sim o MetaTrader 5.
Agora observe a segunda linha no arquivo de log. Note a origem da informação. Ou seja, é o Chart Trade. Neste momento o Chart Trade enviou uma mensagem para o Expert Advisor abrir uma posição a mercado. Observe que esta mensagem se repete outras duas vezes. Entre elas temos o que é feito pelo Expert Advisor junto ao servidor de negociação real. Mas estes dados que você vê, foram gerados na função OnTradeTransaction. Usando as linhas 63, 67, 71 e 75. Olhe e aprenda.
Cada vez que o servidor devolve ao MetaTrader 5 uma resposta, teremos o nome da função OnTradeTransaction sendo mostrada no log. Note que existe um padrão na comunicação. Ou seja, o Expert Advisor, envia um pedido ao servidor, e ele devolve em seguida uma resposta. Cada uma das respostas é capturada pela função OnTradeTransaction e os valores são impressos na seguinte ordem: Primeiro dos dados presentes na estrutura MqlTradeTransaction, logo depois dos dados na estrutura MqlTradeRequest para finalmente os dados na estrutura MqlTradeResult. Isto mensagem a mensagem vinda do servidor.
Mas vamos voltar ao código do Expert Advisor para entender como eu fiz isto. Observe que os dados das estruturas são impressos usando: ArrayPrint. Mas como assim, você está usando ArrayPrint para imprimir dos dados no terminal? Cara realmente você é muito doido. Achei que seria preciso declarar todos aqueles campos de cada uma das estruturas. Mas você de fato, superou o nível de complicação e uso do MQL5. E eu aqui digitando código e mais códigos e você vem com esta.
Bem, mas como eu disse, fazer as coisas de forma simples não tem graça. A graça está em forçar a linguagem a um novo nível de utilização. Mas agora todos aqueles valores, visto no log, fazem algum sentido para você, meu caro leitor? Se ainda assim está difícil de entender, podemos jogar eles em um banco de dados SQL, e teremos algo um pouco mais simples. Usando para isto três tabelas diferentes dentro do banco de dados. Mas isto fica como dever de casa para você. Não estava pensando que eu daria tudo de mãos beijadas assim. Ou estava?
Quando você conseguir observar estes dados. Irá notar que, o valor de alguns campos, indicam o que está sendo feito pelo servidor. Em um dado momento, o servidor criará uma ordem que será executa a mercado. Quando isto ocorrer será criado o bilhete: 1612507881 com um volume de 1, sendo a operação do tipo zero. Ou seja, uma compra a mercado. Até neste momento, não temos nenhuma posição aberta ainda. O valor no campo da posição é zero. E isto ficará assim, até que o campo type da estrutura MqlTradeTransaction, passe a ter o valor seis. Ou seja, o servidor, terá disparado a enumeração TRADE_TRANSACTION_DEAL_ADD para o MetaTrader 5. Neste momento o campo posição deixará ser zero, e passará a ter o valor igual ao valor da ordem criada no servidor.
Depois disto o servidor lança um evento 2, que é um TRADE_TRANSACTION_ORDER_DELETE. Onde a ordem criada pelo servidor deixará de existir. Um evento 3, que é um TRADE_TRANSACTION_HISTORY_ADD, para anotar, no histórico, o que foi feito no servidor. E finalmente um evento 10, que é um TRADE_TRANSACTION_REQUEST. Este finaliza a abertura da posição. Mas o que quero que você preste atenção é no valor do bilhete criado. Pois no próximo ciclo de execução do pedido vindo do Chart Trade. Este valor irá aparecer novamente. Mas note que o valor da ordem criada pelo servidor é diferente. Porém o valor da posição permanece.
No final do segundo ciclo, teremos um lote de volume dois no servidor. Agora precisamos fechar a posição. Isto é feito no terceiro ciclo mostrado no log. Observe novamente que o valor do bilhete da posição ainda, permanece inalterado durante todo o procedimento.
Aqui mora uma questão interessante: Você pode notar que em nenhum momento, tivemos o tipo 8 sendo retornado pelo servidor. Se isto viesse a acontece, indicaria um TRADE_TRANSACTION_DEAL_DELETE, que seria o equivalente ao tipo dois. Sendo que este tipo dois é visto com frequência, justamente por ele ser uma ordem a mercado. Então podemos usar estes dados visto no log, como uma maneira de implementar um uso da função OnTradeTransaction. Já que não precisaríamos ficar varrendo a todo instante a lista de ordens ou posições. No caso das posições, talvez isto não faça o menor sentido, se estivermos em uma conta NETTING. Mas como queremos generalizar o sistema de tratamento. Precisamos que o Expert Advisor consiga lidar bem, em todos os cenários possíveis. Mesmo que alguns destes cenários, nos dê um pouco mais de trabalho na implementação.
Muito bem. Neste ponto do campeonato, você pode estar pensando o seguinte: Ok. Você mostrou todos estes números e formas de obter dados, que podemos utilizar a fim de programar o Expert Advisor. Mas ainda não consigo entender, como tudo isto de fato será usado para pôr em prática. Uma forma de controlar e implementar a comunicação entre o Expert Advisor e o Indicador de posição. Já que para mim, isto que você está fazendo, não faz o menor sentido. Se eu fosse você, faria as coisas de uma maneira muito mais simples. Se você pensou assim, meu caro leitor. Devo concordar com você. De fato seria muito mais simples fazer as coisas de uma outra maneira. Mas não quero fazer o obvio. Quero fazer as coisas de uma forma totalmente inexplorada porém que seja completamente funcional. Em qualquer tipo de situação que possa vir a surgir no futuro.
Lembre-se de uma coisa: Aqui não estamos desenvolvendo uma aplicação que sempre funcionará junto ao servidor de negociação. Estamos desenvolvendo algo que irá de fato simular o servidor de negociação. Algo que precisa de uma forma totalmente diferente, de implementar o que você muito provavelmente, já viu implementado. Não podemos ficar usando funções do tipo PositionsTotal, para saber das coisas. Pois quando formos usar o replay/simulador. Não poderemos contar com tais funções, nos dando auxilio ou suporte. Precisamos ir por caminhos totalmente alheios ao que muitos pensam ser o mais prudente a seguir.
Considerações finais
A um tempo atrás, fiz um artigo falando sobre como usar esta função OnTradeTransaction. Bem, de lá para cá muita coisa mudou no meu entendimento sobre o MetaTrader 5 e o MQL5. Então aqui estou mostrando coisas que na época eu não havia pensado em mostrar. Isto por que notei que mais pessoas iniciantes ou entusiastas tem de fato se interessado pelo assunto. E buscado tentar entender por que meus códigos tem esta aparência tão exótica e pouco convencional. Espero sinceramente que estes artigos, estejam ajudando a estas pessoas a verem que podemos fazer bem mais do que muitos pensam ser possível.
Agora que foi apresentado, o primeiro dos grandes problemas que precisamos solucionar. Poderemos no próximo artigo pôr a máquina para realmente funcionar, e criar um código do Expert Advisor, de forma que o Indicador de posição possa pelo menos trabalhar de maneira mais adequada. Como o que será implementando envolve uma explicação mais profunda, a fim de que você, meu caro leitor e entusiasta, consiga entender o que de fato estará acontecendo. Não irei neste artigo daqui, mostrar o código do Expert Advisor, já modificado para permitir retirar o indicador de posição, quando uma posição for fechada. Ou colocar o indicador de posição, no gráfico, quando uma posição vier a ser aberta. Apesar de que, fazer isto não é algo complicado, como possa parecer.
O problema de fato, é você entender por que o código funciona, quando ele não está usando coisas que você esperava utilizar em um código convencional. Mas isto será visto no próximo artigo. Por hora, estude o que foi visto neste artigo. Pois programar não é nada mais do que entender o problema e encontrar uma solução matemática para ele.
Arquivo | Descrição |
---|---|
Experts\Expert Advisor.mq5 | Demonstra a interação entre o Chart Trade e o Expert Advisor (É necessário o Mouse Study para interação) |
Indicators\Chart Trade.mq5 | Cria a janela para configuração da ordem a ser enviada (É necessário o Mouse Study para interação) |
Indicators\Market Replay.mq5 | Cria os controles para interação com o serviço de replay/simulador (É necessário o Mouse Study para interação) |
Indicators\Mouse Study.mq5 | Permite interação entre os controles gráficos e o usuário (Necessário tanto para operar o replay simulador, quanto no mercado real) |
Indicators\Order Indicator.mq5 | Responsável pela indicação de ordens de mercado, permitindo interação e controle das mesmas |
Indicators\Position View.mq5 | Responsável pela indicação de posições de mercado, permitindo interação e controle das mesmas |
Services\Market Replay.mq5 | Cria e mantém o serviço de replay e simulação de mercado (Arquivo principal de todo o sistema) |
Aviso: Todos os direitos sobre esses materiais pertencem à MetaQuotes Ltd. É proibida a reimpressão total ou parcial.
This article was written by a user of the site and reflects their personal views. MetaQuotes Ltd is not responsible for the accuracy of the information presented, nor for any consequences resulting from the use of the solutions, strategies or recommendations described.





- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso