SuperCharlie_Oxford/Homologacao_v4_2/S4_Cambio4x4_v4_2.mqh

188 lines
17 KiB
MQL5
Raw Permalink Normal View History

2025-05-30 16:27:23 +02:00
<EFBFBD><EFBFBD>//+------------------------------------------------------------------+
//| S4_Cambio4x4_v4_2.mq5 |
//| HOMOLOGACAO |
//| 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 "HOM_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 <00> 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
//+===================================================================================================================================================================================+