//+------------------------------------------------------------------+ //| S2_Motor1_v0.mq5 | //| DESENVOLVIMENTO | //| OXFORD | //| HEDGING HORN CAPITAL | //| https://www.hhcapital.com.br | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, HEDGING HORN CAPITAL" #property link "https://www.hhcapítal.com.br" #property version "DEV_v0" #property description "HFT MARKET MAKING BASED ON OXFORD'S STUDIES. MINI INDICE." //INDICE //+===================================================================================================================================================================================+ //| 1 - SESSAO DE CABECALHO / ADMISSAO //+===================================================================================================================================================================================+ //+------------------------------------------------------------------+ //| 1.1 - IMPORTACOES | //+------------------------------------------------------------------+ #include #include #include #include "MarketBook.mqh" #include "S1_Admissao1_v0.mqh" #include "S3_Freios1_v0.mqh" #include "S4_Cambio4x4_v0.mqh" #include "S5_Direcao1_v0.mqh" #include "S6_Transmissao1_v0.mqh" //+------------------------------------------------------------------+ //| 1.2 - ENTRADAS DE USUARIO | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| 1.2.1 - INPUTS DE GERENCIAMENTO DE INVENTARIO | //+------------------------------------------------------------------+ input group "Gerenciamento de Inventário--------------------------------------------------------------------------------------------------" input int inventario = 10; //Inventario máximo Q {1}[1, +inf[ input int rajada = 10; //Quantidade por ordem η {1}[1, +inf[ input double fi = 0.0002; //Fi: Running Penalty (injeção eletrônica) input int lifetime = 10; //Tempo em minutos da duracao de uma ordem pendente //+------------------------------------------------------------------+ //| 1.2.2 - INPUTS DE GERENCIAMENTO DE OPERACOES | //+------------------------------------------------------------------+ input group "Gerenciamento de Operacões---------------------------------------------------------------------------------------------------" input ushort horarioShort_inicial = 545; //Horário inicial 09:05 -> Τ0 em minutos {600}[600, 985] input ushort horarioShort_final = 980; //Horário final 16:20 -> ΤF em minutos {700}[600, 985] input ushort horarioShort_fechamento = 985; //Horário limite de after 16:25 -> ΤP em minutos {705}[600, 990] input ulong T = 180; //Quantidade maxima de tempo para encerramento do trade input int profundidadeBook = 10; //Profundidade do book a calcular o k {3}[1, +inf[ input double alpha = 0.0001; //Custo por zerar posição input double premioOperacao = 10; //Premio por trade liquido ρ {0.64}[0.0, 1.0[ input double custoOperacao = 2.1; //Custo por operacao ζ {1.86}[0.0, 2.0[ input double tickMin = 5; //Tick minimo do ativo Δ {0.5}[0.01, +inf[ input bool chaveBook = false; //Chave que liga/desliga o book para usar na real ou backtest {false} [true=ligado,false=desligado] input double desvioDiario = 8; //Desvios padroes limite para o preco do ativo no dia input double lambdaC = 10; //Lambda de compra input double lambdaV = 10; //Lambda de venda input double KC = 100; //Fila media de compra input double KV = 100; //Fila media de venda //+------------------------------------------------------------------+ //| 1.2.3 - INPUTS DE GERENCIAMENTO DE RISCOS | //+------------------------------------------------------------------+ input group "Gerenciamento de Riscos------------------------------------------------------------------------------------------------------" input double alvoFinanceiro = 1000.0; //3º Order Risk M.: Alvo financeiro no dia sup(Χ) input double stopFinanceiro = -1000.0; //3º Order Risk M.: Stop financeiro no dia inf(Χ) //+------------------------------------------------------------------+ //| 1.3 - VARIAVEIS GLOBAIS | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| 1.3.1 - VARIAVEIS FINANCEIRAS | //+------------------------------------------------------------------+ double saldoInicialDia = 0.0; double saldoFinalDia = 0.0; double diferencaSaldo = 0.0; //+------------------------------------------------------------------+ //| 1.3.4 - VARIAVEIS OPERACIONAIS | //+------------------------------------------------------------------+ int magic = 11111; MqlDateTime horarioMQL_inicio, horarioMQL_final, horarioMQL_encerramento, horarioMQL_atual, horarioMQL_comprado, horarioMQL_compra; ushort horarioShort_atual; datetime horarioDatetime_atual; int diaAtual = 0; CSymbolInfo simbolo; CMarketBook Book(_Symbol); CTrade negocio; MqlTradeRequest request; MqlTradeResult result; MqlTradeTransaction transaction; MqlTradeCheckResult check_result; MqlBookInfo ArrayBook[]; MqlTick ArrayTick[]; double MA[]; double STDDEV[]; int handlerMA; int handlerSTDDEV; int periodoMA = 2; int periodoSTDDEV = 2; string handlerNormalizeDoubleSize; int normalizeDoubleSize; int intervaloTicks = 10; double limiteInfDesvio = 0; double limiteSupDesvio = 500; fluido Fluidos; slot SlotsC[]; slot SlotsV[]; bool chaveFechaPosicao = true; //+===================================================================================================================================================================================+ //| 2 - SESSAO DE LOGICA CENTRAL / MOTOR //+===================================================================================================================================================================================+ //+------------------------------------------------------------------+ //| 2.1 - FUNCAO DE INICIALIZACAO | //+------------------------------------------------------------------+ int OnInit() { Print("DESENVOLVIMENTO V0"); //Inicializa o saldo da conta saldoInicialDia = AccountInfoDouble(ACCOUNT_BALANCE); //Inicializa a contagem de dias TimeToStruct(TimeCurrent(), horarioMQL_atual); diaAtual = horarioMQL_atual.day; //Inicializa o MarketBook if(chaveBook == true) if(!MarketBookAdd(_Symbol)) Print("Falha para inicializar o book"); ArrayResize(ArrayTick, intervaloTicks, intervaloTicks); //Inicializa o ArrayTick if(CopyTicks(_Symbol,ArrayTick,COPY_TICKS_ALL,0,intervaloTicks) != -1) { ArraySetAsSeries(ArrayTick,true); } else Print("Falha para inicializar o ArrayTicks: ", GetLastError()); //NormalizeDouble handlerNormalizeDoubleSize = DoubleToString(tickMin); handlerNormalizeDoubleSize = StringReplace(handlerNormalizeDoubleSize,".",""); normalizeDoubleSize = (StringLen(handlerNormalizeDoubleSize))-1; //Ajusta o tamanho dos arrays de slots de compra e venda ArrayResize(SlotsC, inventario); ArrayResize(SlotsV, inventario); //inicializa os slots de compra e venda for(int i=0; i= ArrayTick[0].last) { VendaLimite(SlotsV[i].precoEnvio, SlotsV[i].precoStop, SlotsV[i].qtd, magic, SlotsV, i, simbolo, request, result, check_result); if(result.retcode == 10009) { //Avanca o status do slot para enviado SlotsV[i].idOrdem = result.order; OrderSelect(SlotsV[i].idOrdem); TimeToStruct(OrderGetInteger(ORDER_TIME_SETUP),SlotsV[i].cronometro); } else { SlotsV[i].status = 0; } } break; //Altera ordem enviada com precoEnvio, precoStop ou precoAlvo novos (atualiza o box de ordem) case 2 : ModificaOrdemEnviada(SlotsV[i].idOrdem, SlotsV[i].precoEnvio, 0, SlotsV[i].precoStop, magic, negocio, simbolo, request, result, check_result); break; case 4 : CancelaOrdemAberta(SlotsV[i].idOrdem, negocio); break; //Default default : break; } } } //+===================================================================================================================================================================================+ //| FIM DO PROGRAMA //+===================================================================================================================================================================================+