[Música] [Música] Olá tudo bem seja muito bem-vindo ao quarto dia da imersão full stack full cyc meu nome é Wesley e se você ainda não teve a oportunidade de assistir aos vídeos anteriores eu super recomendo que você volte os assista antes de começar esse no vídeo anterior nós fizemos a integração entre o front-end e o backend do nosso sistema utilizando o websockets Para garantir a comunicação em tempo real foi um grande passo no nosso projeto prático e ele trouxe toda a dinâmica necessária pro funcionamento da nossa aplicação até aqui agora eu quero te fazer uma
pergunta você já teve aquela sensação que nunca vai ser capaz de trabalhar numa grande empresa ou participar de grandes projetos simplesmente porque parece que sempre falta algo talvez fundamentos como entendimento de microsserviços sistemas Distribuídos comunicação assíncrona e resiliência que permitem por exemplo construir pequenos sistemas independentes e distribuídos capazes de se comunicar sem perder dados mesmo quando um deles está fora do ar e que ainda eles possuem aí aquela capacidade de se recuperar automat praticamente ou talvez pela falta de conhecimento sobre as tecnologias modernas que são amplamente utilizadas nas maiores organizações do mundo a verdade é
que Muita gente está fora do mercado justamente por não entender esses conceitos e tecnologias isso precisa deixar de ser um impedimento pro seu crescimento profissional saber como trabalhar com microsserviços e sistemas distribuídos é o que realmente diferencia um desenvolvedor que muitas vezes está preso em um sistema monolítico e eu não tô falando aqui que sistemas monolíticos são ruins Tá mas a grande realidade é que em organizações Maiores é praticamente impossível evitar sistemas distribuídos isso acontece tanto por motivos tecnológicos para usar ferramentas certas no contexto certo quanto em questões organizacionais mesmo imagine uma big Tech como
Google Amazon Netflix Mercado Livre grandes bancos tentando operar Com um único sistema monolítico é inviável trabalhar de forma distribuída já é uma realidade faz muito tempo e hoje quem não domina esses conceitos realmente vai est muito longe De ser considerado para uma oportunidade em grandes empresas Independente de você tá numa organização que já utiliza microsserviços e sistemas distribuídos ou não é fundamental que você assuma o controle do seu desenvolvimento profissional você não pode terceirizar a sua carreira pra empresa onde você trabalha aprender coisas novas se especializar e dominar esses conceitos é essencial para você conseguir
se manter relevante no mercado e ficar também Preparado pros desafios futuros o aprendizado contínuo é o que realmente vai te diferenciar e abrir novas portas independente do momento em que você aí se encontra Além disso não basta apenas entender essas questões de arquitetura e etc é totalmente necessário você também saber criar aplicações performáticas seguras e eficientes para suportar um alto volume de requisições e transações garantindo que o seu sistema ele realmente seja confiável mesmo sobre Grande pressão é aí que a escolha da linguagem de programação faz toda a diferença também imagine Grande temas recebendo diversas
requisições para realizar processamento pesado de dados e sendo capazes aí de executar apenas uma tarefa por vez ou para tentar paralelizar todo o processamento precisarem subir diversas máquinas gastando cada vez mais recursos computacionais isso é muito mais comum do que você imagina no dia a dia e Normalmente ocorre porque a esmagadora maioria do sistemas desenvolvidos trabalham aí de forma serial não aproveitando o grande poder aí da utilização do paralelismo e multitrading e normalmente isso acontece por um motivo muito claro complexidade realmente não é fácil gerenciar múltiplas threads fazendo o sistema de forma segura para evitar
Race conditions e problemas de concorrencia só quem já sofreu com semáforo mutex etc sabe do Que eu tô falando o o risco é alto de fato um pequeno erro ao realizar um Lock ou um unlock pode gerar consequências catastróficas aí no comportamento do sistema e o pior de tudo é que esses tipos de comportamento são totalmente intermitentes e muitas vezes nem são pegos nos ambientes de testes mesmo aí automatizados mas atualmente temos uma carta na manga quando a gente trata exatamente sobre esses desafios e essa carta é a linguagem Gol criada pela Google ao longo
de mais de uma década o gol Tem se tornado protagonista em Sistemas de grandes empresas que buscam eficiência sem abrir mão da simplicidade podendo gerenciar até centenas de milhares de trads de uma forma extremamente segura eficiente E economizando muitos recursos computacionais no entanto de nada adianta desenvolver sistemas altamente performáticos com GO exemplo se eles não conseguem se comunicar de forma Eficiente e confiável com outros microsserviços em um ambiente distribuído onde vários serviços precisam trocar informações constantemente a comunicação se torna um ponto mais do que crítico É nesse cenário que enfrentamos uma das maiores dores dos
sistemas modernos garantir a comunicação assíncrona a resiliência e a escalabilidade a comunicação assíncrona não apenas garante que nenhuma transação seja perdida permitindo que mensagens Pendentes sejam processadas quando um serviço retornar mas também facilita a escalabilidade do sistema de forma bem eficiente esse modelo evita a necessidade que as transações sejam processadas imediatamente o que reduz a pressão no serviços e economiza recursos computacionais é uma solução aí fundamental em arquitetura distribuídas que buscam alta performance e confiabilidade e é também aí que entra o famoso apach cfca um dos sistemas de Mensageria stream de dados mais eficientes rápidos
e completos aí do mercado o cafc ele é utilizado pelas maiores empresas do mundo para garantir comunicação confiável e escalável entre os seus sistemas o cafca funciona como um intermediário entre sistemas organizando a troca de informa ações de maneira síncrona ele utiliza um mecanismo chamado de tópicos para categorizar esses tipos de mensagem um tópico ele pode ser visto como um canal Onde as informações relacionadas a um determinado contexto são publicadas por produtores sistemas que enviam eventos e consumidas pelos consumidores os sistemas que processam esses eventos esse modelo garante que as mensagens estejam disponíveis para qualquer
sistema que precise delas mesmo quando os serviços envolvidos eles não estejam mais ativos simultaneamente e hoje a gente vai desenvolver a nossa Bolsa de Valores a gente vai criar uma espécie de Uma B3 onde a gente vai realmente ter aquele backend que vai poder processar as nossas ordens ah de compra e venda de ativos tá e a gente vai fazer tudo isso realmente utilizando a linguagem go Então vai ser uma experiência realmente fantástica e bem desafiadora pra gente conseguir colocar tudo isso aí para funcionar agora se você nunca trabalhou com GO ou com ap ch
Cica Fique tranquilo eu vou ser o mais didático possível explicando tudo passo a passo mesmo que Alguns detalhes aí pareçam complexos o importante é que você compreenda a ideia Geral de como tudo tá sendo desenvolvido e eu não quero que você saia dessa imersão sendo um especialista l em go ou Kafka até porque por exemplo o Kafka é tão abrangente e complexo que seria possível a gente dedicar uma imersão inteira apenas para ele o nosso foco aqui é apresentar como utilizá-los dentro do contexto do nosso projeto prático garantindo que você entenda o Fluxo e o
processo de desenvolvimento desses microsserviços a gente tá aqui muito empolgado em trazer esse tipo de material e projeto prático nessa imersão o nosso objtivo aqui é ajudar você a avançar na sua carreira assim como muito dos nossos alunos que todos os dias estão tendo resultados aí fantásticos vai fazer se anos que eu tô na carreira né Eu até brinco que tenho pré fuçar que eu poss fuçar que eu não tinha aquela base como é que eu Começo um projeto agora para um cliente real eu não vou conseguir para mim não dá eu não consigo mais
isso já me causava um frio na barriga só que isso dali ó às vezes entra muito no que a gente chama de síndrome do impostor né inclusive amigos meus tá pessoas que se formaram junto comigo que eles acabaram não entrando na área acabaram desistindo assim você sai da faculdade é um leque muito grande que você não sabe para onde que você vai sabe eu acho que foi no Finalzinho de janeiro lançou o curso da full cycle que eu que eu adquiri eu falei cara tem muita coisa ali que eu posso aproveitar eu tô começando a
entender muito melhor as coisas que você às vezes faz num repasse alguma coisa porque a explicação ali tanto do Wesley quanto dos outros professores que t no curso não deixam a desejar sabe e ano passado mesmo eu tirei 17 certificados do curso Foi muita coisa que eu estudei sabe todo dia todo dia todo dia final de Semana e a o diferencial que eu vejo hoje que o curso proporcionou para mim foi tentar enxergar um pouco além daquilo que já parece que é óbvio na tua cabeça sabe nada é tão perfeito que você não possa melhorar
e tá toda a vida com aquela Mel contínua Eu tava explicando um pouquinho de Clean ar teure ali para um outro Dev ali do nosso time e todo esse conhecimento foi trazido do curso e mostrando porquê daquilo não porque ah O Marcelo quer que faça assim eu gosto que As pessoas entendam o por que elas estão construindo Cara eu tô fazendo e eu sei o por que eu tô fazendo eu não achei caro sabe porque como eu comentei Eu sempre tive estudando e eu já comprei Assim muitos cursos picados assim ó um pouco de conhecimento
ali um pouco de conhecimento aqui mas não o contexto completo como hoje a gente tem na full cycle que se for fazer a soma de todos os cursos que eu acabei comprando assim ó não com toda aquela qualidade que Vocês empregam ali ó com toda aquela dinâmica que vocês têm ali ó eu paguei hoje muito mais caro do que o próprio curso sabe então assim ó em questão do preço do curso eu não achei ele caro não tá pela quantia de conteúdo e pelo valor assim que ele me agregou eu já vi pós-graduações assim em
universidades as quais Eu já fui buscar que eu achei ela muito mais cara com menos conteúdo do que a fusar que hoje me entrega que o certificado é emitido eu já utilizo Aquela opção de linkar com o Linkedin né E acabo colocando todos os meus cursos lá e assim as propostas elas vêm vê vem em peso e não só propostas nacionais vem propostas da Gringa também bom chegou a hora então da gente pra tela do meu computador e colocar a mão na massa Bora lá bom pessoal então vamos começar a nossa jornada agora pra gente
criar a nossa B3 a nossa Bolsa de Valores Ah não espero de forma alguma que você Entenda 100% do que a gente vai colocar tanto em relação a código tanto em relação à lógica de tudo que a gente vai trabalhar porque não é algo tão trivial assim e criar um sistema de compra e venda match ações livro carteiras etc não é algo trivial mas eu acho que vai ser uma oportunidade legal para você ah exercitar um pouco sua lógica né de programação ao mesmo tempo aprendendo ou utilizando uma linguagem nova ou mesmo se aperfeiçoando na
linguagem que você Já trabalha nesse nosso caso a gente vai utilizar uma linguagem a linguagem go é uma linguagem fantástic extremamente madura foi criada pela Google e eu tenho assim um um uma felicidade muito grande de poder programar com ela tá eu programo em diversas linguagens de programação hoje em dia go a linguagem que eu mais utilizo no dia a dia não sou apaixonado por linguagens de programação mas obviamente eu tenho as minhas preferências e ultimamente a minha Preferência tá sendo na linguagem go né hoje eu sou Google também developer Expert a na linguagem go
Então eu acho que vai ser uma boa pegada você aprender bastante coisa aí comigo espero que eu consiga te ajudar primeiro passo que você vai fazer caso você nunca tenha instalado o go no seu computador você vai acessar go.dev tá então vai acessar go.dev você vai cair aqui nessa página vai clicar em download e na hora que você clicar em download você vai Escolher a versão do seu sistema operacional para fazer a instalação e é bem simples mesmo next next next e acabou você já pode utilizar segundo ponto é você poder utilizar o gol no
seu vess code ou editor similar tá somente para você saber nessa imersão especificamente eu vou usar o cursor a gente tá trabalhando muito com inteligência artificial aqui na full cych obviamente eu não vou ficar fazendo gerações de código e e tudo mais Obviamente a gente vai utilizar um pouco de autocomplete mas eu tenho utilizado o curso nos últimos tempos tá sendo uma experiência bem legal também mas isso é totalmente independente o que eu quero trazer aqui para você de qualquer forma caso você esteja usando o vs code Eu recomendo que você venha nas suas extensões
do vs code tá digite go aqui você vai cair na ex ão oficial da linguagem go criada pelo time da Google tá aqui até pedindo para eu reiniciar Porque teve uma atualização da extensão após você instalar essa extensão você vai dar um control shift IP ou um Command shift IP no seu vs code e vai digitar go aqui na frente dois pontos você vai ver essa opção aqui ó install bar update Tools quando você fizer isso Ah vai aparecer essa janelinha falando tudo que você precisa instalar para você ter um ambiente assim super zerado de
desenvolvimento utilizando a linguagem go então você seleciona tudo dá um ok e Simplesmente você já vai sair utilizando a o vs code ah com a linguagem go com tudo que você precisa para rodar fazer os testes ah e lint e tudo mais tá então é basicamente isso que a gente vai fazer então agora a gente vai dar o nosso próximo passo pra gente iniciar o nosso desenvolvimento para isso eu tô indo agora pro cursor Mas poderia estar usando normalmente aí também o vs code vamos nessa bom pessoal então vamos agora Nessa primeira parte desse nosso
projeto fazer realmente com que as regras de negócio do nosso home broker funcione a nossa ideia aqui nesse momento é a gente conseguir simular como se fosse uma B3 ou uma bolsa de valores que vão que vai receber no final das contas as os pedidos de compra e os pedidos de venda venda e a nossa ideia no final das contas é conseguir fazer o match dessas operações tá então acho que esse aí é o nosso principal objetivo então se eu tô Querendo vender uma ação por r$ 1 né E e essa ação vamos dizer ela
tem 100 share 100 pedacinhos né o que que vai acontecer quem quer comprar essa ação pelo preço mais baixo possível eu vou casar essas operações né E depois eu vou distribuir isso para quem comprou e para quem vendeu tá então é basicamente essa a ideia eu tenho que admitir para você que não é a o projeto o domínio mais simples de se entender né mas eu vou tentar ao máximo aqui simplificar e ser O mais didático possível porque a questão aqui não é só linguagem de programação mas é entender como que a gente vai resolver
esse desafio aqui né e é Um Desafio bem bacana então para isso pessoal nós vamos utilizar aqui né a linguagem go e eu não sei se vocês já tem experiência com gol ou não mas a grande sacada é que qualquer projeto gol que a gente vá começar nós temos que inicializá-la é como se nós fôssemos trabalhar com o npm da vida né onde a Gente tem que dar um npm init então no go a gente faz a mesma coisa a gente dá um go mod eit legal e eu vou passar o nome do meu módulo
ou seja o nome do meu do caminho do meu namespace que inclusive depois outras pessoas pessoas podem importar e utilizar nos projetos dela tá então o nome desse camarado vai ser github.com bdf cycle bar imersão 21 barg Então esse vai ser um endereço onde nós garantimos que tudo que tiver aí dentro vai ser parte do nosso projeto eu Poderia escrever teste ali go mod nit teste Mas esse vai ser o caminho aonde os nossos arquivos nossos importes eles vão funcionar então por isso que eles Normalmente eles T que ser um nome único e para ser
AL único Você pode passar o repositório do github E O que é muito comum na comunidade go é que você publica os pacotes no github e quando você dá um goget por exemplo você importa baseado no endereço do github então isso fica bem legal então vou dar Um enter aqui e você vai perceber que ele gerou o nosso primeiro arquivo que é o nosso go mod né falando qual é o módulo e aqui falando com a versão nesse momento a gente tá na versão 1.24 do Gol uma versão recém Lan ada inclusive beleza bom agora
que nós já temos isso eu quero estruturar rapidamente aqui com vocês a o nome das nossas pastas por convenção vamos dizer assim existe uma pasta que normalmente a gente cria chamada internal essa pasta internal ela Identifica pra gente que tudo que tiver aí dentro dela são arquivos internos no meu programa e não são bibliotecas que outros terceiros vão poder utilizar tá então isso aí é um ponto importante é uma definição que a gente coloca coloca e eu vou colocar um nome meio que do que o meu sistema vai fazer eu tô fazendo isso muito mais
para deixar o meu sistema mais expressivo do que qualquer outra coisa eu não precisaria criar uma pasta aqui dentro mas eu vou criar uma Pasta chamado de market que vão ser né basicamente todos tudo que vai acontecer dentro do nosso projeto legal e agora pra gente começar a entender toda essa estrutura e como que a gente vai trabalhar com o nosso projeto eu vou criar aqui também uma pasha tá chamada de entities tá ou entity eu gosto de trabalhar sempre no singular com o go tá e dentro desse entity a gente vai ter as nossas
entidades ou seja pontos chave do nosso projeto né que vão ser utilizados Para que a gente consiga fazer essa compra e venda de ativos tá esses ativos em inglês a gente chama de assets então primeira coisa que eu vou fazer aqui é eu vou criar né um arquivo chamado de asset GO Tá então vamos lá deixa eu colocar aqui New file Opa New file asset PG e esse camarada aqui ele deixa eu até aumentar um pouco aqui o zoom para ficar cada vez melhor aí para vocês ah a grande sacada aqui desse nosso asset PG
é basicamente Nós colocarmos para ele que ele faz parte né de um pacote chamado entity e você vai entender que esse pacote entity aqui ele sempre vai ser baseado no nome da pasta Onde você tá legal então eu estou dentro do pacote entity porque eu estou dentro da pasta entity aqui para mim e agora o que eu vou fazer eu vou definir uma estrutura de dados o go é um é uma usa vamos dizer assim uma ideia de data driven você não tem classes você tem estrutura de dados mas essas Estruturas de dados também tem
métodos então fica muito próximo Aí a orientação objetos então eu vou colocar aqui ó Type asset e vou vou falar que isso é uma struct ou seja uma estrutura de dados e dentro dessa estrutura de dados o que que eu vou colocar eu vou falar que ele tem um ID esse meu asset eu vou falar que ele tem um name que é uma string e eu vou chamar que ele vai ter um Market volume certo que basicamente é a quantidade de shares de ações que a Gente tem no mercado pra gente trabalhar ah com esse
camarada beleza então essa é a nossa ideia Inicial aqui uma vez que eu consegui definir isso aqui eu vou criar uma função construtora ele até já tá me sugerindo aqui né o meu copiloto nesse caso aqui eu tô utilizando cursor Mas você poderia est usando qualquer outro ponto a gente vai aproveitar muito da utilização de inteligência artificial para nos ajudar aqui a construir o nosso código e deixar A gente mais produtivo Mas a nossa ideia aqui é que eu possa criar um novo asset ou seja um novo camarada como se fosse um construtor é uma
função onde eu vou passar o id o nome dela e eu vou passar o market volume a quantidade de shares que a gente tem no mercado e aqui é o meu retorno tá Ou seja eu tô retornando um asset aqui para mim Esse asterisco aqui é um ponteiro eu não quero que você fique preso nisso ou tentando entender meu Deus ponteiro do C como é que era a Faculdade não basicamente esse cara simplesmente tá dizendo que ele não é uma variável comum Ele simplesmente ele aponta pro preço na memória onde um valor é guardado Tá
mas na prática aqui é isso eu tô retornando um ponteiro de asset e para dizer que eu tô retornando um ponteiro ou seja uma posição na memória eu tenho que colocar um e- comercial aqui na frente mas fica tranquilo com isso isso não vai mudar absolutamente nada no seu entendimento Ah no que a gente vai fazer hoje tá inclusive temos outros vídeos no YouTube onde eu dou a vamos dizer assim uma boa explicação sobre como é que funcionam ponteiros Beleza então toda vez que eu rodar essa função passar o nome do asset né a o
ID dele e o volume né a gente vai ter um novo objeto aí pra gente fora isso o que que a gente precisa para ter um mercado funcionando a gente precisa de investidores né então eu vou criar aqui um arquivo chamado de investor PG e Nesse investor PG novamente eu vou ter o meu pacote com a minha entidade e ele já tá até me sugerindo aqui uma struct Tá mas ele vai ter o id o nome certo e aqui na realidade o que eu vou fazer é que eu quero dizer aqui para ele que eu
vou ter um asset position eu não quero simplesmente passar uma lista de assets que esse cara tem tá eu quero dizer aqui para ele que ele tem a qual é a posição dele nas ações né nos ativos que ele tem com ele então eu vou chamar isso aqui de Asset position tá agora esse asset position não sei se você consegue perceber aqui é como se fosse uma lista isso aqui é chamado de Slice no go que é algo dinâmico tá então se é algo dinâmico eu posso criar ele pode ir crescendo o tamanho dele diferente
de uma rei que se eu coloco um um número aqui ele vai ter uma posição fixa tá basicamente essa a ideia agora um ponto importante aqui é a gente vai voltar aqui ainda tá eu vou Deixar assim por enquanto mas a gente vai voltar o que eu vou fazer agora aqui é também tá fazer o seguinte criar uma estrutura tá pro nosso investor asset position tá por a gente vai criar uma estrutura de dados para guardar no final das contas as posições né ou seja Quais são as ações que ele tem e a quantidade que
ele tem então eu vou colocar assim ó Type investor asset position que é uma struct e aqui eu vou falar qual que é o a ID eu Vou marcar esse cara pelo id mesmo não vou nem fazer uma referência com uma outra struct e aqui em vez de quantidade eu vou chamar de shares que é normalmente a o próprio nome né desse tipo de domínio né normalmente a gente chama de shares que é a quantidade de cotas que a gente tem de uma determinada ação agora que eu tenho essas duas estruturas aqui o que eu
posso fazer aqui é a mesma coisa nesse asset position ao invés de eu falar quais Assets que ele tem eu vou fazer o seguinte eu vou falar que ele pode ter um investor asset position na realidade no final das contas é uma lista com todos os assets que tem Wesley o que que é esse ponteiro é porque eu posso trabalhar com esse cara de forma vazia caso não tenha nada dentro dele caso esse cara esteja ah em branco para mim então mas novamente galera abstraia qualquer coisa de ponteiro não necessariamente até precisaria usar aqui Tá
Agora que a gente tem isso um ponto importante é que a gente precisa criar aquela função para nós criarmos um novo investidor certo então eu vou colocar aqui ó punk a new investor e nesse New investor eu vou passar no final das contas a um ID desse camarada que eu vou falar que é uma string eu nem vou passar o name nesse caso aqui porque eu quero simplificar a nossa vida e eu vou retornar aqui para mim um investor aqui para mim tá nem vou passar o name dele Aqui vou deixar o nome em branco
beleza então ah não tô muito preocupado e eu vou passar aqui pra gente iniciando uma carteira dele que está em Branca né ou seja o investor asset position as posições dele aqui que eu tô trabalhando são posições em branco porque ele tá começando do zero ele não tem nada ainda aqui comigo beleza agora o que que acontece toda vez que eu vou a trabalhar né com com essas ações eu preciso ter algumas regras de negócio para esse meu Investidor por exemplo toda vez que eu quero dizer que eu vou comprar uma ação no final das
contas eu preciso adicionar vamos dizer aqui na carteira dele né a os assets que ele acabou de comprar então o que que eu posso fazer aqui nesse caso eu posso criar um método tá e um método na realidade ele é um método baseado nessa Nossa struct investor então eu vou fazer assim ó funk tá e de investor e isso eu tô dizendo o qu que quando eu Coloco ess isso aqui entre parênteses eu tô simplesmente dizendo que esse aqui é um método dessa struct aqui E esse I vai me ajudar a acessar esses valores aqui
para mim então eu vou colocar assim ó add asset position e aqui eu vou passar o asset position que eu quero que no final é um investor asset position basicamente é essa ideia que eu quero trazer aqui para você beleza então com isso aqui eu vou adicionar a carteira aqui dele né Pra gente saber tudo que ele tem basicamente é essa é a nossa ideia e para fazer isso eu simplesmente vou dar um append Ou seja eu vou pegar essa lista de posições aqui e vou adicionar né esse objeto aqui dentro então agora Toda vez
que eu criar uma nova carteira eu crio essa carteira vazia e adiciono nessa carteira vazia essas novas posições ah de investimentos então se eu comprei várias ações vou adicionando esses caras aí dentro para mim tá agora Uma coisa que é importante aqui também para mim é eu poder ajustar a quantidade de assets né das posições nas carteiras que eu tenho como assim ajustar que eu tô querendo dizer aqui nesse caso é que imagina que eu compro algo o que que vai acontecer no final das contas eu posso dizer que eu vou adicionar um determinado asset
para mim com uma quantidade de ações ou se as essas minhas ações agora estão em branco quer dizer que eu não vou ter mais nada Daquela posição para fazer isso o que que eu vou fazer no final das contas vai ser o seguinte galera eu vou criar um método chamado adjust asset position Tá o que que esse camarada vai fazer aqui vamos lá eu vou colocar um I de investor aqui para mim eu colocar adjust adjust asset position legal onde eu vou ter aqui ó ele já tá meio que tentando adivinhar aqui para mim mas
vai funcionar da Seguinte forma eu vou ter o asset ID ou seja qual é a ação sei lá Petrobras ou qualquer coisa desse tipo né ela tem um um ID um nome né conhecido e a quantidade de ações eu vou chamar isso aqui de qtd shares somente para deixar o nosso código ainda mais expressivo e agora eu vou fazer o seguinte eu vou pegar quais são a as posições que eu tenho dos meus assets tá então provavelmente eu vou precisar de alguma função para eu conseguir Pegar as posições de assets que eu tenho naquele momento
como que eu posso fazer eu vou criar um outro método aqui ó eu vou colocar aqui ó to do né é iniciar pegando a a posição que eu tenho de um asset específico que nesse caso vai ser o nosso asset ID Então como que eu vou fazer isso eu vou criar um método aqui chamado funk investor get asset position olha só que ele Já adivinhou aqui para mim e aqui eu vou pegar dados desses Assets Ou seja eu vou pegar e eu vou varrer a lista né a de todos os assets que eu tenho buscando
para ver se eu tenho essa ação aqui em específico então para isso o que que eu vou fazer eu vou fazer um for eu não preciso do um índice né então por isso eu tô deixando um underline para ele Ah para dizer que eu não vou utilizar o índice e eu vou colocar assim ó asset position dois pontos igual a range de i p asset position o que que eu tô dizendo aqui Para ele nesse momento todos os meus asset positions né que é o meu i p asset position que eu tenho essa lista aqui
para mim Ah eu vou varrer ela basicamente é isso que eu vou fazer e eu vou verificar se eu tenho esse asset ID então eu vou fazer o seguinte eu vou fazer if asset position asset position vamos ver se ele traz aqui para mim é igual o asset ID ele vai retornar para mim o asset position sen não ele vai retornar em branco aqui para mim tá Então é basicamente isso que eu tô fazendo e agora que eu tenho isso aqui feito eu posso voltar aqui né para eu ajustar o meu asset position então vou
fazer o seguinte ó vou falar que asset position é igual a get asset position n e agora olha só que interessante eu vou fazer o seguinte eu nem vou botar aqui para ele completar para eu poder explicar melhor aqui para você eu vou verificar assim ó se o asset position que eu tenho tá for igual a em branco o Que que significa significa que eu não tenho essa ação e se eu não tenho essa o que que vai acontecer eu vou criar tá um novo asset position para mim baseado nessa ação ou seja eu não
tinha nenuma ação da petrobr então já que eu não tenho nenhuma eu preciso criar agora então o que que eu V fazer eu V fazer I asset position onde eu vou pegar todos os meus asset positions certo e agora eu tenho esse meu asset position eu vou dar um append né Falando o seguinte aqui Para mim ó eu vou pegar o asset position e vou colocar aqui para mim né um novo cara que eu vou colocar um New investor asset position onde eu vou passar o asset id e eu vou passar a quantidade de shares
que eu vou adicionar é basicamente isso que eu tô colocando aqui deixa eu esconder isso aqui aqui deixa eu colocar aqui Aqui fica melhor pra gente ver tá e se você perceber eu não tenho essa Função aqui legal então eu preciso criar essa minha função para me ajudar a poder criar um novo investor asset position né No final das contas é essa então o que que eu vou fazer eu vou fazer o seguinte eu vou aqui embaixo e vou pedi para ele criar para mim aqui a minha função então vai ficar o asset ID a
quantidade de shares e eu vou retornar então um novo objeto com ID shares basicamente é um Construtor que eu tenho aqui e agora no final das contas o que eu tô fazendo Aqui é o seguinte Voltamos para cá então se ele não tem né nenhuma posição né Ou seja eu não tenho nenhuma ação desse cara eu vou criar essa ação Beleza agora e se eu tiver o que que eu vou fazer aqui no afal das contas né se eu não se eu se eu tiver eu vou falar que eu quero somar a minha quantidade de
shares Ou seja eu quero adicionar a minha quantidade de cotas aqui para mim mas eu não quero ficar ah usando esse tipo de coisa aqui com um I mais mais saca porque eu quero que se eventualmente eu tiver alguma regra que para adicionar uma nova Como que eu posso dizer uma nova uma nova ação uma somar a minha quantidade de ações né minha quantidade de shares eu prefiro aqui nesse meu caso fazer o quê criar um método chamado AD share tá então eu prefiro fazer assim ó então eu posso colocar asset position ponto AD shares
e eu vou passar aqui a minha quantidade e agora o que eu Vou pedir paraa Nossa ia nos ajudar aqui vamos ver se ela consegue nos ajudar onde eu eu vou ter um método aqui chamado de Ed share para me ajudar então no final das contas é isso que vai acontecer então vamos colocar aqui e vamos ver Ed shares e esse Ed shares basicamente ele tá somando esse cara aqui para mim somente para não gerar confusão desse I Invest position ou qualquer coisa desse tipo Eu Vou Chamar esse cara de sei lá IAP né o
investor Asset position só pra gente não não complicar nada mais tá só para uma questão de leitura mesmo e aqui eu não vou colocar shares eu vou colocar quantidade para deixar Sempre o meu código o mais simples e eu conseguir entender e agora Finalmente eu tenho essa minha parte aqui feita né Ed shares tô feliz e contente ah com tudo que eu acabei fazendo que mais que eu preciso fazer agora aqui então eu consigo ajustar minha posição eu consigo Adicionar um novo asset aqui para mim eu consigo também vê a posição quanto que eu tenho
a das minhas ações aqui para mim então eu acho que isso aqui para mim tá super Ok pelo que eu preciso nesse momento tá e tô feliz e contente passamos pela nossa primeira fase aqui onde nós temos o nosso asset e nós temos o nosso investidor porém a vida não é tão fácil assim por nós precisamos ter ordens de compra Tá e isso é um ponto importante e a gente começa nesse Momento a entrar numa Ceara um pouquinho mais complexa aqui né obviamente porque eu vou ter que ter Order de compra ou seja toda vez
que eu vou a realizar uma operação eu tenho que fazer uma ordem de compra então para isso eu vou colocar meu pacote entity aqui tudo maravilha e agora eu vou ter que estruturar muito bem como é que eu vou trabalhar com esse camarada Então vamos vamos organizar bem como é que a gente precisa eu preciso do id dessa Order eu preciso saber quem é o Investor e aqui para isso eu vou passar que eu tenho um investor Eu também preciso ter o asset ou seja qual eh qual ativo né tá sendo negociado eu vou colocar
aqui também Além disso eu preciso saber quantas shares né quantas cotas estão sendo negociadas e o ponto é o seguinte galera tem uma parada que é muito importante aqui que é chamado de pending shares o que que isso significa imagina que eu quero vender 100 cotas da Ação da Petrobras e de repente eu boto isso no mercado para vender 100 imagina que o meu amigo Luiz o que que ele fez ele quer comprar 50 cotas aí ele vai cruzar o meu sistema e vai ver olha o Wesley tá vendendo 100 wes o Luiz quer comprar
50 então eu compro do Luiz né o Luiz compra 50 das 100 ações que eu queria vender Mas ainda eu tenho 50 vendas ainda eu tenho que esperar uma outra pessoa fazer uma ordem de compra para eu conseguir vender essas minhas Ações então o Pain in shert é o restante dessas ações dessa ordem que ainda estão pendentes para fechar aí eu preciso saber o price ou seja o valor que a gente Ah tá vendendo essa ação e eu preciso também saber o Order Type o que que é o Order Type se é uma compra ou
se é venda no final das contas legal outra coisa que eu preciso também saber é o status dessa Order né Se ela já terminou se ela não terminou e eu preciso finalmente também saber quais foram as Transações que foram realizadas né para que essa ordem seja fechada como assim vamos imaginar que eu fiz um pedido de compra ah de ações aí eu consegui comprar uma parte do que eu queria Então gerou uma transação de compra né mesma coisa do Luiz né o Luiz comprou metade das minhas ações o Joãozinho comprou outra metade Ou seja eu
tenho duas transações que aconteceram dentro para dentro dessa Order para que essa Order ela seja Cumprida basicamente é isso então aqui ó eu vou precisar de algo chamado transactions legal e eu já vou colocar aqui que essa transaction no final das contas vai ser um novo tipo que a gente vai precisar aqui pra gente conseguir trabalhar e somente para não ficar dando um monte de erro eu já vou criar um arquivo aqui chamado de transaction transaction pgo mesmo esquema ah Opa eu criei ele na pasta errada aqui então vamos lá transaction package Entity aqui para
mim e na minha transaction eu vou ter algumas coisas aqui que são importantes para mim também tá então Primeira coisa eu vou colocar uma struct aqui de uma transaction em branco por enquanto somente pra gente não ter erro Ah nesse camarada aqui tá então é basicamente isso que eu tô fazendo apenas pra gente não perder a nossa linha de raciocínio e agora que a gente tem isso o que que nós vamos fazer eu Vou criar uma nova Order e para criar uma nova Order Eu tenho aquele aquela minha função New ali para mim então vamos
ajudar o nosso nosso nosso Auto complete aqui para nos nos ajudar e vamos ver se ele vai fazer tudo da forma como eu gostaria que fosse feita e a gente revisa esse código aqui tá E ele já tá gerando um monte de coisa aqui que eu não queria Então vamos lá que que tá acontecendo aqui galera eu tenho uma nova Order que é um ID então Eu vou chamar isso aqui de Order ID só para deixar mais claro ainda aqui então ID aqui desse cara eu vou chamar ele de Order ID eu tenho investor que
vai ser o meu investor beleza aí eu tenho o meu asset que vai ser o meu asset eu tenho o shares que é a minha quantidade de shares pending shares Opa Cadê o pending shares aqui para mim é a mesma quantidade de shares que é em branco Por enquanto né ou o total né se eu compr se eu crio uma nova Ordem de 100 óbvio que tem 100 pendentes também beleza aí eu tenho um Price que é o valor do preço e eu tenho o Order Type que é o tipo da ordem e ele vai
retornar uma nova Order aqui para mim a única coisa que eu vou fazer aqui com o nosso status aqui eu vou deixar isso aqui como Open eu poderia criar uma espécie de um um tipo somente né ou uma constante somente para documentar a se é uma ordem tá aberta se ela tá fechada mas galera eu quero simplificar o máximo tudo isso Aqui para vocês pra gente poder andar com o nosso projeto ah de uma forma simplificada mas também que fique decente ainda pra gente trabalhar legal e agora vai ser o seguinte essa a nossa order
a gente vai ter que poder fazer o que no final das contas realizar o trade fazer a troca dessas ações como que isso funciona no final das contas basicamente eu vou criar tá um um método chamado de apply Trade e nesse apply trade eu vou passar assim ó trade shares Ou seja a a quantidade de cotas que eu quero legal e aqui o que que eu vou fazer eu vou verificar nesse momento se a quantidade de shares que que eu tenho ela é maior que a quantidade de paining shares concorda comigo porque se eu tiver
mais ações né ah do que eu tenho de pend in shares quer dizer que no final das contas a minha quantidade de trade shares é igual a minha quantidade de Pain in shares no final das contas é isso que tá acontecendo aqui para mim legal o Opa eu vou chamar de traded traded shares traded shares aqui PR mim eu vou colocar aqui esse cara é igual dessa forma aqui então Vamos trabalhar dessa forma galera uma outra coisa que eu vou fazer agora no final das contas também vai ser o seguinte agora tá agora tem o
seguinte se as minhas pending shares se não né Agora eu vou diminuir As minhas trade shares aqui para mim tá eu vou chamar traded shares aqui por isso tá dando esse erro traded shares então o seguinte se a minha quantidade n de shares que eu quero né negociar nesse momento for maior que a quantidade de shares que eu tenho eu vou falar que eu vou negociar apenas a quantidade de shares que eu tenho disponível tá ou seja o Luiz quer comprar para mim 100 ações mas eu tenho apenas 50 então né Eu tenho 50 pending
então eu vou falar o seguinte se o Luiz tem 100 e eu só tenho 50 eu vou falar que eu vou negociar apenas 50 então por isso que eu estou igualando aqui e agora que eu vou igualar o que que eu vou fazer eu vou subtrair né De quanto que eu tô fazendo a compra Ou seja eu tinha 50 né eu tinha 100 agora que eu tô negociando 50 eu vou remover isso das minhas ações pendentes Maravilha e agora eu vou fazer uma pergunta simples se o meu pend in shares Certo então se o meu
pend in shares for igual a zero nesse momento Adivinha o que eu vou fazer eu vou falar que o status da minha Order agora é closed basicamente isso que eu tô fazendo galera porque primeira coisa então somente pra gente lembrar eu tenho uma quantidade de ações e eu tenho uma quantidade que eu tenho no momento de ações que eu quero negociar se a quantidade Ah que a pessoa quer negociar é maior do Que a minha quantidade de ações eu tô falando que eu vou negociar apenas o que eu tenho e depois disso eu vou subtrair
né ah o quanto eu negociei e se na hora que eu subtraí deu zero valor eu posso dizer que essa Order aqui foi fechada porque agora não tem mais essa né não tem mais nenhuma ação pendente para ser negociada e agora obviamente Eu também quero poder adicionar novas transações dentro dessa minha Order né então eu vou fazer o seguinte eu vou criar uma função Chamada Order e eu vou fazer o seguinte ó add transaction onde eu vou receber uma T de transaction aqui para mim e eu vou adicionar isso na minha lista de transações então
com isso aqui galera o o Qual é a capacidade que eu tenho nesse meu Order aqui eu posso Ah fazer né realizar o trade ou seja fazer a negociação removendo ações de quem quer comprar e etc né Ou seja eu comprei tantos então eu tenho menos Ações para negociar até o pending né até o pending shar ficar zero quando o pending shar fica zero acabou e aqui eu tenho Ed transaction né que toda vez que eu fizer uma transação eu tenho que adicionar essa transação aqui dentro dessa minha Order para ficar registrado o que aconteceu
mas agora a gente vai também pra parte de transação e essa parte de transação também ela é complexa e não é porque a transação em si ela se define muito mais como a gente vai Processá-la né então a gente tem a transação e a gente tem o processamento dessa transação Então como que fica a estrutura de uma transação eu vou falar que eu tenho uma string certo e eu vou falar aqui que eu tenho uma selling Order ou seja uma ordem de compra de venda e eu tenho um buying Order que é uma Order de
compra então uma transação ela só acontece assim tem alguém querendo comprar uma Order de compra e eu tenho uma ordem de Venda e aí a gente faz o Mat legal aí eu tenho a quantidade de shares que essa a transação vai trabalhar eu tenho o preço que a gente vai trabalhar ou seja um float 64 aqui no nosso caso a gente tem o total né de Quanto isso vai dar e eu tenho o date time aqui para mim para me ajudar aqui também e agora eu tenho o new transaction ele já completou aqui para mim
mas eu quero agora retornar o cara que eu preciso Então vou falar que eu tenho o id e eu vou falar que o ID vai usar um uuid.new p string E aí a gente vai começar a perceber que o go vai autocompletar e a gente vai precisar baixar essa dependência porque o go não lida com o uuid na sua biblioteca padrão depois eu tenho o selling Order que vai ser igual o selling Order certo e nós temos aqui o bu Order tem o shares o price o total o total inicialmente Opa abri aqui minhas Extensões
sem querer o total por enquanto é zero dessa transação né ela vai ser calculada durante o processamento e a gente tem a data e hora do que aconteceu tá então é basicamente isso que a gente acaba tendo Ah só vou mudar aqui então vou colocar selling Order buying Order aqui para mim para ficar um pouquinho mais expressivo galera vocês vão perceber que cada dia mais eu sou um cara que foco muito em dar nome nas Coisas para não ter dúvida nenhuma ainda mais esses tipos de sistemas que são meio tricky aqui pra gente então aqui
é a forma como eu tenho as minhas ordens você vai ver aqui agora que ele tá usando um pacote do Google para fazer o uuid mas tá vermelhinho por quê Porque eu não baixei esse pacote ainda então se eu rodar aqui ó go mod Tide o que que ele vai fazer ele vai baixar esse pacote lá do github da Google tá vendo ó esse endereço e agora aqui ele já resolveu Minha dependência E se eu olhar aqui o meu go mod Ó você vai ver que eu já tenho né A minha dependência aqui guardada né
então é como se fosse um package P Jon aqui para mim beleza então nesse momento eu tenho a minha transação fora isso o que que acontece a minha transação ela precisa ser processada então eu vou colocar funk Tá T de transaction e eu vou Vou colocar aqui process o grande ponto é que como que eu vou processar uma transação eu preciso Ter um processador de transação e eu eu prefiro separar o processador da transação da transação Porque tem uma diferença muito grande do que você tá fazendo né uma coisa é o registro da transação outra
coisa é como que ela é processada então por isso que eu tô fazendo o seguinte eu vou criar um arquivo aqui chamado de Order processor Order processor aqui PR mimg esse meu Order processor ele vai ter um objetivo bem claro de fazer o Processamento de tudo isso então eu vou fazer o seguinte ten uma entidade e eu tenho então aqui um Type Order Order processor é uma struct E adivinha o que que esse cara tem ele tem uma transaction dentro dele legal e não é uma lista de transaction né é uma transaction só é isso
que ele vai processar e aqui agora ele já tá fazendo o meu método Construtor né Para eu processar e retornar um cara aqui e Agora qual que é o grande ponto aqui como que eu consigo processar uma ordem né eu preciso ter alguns passos eu preciso fazer o cálculo da quantidade de cotas que eu tenho de Sher que eu tenho eu preciso mudar a posição né A de quem tá comprando e de quem tá vendendo porque se o Wesley tinha 100 vendeu ele tem 50 se o Luiz tinha zero e ele comprou Ele ficou com
50 agora tá então eu tenho que mudar a carteira dos dos investidores aí nesse nosso caso e Eu preciso alterar também o processamento meu da minha ordem né Ou seja eu preciso alterar minha ordem mudando a quantidade de share se ela tá pending ou se ela tá fechada ou se ela tá aberto então dá para perceber que esse process aqui pra gente ele é bem então o que que eu vou fazer aqui né Eu já vou ah tentar trabalhar da seguinte forma para ficar um pouquinho melhor eu vou colocar assim shares dois pontos igual op
P calculate shares aqui para Mim primeira coisa que eu quero fazer é calcular a minha quantidade de ações beleza como que eu vou fazer esse cálculo eu vou criar um método aqui chamado de calculate shares aqui para mim vai retornar um inteiro mas na realidade esse cálculo ele vai Ah fazer alguns passos primeiro passo que a gente vai fazer a gente vai verificar a quantidade de cotas de ações que a gente tem disponível que a gente tem nessa Transação lembra quando a gente vai aqui na transação e a gente tem aqui a o total aqui
pra gente basicamente ó a quantidade de shares que a gente acaba tendo no final das contas Então essas shares aqui é a quantidade de cota que essa transação trabalha então primeira coisa que eu vou fazer eu vou pegar essa quantidade Então vou colocar available shares dois pontos iG op. transaction P shares aqui para mim então agora eu sei quantas ações existem tá Avil shares beleza E agora o que que eu preciso fazer eu vou verificar tá a disponibilidade de cotas para quem tá comprando e também depois verificar a disponibilidade de cotas para quem tá vendendo
então eu vou fazer um if aqui ó if op né ou seja Order processor ponto transaction pon buying buying Order dentro da minha transaction eu não tenho buying Order buy Order eu vou colocar aqui é Buy in Order e isso aqui vai afetar vai me afetar em algum lugar Beleza então eu tenho aqui ó se a minha transaction aqui né se e não tenho não tô trabalhando com typescript se a minha transaction buying Order tá buying Order aqui para mim tá ponto pend in shares Ou seja eu quero saber quanto que ela tem de pendente
for menor que available shares o que que eu vou fazer no final das contas eu vou fazer o seguinte que available Shares é igual a quantidade de shares que eu tenho disponível tá então eu tenho 100 ações Agora se a minha quantidade né de ações disponíveis que eu tenho for menor que a minha quantidade de ações pendentes para processar eu vou falar que eu tenho como cotas disponíveis é esse valor né ou seja o valor pendente das minhas ações Basic Eu Tô verificando se o total de ações que eu tenho é igual a quantidade pendente
de ações tá se for diferente eu Vou falar que as minhas ações disponíveis né as minhas cotas disponíveis são os valor o valor pendente e agora eu também vou fazer a mesma coisa eu vou fazer se op. transaction P selling Order antes eu tava fazendo com buying agora eu tô falando com selling Order pending shares for menor mesmo esquema que a gente fez a gente vai fazer a mesma coisa tá então basicamente eu verifico aqui para quem tá comprando e para quem tá vendendo eu Só tô alinhando agora aqui o quanto de ações disponíveis que
eu tenho paraa compra e paraa venda porque lembrando não necessariamente o valor da minha ordem a quantidade de ações que eu tenho na minha Order é o quanto que eu tenho disponível Porque conforme eu vou comprando ou vendendo aquele meu pending shares né a gente tem aquele contador né Eu comprei vendi 100 Ah quer dizer eu queria comprar vender 100 mas alguém comprou só 50 então já que comprou só 50 O que que vai acontecer esse meu Pain in shares É 50 por isso que eu falo nesse momento que a quantidade que eu tenho disponível
aqui paraa compra nesse caso é apenas 50 porque é diferente né eu tenho que verificar esses caras aqui para mim então com isso aqui eu já consigo fazer o cálculo de shares aqui então aqui eu sei quanto que eu vou poder negociar agora que eu sei quanto eu posso negociar eu tenho que mudar né a posição da carteira das pessoas ou Seja quem comprou e quem vendeu tem que mudar as posições então o que que eu vou fazer eu vou criar um método chamado op Order processor e eu vou chamar isso aqui de update positions
que eu vou passar a quantidade de shares e agora eu vou fazer né se eu comprei 50 e se eu vendi 50 eu tenho que atualizar isso aí do lado do comprador e do n eu dizendo isso em relação a quem tá investindo né vou pegar op. Transaction selling Order pon investor que tá vendendo aquela sell Order né e vou adjust position n passando o que aqui no meio da da história aqui que tá a grande sacada eu tenho que passar o que para ele eu tenho que simplesmente falar o seguinte eu V F que
a qud que ele tem agora vai ser o qu op transactions transaction selling Order selling Order P asset pid vírgula menos shares aqui para mim deixa eu colocar aqui para mim para ficar melhor para você conseguir ver ah é é basicamente isso porque que ele tá dando o meu erro ele tá dando erro no meu asset position basicamente o que eu tô fazendo é subtraindo a quantidade de shares que eu tenho aqui para mim não sei porque Que tá dando erro mas a gente já ajusta isso aqui e a mesma coisa vai acontecer para quem
tá comprando tá mas aqui a gente vai adicionar ações deixa eu ver é mais add asset position Ah não é ADD asset position é adjust asset position adjust asset position adjust asset position e adjust asset position então basicamente eu tô dizendo o seguinte quando uma uma eu for processar uma ordem quem comprou n né quem vendeu tá subtraindo da carteira Dele e quem comprou tá adicionando Aquela quantidade de shares na carteira dele é basicamente isso que eu tenho aqui e agora que eu tenho isso aqui Eu também preciso né aqui eu alterei o investidor agora
aqui eu preciso atualizar a minha Order porque agora os valores dela mudou né porque teve uma nova transação dentro dela então vou colocar funk ah op Order processo E eu vou colocar aqui update orders vou passar a quantidade de shares e agora a parada vai ficar bem simples porque a gente criou esse método então eu vou colocar op. transaction pon buying Order pon apply trade e aqui eu passo a quantidade de shares aqui para mim e aqui eu vou fazer a mesma coisa para selling Order então lembra que a gente fez aquele apply trade o
apply trade ele faz Exatamente isso né Ele atualiza né as a nossa Order de pedido muda o pend in shares E se o pend in shares ficou Zero no final das contas ele fecha a nossa a nossa Order basicamente é isso que acaba acontecendo Então dito isso galera agora que a gente tem os nossos métodos principais vamos terminar o nosso processamento Então eu tenho a quantidade de de shares Agora eu preciso update positions Opa update positions primeiro update positions legal onde eu vou passar o Número de shares update orders que eu preciso e agora eu
vou mudar o valor da da minha transação porque eu vou multiplicar o preço né daquela transação pela quantidade de ações que foram negociadas então basicamente eu vou fazer op transaction Total vai ser igual a float 64 de shares eu tenho que converter PR float4 porque a quantidade de shares é inteiro vezes op. transaction Price então basicamente isso Vai fazer com que eu processe uma Order de pagamento então isso aqui consegue gerar aquele meu Panorama principal para eu conseguir trabalhar show de bola feito isso galera a gente criou vamos dizer assim a base do nosso sistema
nós temos o asset a gente tem o investidor até a gente tem as nossas ordens de compra a gente tem as nossas transações e a gente tem o nosso processador né de transações que vai alterar a nossa Order de compra Cada vez que a gente processa Então inclusive quando eu chegar aqui no meu Order lembra que eu tenho um um eu acho que é no order que eu tenho não é no transaction né se eu for no meu transaction aqui eu tenho um process Como que eu consigo processar isso aqui eu posso colocar processor é
igual a dois pontos igual New Order processor onde eu vou passar minha transação e agora eu vou colocar processor pon process aqui para mim é Basicamente isso que eu tô fazendo nesse momento então eu falo a minha ação que eu quero processar e eu mando ele processar essa minha transação é basicamente isso que acontece e Maravilha show bom galera feito isso aqui a gente tem a nossa base agora tá chegou uma parte que vamos dizer assim ela é um pouco mais crítica do sistema e grande grande parte disso é o que faz o nosso sistema
funcionar que é o livro tá que é o book esse book aí basicamente Fica o registro de todas as ordens de compra e venda e é através desse livro que a gente vai conseguir fazer um match de eu quero vender tanto por aquele preço e eu quero comprar tanto por aquele preço e eu vejo né Ah e eu tento casar essa compra e venda essa vamos dizer assim eu digo que em relação ao algoritmo é a parte mais complexa a gente vai fazer isso de forma bem simplificada obviamente Tá mas é essa parte que é
a parte do match no final Das contas né E essas partes dos matchs normalmente elas acabam sendo realmente mais complexas Mas relaxa O importante a gente ter essa experiência de fazer tudo isso juntos maravilha então vamos lá primeiraa coisa que a gente precisa aqui é criar o nosso livro de compra e venda certo então aqui eu tenho a minha estrutura do meu livro de compra e venda e aqui o que que eu preciso nesse meu livro eu preciso ter todas as orders registradas Então vou colocar aqui ó Order aqui para mim o que que eu
preciso também ter no meu livro todas as minhas transações certo Opa Ó o meu Auto complete aqui forçando a barra outra coisa que eu preciso agora e é isso que eu quero que você entenda nesse momento porque isso é uma peculiaridade do gol e é o que faz o gol ser tão rápido assim e que faz também com que o gol evite problemas de concorrência tá porque o que que acontece a gente precisa de um canal de Recebimento das orders que estão chegando e todas as ordens que chegarem eu vou processar e eu preciso ter
um canal para eu retornar todas as minhas ordens processadas tá e o go tem uma parada chamado de Channel tá o Channel é como se fosse uma forma para eu trabalhar com múltiplas trads que são as nossas go rotinas não são trads reais são trads newer para rodar tudo isso de forma paralela tá E concorrente paralela se você tiver multicore no final das Contas Então o que eu tô querendo dizer com isso nesse momento é eu vou ter um local onde eu fico recebendo novas ordens e eu vou ter um outro canal onde eu fico
retornando ordens que estão sendo processadas então eu V chamar isso aqui de incoming orders e eu vou falar que iso é um canal do tipo de Order e eu vou colocar processed orders que vai ser também um canal de Order aqui para mim legal Incoming Order de colocar com i maiúsculo incoming orders e process orders aqui para mim uma outra coisa que o go tem também galera e isso é um ponto importante é o seguinte o o go ele tem algo que nos ajuda a sincronizar essas nossas trads né Essa tudo que tá acontecendo simultaneamente
em processos em background tá e o go ele tem uma parada chamado de weight groups Tá o que que é um weight groups é uma Forma de você conseguir sincronizar tá a essas nossas ordens tá tudo que tá acontecendo como é que funciona a ideia de um weight group eu vou falar rapidamente aqui para para você imagina que eu tenho uma transação um eu tenho uma transação dois uma transação Três beleza Ah e Para eu terminar o meu programa eu preciso que essas quatro transações sejam finalizadas Caso o contrário o meu programa ele não vai
ele não vai Ah poder parar Então como que eu tenho certeza que tudo está terminado como que eu garanto que tudo que aconteceu foi processado então o que que acontece aqui no go eu faço o seguinte eu falo aqui eu falo seguinte para ele olha toda vez que iniciar uma transação eu vou somar um tá toda vez que começar outra transação eu vou somar um eu vou somar mais um aqui vou somar mais um e agora eu tenho quatro transações rodando Beleza então o meu weight group o que que ele faz no final das contas
ele adiciona um ador aqui para saber quantos caras estão sendo processados ao mesmo tempo e daí aqui embaixo esse nosso weight group ele faz o quê um waight então ele vai travar o programa aqui pra gente até a gente ter certeza que todos esses caras terminaram como que eu sei que esse cara Terminou quando ele tem um um Don então quando eu falo que eu tenho um Don dessa transação um esse cara aqui Que era quatro ele vai para TRS do e um quando acabar nesse um esse weight ele ele deixa o programa seguir pra
frente é basicamente isso então enquanto o weight tiver funcionando é porque ainda a gente tem coisas acontecendo como que a gente tem coisas acontecendo a gente vai adicionando né a a quantidade de operações no nosso weight group que no final a gente dá um WG poned então toda vez que começou uma Transação eu dou um AD começou outra transação eu dou um add quando terminou a transação eu dou um Don e aqui ele vai controlando aqui para mim quando tudo tiver done ele deixa a gente ir para uma outra fase do programa e provavelmente essa
fase do programa é o momento que o nosso programa vai acabar mas aqui a gente garante que todas as transações estão sincronizadas tá então é para isso que serve o nosso weight group aqui pra gente uma forma bem Ah Geral falando Aqui para vocês agora a gente precisa criar um novo livro né Aquela nossa aquele nosso método que a gente gosta muito Construtor aquela função muito Construtora né que eu vou chamar de newbook aqui para mim e o meu newbook eu vou colocar o meu incoming orders tá mas além do incoming orders eu vou passar
aqui também o process orders que eu preciso ler esses canais tá eu preciso ter também o meu weight group aqui para mim tá Por que Que eu preciso disso porque toda hora que eu quiser ver se tá vindo uma nova ordem eu vou ficar lendo esse canal aqui toda hora que eu processar uma Order eu vou mandar informação para esse canal aqui e para garantir que tá tudo sincronizado eu preciso do meu group é basicamente isso que acontece Então nesse momento como é que vai funcionar aqui o nosso return né como é que a gente
vai criar o nosso objeto vai trabalhar da seguinte forma aqui eu vou Dar um return book aqui mim book o que que eu vou retornar eu vou pegar orders certo e nesse momento eu não tenho absolutamente nenhuma ordem né então vou colocar Order aqui em branco outra coisa que eu preciso são as minhas transações e nesse momento eu não tenho nenhuma transação certo e aqui eu preciso ter o meu canal de processados e o que está Chegando e o meu weit group aqui para mim return aqui para mim então é basicamente assim que eu crio
o meu novo livro então começa dessa forma Então eu tenho um canal para receber novas orders Eu tenho um canal para eu falar que eu terminei de processar uma Order né e eu tenho um local para eu sincronizar como que eu vou receber esses dados do incoming Order não interessa nesse momento a gente vai utilizar o ap Cica não hoje e O que que isso significa que a gente vai ficar lendo o os dados no cafca quando a gente pega um dado do cafca a gente pega essa informação desse pedido e joga nesse canal chamado
incoming orders é basicamente isso que vai acontecer quando a gente processar essa ordem a gente vai pegar num outra parte do programa Essa ordem processada e vai jogar o resultado dela num ap CFC é basicamente isso que vai acontecer Tá e agora né para que a gente consiga fazer Esse nosso livro funcionar a gente precisa entender alguns conceitos básicos tá e um conceito básico é que a gente precisa ter uma fila tá eu não tô falando fila de cfca ou qualquer coisa mas uma fila lógica para que a gente possa enfilar a chegada de cada
ordem que a gente vai recebendo e essa fila ela usa aquele famoso pifo né first in first out Então chegou uma nova transação é esse cara que eu vou mandar para processar e Eu vou tirar ele da fila então a gente precisa ter uma fila de transações que a gente vai trabalhar tá e obviamente essa fila a gente poderia fazer ela de forma extremamente complexa e etc a gente vai trabalhar de uma forma bem simples então para isso o que que eu vou fazer eu vou criar um novo tipo aqui chamado de Order queue e
esse Order queue eu vou falar que no final das contas ele é um Slice de orders Ou seja eu tenho várias orders aqui dentro beleza E agora o que que eu Vou fazer eu vou criar simplesmente alguns métodos simples primeiro método que eu vou criar da minha Order que vai ser aqui ó Order que e eu vou dar um add onde eu vou passar aqui uma nova Order para ele beleza basicamente é isso que eu quero aqui não vou botar para remover desse jeito Beleza então é assim que eu vou adicionar uma nova ordem eu
vou dar um append aqui para mim agora eu priso fazer o quê eu Preciso toda vez que chegar uma nova ordem eu vou adicionar mas na hora que eu for processar né O que que eu vou fazer eu preciso pegar uma próxima ordem como que eu pego uma próxima ordem olho a minha fila pego a próxima ordem que eu vou processar e Retiro essa próxima ordem da fila para garantir que ela não vai ser processada duas vezes então basicamente a ordem chegou na fila eu mando ela para processamento e eu tiro ela da fila então
é basicamente isso Então para isso eu vou chamar ela de get punk Vou colocar aqui Order que eu vou chamar ela de get next Order aqui para mim tá E esse get next Order o que que vai acontecer primeiramente eu vou verificar se existe ordem na minha fila porque se não tiver nada na minha fila eu vou retornar isso em branco aqui para mim para dizer que a minha fila tá vazia então vou fazer if l n da da minha fila For igual a zer eu já vou retornar em branco return New Beleza agora se
não for o que que eu vou fazer eu vou primeiro remover eu vou pegar a primeira ordem da minha fila então vou fazer Order dois pontos igual e eu vou colocar aqui ó Order e vou pegar a minha ordem na minha primeira pum peguei essa minha ordem aqui agora agora que eu tenho essa ordem na minha mão eu vou remover essa minha ordem da Fila Então vou colocar a minha Order removendo ela da minha fila aqui como que eu removo ela da fila dessa forma aqui o que que significa isso que eu vou pular a
primeira posição que é a minha posição zero e eu vou pegar tudo que venha depois da minha posição zero basicamente assim que o go faz ou seja Ah imagina que eu tenho 10 registros eu vou pular esse primeiro aqui e tudo que tiver depois dele eu vou trabalhar com ele então eu tô tirando simplesmente o Cara da fila e agora o que eu vou fazer eu vou retornar a minha Order aqui então aqui é uma forma de como que eu consigo trabalhar aqui para eu trabalhar com o meu get next Order toda vez chegou uma
Order eu vou verificar se a fila tá vazia se não tiver vazia eu pego essa minha Order retorno ela e tiro ela da fila para não ter chance alguma dela ser processada em conjunto agora a gente vai pra parte de inteligência do nosso algoritmo tá por a Gente vai começar agora a criar o esqueleto de como que a gente vai fazer o trade mesmo ou seja como que a gente vai fazer as negociações dos nossos livros então o que que a gente vai fazer aqui no final das contas vai ser o seguinte eu vou criar
um método chamado tá baseado no nosso book eu vou chamar ele de trade aqui para mim esse cara é o pai de todos ou seja ele é o que gerencia todo o nosso livro pra gente realizar As Nossas ações de compra e venda então primeira coisa que eu preciso fazer é inicializar tá a o nosso livro baseado no quê num tipo de fila onde a gente vai poder e comprar algo baseado em um asset ou seja baseado numa ação ou seja eu vou ter um livro focado né com um mapa da Petrobras eu vou ter
o livro da o livro não O livro é o mesmo mas eu tenho Petrobras eu tenho vários assets Então o que eu vou ter que fazer no final das Contas é inicializar esse cara basicamente é isso que vai acontecer então eu tenho uma string e eu tenho a ordem a a Order naquela minha fila que eu preciso trabalhar então vai ser basicamente o seguinte Eu sempre tenho duas o meu livro ele é sempre partido em duas partes a parte de compra e a parte de venda legal então eu vou fazer o seguinte ó buy orders
ou seja aqui vão ter todas as ordens que a gente vai utilizar né as ordens de compra então Para isso eu vou inicializar esse cara aqui da seguinte forma eu vou falar que é um map de string onde a chave é uma string e a outra parte o que que é é uma Order aqui para mim ou seja aqui eu vou ter uma lista de ordens tá de compra onde esse cara aqui né eu posso comprar baseado no asset que eu tenho e aqui eu vou ter a mesma coisa sell orders aqui para mim ele
já começou a airar aqui para mim eu não quero nesse momento tá Então é isso que eu quero agora então eu tenho aqui duas filas na minha mão uma fila onde eu vou receber todas as ordens de compra e uma fila com todas as ordens de venda E agora o que que a gente vai fazer eu vou pegar todas as ordens que estão chegando através Desse Canal Como que eu faço isso eu vou fazer da seguinte forma vou dar um for Order dois pontos igual Range certo nesse range eu vou colocar Aqui ó b. incoming
orders e agora aqui ó todas as ordens que estão chegando vão cair aqui para mim então a primeira coisa que eu preciso saber é de qual asset que ele tá falando qual o tipo de ação é Petrobras é vale tá então eu vou colocar aqui ó asset dois p igual Order P asset pid Então agora eu sei de qual tipo de ação que eu tô falando agora eu vou inicializar a minha fila caso esse asset não exista ainda nessa minha fila Lembra que aqui é o nome do meu asset né aqui é o asset e
aqui é a fila desse asset eu tenho uma a fila basicamente né nesse caso nessa nesse mapeamento por asset Então nesse caso o que que eu tô fazendo eu vou fazer o seguinte se o buy orders certo asset né by Order asset o asset Ou seja é o meu ID do meu asset né se o buy orders da Petrobras estiver em Branco o que que eu preciso fazer nesse caso eu preciso criar uma fila para ele então eu vou colocar byy orders asset aqui é igual a Order queue aqui para mim e a mesma coisa
acontece com o Cell orders Então se pela primeira vez a gente nunca teve Petrobras ele vai iniciar uma fila em branco da Petrobras aqui pra gente pra gente trabalhar com esse cara então Perceba como essa fila é importante porque a gente a gente não tem que dar Um match apenas na ordem de compra e venda é na ordem de compra e venda baseado naquela ação Então eu preciso de uma fila por ação e é isso que tá acontecendo aqui tá Agora que a gente tem isso eu vou fazer o seguinte eu vou fazer um if
aqui né se a minha Order ponto Order Type for igual a buy ou seja se for uma Order baseada em Compra o que que eu vou fazer eu vou tentar fazer um match tá então eu vou colocar assim ó B pon A Try match da incis méthodo onde eu Tenho a minha Order aí eu tenho a minha fila aqui né de sell orders baseado no meu asset e eu tenho aqui o meu byy orders baseado também no meu asset aqui para mim basicamente isso que eu tô fazendo então eu vou tentar fazer um match desse
cara aqui para mim eu vou pegar a Order que eu tenho que tá chegando né que eu que que que eu tô recebendo e eu vou pegar a fila onde eu tenho todas as orders que existem Baseados no tipo né ou seja na ação que eu quero trabalhar e eu vou botar isso tanto para quem tá comprando ou para quem tá vendendo então se for pra gente comprar e vender vai ser dessa forma e o ELS aqui vai ser exatamente a mesma mesma coisa mas vai mudar a ordem aqui é para quem quer comprar então
eu vou colocar Quanto que o cara quer vender para quem vai comprar e aqui obviamente é para quem vai vender então eu vou colocar o comprador e aqui as opções de Ofertas que eu tenho para eu fazer essa compra então é basicamente isso que tá acontecendo aqui ah feito isso galera basicamente é assim que a gente faz o nosso trade agora A grande questão aqui é como a gente vai fazer o match né porque a gente tem filas e a gente tem que sair fazendo o match dessas dessas orders que acab acontecendo aqui pra gente
então primeira eu criar agora esse noss método aqui de trch então V colocar aqui funk B Do nosso book e El colou aqui Deixa eu escolher assinatura eu vou chamar de New Order onde ele vai ter a Order que ele vai receber ele vai ter available orders que que são as ordens disponíveis né que a gente vai ter ou seja a fila das ordens que estão disponíveis pra gente fazer o o match tá então eu vou colocar assim e eu tenho também o Pending orders que é a fila das ações que eu tenho para eu
trabalhar ou seja as pending orders basicamente é uma fila onde eu tenho as orders que não deram Mat completamente ainda e Estão guardadas basicamente é isso que tá acontecendo Beleza então eu tenho as as ordens que eu tenho disponíveis para eu fazer o match e eu tenho as minhas orders pendentes Ainda que elas não completaram completamente elas não completaram completamente ficou bonito né galera agora que a gente faz isso o que que eu vou fazer primeira coisa que eu quero fazer é pegar a próxima Order que eu tenho disponível Beleza então eu tenho Qual é
a próxima Order disponível que eu tenho nesse momento na minha fila Como que eu faço isso eu dou um potential vamos chamar de poten potential match ótimo dois pontos Igual get next Order lembra que a gente criou aqui ó a nossa fila a gente agora tá pegando o primeiro da fila removendo da fila e pegando ela aqui agora ela não cai ela saiu daquela fila a gente tá tralhando com ela nesse momento agora aqui e aqui eu vericar o seguinte se eu não tenho nenhuma potential Order certo deixa eu colocar aqui esa um pouquinho se
eu não tenho nenhuma potential Order nesse momento se o meu potential match aqui nesse momento ele Como que eu posso dizer tiver em branco no final das contas O que que significa que eu acabou o jogo aqui para mim tá é basicamente isso que eu tô querendo colocar então if potential match for igual a new eu tô acabando com o play aqui para mim basicamente isso que eu tô fazendo agora que eu tenho isso aqui feito eu vou pro meu próximo passo aqui que vai ser o seguinte ele tá falando Break not em for Switch
não tem problema depois a gente vai ajudar aqui porque Isso aqui tem que ser um Loop Infinito concordam comigo tem que ser um Loop Infinito senão não dava para dar Break mesmo tá isso aqui vai ficar rodando para sempre tanto na buy quanto no Compra né no buy e no sell Isso aqui vai ficar rodando para sempre sempre esperando chegar novas ordens de compra aqui para mim então agora o que tem que fazer é toda vez que alguém vai fazer uma compra ou uma venda ele coloca o preço que ele quer vender e o preço
Que ele quer comprar e a gente tem que ver naquele momento se os preços batem na hora que a gente quer fazer o match e a ideia é sempre a gente pegar o preço mais barato na oferta então por exemplo eu tô querendo vender 100 shares de Petrobras a r$ 1 e tem uma pessoa me oferecendo 12 outro oferecendo 11 eu sempre vou Tent pegar o que tem mais ali disponível para mim para eu fazer o meu sempre o meu melhor negócio então ele sempre vai pegar esse Tipo de coisa então o que eu vou
fazer aqui é eu vou verificar se os preços das ordens são compatíveis a nesse nosso Price match que a gente vai fazer então para eu fazer isso eu vou fazer algo desse tipo tá eu vou falar assim ó se eu não tiver um preço compatível ou seja prices match da minha New Order que tá chegando com o meu potential match o que que vai acontecer aqui nesse Momento deixa eu o que que vai acontecer aqui nesse momento tá isso aqui é um método que a gente vai ter que criar né prices match ou seja eu
vou verificar se a gente tem alguma compatibilidade tá se a gente não tiver eu vou fazer o seguinte ó available orders PED e vou colocar aqui ó potential match aqui pra gente então se os preços não tão aqui trabalhando eu vou verificar aqui tá então basicamente isso que eu vou fazer e o por que que eu tô dando esse Available orders pad porque eu estou adicionando esse cara na fila de novo por quê Porque se o preço não tá batendo eu não tenho negociação correto e se eu não tenho negociação o que que eu preciso
fazer jogar ele na fila de novo aqui para mim ó porque senão esse cara nunca vai mais ser negociado lembra que a gente tirou ele da fila a gente tirou e começou a fazer a verificação aqui Essa ordem tá batendo esse preço tá então beleza agora não tá então Maravilha eu vou botar ela na fila de novo porque daí ela vai voltar pra fila e numa próxima oportun ade a gente vai ficar tentando fazer o match dela de novo até a gente conseguir então colocamos vou dar um break agora aqui acabou o play aqui pra
gente também tá esse pric match a gente cria já já essa função esse algoritmo Tá e agora o que que eu vou fazer partindo do princípio né então que os os preços estão batendo porque se não tiver ele Vai parar aqui mesmo o que que eu vou fazer eu vou fazer uma verificação if potential mat tá ponto pend in shares for maior que zero porque não adianta apenas eu tenho um Mat potencial eu tenho que verificar naquele momento né se eu tenho ainda as shares disponíveis para eu fazer essa transação Então nesse momento caso eu
tenha eu vou dar o match aqui então vou chamar de matched transaction dois pontos igual b Ponto create transaction onde eu vou passar aqui um New Order aqui para mim com o meu potential match aqui e obviamente a gente vai precisar trabalhar em cima desse Create transaction mas isso aqui vai ser fácil porque você vai ver como que a gente vai trabalhar uma vez que a gente fez isso esse Create transaction o que que eu preciso fazer já que eu tenho uma transaction eu vou dar um process transaction aqui para mim com a Minha transação
que eu dei um match aqui para mim e agora lembrando galera tudo que tá aqui são métodos que a gente vai ter que implementar mas a ideia tá o esqueleto do software na nossa cabeça né Eu preciso fazer um match do Price e eu preciso criar a minha transação beleza e agora eu preciso processar essa minha transação uma vez que eu consegui né fazer isso aqui né esse meu pend in shar eu consegui fazer o processamento eu vou verificar agora também tá se ainda tem Alguma pend in share então vou fazer o seguinte ó if
potential match tá ponto pend in shares for maior que zero o que que eu vou fazer ainda eu vou colocar available orders poned potential match aqui para mim por que que eu tô dizendo isso imagina que eu fiz a minha transação tava vendendo 100 eu comprei 50 sobraram 50 novamente Ainda para eu transacionar então o que que eu vou fazer vou voltar novamente Essa minha ordem para a minha fila basicamente é isso que eu vou fazer por quê Porque senão eu nunca vou terminar essa transação então ah se o preço não bate volta pra fila
se comprou a ordem mas não não comprou toda né Se ela não se não utilizou todas as shares ou seja todas as pend in shares eu transacion o que eu preciso mas eu volto ela na fila novamente porque se eu não voltar na fila vai ficar sobrando shares e essa transação Nunca vai terminar tá Então essa é uma coisa e uma outra verificação aqui é né somente para garantir se a nossa New Order P pending shares for igual a zero a gente dá um Break também aqui também tá então é basicamente isso porque se eu
tenho a nossa Order e nesse momento a gente viu que a gente não tem nenhuma Share nível o que que a gente vai fazer a gente dá um Break E aí o programa volta de novo lá no nosso loop legal Ah agora um ponto importante aqui pra gente é que após isso né a gente tem uma seguinte situação caso a gente não tenha caído nem a pau nesse if vamos dizer assim né ou seja a gente caiu em toda situação a gente nem conseguiu trabalhar aqui dentro desse for ou seja depois que a gente tentou
de tudo caso a gente não tenha o sucesso que a gente gostaria O que que a gente pode fazer no final das Contas eu posso fazer o quê se a nossa minha nova Order ponto pending shares é maior que zero o que que eu vou fazer para ter uma garantia um pouquinho maior eu vou falar que a minha pending orders poned volta pra minha fila aqui novamente tá então é basicamente isso que eu tô fazendo Tá então não deu jogo a gente volta pra fila essa minha nova Order aqui depois que eu tentei fazer o
match não deu match de forma Nenhuma volta fra fila essa minha ordem Lembrando que a gente tem ordem de compra a gente tem ordem de venda aqui pra gente beleza então isso aí é um ponto importante aqui pra gente mas nós temos aqui alguns rabos né a gente tem que fazer o PR o price match a gente tem que criar a transação e a gente tem que processar a nossa transação então primeiro coisa que a gente tem que pensar aqui é como que eu faço para verificar se o se o preço tá dando um Match
na realidade galera é bem simples né se você pensar bem prestar bem atenção é só verificar né se se eu tiver comprando se o preço for menor igual a ele na realidade eu vou Vai dar bom certo e se eu tiver vendendo é o oposto basicamente é um true ou false no final das contas para ver se o preço dá um match ou não então basicamente eu vou fazer o seguinte ó B eu vou colocar aqui book eu vou chamar de prices match onde eu vou colocar a minha Order e o meu Match Order Ou
seja eu tenho a minha Order e eu tenho ou seja uma ordem que pode ser de compra e eu tenho a Order que pode ser de venda ou venda ou compra tanto faz tá mas eu tenho uma ordem principal e a outra ordem que eu tô querendo dar um match dela tá então ambas aqui são orders aqui pra gente e aqui eu tenho um bullan no final das contas o que eu tô querendo dizer aqui é o seguinte se a minha Order ponto Order Type tá for igual a buy que que eu tô querendo fazer
a minha verificação vai ser a seguinte eu vou retornar true ou false basicamente no se o meu Order se o match Order pon price for menor ou igual ao meu Order pon Price o que que eu tô querendo dizer é o seguinte né se essa minha ordem é uma ordem de compra né significa que o preço dessa minha ordem de compra tá tem que ser menor ou igual o preço de alguém que tá Querendo vender e o oposto é a mesma coisa aqui né se né O meu a minha Order minha match de Order o
preço dela for maior igual que o preço da Order Eu também retorno aqui para mim então isso aqui é no caso de compra e aqui é no caso de venda no final das contas tá então se eu tô comprando eu tenho que garantir que o meu preço bata E se eu tô aqui vendendo mesma coisa né eu tenho que garantir que o meu preço seja maior e igual então é Basicamente isso como é que eu acabo fazendo então para quem tá comprando uma ordem o preço da Ordem ele tem que ser menor ou igual de
quem tá comprando e para quem tá vendendo o preço da ordem ele tem que ser maior ou igual de quem tá vendendo é basicamente isso então se isso aqui der true ou nessa situação ou Nessa situação a gente tem finalmente o nosso prices match e agora a gente tem a parada do Create transaction né a gente precisa realmente criar a nossa Transação pra gente conseguir trabalhar como que a gente vai fazer isso galera Ah vai ser da seguinte forma ele até meio que preparou aqui para mim mas eu não sei como é que vai funcionar
o Create transaction eu vou fazer da seguinte forma tá ele vai criar uma nova transação baseada nas duas ordens aqui para mim então eu preciso a ordem que tá chegando incoming Order e a match Order aqui Mim e El no Fin contas vai uma Action né que no final das contas é o que a gente criou aqui pra gente como que nós vamos fazer aqui Então primeiramente eu vou criar aqui uma variável chamado by Order e uma outra variável chamado sell Order que ambas são aqui do tipo Order aqui para mim e agora eu vou
fazer o seguinte se a ordem que eu tô recebendo agora é uma ordem de compra tá então ela vai ser uma ordem do tipo compra correto comigo então vai ser o seguinte eu vou Fazer assim ó if incoming Order ponto Order Type for igual a buy o que que eu quero fazer eu vou falar que eu tenho bu Order vírgula sell Order é igual a incom Order vírgula matched Order aqui para tá então se a minha ordem é de compra significa que essa minha variável de income Order é a minha bu Order e se e
obviamente né a Mat a ordem que eu tô querendo fazer o match essa minha sell Order basicamente é isso que eu tô fazendo agora caso ao contrário a gente tem a mesma situação correto se for uma ordem de venda a minha buy Order vai ser a minha match Order que é a que eu t tentando casar e a minha Cell Order é a ordem que tá chegando aqui para mim basicamente é isso que tá acontecendo E agora o que que eu vou fazer nessa minha transação eu vou verificar tá se eu tenho shares o Suficiente
para realizar aquela transação porque tudo isso que a gente tá fazendo esses cálculos no final das contas eu quero garantir sempre que essa transação ela possa ser criada e que eu tenha a quantidade de cotas o suficiente para fazer ela acontecer então é uma dupla verificação vamos dizer assim então vou falar que shar dois pontos igual que é incoming Order ponto pend shares beleza e agora eu vou fazer if match Order P pend in shares for menor que shares o que que eu vou falar eu vou falar que as minhas shares vou falar com as
minhas shares opa ele já tentou fazer um negócio aqui para m ele vai ele eu vou falar que as minhas shares no final das contas é igual a minha paining shares beleza se for o total beleza se não for o total o que que vai acontecer vai ah manter as shares que foram possíveis fazer a nossa compra o que a gente tem que garantir né Que a quantidade de shares que eu tenha né ah seja o suficiente para minha transação conseguir rodar basicamente é isso tá então eh a gente garante que é um mínimo de
ordens pendentes tem que est a disponíveis para tanto a minha ordem de compra e paraa minha ordem de venda o que eu tô dizendo nesse caso aqui é Wesley tá querendo vender uma ação a 100 quer vender 10 cotas luí quer comprar cinco Wesley tem 10 cotas para vender o Luiz tem cinco cotas para Comprar é basicamente isso que eu tô fazendo aqui nesse momento eu quero garantir que todo mundo tenha o que tá prometendo que tem na aquele momento é basicamente isso e agora eu vou retornar uma nova transação Tá então vamos lá return
New transaction onde eu tenho o meu sell Order eu tenho meu buy Order eu tenho as shares a quantidade de shares e eu tenho o preço né matched Order P Price aqui para Mim beleza e agora a tem que ter alguma outra paradinha aqui que vai nos ajudar bastante que vai ser o seguinte lembra que a gente precisa ter o nosso process transaction porque aqui eu criei a transação fiz as verificações para ver se essa transação poderia ter sido criada agora uma vez que essa transação ela foi criada eu tenho que processá-la como que eu
vou processar eu vou fazer o seguinte a funk B deixa ele preencher aqui para Mim process transaction aqui para mim como que eu vou processar essa minha transação primeira coisa que eu tenho que fazer é lembra que eu falei para vocês do weight groups cada vez que inicia o processamento de uma transação eu tenho que falar que ela tá pronta quando termina então o go ele tem uma parada chamada ele tem uma parada chamado de defer o defer significa o seguinte depois que toda essa função rodar executa essa função aqui esse Statement assim a gente
não esquece eu poderia não colocar isso Executar tudo e colocar isso aqui por último ia dar na mesma mas esse cara aqui ele espera tudo ser executado dentro dessa função tá para daí ele rodar E agora o que que eu vou fazer nesse momento eu vou rodar um transaction pon process que a gente criou agora lá atrás mas fora isso o que que eu preciso fazer lembra que eu tenho o nosso canal de comunicação onde eu tenho as minhas Ordens processadas Então eu preciso falar agora que essas minhas ordens foram processadas Ou seja eu preciso
jogar de volta essas ordens processadas no meu canal Como que eu faço vou colocar b ponto b pon processed orders recebendo a minha transaction buy in Order e a mesma coisa acontece aqui ó b. process Orders recebendo a minha transação de quem do meu selling Order aqui embaixo então basicamente o que eu tô dizendo nesse momento é o seguinte estou processando a transação deu certo a minha transação né a gente criou o process transaction e agora que tá tudo feito certinho eu tô trazendo o resultado para você dessas trans AES que foram realizadas uma vez
que a gente tem isso a gente pode ler esse canal em algum outro lugar do nosso programa Pegar essa informação e mandar pro apach CFC pro programa do Luiz saber que aconteceu né a aconteceu uma transação e daí ele vai pegar sei lá vai usar websockets e vai mostrar lá que é uma ordem ela foi concluída beleza mas tem uma coisa também que é importante tá que é o seguinte pra gente Além disso aqui né ser importante da gente pegar tudo isso eu preciso registrar no nosso Livro que a gente tem o nosso book aqui
né que essa transação ocorreu porque a gente usou o livro para fazer a transação deu tudo certo mas eu tenho que registrar isso no meu livro tá então o que que eu vou fazer eu vou criar um método aqui chamado de Record transaction Então vou colocar book eu vou colocar aqui ó Record transaction onde eu vou pegar a minha transação e na hora que eu pegar essa minha transação eu vou fazer o seguinte eu vou adicionar Essa minha transação aqui no meu livro Mas além disso essa minha transação ela tem que ficar registrado na minha
Order lembra que aqui na nossa order a gente tem a lista de transações eu tenho que adicionar essa transação nessas minhas ordens tanto na ordem de compra e de venda para ficar registrado que essa ordem teve uma transação então o que que eu vou fazer eu vou fazer o seguinte ó transaction P buying Order ponto Transactions e eu vou dar o append aqui para mim e eu vou fazer a mesma coisa com o selling então Além de eu registrar essa transação no meu livro eu estou registrando na ordem de compra e na ordem de venda
que essa transação ocorreu se eu não fizer isso eu perco o registro das transações que aconteceram e obviamente Galera vocês estão percebendo que eu não estou usando banco de dados tá a gente tá trabalhando com tudo isso em memória e a gente vai fazer Isso principalmente porque é uma simulação e é tudo mais que a gente tá trabalhando ah Seria algo extremamente muito mais complexo obviamente botar camada de banco de dados em cima de tudo isso a gente não conseguiria fazer isso no pouco tempo que a gente tem numa imersão Tá mas é importante é
você você entender a as regras de negócio porque depois disso eu poderia até persistir esses dados em algum outro local Tá mas é importante vocês entenderem que esse Momento aqui ele realmente é importante aqui pra gente maravilha então uma vez que eu consegui dar um Record transaction o que que eu vou fazer aqui eu vou usar esse método b. Record transaction e eu vou passar a minha transaction aqui dentro beleza e agora basicamente pessoal a gente tem o nosso programa pronto tá e o que que eu quero dizer com o nosso programa pronto o Core
da nossa aplicação agora está Funcionando beleza a gente tem alguns desafios ainda pela frente Quais são esses desafios a gente botar isso para rodar ler os do AP cfca gravar os dados né e pegar as ordens processadas e jogar de volta no ap CFC é basicamente isso que a gente vai precisar fazer e a gente vai continuar isso no nosso próximo vídeo tá então espero que você tenha gostado tenho que admitir para você que a maior complexidade de tudo isso na minha opinião não tá na linguagem se Você perceber o go na realidade ele ajuda
muito aqui com esses canais e tudo que a gente tá trabalhando mas a maior complexidade é Inclusive a lógica de tudo isso né porque um software desse de fazer match etc transações não é algo trivial não é algo Simples então espero que você tenha curtido essa experiência outra coisa também que é importante eu dizer que eu não espero que você tenha entendido 100% de tudo que a gente tá colocando aqui inclusive as lógicas e Tudo mais você vai ter acesso a todo esse repositório depois ah dá para você conseguir entender um pouco melhor a qual
foi toda a linha de raciocínio olhando com calma e tudo mais mas eu acho que o ponto importante aqui é você entender a ideia daquilo que a gente tá criando a gente tem um livro com ordens de compra e venda a gente vê se a gente consegue fazer um Mat se a gente faz a gente cria uma transação a gente processa essa transação e essa transação Né quando acontece Essa ordem a gente termina Essa ordem mandando de volta a para algum outro sistema e nesse caso a gente vai mandar de volta pro apach cfca e
a gente vai ler esses pedidos dessas ordens também através do apach cfca Maravilha galera Então até o nosso próximo vídeo Porque no próximo vídeo a gente vai falar bastante aí de apach cica e a gente vai fazer essa implementação e também vai ter o integrar tudo junto né então isso aí vai Ser bem importante que a gente vai colocar todo o backend o frontend Ah e tudo mais pra gente conseguir colocar para funcionar fechou um grande ab abraço e é isso aí [Música]