SuperCharlie_Oxford/Desenvolvimento_v4_1/S1_Ignicao1_v4_1.mq5
super.admin 513958a1f2 convert
2025-05-30 16:27:23 +02:00

460 lines
No EOL
44 KiB
MQL5

//+------------------------------------------------------------------+
//| S1_Ignicao1_v4_1.mq5 |
//| DESENVOLVIMENTO |
//| 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 "DESENV_v4_1"
#property description "HFT MARKET MAKING BASED ON OXFORD'S STUDIES. MINI INDICE."
//+===================================================================================================================================================================================+
//| 0 - SESSAO DE CABECALHO / ADMISSAO
//+===================================================================================================================================================================================+
//+------------------------------------------------------------------+
//| 0.1 - IMPORTACOES |
//+------------------------------------------------------------------+
#include <Expert/Expert.mqh>
#include <Trade/Trade.mqh>
#include <Trade/SymbolInfo.mqh>
#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 RISCOS |
//+------------------------------------------------------------------+
input group "Gerenciamento de Riscos-------------------|---------------------------------------------------------------"
input double saldoInicial = 4000; //X0: Saldo inicial do dia, se escalonador = false
input double alvoPercentual = 0.30; //XAlvo%: formato 0.05 = 5%, se escalo = true {0.30} [0, inf+[
input double stopPercentual = 0.10; //XStop%: formato 0.05 = 5%, se escalo = true {0.10} [0, 1]
input double alvoFinanceiro = 800.0; //XAlvoR$: Alvo financeiro no dia, se escalonador = false
input double stopFinanceiro = -400.0; //XStopR$: Stop financeiro no dia, se escalonador = false
//+------------------------------------------------------------------+
//| 0.2.2 - INPUTS DE GERENCIAMENTO DE INVENTARIO |
//+------------------------------------------------------------------+
input group "Gerenciamento de Inventário---------------|---------------------------------------------------------------"
input int niveis = 4; //η: Níveis máximos η, se escalonador = false {1}[1, +inf[
input int rajada = 1; //r: Quantidade por ordem r, se escalonador = false {1}[1, +inf[
//+------------------------------------------------------------------+
//| 0.2.3 - INPUTS DE GERENCIAMENTO DE TEMPO |
//+------------------------------------------------------------------+
input group "Gerenciamento de Tempo--------------------|---------------------------------------------------------------"
input ushort horarioShort_inicial = 545; //t0: Horário inicial 09:05 -> Τ0 em minutos {545}[600, 985]
input ushort horarioShort_final = 980; //tf: Horário final 980 = 16:20 -> ΤF em minutos {980}[600, 985]
input ushort horarioShort_fechamento = 983; //Tf: Horário limite de after 16:25 ->ΤP em minutos{983}[600,990]
//+------------------------------------------------------------------+
//| 0.2.4 - INPUTS DE GERENCIAMENTO DE ESTRATEGIA |
//+------------------------------------------------------------------+
input group "Gerenciamento de Estratégia---------------|---------------------------------------------------------------"
input double fi = 0.0002; //φ: Running Penalty (aversao a risco)
input double passoFi = 10; //passo φ
input double custoOperacao = 1.20; //ζ : Custo por operacao ζ {1.20} [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 = 30; //τ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
input double corteImbalance = 0.10; //Z: Offset do corte do regime Z do imbalance p
input int fatorHedge = 10; //fH: Fator de spread alvo do hedge
input int spreadOffsetEnvioLado = 15; //δo: Spread Offset do Envio da tendencia de lado
input int spreadOffsetEnvioLeve = 25; //δo: Spread Offset do Envio da tendencia leve
input int spreadOffsetAlvoLado = 15; //δo: Spread Offset do Alvo da tendencia de lado
input int spreadOffsetAlvoLeve = 25; //δo: Spread Offset do Alvo da tendencia leve
//+------------------------------------------------------------------+
//| 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 chaveRiscoSaldo = true; //Chave on/off do risco saldo {true}
input bool chaveLambda = false; //Chave on/off do lambda {false}
input bool chaveBook = false; //Chave on/off do book {false}
input bool chaveLambdaBacktest = true; //Chave on/off do lambda backtest {true}
input bool chaveBookBacktest = false; //Chave on/off do book backtest {false}
input bool chaveRiscoTend = false; //Chave on/off do risco de tendencia {false}
input bool chaveFiAutomatico = false; //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}
//+------------------------------------------------------------------+
//| 0.3 - VARIAVEIS GLOBAIS |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| 0.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("DESENVOLVIMENTO V1_para_v3");
//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.handlerVolumeReal = -1;
Fluidos.handlerVolumeNegocios = -1;
Fluidos.periodoMA = 100;
Fluidos.periodoSTDDEV = 100;
Fluidos.periodoVolume = 10;
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.precoOpen = -1;
Fluidos.precoClose = -1;
Fluidos.desvioDiario = desvioDiario;
Fluidos.limiteInfTend = -1;
Fluidos.limiteSupTend = -1;
Fluidos.limiteInfDesvio = -1;
Fluidos.limiteSupDesvio = -1;
Fluidos.imbalance = 0.0;
Fluidos.corteImbalance = corteImbalance;
Fluidos.LC = true;
Fluidos.LV = true;
Fluidos.fatorHedge = fatorHedge;
Fluidos.tendencia = "";
Fluidos.spreadOffsetEnvioLado = spreadOffsetEnvioLado;
Fluidos.spreadOffsetEnvioLeve = spreadOffsetEnvioLeve;
Fluidos.spreadOffsetAlvoLado = spreadOffsetAlvoLado;
Fluidos.spreadOffsetAlvoLeve = spreadOffsetAlvoLeve;
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.chaveLambdaBacktest = chaveLambdaBacktest;
Operacao.chaveBookBacktest = chaveBookBacktest;
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<Fluidos.niveis ;i++)
{
SlotsC[i].statusCambio = 0;
SlotsC[i].statusMotor = 0;
SlotsV[i].statusCambio = 0;
SlotsV[i].statusMotor = 0;
SlotsC[i].ponta = 0;
SlotsV[i].ponta = 2;
}
//Cria os buffers dos indicadores de media e desvio padrao
Fluidos.handlerMA = iMA(_Symbol, PERIOD_M1, Fluidos.periodoMA, 0, MODE_EMA, PRICE_MEDIAN);
Fluidos.handlerSTDDEV = iStdDev(_Symbol, PERIOD_M1, Fluidos.periodoSTDDEV, 0, MODE_EMA, PRICE_MEDIAN);
Fluidos.handlerVolumeReal = iVolumes(_Symbol, PERIOD_M1, VOLUME_REAL);
Fluidos.handlerVolumeNegocios = iVolumes(_Symbol, PERIOD_M1, VOLUME_TICK);
ArraySetAsSeries(Fluidos.MA, true);
ArraySetAsSeries(Fluidos.STDDEV, true);
ArraySetAsSeries(Fluidos.VOLUMEREAL, true);
ArraySetAsSeries(Fluidos.VOLUMENEGOCIOS, true);
CopyBuffer(Fluidos.handlerMA, 0, 1, 2, Fluidos.MA);
CopyBuffer(Fluidos.handlerSTDDEV, 0, 1, 2, Fluidos.STDDEV);
CopyBuffer(Fluidos.handlerVolumeReal, 0, 1, 2, Fluidos.VOLUMEREAL);
CopyBuffer(Fluidos.handlerVolumeNegocios, 0, 1, 2, Fluidos.VOLUMENEGOCIOS);
Fluidos.precoOpen = iOpen(_Symbol, PERIOD_M1, 0);
Fluidos.precoClose = iClose(_Symbol, PERIOD_M1, 0);
Fluidos.media = Fluidos.MA[0];
Fluidos.sigmaHFT = MathAbs(Fluidos.STDDEV[0]);
Fluidos.volumeReal = Fluidos.VOLUMEREAL[0];
Fluidos.volumeNegocios = Fluidos.VOLUMENEGOCIOS[0];
Fluidos.driftLFTTend = Fluidos.MA[0] - Fluidos.MA[1];
Fluidos.driftLFTVol = Fluidos.STDDEV[0] - Fluidos.STDDEV[1];
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| 1.2 - FUNCAO EVENTO TICK / CORACAO |
//+------------------------------------------------------------------+
void OnTick()
{
//Atualiza os ticks e variaveis
AtualizaVariaveis();
//Chamar o motor
if(VerificaHorarioOrdens(Operacao)) FazTrades(Operacao, Fluidos, SlotsC, SlotsV, ArrayTick, ArrayBook);
else if(VerificaHorarioFechamento(Operacao))
{
if(Operacao.countFechaDia == 0)
{
FechaPosicoes(Operacao);
Print("Mandou fechar todas as posicoes por fechamento de dia.");
CancelaOrdensAbertas(Operacao);
Print("Mandou cancelar todas as ordens abertas por fechamento de dia.");
ArrayFree(SlotsC);
ArrayFree(SlotsV);
ArrayResize(SlotsC, Fluidos.niveis);
ArrayResize(SlotsV, Fluidos.niveis);
for(int i=0;i<ArraySize(SlotsC);i++)
{
SlotsC[i].statusCambio = 0;
SlotsC[i].statusMotor = 0;
SlotsV[i].statusCambio = 0;
SlotsV[i].statusMotor = 0;
}
Operacao.countSaldo = 0;
if((PositionsTotal() + OrdersTotal()) == 0) Operacao.countFechaDia = 1;
}
}
else return;
return;
}
//+------------------------------------------------------------------+
//| 1.3 - FUNCAO QUE ATUALIZA AS VARIAVEIS IMPORTANTES |
//+------------------------------------------------------------------+
void AtualizaVariaveis()
{
//Atualiza saldoInicialDia no backtest
if(Operacao.chaveEscalonador == true)
{
//Atualiza as rajadas e niveis de acordo com o novo saldo
Fluidos.rajada = floor(AccountInfoDouble(ACCOUNT_BALANCE)/10000) + 1;
Fluidos.niveis = floor(AccountInfoDouble(ACCOUNT_BALANCE)/(Fluidos.rajada*1000));
Fluidos.Q = Fluidos.rajada * Fluidos.niveis;
ArrayResize(SlotsC, Fluidos.niveis);
ArrayResize(SlotsV, Fluidos.niveis);
if(Operacao.countSaldo == 0)
{
Operacao.saldoInicialDia = AccountInfoDouble(ACCOUNT_BALANCE);
Operacao.alvoFinanceiro = Operacao.saldoInicialDia * Operacao.alvoPercentual;
if(stopPercentual > 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);
Fluidos.precoOpen = iOpen(_Symbol, PERIOD_M1, 0);
Fluidos.precoClose = iClose(_Symbol, PERIOD_M1, 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);
CopyBuffer(Fluidos.handlerVolumeReal, 0, 1, 2, Fluidos.VOLUMEREAL);
CopyBuffer(Fluidos.handlerVolumeNegocios, 0, 1, 2, Fluidos.VOLUMENEGOCIOS);
Fluidos.midPrice = (Operacao.simbolo.Ask() + Operacao.simbolo.Bid())/2;
Fluidos.media = Fluidos.MA[0];
Fluidos.sigmaHFT = MathAbs(Fluidos.STDDEV[0]);
Fluidos.volumeReal = Fluidos.VOLUMEREAL[0];
Fluidos.volumeNegocios = Fluidos.VOLUMENEGOCIOS[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<Fluidos.niveis ;i++)
{
SlotsC[i].ponta = 0;
SlotsV[i].ponta = 2;
}
return;
}
//+------------------------------------------------------------------+
//| 1.4 - FUNCAO EVENTO BOOK |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
{
if(Operacao.chaveBook == true)
{
//Atualiza os melhores indices de bid e ask do book
if(MarketBookGet(_Symbol, ArrayBook))
{
Fluidos.iBid0 = Book.InfoGetInteger(MBOOK_BEST_BID_INDEX);
Fluidos.iAsk0 = Book.InfoGetInteger(MBOOK_BEST_ASK_INDEX);
}
else
{
Print("Falha ao obter o Book");
}
}
return;
}
//+------------------------------------------------------------------+
//| 1.5 - FUNCAO EVENTO TRADE |
//+------------------------------------------------------------------+
void OnTrade()
{
}
//+------------------------------------------------------------------+
//| 1.6 - FUNCAO DE DESLIGAMENTO |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//Da release nos indicadores
IndicatorRelease(Fluidos.handlerMA);
IndicatorRelease(Fluidos.handlerSTDDEV);
if(chaveDeinitOrdens == true)
{
CancelaOrdensAbertas(Operacao);
}
if(chaveDeinitPosicoes == true)
{
FechaPosicoes(Operacao);
}
Print("OUTPUT PATH=",TerminalInfoString(TERMINAL_DATA_PATH));
//Falha na desinicializacao
printf("Deinit reason: %d", reason);
}
//+===================================================================================================================================================================================+
//| FIM DO PROGRAMA
//+===================================================================================================================================================================================+