English Русский Español
preview
Desenvolvendo um sistema de Replay (Parte 53): Complicando as coisas (V)

Desenvolvendo um sistema de Replay (Parte 53): Complicando as coisas (V)

MetaTrader 5Exemplos | 17 junho 2024, 12:32
146 0
Daniel Jose
Daniel Jose

Introdução

No artigo anterior Desenvolvendo um sistema de Replay (Parte 52): Complicando as coisas (IV), criamos toda uma nova estrutura de dados, a fim de conseguir fazer com que o indicador de mouse, pudesse interagir com o indicador de controle. Apesar da interação poder acontecer perfeitamente, e de maneira bastante estável, isto a princípio, temos alguns problemas que nos força a modificar levemente as coisas.

O problema em si, não é no código, e nem na plataforma e tão pouco nos conceitos utilizados. Mas devido a intensão e na forma como estamos trabalhando. Pessoalmente peço desculpas a todos vocês, que vem acompanhando esta sequência de artigos, a ponto de ter um sistema de simulação / replay. Sinceramente não esperava precisar fazer uso de algumas técnicas encontradas em sistemas modulares, mas não haverá como prosseguir no desenvolvimento do sistema de replay / simulação sem usar algumas técnicas desenvolvidas a décadas atras.

Talvez para muitos de vocês, o que irei mostrar aqui irá soar algo extremamente bizarro, e para outros algo muito familiar. No entanto, independentemente do como você queira ver as coisas, tal mecanismo que irei explicar aqui, e começaremos a fazer uso cada vez em quantidade maior, está presente no MetaTrader 5, e o MQL5 nos permite fazer uso do método. Se bem que ao usar o MQL5, ficamos limitados a fazer uso apenas dentro do gráfico, ou dentro do próprio MetaTrader 5. Isto não é ruim, pelo contrário, é uma forma de segurança imposta, já que a plataforma é voltada para trabalhar com dinheiro, e você não vai querer que algo estranho faça você perder dinheiro, a torto e a direita.

Então apesar das limitações, não reclame. Pense muito bem, antes de reclamar, pois o que iremos começar a usar aqui vai fazer com que você, iniciante ou aspirante em programação, fique meio perdido por um tempo. Mas isto é apenas por que você desconhece o conteúdo da coisa, e como tirar proveito dela. Entretanto, de certa forma venho fazendo uso dela a algum tempo, mas não da forma como será feito a partir de agora. Então chegou a hora de subir a régua e aplicar coisas mais complexas nos artigos.


Explicando o conceito

O que vamos começar a fazer uso mais intensivo, e é bom que você preste bastante atenção, se não conhecer do assunto, já que irei dar uma rápida pincelada no mesmo. Será o uso de mensagens entre os programas. Sim, o MQL5 nos permite fazer isto. Este tipo de abordagem, é extremamente poderosa, se for bem usada, e projetada de maneira adequada. Mas se você não compreender alguns detalhes irá ficar completamente perdido, fazendo com que programas se comportem mal, ao serem colocados juntos, em um mesmo gráfico dentro do MetaTrader 5.

Até o momento, os programas que tenho apresentado nesta sequência, fazem uso de mensagens, mas não entre eles. E sim dentro do próprio código, onde uma classe pode se comunicar com a outra, mesmo que elas estejam em níveis diferentes, ou não estejam ligadas por herança. Você pode notar isto, ao observar os meus códigos de classes. Praticamente quase todos tem um procedimento comum: DispatchMessage. Este tem como principal objetivo, tratar as mensagens que são jogadas para dentro da classe. Mesmo que existem outras formas de se comunicar com a classe, fazendo uso de outros procedimentos, ou funções. A DispatchMessage está ali, para promover um tratamento de mensagens voltadas para a classe.

Esta ideia não é originalmente minha, ela é muito mais antiga, e tem como objetivo promover uma interface comum entre programas, ou procedimentos de forma geral. Quem trabalha com programação a mais tempo de forma profissional sabe do que estou falando. Então quando você precisa enviar dados, valores ou requisições a um outro programa, cujo código você desconhece completamente, você faz uso justamente deste princípio. Você envia uma mensagem a uma função muito especifica, e ela irá lhe devolver algum tipo de informação. A forma delas se comunicarem é justamente por meio desta única função.

O nome que tal função recebe, varia, mas o conjunto e a sequência de dados que lhe são informados, é sempre o mesmo.

Talvez eu possa estar parecendo muito superficial e totalmente sem sentido. Mas se você está estudando programação, no caso MQL5, já deve ter visto esta função, e não somente uma vez, mas diversas vezes, e quase todo o código de indicador ou de Expert Advisor, contém esta função. Esta função, ou melhor dizendo, procedimento tem o nome de: OnChartEvent, isto no MQL5.

Talvez você possa estar pensando: Mas como assim ?!?! Quer dizer que o MetaTrader 5, se comunica com o meu programa, via troca de mensagens ?!?! Sim. E ao analisar o valor indicado na constante inteira ID presente nesta chamada, você pode filtrar e identificar qual foi a mensagem que o MetaTrader 5 lhe enviou.

Você muito provavelmente pode estar surpreso com isto. Mas a coisa vai ainda mais além, e é neste ponto que a coisa começa a complicar, para quem está iniciando. Mas para não complicar, irei manter a explicação dentro do MetaTrader 5, mas ela não se limita somente a ele. A coisa toda é bem mais ampla e complexa. Então você deve compreender muito bem este ponto: O MetaTrader 5, envia mensagens para o seu programa. Estas mensagens são capturadas e tratadas por alguns procedimentos presentes no seu programa. Entre estes procedimentos, existe um que é mais genérico, permitindo enviar coisas bem mais complexas e fazendo uso de uma interface comum e muito bem definida. O nome deste procedimento é OnChartEvent. Ponto, nova linha. Agora que vem a parte complicada.

O MQL5, e irei me manter apenas nele para não complicar ainda mais as coisas, permite que você como programador, defina eventos customizados. Tais eventos são identificados por uma constante somada a um valor. O nome desta constante é: CHARTEVENT_CUSTOM. Então ao fazer uso desta constante, você pode enviar de qualquer parte de seu programa, uma mensagem para o tratador de mensagens, e assim concentrar todo tratamento especifico, e comum em um único ponto. Mas você não chama o tratador de mensagens de qualquer maneira. Você precisa fazer isto de uma forma adequada, e para simplificar as coisas o MQL5, nos fornece uma função a ser usada para este proposito: EventChartCustom. Ao fazer uso desta função você pode enviar mensagens para o tratador de mensagens padrão, a tal OnChartEvent, e está no meu caso, chama a DispatchMessage.

Isto tudo é lindo de ser visto e funciona perfeitamente bem. Permitindo você fazer muitas coisas. Porém, toda via e, entretanto, existe um perigo nesta história toda. E o perigo se esconde justamente nas CHARTEVENT_CUSTOM. O maior perigo estas chamadas customizadas, não está no meu, no seu, ou no programa de qualquer outro bom programador. O real perigo está justamente no fato do usuário não saber o que cada programa de fato faz. Não julgue mal o pobre do usuário. Ele muita das vezes, se quer tem noção do que acontece de fato. Por isto é bom você NUNCA, e JAMAIS usar algo sem saber do que realmente se trata. Pois o programa pode funcionar perfeitamente bem, em diversos cenários. Mas vai existir um, e basta um, onde a interação entre programas se torna um pesadelo completo. Fazendo com que a plataforma trave, coisas desapareçam, outras venham a aparecer do nada. E você ali se entender absolutamente nada do que está acontecendo. Ok, quando os efeitos são perceptíveis, tudo bem. Mas, e quando eles simplesmente acontecem, e ficam no mais absoluto silêncio. Você pode imaginar que está tudo funcionando perfeitamente bem, quando na verdade a coisa pode estar à beira do precipício.

Se você é um programador profissional, e ganha desenvolvendo e vender soluções, não me leve a mal. Mas você deveria explicar ao seu cliente que seu programa pode interagir de forma a causar problemas em outros programas, ou outros programas podem causar problemas no seu. E você usuário, deveria ter este cuidado de não misturar código de um programador, com código de outro. Por conta disto é que o Windows a uns tempos atras vivia travando sem motivo aparente, e as pessoas simplesmente culpam o programa, quando na verdade, os travamentos normalmente aconteciam quando certos programas estavam rodando juntos, no mesmo ambiente.

Mas não irei entrar nesta questão, pois isto sairia do que realmente quero explicar. Mas é importante que você compreenda uma coisa: O MetaTrader 5, seria como o sistema operacional Windows. Se você usar as coisas certas, da forma correta, você NUNCA terá problemas com a plataforma. Mas se começar a misturar as coisas, fique esperto, pois você pode vim a ter problemas de diversos tipos. Então sabendo que o MetaTrader 5, é um ambiente gráfico, voltado para ser utilizado em operações de mercado financeiro, vem uma pergunta: O que acontece se dois programas estiverem usando EventChartCustom, já que esta função faz com que o MetaTrader 5 transfira, a pedido do programador, uma mensagem ?!?!

Bem. A questão é simples de ser perguntada. E de fato é uma pergunta válida. Mas para entender, vamos começar com um caso mais simples. O que acontece quando UM programa usa a função EventChartCustom ?!?! Basicamente, o MetaTrader 5 irá enviar o um evento customizado para ser tratado pelo procedimento OnChartEvent. Isto parece obvio, não é mesmo ?!?! Mas não. Não é assim tão obvio, e é aí que mora o perigo.

Um típico uso de EventChartCustom, pode ser visto no código do indicador de controle, visto no artigo anterior. Na linha 30 do código do indicador de controle, você irá ver o seguinte código:

30.     EventChartCustom(user00, C_Controls::evInit, Info.s_Infos.iPosShift, Info.df_Value, "");

Pois bem. Quando o MetaTrader 5, executar esta linha irá lançar um evento ChartEvent, que por consequência irá fazer com que OnChartEvent seja executada pelo código presente no gráfico. E o tratamento segue até encontrar a função DispatchMessage, que se encontra presente na classe C_Control, isto na linha 161 do código que pode ser visto no artigo anterior, mas para facilitar vamos trazer o fragmento para cá.

161.            void DispatchMessage(const int id, const long &lparam, const double &dparam, const string &sparam)
162.                    {
163.                            u_Interprocess Info;
164.                            
165.                            switch (id)
166.                            {
167.                                    case CHARTEVENT_CUSTOM + C_Controls::evInit:
168.                                            Info.df_Value = dparam;
169.                                            m_Slider.Minimal = Info.s_Infos.iPosShift;
170.                                            SetPlay(Info.s_Infos.isPlay);
171.                                            if (!Info.s_Infos.isPlay) CreateCtrlSlider();
172.                                            break;

Fragmento do código presente na classe C_Control

Agora por conta que o evento é customizado, o MetaTrader 5, irá configurar o valor da ID na chamada do procedimento OnChartEvent, de maneira que esta ID seja um valor correspondente a CHARTEVENT_CUSTOM somada a um outro valor, no caso mostrado, o valor será o da C_Control:evInit. Mas qual é o valor de C_Control:evInit ?!?! Para saber isto, você deverá ir na linha 35, do código da classe C_Control, e verificar o valor.

035.            enum EventCustom {evInit};

Este valor faz parte de uma enumeração. E já que a enumeração conta apenas com este valor, e não está sendo inicializada com um valor, ela irá começar com o valor padrão, ou seja ZERO. Então a mesma linha 30 presente no indicador de controle, na verdade seria compreendida pelo MetaTrader 5, como sendo:

30.     EventChartCustom(user00, CHARTEVENT_CUSTOM + 0, Info.s_Infos.iPosShift, Info.df_Value, "");

Este código irá funcionar perfeitamente bem, e com plena segurança, podendo você programador, fazer uma chamada customizada a qualquer momento, a fim de que o procedimento DispatchMessage, presente dentro da classe C_Control, venha a inicializar alguns valores que não foram ajustados no constructor da classe. Este tipo de coisa é muito comum e é uma forma perfeitamente adequada de se programar. Sendo bastante útil em diversas situações.

A mesma coisa acontece no indicador de mouse. Então vamos dar uma olhada nele para entender uma outra coisa, mas ainda dentro do uso de UM programa que faz uso de eventos customizados no MetaTrader 5.

Em todo o código do indicador de mouse, você não vê nenhuma chamada EventChartCustom. Mas, porém, entretanto e toda via, existe no tratador de mensagens, um código a fim de responder a um evento customizado. Este código está ali, a um bom tempo, já prevendo o seu uso futuro e isto de forma quase sem querer querendo. Você pode ver este código de tratamento, ao observar na linha 196 e 199 da classe C_Mouse. Observando com atenção você irá notar algumas coisas. Vamos trazer o fragmento para este artigo, a fim de que você compreenda melhor o que estou querendo explicar.

189. virtual void DispatchMessage(const int id, const long &lparam, const double &dparam, const string &sparam)
190.                    {
191.                            int w = 0;
192.                            static double memPrice = 0;
193.                            
194.                            if (m_Mem.szShortName == NULL) switch (id)
195.                            {
196.                                    case (CHARTEVENT_CUSTOM + ev_HideMouse):
197.                                            if (m_Mem.IsFull) ObjectSetInteger(GetInfoTerminal().ID, def_NameObjectLineH, OBJPROP_COLOR, clrNONE);
198.                                            break;
199.                                    case (CHARTEVENT_CUSTOM + ev_ShowMouse):
200.                                            if (m_Mem.IsFull) ObjectSetInteger(GetInfoTerminal().ID, def_NameObjectLineH, OBJPROP_COLOR, m_Info.corLineH);
201.                                            break;

Fragmento do código presente na classe C_Mouse

Observe que neste fragmento estamos usando ev_HideMouse e ev_ShowMouse. Se algum programa desejar ocultar a linha do indicador de mouse, bastará que ele peça ao MetaTrader 5 para enviar um evento customizado para o indicador de mouse, assim você poderá tanto ocultar quanto mostrar a linha do mouse. Note que não destruímos o objeto, apenas mudamos a propriedade de cor.

Mas estes valores ev_HideMouse e ev_ShowMouse, são enumerações. E de onde eles estão vindo ?!?! Bem, você pode os ver ao observar a linha 34 da classe C_Mouse. Então, novamente para ajudar na explicação, vamos trazer a tal linha para este artigo.

034.            enum eEventsMouse {ev_HideMouse, ev_ShowMouse};

Talvez você ainda não tenha compreendido o que estou tentando explicar. Mas para ficar mais simples, veja o vídeo 01, ali você pode notar como este sistema está funcionando.


Vídeo 01 - Demonstração.

Note que eles trabalham em perfeita harmonia, e sem causar nenhum tipo de problema. Já que durante a inicialização o indicador de controle diz ao MetaTrader 5, que um evento customizado precisa ser tratado, e o indicador de Mouse espera que algum programa lhe envie um evento customizado a fim de ocultar ou mostrar a linha do mouse. Quando separados ambos indicadores não geram nenhum tipo de problema ou conflito entre si. Mas quando colocados juntos. A situação começa a ficar tensa. Você pode ver isto no vídeo 02.


Vídeo 02 - Conflitos.

Mas por que que isto acontece ?!?! Por que quando separados eles não geram nenhum tipo de problema, mas quando colocados juntos eles entram em conflito ?!?! Esta é a grande questão, é onde muitos desistem de se tornarem programadores profissionais. Um iniciante que não está de fato motivado a aprender programação, desiste nesta hora. No entanto um programador profissional, ou alguém que está motivado a se tornar um, vê nisto uma oportunidade de aprendizado e busca por mais conhecimento, a fim de conseguir resolver este conflito. E é justamente este o problema de usar programas de diferentes programadores, ou mesmo de um mesmo programador, que não se preocupa em testar seus programas, de uma maneira um pouco mais fora da caixa, tentando fazer algo para o qual eles não foram projetados inicialmente. Mas vamos deixar um pouco de lado esta questão e vamos focar na questão do conflito visto no vídeo 02.

Por que dois indicadores que funcionam aparentemente bem, quando isolados, tem um funcionamento completamente bizarro quando colocados juntos ?!?!


Entendendo o conceito de ambiente de trabalho

Muito provavelmente, se você for um usuário mais experiente, já deve ter ouvido falar, ou mesmo usado ambientes de trabalho. A ideia por detrás de tal conceito, tem como fundamento a separação das coisas, de maneira que elas possam conviver separadamente, mas fazendo parte de um mesmo ecossistema.

No MetaTrader 5, esta questão sobre ambiente é levada de uma forma bastante séria. Se você não conseguir compreender esta ideia de ambiente de trabalho, não irá conseguir compreender o porquê do conflito mostrado no vídeo 02. E principalmente, não conseguirá entender como resolver este mesmo conflito. Lembre-se: Queremos que o indicador de mouse, funcione em perfeita harmonia com qualquer outro. Eliminando assim uma série de coisas, e passando a ser um modulo de um sistema ainda maior.

Muitos iriam simplesmente desistir. Mas desistir não é uma escolha. Queremos e iremos fazer com que o sistema seja modular, e para fazer isto, precisamos que o indicador de mouse trabalhe em conjunto com o indicador de controle.

Então ao observar o vídeo 01 e notar que os indicadores não entram em conflito, e observar no vídeo 02, que quando colocados juntos, coisas estranhas acontecem com o indicador de mouse, presente no mesmo gráfico que o indicador de controle. Podemos perceber nitidamente que o MetaTrader 5, trata cada um dos gráficos como sendo ambientes totalmente isolados entre si.

Este tipo de observação é importante, e iremos fazer uso dela depois. Mas existe mais uma observação igualmente importante a ser notada no vídeo 02. Quando o MetaTrader 5, atualiza o gráfico, ao responder a um evento do usuário para troca de tempo gráfico, uma série de coisas acontecem. Mas para entender é preciso compreender de fato como o MetaTrader 5 trabalha.

Assim que fazemos o pedido para mudança de tempo gráfico, que foi o caso visto no vídeo. O MetaTrader 5, remove temporariamente tudo que está no gráfico, para logo em seguida recolocar o que realmente é necessário. Por conta disto, apenas indicadores e Expert Advisor são repostos no gráfico. Se o programador não tiver a devida consciência disto, irá fazer todos os programas entrarem em conflito. Já que a ordem em que o MetaTrader 5 irá repor as coisas, muito provavelmente não será a mesma que o usuário as colocou no gráfico. Então pode ser que você, usuário, coloque no gráfico as coisas em uma ordem em que nada dá errado. Mas assim que algo acontece, e o MetaTrader 5, for recriar o gráfico, a ordem pode ser diferente, e neste momento os problemas irão começar a aparecer. Muitos irão culpar a plataforma, outros irão ficar achando que é o sistema operacional, outros vão culpar DEUS ou o DIABO. Mas na real, o problema é que a programação feita por você, ou alguém que você contratou, não está prevendo o uso de coisas em conjunto. E o fato de muitos códigos serem simplesmente fechados, dificulta ainda mais o trabalho de entender por que as coisas estão entrando em conflito.

Mas vamos voltar a questão principal. Neste artigo, informei que o indicador de mouse, não faz uso interno de nenhum evento customizado. Mas, no entanto, ele responde a dois eventos customizados. Um para ocultar o mouse e outro para mostrar a linha do mouse. Já o indicador de controle, tanto faz uso, quanto também responde a um evento customizado, este serve justamente para inicializar algumas coisas na classe de controle.

Pois bem, vamos dar novamente uma olhada no código. E agora quero que prestem muita, mas muita atenção mesmo ao que irei explicar. Se você conseguir entender o que irei explicar, irá dar um grande salto na sua compreensão de como o MetaTrader 5 funciona.

Ambos indicadores, tanto o de controle, quando o de mouse, são compilados separadamente. E no código usamos enumerações que deveriam estar de certa forma ligadas a classe que iria responder as mensagens. Sim, mas ao pensar desta forma, você está supondo algo. E em programação, não fazemos suposições. Para o compilador aquele código de evento customizado será sempre um valor, deslocado a partir de uma constante. A constante é CHARTEVENT_CUSTOM, e como as enumerações estão começando com o valor padrão, ou seja, ZERO, tanto o código de tratamento de mensagens do indicador de mouse, quando do indicador de controle, começam no mesmo index, CHARTEVENT_CUSTOM mais ZERO.

Você pode pensar que isto não explica por que do conflito. Mas você está equivocado. Isto explica sim o motivo. E mais. Isto explica como o MetaTrader 5, se organiza em termos de ambiente de trabalho.

Cada gráfico é um ambiente de trabalho no MetaTrader 5. Quando um programa envia um evento customizado para o MetaTrader 5, e sim, o evento não é enviado para o programa, ou para algum outro programa especifico, ele é enviado ao MetaTrader 5. A plataforma irá lançar este evento a todo e qualquer programa presente no ambiente de trabalho, ou seja, o GRAFICO. Por conta disto que no vídeo 02, você vê o comportamento apresentado. Isto se deve justamente ao fato de que todos os programas dentro do gráfico, irão receber a mesma notificação do MetaTrader 5, assim que um evento customizado for disparado. Agora pense, se um Expert Advisor, faz uso de um evento customizado a fim de abrir e fechar uma posição, e este mesmo evento tem como index, um evento de enviar um sinal dentro de um indicador, e tanto este indicador, quando o Expert Advisor, estão no mesmo gráfico. O que acontecerá quando o Expert Advisor, ou o indicador disparar o evento customizado ?!?! Você terá um baita de um problema. Isto sim. 

E lembre-se ainda estou pegando leve nesta questão. A coisa é muito, mas muito mais complicada do que pode parecer, e iremos fazer uso deste mesmo sistema a fim de conseguir fazer outras coisas. Por conta disto é necessário que você compreenda o que está acontecendo, e passe a estudar com bastante calma o que estou mostrando. Se você não fizer isto, irá acabar em um beco onde logo a frente existe um precipício.

Mas então, você pode estar na dúvida e pensando: Será que não existe uma forma de resolver isto ?!?! Sim, e ela é bastante simples, e conta com um conhecimento adequado sobre o que estará sendo feito. No entanto não irei entrar em detalhes sobre isto neste artigo. Já que será preciso fazer algumas mudanças, e explicar algumas coisas que se forem feitas neste momento, muito provavelmente irá mais confundir do que esclarecer.


Conclusão

Neste artigo, comecei a fazer uma apresentação do que irá vir a ser o conteúdo dos próximos artigos. Sei que para muitos de vocês este conteúdo é extremamente complicado, e difícil de ser compreendido assim, de uma hora para outra. Mas é importante que você comece a se preparar, e a estudar este assunto que mostrei neste artigo. Mas a principal questão será vista nos próximo que virão.

Então a fim de conseguir compreender, e de assimilar melhor o que foi explicado aqui. Crie pequenos programas, podem ser simples indicadores cujo único propósito é gerar e responder a eventos customizados. Coloque eles em um mesmo gráfico e em gráficos separados. Observem como eles se comportam, quando estão juntos e quando estão separados. Mas principalmente, e esta é a dica de ouro deste artigo. Tente fazer com que um indicador mude algo em outro indicador. Tanto quando estão no mesmo gráfico, quando estão em gráficos separados.

Se você não conseguir fazer com que eles se comuniquem via eventos customizados, estando em gráficos separados, tudo bem. Não precisa ficar achando que você é um mal profissional. O que muito provavelmente estará acontecendo, é que você ainda não tem o devido conhecimento de como fazer isto. Mas aqui irei mostrar, não apenas como fazer isto, mas iremos levar as coisas a um outro nível de entendimento, pois como você pode ter notado, caro leitor, estou evitando ao máximo fazer uso de algumas coisas, como usar DLL externa a fim de cobrir alguma deficiência no MQL5, pois até agora ele tem conseguido atender perfeitamente o que estamos fazendo, não necessitando de soluções estravagantes ou coisas do tipo.

Então bons estudos, e nos vemos no próximo artigo. E se preparem, pois está vindo chumbo grosso.

Arquivos anexados |
Anexo.zip (420.65 KB)
Criando um algoritmo de market making no MQL5 Criando um algoritmo de market making no MQL5
Como funcionam os market makers no mercado? Vamos explorar isso e criar um algoritmo simples de market making.
Redes neurais de maneira fácil (Parte 71): Previsão de estados futuros com base em objetivos (GCPC) Redes neurais de maneira fácil (Parte 71): Previsão de estados futuros com base em objetivos (GCPC)
Nos trabalhos anteriores, conhecemos o método Decision Transformer e vários algoritmos derivados dele. Experimentamos com diferentes métodos de definição de objetivos. Durante os experimentos, trabalhamos com diferentes maneiras de definir objetivos, mas o estudo da trajetória já percorrida pelo modelo sempre ficou fora de nosso foco. Neste artigo, quero apresentar um método que preenche essa lacuna.
Aprendendo MQL5 do iniciante ao profissional (Parte II): Tipos de dados básicos e uso de variáveis Aprendendo MQL5 do iniciante ao profissional (Parte II): Tipos de dados básicos e uso de variáveis
Continuação da série para iniciantes. Aqui veremos como criar constantes e variáveis, registrar datas, cores e outros dados úteis. Aprenderemos a criar enumerações como dias da semana ou estilos de linha (contínua, tracejada etc.). Variáveis e expressões são a base da programação. Elas estão em 99% dos programas, portanto é fundamental entendê-las. Se você é novato em programação, este é um bom ponto de partida. Se o nível de conhecimento em programação é muito básico, conforme meu artigo anterior (link no início).
Algoritmos de otimização populacionais: algoritmo híbrido de otimização de forrageamento bacteriano com algoritmo genético (Bacterial Foraging Optimization - Genetic Algorithm, BFO-GA) Algoritmos de otimização populacionais: algoritmo híbrido de otimização de forrageamento bacteriano com algoritmo genético (Bacterial Foraging Optimization - Genetic Algorithm, BFO-GA)
Este artigo apresenta uma nova abordagem para resolver problemas de otimização, combinando as ideias dos algoritmos de otimização de forrageamento bacteriano (BFO) com as técnicas usadas no algoritmo genético (GA), resultando no algoritmo híbrido BFO-GA. Ele utiliza o comportamento de enxameamento das bactérias para a busca global da solução ótima e operadores genéticos para refinar os ótimos locais. Ao contrário do BFO original, as bactérias agora podem mutar e herdar genes.