//+------------------------------------------------------------------+ //| S4_Cambio4x4_v4_2.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_2" #property description "HFT MARKET MAKING BASED ON OXFORD'S STUDIES. MINI INDICE." //INDICE //+===================================================================================================================================================================================+ //| 0 - SESSAO DE CABECALHO / ADMISSAO //+===================================================================================================================================================================================+ //+------------------------------------------------------------------+ //| 0.1 - IMPORTACOES | //+------------------------------------------------------------------+ #include "S0_Admissao1_v4_2.mqh" //0 == Nada //1 == Ordens //1.1 == Enviar //1.2 == Modificar //1.3 == Cancelar -> 0 == Nada //2 == Posicoes //2.1 == Modificar //2.2 == Cancelar -> 0 == Nada //2.3 == Encerrada -> 0 == Nada //3 == Reset //3.1 == Cancelar Ordens -> 0 == Nada //3.2 == Cancelar Posicoes -> 0 == Nada //3.3 == Posicoes Encerradas -> 0 == Nada //+===================================================================================================================================================================================+ //| 4 - SESSAO DE QUANTIDADES / CAMBIO //+===================================================================================================================================================================================+ //+------------------------------------------------------------------+ //| 4.1 - FUNCAO QUE TROCA STATUS DOS SLOTS | //+------------------------------------------------------------------+ void TrocaMarcha(operacao &Operacao, fluido &Fluidos, slot &Slots[]) { OrderSelect(Slots[Fluidos.iSlot].idOrdem); // if(OrderGetInteger(ORDER_POSITION_ID) != 0) // { // //isso eh uma posicao // PositionSelect(OrderGetInteger(ORDER_POSITION_ID)); // Print("Isso é uma posicao"); // //inicializa o cronometro de uma posicao // TimeToStruct(PositionGetInteger(POSITION_TIME), Slots[Fluidos.iSlot].cronometro); // // Slots[Fluidos.iSlot].idPosicao = PositionGetInteger(POSITION_TICKET); // if(Slots[Fluidos.iSlot].idPosicao != 0) // { // if(Fluidos.q > 2*Fluidos.rajada || Fluidos.q < (-2 * Fluidos.rajada)) //|| Lambda > 20 // { // Slots[Fluidos.iSlot].statusCambio = 2; // Slots[Fluidos.iSlot].statusMotor = 4; // } // else if(CalculaExpiraPosicao(Operacao, Fluidos, Slots) == true) // { // Slots[Fluidos.iSlot].statusCambio = 2; // Slots[Fluidos.iSlot].statusMotor = 5; // } // } // else // { // Slots[Fluidos.iSlot].statusCambio = 0; // Slots[Fluidos.iSlot].statusMotor = 0; // } // } // else // { //isso eh uma ordem if(OrderGetInteger(ORDER_STATE) == ORDER_STATE_PLACED) { ////ja enviou //if(Fluidos.q > 3*Fluidos.rajada || Fluidos.q < (-3 * Fluidos.rajada)) //|| Lambda > 20 //{ // if(CalculaOffsetModificaOrdem(Operacao, Fluidos, Slots) == true) // { // Slots[Fluidos.iSlot].statusCambio = 1; // Slots[Fluidos.iSlot].statusMotor = 2; // } // else // { // Slots[Fluidos.iSlot].statusCambio = 1; // Slots[Fluidos.iSlot].statusMotor = 0; // } //} //else if(CalculaExpiraOrdem(Operacao, Fluidos, Slots) == true) { Slots[Fluidos.iSlot].statusCambio = 1; Slots[Fluidos.iSlot].statusMotor = 3; } } else { //nao enviou Slots[Fluidos.iSlot].statusCambio = 1; Slots[Fluidos.iSlot].statusMotor = 1; } // } return; } //+------------------------------------------------------------------+ //| 4.2 - FUNCAO QUE CALCULA A QUANTIDADE A SER ENVIADA | //+------------------------------------------------------------------+ int CalculaQuantidade(fluido &Fluidos, slot &Slots[]) { int retorno = 0; Slots[Fluidos.iSlot].qtd = Fluidos.rajada; return retorno; } //+------------------------------------------------------------------+ //| 4.5 - FUNCAO QUE CALCULA TEMPO DE EXPIRACAO DE SLOTS | //+------------------------------------------------------------------+ bool CalculaExpiraOrdem(operacao &Operacao, fluido &Fluidos, slot &Slots[]) { ushort horarioOrdem = 0; ushort horarioShortAtual = 0; //Captura o horario atual e coloca em Struct MqlDateTime TimeToStruct(TimeCurrent(), Operacao.horarioMQL_atual); horarioOrdem = Slots[Fluidos.iSlot].cronometro.hour*60*60 + Slots[Fluidos.iSlot].cronometro.min*60 + Slots[Fluidos.iSlot].cronometro.sec; horarioShortAtual = Operacao.horarioMQL_atual.hour*60*60 + Operacao.horarioMQL_atual.min*60 + Operacao.horarioMQL_atual.sec; //Verifica se esta dentro da sessao de trade do dia if((horarioShortAtual - horarioOrdem) > Fluidos.lifetimeOrdem) { return true; } else return false; } //+------------------------------------------------------------------+ //| 4.5 - FUNCAO QUE CALCULA TEMPO DE EXPIRACAO DE SLOTS | //+------------------------------------------------------------------+ bool CalculaOffsetModificaOrdem(operacao &Operacao, fluido &Fluidos, slot &Slots[]) { int horarioOrdem = 0; int horarioShortAtual = 0; //Captura o horario atual e coloca em Struct MqlDateTime TimeToStruct(TimeCurrent(), Operacao.horarioMQL_atual); horarioOrdem = Slots[Fluidos.iSlot].cronometro.hour*60*60 + Slots[Fluidos.iSlot].cronometro.min*60 + Slots[Fluidos.iSlot].cronometro.sec; horarioShortAtual = Operacao.horarioMQL_atual.hour*60*60 + Operacao.horarioMQL_atual.min*60 + Operacao.horarioMQL_atual.sec; //Verifica se esta dentro da sessao de trade do dia if((horarioShortAtual - horarioOrdem) > (Fluidos.lifetimeOrdem/3)) { return true; } else return false; } //+------------------------------------------------------------------+ //| 4.5 - FUNCAO QUE CALCULA TEMPO DE EXPIRACAO DE SLOTS | //+------------------------------------------------------------------+ bool CalculaExpiraPosicao(operacao &Operacao, fluido &Fluidos, slot &Slots[]) { ushort horarioOrdem = 0; ushort horarioShortAtual = 0; //Captura o horario atual e coloca em Struct MqlDateTime TimeToStruct(TimeCurrent(), Operacao.horarioMQL_atual); horarioOrdem = Slots[Fluidos.iSlot].cronometro.hour * 60 + Slots[Fluidos.iSlot].cronometro.min; horarioShortAtual = Operacao.horarioMQL_atual.hour * 60 + Operacao.horarioMQL_atual.min; //Verifica se esta dentro da sessao de trade do dia if((horarioShortAtual - horarioOrdem) > Fluidos.lifetimePosicao) { return true; } else return false; } //+===================================================================================================================================================================================+ //| FIM DO PROGRAMA //+===================================================================================================================================================================================+