//+------------------------------------------------------------------+ //| S1_Ignicao1_v4_1.mq5 | //| PRODUCAO | //| OXFORD | //| HEDGING HORN CAPITAL | //| https://www.hhcapital.com.br | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, HEDGING HORN CAPITAL" #property link "https://www.hhcapital.com.br" #property version "PROD_v4_1" #property description "HFT MARKET MAKING BASED ON OXFORD'S STUDIES. MINI INDICE." //+===================================================================================================================================================================================+ //| 0 - SESSAO DE CABECALHO / ADMISSAO //+===================================================================================================================================================================================+ //+------------------------------------------------------------------+ //| 0.1 - IMPORTACOES | //+------------------------------------------------------------------+ #include #include #include #include "MarketBook.mqh" #include "S0_Admissao1_v4_1.mqh" #include "S2_Motor1_v4_1.mqh" #include "S3_Freios1_v4_1.mqh" #include "S4_Cambio4x4_v4_1.mqh" #include "S5_Direcao1_v4_1.mqh" #include "S6_Transmissao1_v4_1.mqh" //// //+------------------------------------------------------------------+ //| 0.2 - ENTRADAS DE USUARIO | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| 0.2.1 - INPUTS DE GERENCIAMENTO DE INVENTARIO | //+------------------------------------------------------------------+ input group "Gerenciamento de Inventário---------------|---------------------------------------------------------------" input int niveis = 4; //η: Quantidade de níveis máximos η {1}[1, +inf[ input int rajada = 1; //r: Quantidade por ordem r {1}[1, +inf[ //+------------------------------------------------------------------+ //| 0.2.2 - INPUTS DE GERENCIAMENTO DE ESTRATEGIA | //+------------------------------------------------------------------+ input group "Gerenciamento de Estratégia---------------|---------------------------------------------------------------" input double fi = 0.0002; //φ: Running Penalty (injeção eletrônica) input double passoFi = 10; //passo φ input double custoOperacao = 1.20; //ζ : Custo por operacao ζ {0.88} [0.0, 2.0[ input int profundidadeBook = 5; //β: Profundidade do book a calcular o k {5}[1, +inf[ input double desvioDiario = 8; //σ: Desvios padroes limite para o preco do ativo no dia input int lifetimeOrdem = 120; //τO: Tempo em seg da duracao de uma ordem pendente input int lifetimePosicao = 500; //τP: Tempo em seg da duracao de uma posicao pendente input int intervaloTicks = 1000; //Ticks: Intervalo de ticks do ArrayTick //+------------------------------------------------------------------+ //| 0.2.3 - INPUTS DE GERENCIAMENTO DE RISCOS | //+------------------------------------------------------------------+ input group "Gerenciamento de Riscos-------------------|---------------------------------------------------------------" input double alvoPercentual = 0.10; //XAlvo%: em formato 0.05 = 5% {0.10} [0, inf+[ input double stopPercentual = 0.10; //XStop%: em formato 0.05 = 5% {0.10} [0, 1] input double saldoInicial = 4500; //X0: Saldo inicial do dia input double alvoFinanceiro = 500.0; //χsup: 3º Order Risk M.: Alvo financeiro no dia sup(Χ) input double stopFinanceiro = -500.0; //χinf: 3º Order Risk M.: Stop financeiro no dia inf(Χ) //+------------------------------------------------------------------+ //| 0.2.4 - INPUTS DE GERENCIAMENTO DE TEMPO | //+------------------------------------------------------------------+ input group "Gerenciamento de Tempo--------------------|---------------------------------------------------------------" input ushort horarioShort_inicial = 545; //t0: Horário inicial 09:05 -> Τ0 em minutos {600}[600, 985] input ushort horarioShort_final = 980; //tf: Horário final 16:20 -> ΤF em minutos {700}[600, 985] input ushort horarioShort_fechamento = 985; //Tf: Horário limite de after 16:25 ->ΤP em minutos{705}[600,990] //+------------------------------------------------------------------+ //| 0.2.5 - INPUTS DE GERENCIAMENTO DE OPERACOES | //+------------------------------------------------------------------+ input group "Gerenciamento de Operações----------------|---------------------------------------------------------------" input bool chaveEscalonador = true; //Chave on/off do escalonador de saldo, alvo, stop do dia {true} input bool chaveLambda = true; //Chave on/off do lambda {true} input bool chaveBook = true; //Chave on/off do book {true} input bool chaveRiscoSaldo = true; //Chave on/off do risco saldo {true} input bool chaveRiscoTend = false; //Chave on/off do risco de tendencia {true} input bool chaveFiAutomatico = true; //Chave on/off do fi Automatico {false} input bool chaveDeinitOrdens = false; //Chave on/off do cancelamento de ordens no Deinit {false} input bool chaveDeinitPosicoes = false; //Chave on/off do fechamento de posicoes no Deinit {false} //+------------------------------------------------------------------+ //| 1.3 - VARIAVEIS GLOBAIS | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| 1.3.1 - OBJETOS OPERACIONAIS | //+------------------------------------------------------------------+ operacao Operacao; fluido Fluidos; slot SlotsC[]; slot SlotsV[]; MqlTick ArrayTick[]; MqlBookInfo ArrayBook[]; CMarketBook Book(_Symbol); //+===================================================================================================================================================================================+ //| 1 - SESSAO DE DAR A PARTIDA E CONTROLA EVENTOS / IGNICAO //+===================================================================================================================================================================================+ //+------------------------------------------------------------------+ //| 1.1 - FUNCAO DE INICIALIZACAO | //+------------------------------------------------------------------+ int OnInit() { Print("PRODUCAO V1_alterado"); //Inicializao basica Fluidos.q = 0; Fluidos.t = 0; Fluidos.T = lifetimeOrdem; Fluidos.t0d = horarioShort_inicial; Fluidos.td = 0; Fluidos.Td = horarioShort_final; Fluidos.nBook = profundidadeBook; Fluidos.iBid0 = -1; Fluidos.iAsk0 = -1; Fluidos.iSlot = 0; Fluidos.niveis = niveis; Fluidos.rajada = rajada; Fluidos.lifetimeOrdem = lifetimeOrdem; Fluidos.lifetimePosicao = lifetimePosicao; Fluidos.handlerMA = -1; Fluidos.handlerSTDDEV = -1; Fluidos.periodoMA = 100; Fluidos.periodoSTDDEV = 100; Fluidos.intervaloTicks = intervaloTicks; Fluidos.limiteInfDesvio = 0; Fluidos.limiteSupDesvio = 500; Fluidos.media = -1; Fluidos.midPrice = -1; Fluidos.sigmaHFT = -1; Fluidos.sigmaLFT = -1; Fluidos.assimetria = 0.0; Fluidos.curtose = 0.0; Fluidos.driftLFTTend = 0.0; Fluidos.driftLFTVol = 0.0; Fluidos.driftHFTVol = 0.0; Fluidos.driftHFTTend = 0.0; Fluidos.spreadLFTC = 0.0; Fluidos.spreadLFTV = 0.0; Fluidos.spreadHFTC = 0.0; Fluidos.spreadHFTV = 0.0; Fluidos.KC = 100; Fluidos.KV = 100; Fluidos.lambdaC = 10; Fluidos.lambdaV = 10; Fluidos.lobC = 0.0; Fluidos.lobV = 0.0; Fluidos.fi = fi; Fluidos.fiInicial = fi; Fluidos.passoFi = passoFi; Fluidos.alpha = custoOperacao/1000; Fluidos.desvioDiario = desvioDiario; Fluidos.precoMedioC = 0.0; Fluidos.precoMedioV = 0.0; Fluidos.tickMin = 5; Fluidos.precoAbertura = -1; Fluidos.desvioDiario = desvioDiario; Fluidos.limiteInfTend = -1; Fluidos.limiteSupTend = -1; Fluidos.limiteInfDesvio = -1; Fluidos.limiteSupDesvio = -1; if(chaveEscalonador == true) Fluidos.rajada = floor(AccountInfoDouble(ACCOUNT_BALANCE)/10000) + 1; if(chaveEscalonador == true) Fluidos.niveis = floor(AccountInfoDouble(ACCOUNT_BALANCE)/(Fluidos.rajada*1000)); Fluidos.Q = Fluidos.rajada * Fluidos.niveis; Operacao.chaveEscalonador = chaveEscalonador; Operacao.chaveLambda = chaveLambda; Operacao.chaveBook = chaveBook; Operacao.chaveRiscoSaldo = chaveRiscoSaldo; Operacao.chaveRiscoTend = chaveRiscoTend; Operacao.chaveFiAutomatico = chaveFiAutomatico; Operacao.magic = 11111; Operacao.diaAtual = 0; Operacao.posicoes_total_prev = 0; Operacao.posicoes_total = 0; Operacao.normalizeDoubleSize = 0; Operacao.horarioShort_atual =0; Operacao.horarioShort_inicial = horarioShort_inicial; Operacao.horarioShort_final = horarioShort_final; Operacao.horarioShort_fechamento = horarioShort_fechamento; Operacao.countSaldo = 0; Operacao.countFechaDia = 0; Operacao.saldoInicialDia = saldoInicial; Operacao.saldoAtualDia = 0.0; Operacao.diferencaSaldo = 0.0; Operacao.alvoFinanceiro = alvoFinanceiro; if(stopFinanceiro > 0) Operacao.stopFinanceiro = -1*stopFinanceiro; else Operacao.stopFinanceiro = stopFinanceiro; Operacao.alvoPercentual = alvoPercentual; Operacao.stopPercentual = stopPercentual; Operacao.stopFinanceiro = stopFinanceiro; Operacao.handlerNormalizeDoubleSize = ""; Operacao.lifetimePosicao = lifetimePosicao; Operacao.saldoInicialDia = saldoInicial; //Inicializa a contagem de dias TimeToStruct(TimeCurrent(), Operacao.horarioMQL_atual); Operacao.diaAtual = Operacao.horarioMQL_atual.day; //Inicializa o MarketBook if(Operacao.chaveBook == true) if(!MarketBookAdd(_Symbol)) Print("Falha para inicializar o book"); ArrayResize(ArrayTick, Fluidos.intervaloTicks, 0); //Inicializa o ArrayTick if(CopyTicks(_Symbol, ArrayTick, COPY_TICKS_ALL, 0, Fluidos.intervaloTicks) != -1) { ArraySetAsSeries(ArrayTick, true); } else Print("Falha para inicializar o ArrayTicks: ", GetLastError()); //NormalizeDouble Operacao.handlerNormalizeDoubleSize = DoubleToString(Fluidos.tickMin); Operacao.handlerNormalizeDoubleSize = StringReplace(Operacao.handlerNormalizeDoubleSize,".",""); Operacao.normalizeDoubleSize = (StringLen(Operacao.handlerNormalizeDoubleSize))-1; //Ajusta o tamanho dos arrays de slots de compra e venda ArrayResize(SlotsC, Fluidos.niveis); ArrayResize(SlotsV, Fluidos.niveis); //Inicializa os slots de compra e venda for(int i=0; i 0) Operacao.stopFinanceiro = Operacao.saldoInicialDia * -1 * Operacao.stopPercentual; else Operacao.stopFinanceiro = Operacao.saldoInicialDia * Operacao.stopPercentual; Operacao.countSaldo = 1; Operacao.countFechaDia = 0; } } Fluidos.precoAbertura = iOpen(_Symbol, PERIOD_D1, 0); //Atualiza o horario TimeToStruct(TimeCurrent(), Operacao.horarioMQL_atual); //Atualiza o book if(!Operacao.simbolo.RefreshRates()) return; if(Operacao.chaveBook == true) { if(MarketBookGet(_Symbol, ArrayBook)) { //Atualiza os indices do topo do book Fluidos.iBid0 = Book.InfoGetInteger(MBOOK_BEST_BID_INDEX); Fluidos.iAsk0 = Book.InfoGetInteger(MBOOK_BEST_ASK_INDEX); } else { Print("Falha ao atualizar o Book"); } } ArrayResize(ArrayTick, Fluidos.intervaloTicks, 0); //Atualiza os ticks if(CopyTicks(Symbol(), ArrayTick,COPY_TICKS_ALL, 0, Fluidos.intervaloTicks) != -1) ArraySetAsSeries(ArrayTick, true); else Print("Falha para inicializar o ArrayTicks: ", GetLastError()); //Atualiza os buffers de media e desvio padrao CopyBuffer(Fluidos.handlerMA, 0 ,1, 2, Fluidos.MA); CopyBuffer(Fluidos.handlerSTDDEV, 0, 1, 2, Fluidos.STDDEV); Fluidos.midPrice = (Operacao.simbolo.Ask() + Operacao.simbolo.Bid())/2; Fluidos.media = Fluidos.MA[0]; Fluidos.sigmaHFT = MathAbs(Fluidos.STDDEV[0]); Fluidos.driftLFTTend = Fluidos.MA[0] - Fluidos.MA[1]; Fluidos.driftLFTVol = Fluidos.STDDEV[0] - Fluidos.STDDEV[1]; Fluidos.q = AtualizaQuantidade(Operacao, Fluidos); Fluidos.td = Operacao.horarioMQL_atual.hour*60 + Operacao.horarioMQL_atual.min; for(int i=0; i