Chassis/S5_Direcao1_v0.mqh

328 lines
30 KiB
MQL5
Raw Permalink Normal View History

2025-05-30 14:46:03 +02:00
<EFBFBD><EFBFBD>//+------------------------------------------------------------------+
//| SuperCharlie_Aldridge_Dev_v0.mq5|
//| HEDGING HORN CAPITAL |
//| https://www.hhcapital.com.br |
//+------------------------------------------------------------------+
#property copyright "HEDGING HORN CAPITAL"
#property link "https://www.hhcapital.com.br"
#property version "DEV_v0"
#property description "INDICE"
//INDICE
//+===================================================================================================================================================================================+
//| 1 - SESSAO DE CABECALHO / ADMISSAO
//+===================================================================================================================================================================================+
//+------------------------------------------------------------------+
//| 1.1 - IMPORTACOES |
//+------------------------------------------------------------------+
#include "MarketBook.mqh"
#include "S1_Admissao1_v0.mqh"
//SLOTS_i,q = -<EFBFBD>*k*q^2 , i=q
//SLOTS_i,q = <EFBFBD>c/e , i=q-1
//SLOTS_i,q = <EFBFBD>v/e , i=q+1
//SLOTS_i,q = 0 , default
//+===================================================================================================================================================================================+
//| 5 - SESSAO DE PRECOS / DIRECAO
//+===================================================================================================================================================================================+
//+------------------------------------------------------------------+
//| 5.1 - FUNCAO QUE VERIFICA O PRECO NAQUELE INSTANTE |
//+------------------------------------------------------------------+
int VerificaPreco(double tickMin, int i, fluido &Fluidos, int ponta, slot &Slots[], posicao &SlotPos, bool chavePos)
{
//Calcula os spreads
//Ordem (Child Order)
if(chavePos == false)
{
if(ponta == 0) Fluidos.precoMedioC = CalculaSpreadBuy(tickMin, i, Fluidos, Slots);
else Fluidos.precoMedioV = CalculaSpreadSell(tickMin, i, Fluidos, Slots);
}
//Position (Parent Order)
else if(chavePos == true)
{
CalculaAlteraPosicao(tickMin, Fluidos, SlotPos);
}
return 0;
}
//+------------------------------------------------------------------+
//| 5.2 - FUNCAO QUE CALCULA SPREAD BUY |
//+------------------------------------------------------------------+
double CalculaSpreadBuy(double tickMin, int i, fluido &Fluidos, slot &SlotsC[])
{
double spreadB = 0.0;
switch(i)
{
case 0 : SlotsC[i].precoEnvio = Fluidos.media + Fluidos.driftLFTTend - (2.5 - 0.25*5)*Fluidos.sigmaLFT - tickMin/2;
SlotsC[i].precoAlvo = SlotsC[i].precoEnvio + tickMin*10;
SlotsC[i].precoStop = Fluidos.media - 5*Fluidos.sigmaLFT;
// Print("Envio preenchido: ", SlotsC[i].precoEnvio,"TP preenchido: ", SlotsC[i].precoAlvo,"SL: ", SlotsC[i].precoStop);
break;
case 1 : SlotsC[i].precoEnvio = Fluidos.media + Fluidos.driftLFTTend - (2.5 + 0.25*5)*Fluidos.sigmaLFT - tickMin/2;
SlotsC[i].precoAlvo = SlotsC[i].precoEnvio + tickMin*10;
SlotsC[i].precoStop = Fluidos.media - 5*Fluidos.sigmaLFT;
break;
case 2 : SlotsC[i].precoEnvio = Fluidos.media + Fluidos.driftLFTTend - (2.5 - 0.25*3)*Fluidos.sigmaLFT - tickMin/2;
SlotsC[i].precoAlvo = SlotsC[i].precoEnvio + tickMin*10;
SlotsC[i].precoStop = Fluidos.media - 5*Fluidos.sigmaLFT;
break;
case 3 : SlotsC[i].precoEnvio = Fluidos.media + Fluidos.driftLFTTend - (2.5 - 0.25*2)*Fluidos.sigmaLFT - tickMin/2;
SlotsC[i].precoAlvo = SlotsC[i].precoEnvio + tickMin*10;
SlotsC[i].precoStop = Fluidos.media - 5*Fluidos.sigmaLFT;
break;
case 4 : SlotsC[i].precoEnvio = Fluidos.media + Fluidos.driftLFTTend - (2.5 - 0.25*1)*Fluidos.sigmaLFT - tickMin/2;
SlotsC[i].precoAlvo = SlotsC[i].precoEnvio + tickMin*10;
SlotsC[i].precoStop = Fluidos.media - 5*Fluidos.sigmaLFT;
break;
case 5 : SlotsC[i].precoEnvio = Fluidos.media + Fluidos.driftLFTTend - (2.5)*Fluidos.sigmaLFT - tickMin/2;
SlotsC[i].precoAlvo = SlotsC[i].precoEnvio + tickMin*10;
SlotsC[i].precoStop = Fluidos.media - 5*Fluidos.sigmaLFT;
break;
case 6 : SlotsC[i].precoEnvio = Fluidos.media + Fluidos.driftLFTTend - (2.5 + 0.25*1)*Fluidos.sigmaLFT - tickMin/2;
SlotsC[i].precoAlvo = SlotsC[i].precoEnvio + tickMin*10;
SlotsC[i].precoStop = Fluidos.media - 5*Fluidos.sigmaLFT;
break;
case 7 : SlotsC[i].precoEnvio = Fluidos.media + Fluidos.driftLFTTend - (2.5 + 0.25*2)*Fluidos.sigmaLFT - tickMin/2;
SlotsC[i].precoAlvo = SlotsC[i].precoEnvio + tickMin*10;
SlotsC[i].precoStop = Fluidos.media - 5*Fluidos.sigmaLFT;
break;
case 8 : SlotsC[i].precoEnvio = Fluidos.media + Fluidos.driftLFTTend - (2.5 + 0.25*3)*Fluidos.sigmaLFT - tickMin/2;
SlotsC[i].precoAlvo = SlotsC[i].precoEnvio + tickMin*10;
SlotsC[i].precoStop = Fluidos.media - 5*Fluidos.sigmaLFT;
break;
case 9 : SlotsC[i].precoEnvio = Fluidos.media + Fluidos.driftLFTTend - (2.5 + 0.25*4)*Fluidos.sigmaLFT - tickMin/2;
SlotsC[i].precoAlvo = SlotsC[i].precoEnvio + tickMin*10;
SlotsC[i].precoStop = Fluidos.media - 5*Fluidos.sigmaLFT;
break;
default: SlotsC[i].precoEnvio = Fluidos.media + Fluidos.driftLFTTend - (2.5)*Fluidos.sigmaLFT - tickMin/2;
SlotsC[i].precoAlvo = SlotsC[i].precoEnvio + tickMin*10;
SlotsC[i].precoStop = Fluidos.media - 5*Fluidos.sigmaLFT;
break;
}
return spreadB;
}
//+------------------------------------------------------------------+
//| 5.3 - FUNCAO QUE CALCULA SPREAD SELL |
//+------------------------------------------------------------------+
double CalculaSpreadSell(double tickMin, int i, fluido &Fluidos, slot &SlotsV[])
{
double spread = 0.0;
switch(i)
{
case 0 : SlotsV[i].precoEnvio = Fluidos.media + Fluidos.driftLFTTend + (2.5 - 0.25*5)*Fluidos.sigmaLFT + tickMin/2;
SlotsV[i].precoAlvo = SlotsV[i].precoEnvio - tickMin*10;
SlotsV[i].precoStop = Fluidos.media + 5*Fluidos.sigmaLFT;
break;
case 1 : SlotsV[i].precoEnvio = Fluidos.media + Fluidos.driftLFTTend + (2.5 + 0.25*5)*Fluidos.sigmaLFT + tickMin/2;
SlotsV[i].precoAlvo = SlotsV[i].precoEnvio - tickMin*10;
SlotsV[i].precoStop = Fluidos.media + 5*Fluidos.sigmaLFT;
break;
case 2 : SlotsV[i].precoEnvio = Fluidos.media + Fluidos.driftLFTTend + (2.5 - 0.25*3)*Fluidos.sigmaLFT + tickMin/2;
SlotsV[i].precoAlvo = SlotsV[i].precoEnvio - tickMin*10;
SlotsV[i].precoStop = Fluidos.media + 5*Fluidos.sigmaLFT;
break;
case 3 : SlotsV[i].precoEnvio = Fluidos.media + Fluidos.driftLFTTend + (2.5 - 0.25*2)*Fluidos.sigmaLFT + tickMin/2;
SlotsV[i].precoAlvo = SlotsV[i].precoEnvio - tickMin*10;
SlotsV[i].precoStop = Fluidos.media + 5*Fluidos.sigmaLFT;
break;
case 4 : SlotsV[i].precoEnvio = Fluidos.media + Fluidos.driftLFTTend + (2.5 - 0.25*1)*Fluidos.sigmaLFT + tickMin/2;
SlotsV[i].precoAlvo = SlotsV[i].precoEnvio - tickMin*10;
SlotsV[i].precoStop = Fluidos.media + 5*Fluidos.sigmaLFT;
break;
case 5 : SlotsV[i].precoEnvio = Fluidos.media + Fluidos.driftLFTTend + (2.5)*Fluidos.sigmaLFT + tickMin/2;
SlotsV[i].precoAlvo = SlotsV[i].precoEnvio - tickMin*10;
SlotsV[i].precoStop = Fluidos.media + 5*Fluidos.sigmaLFT;
break;
case 6 : SlotsV[i].precoEnvio = Fluidos.media + Fluidos.driftLFTTend + (2.5 + 0.25*1)*Fluidos.sigmaLFT + tickMin/2;
SlotsV[i].precoAlvo = SlotsV[i].precoEnvio - tickMin*10;
SlotsV[i].precoStop = Fluidos.media + 5*Fluidos.sigmaLFT;
break;
case 7 : SlotsV[i].precoEnvio = Fluidos.media + Fluidos.driftLFTTend + (2.5 + 0.25*2)*Fluidos.sigmaLFT + tickMin/2;
SlotsV[i].precoAlvo = SlotsV[i].precoEnvio - tickMin*10;
SlotsV[i].precoStop = Fluidos.media + 5*Fluidos.sigmaLFT;
break;
case 8 : SlotsV[i].precoEnvio = Fluidos.media + Fluidos.driftLFTTend + (2.5 + 0.25*3)*Fluidos.sigmaLFT + tickMin/2;
SlotsV[i].precoAlvo = SlotsV[i].precoEnvio - tickMin*10;
SlotsV[i].precoStop = Fluidos.media + 5*Fluidos.sigmaLFT;
break;
case 9 : SlotsV[i].precoEnvio = Fluidos.media + Fluidos.driftLFTTend + (2.5 + 0.25*4)*Fluidos.sigmaLFT + tickMin/2;
SlotsV[i].precoAlvo = SlotsV[i].precoEnvio - tickMin*10;
SlotsV[i].precoStop = Fluidos.media + 5*Fluidos.sigmaLFT;
break;
default: SlotsV[i].precoEnvio = Fluidos.media + Fluidos.driftLFTTend + (2.5)*Fluidos.sigmaLFT + tickMin/2;
SlotsV[i].precoAlvo = SlotsV[i].precoEnvio - tickMin*10;
SlotsV[i].precoStop = Fluidos.media + 5*Fluidos.sigmaLFT;
break;
}
return spread;
}
//+------------------------------------------------------------------+
//| 5.4 - FUNCAO QUE CALCULA ALTERACAO DE PRECOS DA POSICAO |
//+------------------------------------------------------------------+
void CalculaAlteraPosicao(double tickMin, fluido &Fluidos, posicao &SlotPos)
{
Print("Entrou no Altera Posicao");
//Se for posicao de compra
if(SlotPos.ponta == POSITION_TYPE_BUY)
{
SlotPos.precoAlvo = SlotPos.precoMedio + 0.4*Fluidos.sigmaLFT;
SlotPos.precoStop = Fluidos.media - 5*Fluidos.sigmaLFT;
}
else if(SlotPos.ponta == POSITION_TYPE_SELL)//Senao eh posicao de venda
{
SlotPos.precoAlvo = SlotPos.precoMedio - 0.4*Fluidos.sigmaLFT;
SlotPos.precoStop = Fluidos.media + 5*Fluidos.sigmaLFT;
}
return;
}
//+------------------------------------------------------------------+
//| 5.5 - FUNCAO QUE CALCULA A MEDIA DE PRECOS |
//+------------------------------------------------------------------+
void GetPrecosPassados(MqlTick &ArrayTick[], double &precos[], int T)
{
if(CopyTicks(Symbol(),ArrayTick,COPY_TICKS_TRADE,0,T) != -1)
{
ArraySetAsSeries(ArrayTick,true);
for(int i=0;i<ArraySize(ArrayTick);i++)
{
precos[i] = ArrayTick[i].last;
}
}
else
{
Print("Falha ao obter o ArrayTick, falha para GetPrecosPassados");
}
return;
}
//+------------------------------------------------------------------+
//| 5.6 - FUNCAO QUE CALCULA OS VETORES DE TENDENCIA E VOLATILIDADE |
//+------------------------------------------------------------------+
void CalculaVetores(MqlTick &ArrayTick[], double &precos[], int T)
{
//Declara variaveis
double lambdaC = 0.0;
double lambdaV = 0.0;
double LOBC = 0.0;
double LOBV = 0.0;
//Calcula lambdas
//lambdaC = CalculaLambdaCompra(ArrayTick, T);
//lambdaC = CalculaLambdaCompra(ArrayTick, T);
//LOBC = CalculaLobCompra(ArrayTick, T);
//LOBV = CalculaLobVenda(ArrayTick, T);
//Calcula vetor compra
//vetorCompra = potencia(lambdaC, 2) / LOBV;
//Calcula vetor venda
//vetorVenda = potencia(lambdaV, 2) / LOBC;
//Calcula vetor tendencia
//vetorTend = raizQuadrada(potencia(vetorCompra, 2) + potencia(vetorVenda, 2));
//Calcula vetor volatilidade
//vetorVol = raizQuadrada(potencia((vetorCompra - vetorVenda), 2)/2);
if(CopyTicks(Symbol(),ArrayTick,COPY_TICKS_TRADE,0,T) != -1)
{
ArraySetAsSeries(ArrayTick,true);
for(int i=0;i<ArraySize(ArrayTick);i++)
{
precos[i] = ArrayTick[i].last;
}
}
else
{
Print("Falha ao obter o ArrayTick, falha para GetPrecosPassados");
}
return;
}
//+------------------------------------------------------------------+
//| 5.7 - FUNCAO QUE CALCULA O LAMBDA COMPRA |
//+------------------------------------------------------------------+
int CalculaLambdaCompra(MqlTick &ArrayTick[], int T)
{
int lambda = 0;
int t = 0;
for(int i=0;i<ArraySize(ArrayTick);i++)
{
while(t<T)
{
t = ArrayTick[0].time_msc - ArrayTick[i].time_msc;
Print("Tempo em milisegundos: ", ArrayTick[0].time_msc);
if(ArrayTick[i].flags == 1)
lambda += ArrayTick[i].volume;
}
break;
}
return lambda;
}
//+------------------------------------------------------------------+
//| 5.8 - FUNCAO QUE CALCULA O LAMBDA VENDA |
//+------------------------------------------------------------------+
int CalculaLambdaVenda(MqlTick &ArrayTick[], int T)
{
int lambda = 0;
int t = 0;
for(int i=0;i<ArraySize(ArrayTick);i++)
{
while(t<T)
{
t = ArrayTick[0].time_msc - ArrayTick[i].time_msc;
if(ArrayTick[i].flags == 2)
lambda += ArrayTick[i].volume;
}
}
return lambda;
}
//+------------------------------------------------------------------+
//| 5.9 - FUNCAO QUE CALCULA O LOB COMPRA |
//+------------------------------------------------------------------+
int CalculaLobCompra(MqlBookInfo &ArrayBook[], int iBid, int T, int spreadBuy)
{
int lobC = 0;
lobC = ArrayBook[iBid].volume;
return lobC;
}
//+------------------------------------------------------------------+
//| 5.10 - FUNCAO QUE CALCULA O LOB VENDA |
//+------------------------------------------------------------------+
int CalculaLobVenda(MqlBookInfo &ArrayBook[], int iAsk, int T, int spreadSell)
{
int lobV = 0;
lobV = ArrayBook[iAsk].volume;
return lobV;
}
//+===================================================================================================================================================================================+
//| FIM DO PROGRAMA
//+===================================================================================================================================================================================+