///////////////////////////////////////////////////////////
// //
// MAXSETUP //
// Versão Final //
///////////////////////////////////////////////////////////
Const
// Para Calculo das Medias Moveis Exponenciais
MediaMovel9 = 9; // Média Móvel Exponencial de 9 períodos
MediaMovel21 = 21; // Média Móvel Exponencial de 21 períodos
MediaMovel35 = 35; // Média Móvel Exponencial de 35 períodos
MediaMovel50 = 50; // Média Móvel Exponencial de 50 períodos
MediaMovel70 = 70; // Média Móvel Exponencial de 70 períodos
MediaMovel100 = 100; // Média Móvel Exponencial de 100 períodos
PeriodoHilo = 20;
PeriodoAdx = 14;
PerStocastico = 14;
PerTrix = 14;
PerMACD_Curto = 12;
PerMACD_Longo = 26;
PerMACD_Sinal = 9;
FatorTilsonT3 = 0.7;
MedTilsonT3 = 3;
PerVolume = 20;
PeriodoSMA = 9; // Média Móvel Simples de 9 períodos (para linha de
sinal)
RSI_Periodo = 14; // Período para cálculo do RSI
PeriodoATR = 14; // Período do ATR
PeriodoMomentum = 10; // Período para cálculo do Momentum
PeriodoOBV = 20; // Período para análise de OBV
PeriodoZScore = 5; // Número de candles para considerar Z-Score consolidado
MediaMomentum = 5; // Faixa neutra para Momentum
PeriodoCCI = 20; // Período para cálculo do CCI
AlvovZ = 200.00;
PeriodovZ = 40;
NivelvZ = 1.00;
DesviovZ = 2.00;
PeriodoSAtrvZ = 20;
TipoSAtrvZ = 0;
ValorAtrvZ = 80;
Parâmetro
QtdContratos(1); // Quantidade de contratos usados nas operações
StopLoss(Verdadeiro);
StopLossInicial(300.00); // trocar o nome para stoploss inicial
StopLoss Inicial // Apenas para referência inicial
TrailingStop(Verdadeiro);
TamanhoStopMovel(50.00); // Trailing Stop
DisparoStopGain(30.00);
DistanciaFinanceira(100.00); // Distância financeira fixa para trailing stop
em Reais
StopGain(20.00);
var
fMedMovel9, fMedMovel21, fMedMovel35, fMedMovel50, fMedMovel70, fMedMovel100:
Float;
DiaAtual: Integer; // Variável para detectar mudança de dia
fHilo, fPrecoAtual, AdxValor, DI_Plus, DI_Minus, fStochastic, aRSI, VolumeAtual:
Float;
ValorATR, vZScore, MomentumValor, CCIValor, OBVValor, OBVMedia: Float;
fTrix, fMACD, fmacdLine, fsignalLine, fTilson, fVolumeAgressao: Float;
TrixNorm, MACDNorm, macdDiff, TilsonNorm, VolumeNorm: Float;
IndicadorComposto, IndicadorCompostoSuave, LinhaSinal, somaIndicador: Float;
nindex : Integer; // Contador para o laço
bSinalcomprado, bSinalVendido, bTendenciaAlta, bTendenciaBaixa : Boolean;
bSinalHiloComprado, bSinalHiloVendido, bTendenciaHiloAlta, bTendenciaHiloBaixa :
Boolean;
bExit, bVendido, bComprado, bHasPosition : Boolean;
// Variaveis Auxiliares
bConfirmaçãoMediadeAlta, bConfirmaçãoMediadeBaixa: Boolean;
bConfirmacaoForca, bSinalContinuacao: Boolean;
bSobreComprado, bSobreVendido: Boolean;
BSinalSaidaComprado, bSinalSaidaVendido: Boolean;
bMomentumAlta, bMomentumBaixa : Boolean;
StopLossAtual, StopLevel, StopGainComprado, StopGainVendido, StopAtual: Float;
begin
////////////////////////////////////////////////////////
// 1 - Inicialização das Logicas no Início do Dia
////////////////////////////////////////////////////////
if Date <> DiaAtual then
begin
DiaAtual := Date; // Atualiza o DiaAtual para o dia corrente
fMedMovel9 := MyPrice;
fMedMovel21 := MyPrice;
fMedMovel35 := MyPrice;
fMedMovel50 := MyPrice;
fMedMovel70 := MyPrice;
fMedMovel100 := MyPrice;
end;
////////////////////////////////////////////////////////
// 2 - Cálculo dos Indicadores a Longo do dia
////////////////////////////////////////////////////////
////////////////////////////////////////////////////////
// 2.1 - Cálculo das Médias Móveis Exponenciais
////////////////////////////////////////////////////////
fMedMovel9 := (MyPrice * (2 / (MediaMovel9 + 1))) + (fMedMovel9 * (1 - (2 /
(MediaMovel9 + 1))));
fMedMovel21 := (MyPrice * (2 / (MediaMovel21 + 1))) + (fMedMovel21 * (1 -
(2 / (MediaMovel21 + 1))));
fMedMovel35 := (MyPrice * (2 / (MediaMovel35 + 1))) + (fMedMovel35 * (1 -
(2 / (MediaMovel35 + 1))));
fMedMovel50 := (MyPrice * (2 / (MediaMovel50 + 1))) + (fMedMovel50 * (1 -
(2 / (MediaMovel50 + 1))));
fMedMovel70 := (MyPrice * (2 / (MediaMovel70 + 1))) + (fMedMovel70 * (1 -
(2 / (MediaMovel70 + 1))));
fMedMovel100:= (MyPrice * (2 / (MediaMovel100 + 1))) + (fMedMovel100 * (1 -
(2 / (MediaMovel100 + 1))));
// Plotagem das Médias no Gráfico
//Plot(fMedMovel9); // Plota a média móvel de 9 períodos
//Plot2(fMedMovel21); // Plota a média móvel de 21 períodos
//Plot3(fMedMovel35); // Plota a média móvel de 35 períodos
//Plot4(fMedMovel50); // Plota a média móvel de 50 períodos
//Plot5(fMedMovel70); // Plota a média móvel de 70 períodos
//Plot6(fMedMovel100); // Plota a média móvel de 100 períodos
////////////////////////////////////////////////////////
// 2.2 - Cálculo HiloActivator
////////////////////////////////////////////////////////
fHilo :=(HiloActivator(PeriodoHilo));
////////////////////////////////////////////////////////
// 2.3 - Cálculo Preço Atual do Ativo
////////////////////////////////////////////////////////
fPrecoAtual :=(MaxPrecoAtual);
///////////////////////////////////////////////////////////
// 2.4 - Calculo DI+ DI- ADX
///////////////////////////////////////////////////////////
ADXValor := ADX(PeriodoADX, PeriodoADX); // Calcula o ADX
DI_Plus := DiPDiM(PeriodoADX)|0|; // Calcula o +DI (usando linha 0
para DI+)
DI_Minus := DiPDiM(PeriodoADX)|1|; // Calcula o -DI (usando linha 1
para DI-)
// Plotagem dos resultados DI+ DI- ADX
// Plot(ADXValor); // Plota o valor do ADX com cor branca
// Plot2(DI_Plus); // Plota o valor do +DI com cor verde
// Plot3(DI_Minus); // Plota o valor do -DI com cor vermelha
////////////////////////////////////////////////////////
// 2.5 - Cálculo Stocastico Pleno
////////////////////////////////////////////////////////
fStochastic :=FullStochastic(PerStocastico);
//Plot9(fStochastic);
////////////////////////////////////////////////////////
// 2.6 - Cálculo RSI
////////////////////////////////////////////////////////
aRSI := RSI(RSI_Periodo, 0); // 0 indica o cálculo clássico
//Plot10(aRSI);
////////////////////////////////////////////////////////
// 2.7 - Cálculo Volume
////////////////////////////////////////////////////////
VolumeAtual := Volume;
//Plot11(VolumeAtual);
////////////////////////////////////////////////////////
// 2.8 - Cálculo ATR
////////////////////////////////////////////////////////
ValorATR := AvgTrueRange(PeriodoATR, 0); // Tipo 0: Média Aritmética
//Plot12(ValorATR);
////////////////////////////////////////////////////////
// 2.9 - Cálculo MOMENTUM
////////////////////////////////////////////////////////
MomentumValor := Momentum(PeriodoMomentum, MediaMomentum, 1); // Calcula o
Momentum
//Plot13(MomentumValor);
////////////////////////////////////////////////////////
// 2.10 - Cálculo CCI
////////////////////////////////////////////////////////
CCIValor := CCI(PeriodoCCI); // Calcula o CCI
//Plot14(CCIValor);
////////////////////////////////////////////////////////
// 2.11 - Cálculo OBV
////////////////////////////////////////////////////////
OBVValor := OBV; // Calcula o OBV atual
OBVMedia := MediaExp(PeriodoOBV, OBVValor); // Média exponencial do OBV
//Plot15(OBVValor);
//Plot16(OBVMedia);
////////////////////////////////////////////////////////
// 3 - Cálculos Indicador - MaxSetup
////////////////////////////////////////////////////////
////////////////////////////////////////////////////////
// 3.1 - Cálculo Indicador - Trix
////////////////////////////////////////////////////////
fTrix := TRIX(PerTrix, 1);
TrixNorm := 0;
if fTrix <> 0 then
// Normaliza em relação ao maior valor de 100 períodos
TrixNorm := fTrix / Highest(Abs(fTrix), 100);
//Plot17(fTrix);
////////////////////////////////////////////////////////
// 3.2 - Cálculo Indicador Macd
////////////////////////////////////////////////////////
fMACD := MACD(PerMACD_Longo, PerMACD_Curto, PerMACD_Sinal);
// Cálculo do MACD Normalizado
if Abs(fMACD) > 0 then
// Normaliza em relação ao maior valor de 100 períodos
MACDNorm := fMACD / Highest(Abs(fMACD), 100);
//Plot18(fMACD);
////////////////////////////////////////////////////////
// 3.3 - Cálculo Indicador Tilson - Normalizado
////////////////////////////////////////////////////////
fTilson := Tilson(FatorTilsonT3, MedTilsonT3);
if Abs(fTilson) > 0 then
// Normaliza em relação ao maior valor de 100 períodos
TilsonNorm := fTilson / Highest(Abs(fTilson), 100);
//Plot19(fTilson);
////////////////////////////////////////////////////////
// 3.4 - Cálculo Indicador Volume Agressao - Normalizado
////////////////////////////////////////////////////////
fVolumeAgressao := AgressionVolBuy() - AgressionVolSell();
VolumeNorm := 0;
if Abs(Highest(Volume, PerVolume) - Lowest(Volume, PerVolume)) > 0 then
VolumeNorm := Abs(fVolumeAgressao) / (Highest(Volume, PerVolume) -
Lowest(Volume, PerVolume));
////////////////////////////////////////////////////////
// 3.5 - Cálculo Indicador Composto
////////////////////////////////////////////////////////
IndicadorComposto := (0.5 * TrixNorm) +
(0.2 * MACDNorm) +
(0.2 * TilsonNorm) +
(0.1 * VolumeNorm);
// Suavização do Indicador Composto
IndicadorCompostoSuave := IndicadorCompostoSuave * 0.83 + IndicadorComposto *
0.17;
// Linha de Sinal Indicador Composto
somaIndicador := 0;
// Calcula a soma dos últimos 9 períodos do Indicador Composto Suave
for nindex := 0 to PeriodoSMA - 1 do
begin
somaIndicador := somaIndicador + IndicadorCompostoSuave[nindex];
end;
// Calcula a linha de sinal dividindo a soma pelo número de períodos
LinhaSinal := somaIndicador / PeriodoSMA;
// Plotagem dos Resultados
Plot21(IndicadorCompostoSuave);
Plot22(LinhaSinal); // Plot da Linha de Sinal
////////////////////////////////////////////////////////
// 4 - Verificação do Cruzamento de Hilo e Confluencias
////////////////////////////////////////////////////////
bSinalHiloComprado := (fPrecoAtual > fHilo) and (fPrecoAtual[1] < fHilo);
bSinalHiloVendido := (fPrecoAtual < fHilo) and (fPrecoAtual[1] > fHilo);
bTendenciaHiloAlta := (fPrecoAtual > fHilo);
bTendenciaHiloBaixa := (fPrecoAtual < fHilo);
bConfirmaçãoMediadeAlta := (fMedMovel9 > fMedMovel21) and (fMedMovel21 >
fMedMovel35);
bConfirmaçãoMediadeBaixa := (fMedMovel9 < fMedMovel21) and (fMedMovel21 <
fMedMovel35);
bSinalComprado := (IndicadorCompostoSuave > LinhaSinal);
bSinalVendido := (IndicadorCompostoSuave < LinhaSinal);
bConfirmacaoForca := (ADXValor > 20) and (aRSI > 50) and (aRSI < 70);
bSobreComprado := (fStochastic > 70) and (CCIValor > 100);
bSobreVendido := (fStochastic < 30) and (CCIValor < -100);
bSinalContinuacao := (close > close[1]) and (VolumeAtual > fMedMovel21) and
(OBVValor > OBVValor[1]);
bSinalSaidaComprado := (close > close[1]) and (VolumeAtual < fMedMovel21) and
(obv <= obv[1]);
bSinalSaidaVendido := (close < close[1]) and (VolumeAtual < fMedMovel21) and
(obv >= obv[1]);
bMomentumAlta := (MomentumValor > 0);
bMomentumBaixa := (MomentumValor < 0);
///////////////////////////////////////////////////////////
// 5. Coloração por Operação //
///////////////////////////////////////////////////////////
if (bTendenciaHiloAlta) then
PaintBar(RGB(0, 255, 0)); // Cinza para lateralidade
if (bTendenciaHiloBaixa) then
PaintBar(RGB(255, 0, 0)); // Verde para tendência de alta
///////////////////////////////////////////////////////////
// 6 - LOGICA DA OPERAÇÃO COMPRADO E VENDIDO
//////////////////////////////////////////////////////////
bExit := false;
bVendido:= isSold;
bComprado:= isBought;
bHasPosition:= HasPosition;
if (not bHasPosition) then
begin
///////////////////////////////////////////////////////////
// 6.1 - SE NÃO ESTIVER EM OPERAÇÃO
//////////////////////////////////////////////////////////
if (bSinalHiloComprado) then
begin
if (bTendenciaHiloAlta) and (bConfirmaçãoMediadeAlta) then
begin
BuyAtMarket(QtdContratos); // Entra comprado
end;
end;
if (bSinalHiloVendido) then
begin
if (bTendenciaHiloBaixa) and (bConfirmaçãoMediadeBaixa) then
begin
SellShortAtMarket(QtdContratos); // Entra comprado
end;
end;
///////////////////////////////////////////////////////////
// 6.2 - LOGICA PARA INVERTER POSIÇÃO SE NECESSÁRIO
///////////////////////////////////////////////////////////
if (bHasPosition) then
begin
// Caso esteja comprado e sinal de venda seja acionado
if (bVendido) and (bTendenciaHiloAlta) and (bConfirmacaoForca) and
(bSinalContinuacao) then
begin
ReversePosition; // Inverte para vendido
end;
// Caso esteja vendido e sinal de compra seja acionado
if (bComprado) and (bSinalHiloVendido) and (bConfirmacaoForca) and
(bSinalContinuacao) then
begin
ReversePosition; // Inverte para comprado
end;
end;
///////////////////////////////////////////////////////////
// 6.3 - SAIDA DA OPERAÇÃO
//////////////////////////////////////////////////////////
if (bHasPosition) then
begin
if (bComprado) and (adxValor < 20) then // Saida Operação Comprada
ClosePosition;
if (bVendido) and (AdxValor < 20) then // Saida Operação Vendido
ClosePosition;
end;
////////////////////////////////////////////////////////
// 6.4 - TRAILING STOP EM PONTOS
////////////////////////////////////////////////////////
// Trailing Stop para posições compradas
if BuyPositionQty > 0 then
begin
if StopLoss then
begin
// Calcula o novo nível de trailing stop
StopLevel := fPrecoAtual - DistanciaFinanceira;
// Atualiza o trailing stop somente se o novo nível for maior que o
anterior
if (StopAtual = 0) or (StopLevel > StopAtual) then
begin
StopAtual := StopLevel; // Atualiza o nível do stop
SellToCoverStop(StopAtual, StopAtual, BuyPositionQty);
Plottext ("Saidac", ClGreen, 2 , 10);
end;
// Encerra a posição se o preço voltar e atingir o nível do trailing
stop
if Close <= StopAtual then
ClosePosition; // Encerra a posição comprada
end;
end;
// 5.2.1 - Logica Trailing Stop para posições vendidas
if not bexit and bvendido and stoploss then
begin
// Calcula o novo nível de trailing stop
StopLevel := fPrecoAtual + DistanciaFinanceira;
// Atualiza o trailing stop somente se o novo nível for menor que o atual
if (StopAtual = 0) or (StopLevel < StopAtual) then
begin
StopAtual := StopLevel; // Atualiza o nível do stop
BuyToCoverStop(StopAtual, StopAtual, SellPositionQty);
end;
// Encerra a posição se o preço voltar e atingir o nível do trailing stop
if Close >= StopAtual then
Begin
ClosePosition; // Sai da operação vendida
Plottext ("Saidav", ClRed, 0 , 10);
End;
bexit := true;
end;
end;
end;
end;