//+------------------------------------------------------------------+ //| GT - Breakout.mq5 | //| Copyright 2022, GESTÃO TRADER | //| https://www.gestaotrader.com | //+------------------------------------------------------------------+ #property copyright "GESTÃO TRADER" #property link "https://www.gestaotrader.com" #property version "2.6" #property description "Robô Trader Navy Seal" #property description "—————————————————————————" #property description "GESTÃO TRADER | Xayer L. Xavier" #property description "xayerxavier@hotmail.com" #property description "Whatsapp (62) 99433-1331" #property description " " #property description "Estratégia desenvolvida por Xayer L. Xavier" #property description "Programação por: Everson Mayer, Hugo Gava | 2022-2023" #property icon "\\Images\\Icone_Gestao_Trader.ico" //+------------------------------------------------------------------+ //| INCLUSÔES | //+------------------------------------------------------------------+ #include #include //#include //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| CONTROLE | //| DE | //| ACESSO | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ const int NUMERO_MAXIMO_CONTRATOS = 100; const string NOME_NA_CORRETORA = "XAYER LINO XAVIER"; const long NUMERO_CONTA_REAL = 1; const long NUMERO_CONTA_DEMO = 3008889245; const int DIA_DO_VENCIMENTO = 30; const int MES_DO_VENCIMENTO = 6; const int ANO_DO_VENCIMENTO = 2050; //+------------------------------------------------------------------+ //| OUTRAS CONSTANTES | //+------------------------------------------------------------------+ string NOME_NUMERO_MAGICO = "NUMERO_MAGICO"; const int SEGUNDOS_TIMER = 4; const string NOME_ROBO = MQLInfoString(MQL_PROGRAM_NAME); //+------------------------------------------------------------------+ //| ENUM | //+------------------------------------------------------------------+ enum MODO_CONTA { mcNETTING = 0, //Netting mcHEDGING = 1, //Hedge }; enum FILTRO_MEDIAS { UmaMedia = 0, // Acima/Abaixo da Média PEQUENA DuasMedias = 1, // Acima/Abaixo de DUAS Médias TresMedias = 2, // Acima/Abaixo de TRÊS Médias SemMedias = 3, // Sem Médias (Gráfico Puro) LequeTresMedias = 4, // Leque de TRÊS Médias }; enum TIPOS_DE_CONTRATO { MiniIndice = 0, //Mini Indice IndiceCheio = 1, // Indice Cheio MiniDolar = 2, //Mini Dólar DolarCheio = 3, // Dólar Cheio OutrosAtivos = 4, //Outros Ativos (ATIVO CORRENTE) }; enum TIPOS_DE_POSITIONSIZE { PorcentagemConta = 0, //Porcentagem do Saldo em Conta RFixo = 1, // Valor de R fixo LoteFixo = 2, //Lote Fixo }; enum REAL_OU_BACKTEST { ContaReal = 0, //Conta REAL Backtest = 1, //BackTest }; enum TRALING_STOP { Ativa_TralingStop = 0, //Traling Stop ATIVADO Desativa_TralingStop = 1, //Traling Stop DESATIVADO }; enum PORCENTAGEM_DA_CONTA { PorcentagemConta1_0 = 0, //1.0% PorcentagemConta1_5 = 1, //1.5% PorcentagemConta2_0 = 2, //2.0% PorcentagemConta2_5 = 3, //2.5% PorcentagemConta3_0 = 4, //3.0% PorcentagemConta4_0 = 5, //4.0% PorcentagemConta5_0 = 6, //5.0% PorcentagemConta10_0 = 7, //10.0% PorcentagemConta15_0 = 8, //15.0% PorcentagemConta20_0 = 9, //20.0% }; enum ROTEAMENTO { Mini_Indice = 0, //Mini Indice (ATIVO CORRENTE) Indice_Cheio = 1, // Indice Cheio (ATIVO CORRENTE) Mini_Dolar = 2, //Mini Dólar (ATIVO CORRENTE) Dolar_Cheio = 3, // Dólar Cheio (ATIVO CORRENTE) OutrosAtivos = 4, //Outros Ativos (ATIVO CORRENTE) }; enum COMENTARIOS_ROBO { Sim_MostrarOsComentarios = 0, //Sim, mostrar os comentários/variáveis do robô Nao_MostrarOsComentarios = 1, //Não mostrar os comentários/variáveis do robô }; enum INPUT_ALVO_MIN_ENTRADA { Alvo_Pela_Minima_Ou_Maxima = 0, // pela Mínima/Máxima Alvo_Pela_Entrada = 1, // pela Entrada }; enum INPUT_ATR_DIARIO_X_PERIODOS { Habilitado_Atr_Diario = 0, // Só opera se o ATR Diário de XX períodos for maior que XX pontos Desabilitado_Atr_Diario = 1, // Desabilita o filtro do ATR Diário, opera em qq circunstância }; //+------------------------------------------------------------------+ //| INPUTS | //+------------------------------------------------------------------+ input group "■■■■■ CONFIGURAÇÕES POSITIONSIZE ↓" input TIPOS_DE_POSITIONSIZE inputPorcentagemConta = RFixo; // Escolha modo de Positionsize input string ————————————————————— = "———————————————————————————"; input PORCENTAGEM_DA_CONTA inputPorcentagemConta1_5 = PorcentagemConta1_5; // Porcentagem da conta input int valorDoREmReais = 1000; //Valor do R | Risco Financeiro em Reais input int quantidadeDeContratosFixo = 3; //Quantidade de contratos fixo input group "■■■■■ TIPO DE CONTRATO ↓" input TIPOS_DE_CONTRATO inputTipoContrato = MiniIndice; //Pegar Dados Do Seguinte Ativo input ROTEAMENTO inputCrossOrder = Mini_Indice; //Rotear Ordens no Seguinte Ativo input string inputQualTickerAtivo = ""; //Qual TICKER DO ATIVO? Ex: WINQ23 input group "■■■■■ TIPO DE CONTA E OPORTUNIDADES NO DIA ↓" sinput REAL_OU_BACKTEST inputModoDeMercado = ContaReal; //Conta Real ou Backtest?? sinput MODO_CONTA inputModoConta = mcHEDGING; //Tipo de Conta input ulong VALOR_NUMERO_MAGICO = 1000; input int inputMaximoTradesNoDia = 1; input group "■■■■■ COMENTÁRIOS E HORÁRIO DE OPERAÇÃO ↓" input COMENTARIOS_ROBO inputMostrarComentarios = Sim_MostrarOsComentarios; //Mostrar Comentários na tela? sinput string inputHoraInicialAbrirPosicao = "09:05"; //Começa a fazer trade às XX h ? sinput string inputHoraLimiteAbrirPosicao = "17:30"; //Hora limite para fazer trade às XX h ? sinput string inputHorarioVerao = "17:30"; //Fechar Ordens e Posições às XX:XXh? input group "■■■■■ CONFIGURAÇÃO DE MÉDIAS MÓVEIS E ATR ↓" input int inputMMPequena = 34; //Média Móvel Pequena input int inputMMMedia = 144; //Média Móvel Media input int inputMMGrande = 610; //Média Móvel Grande input int inputValorATR = 360; //Valor do ATR de 15 Minutos input group "■■■■■ LÓGICA ↓" input double inputTicksEntrada = 1; //Lançar Ordem a quantos ticks da máxima/mínima? input FILTRO_MEDIAS inputFiltroDasMedias = TresMedias; //Filtro de Médias input string ash = "----"; //---- input int inputATRMaximoDia = 90; //Faz Trade até XX% do ATR Diário. input int inputPercentualRompimento = 50; //Percentual Rompimento (atr do 15). input double inputMultiplicadorDoAlvo = 3.0; //Multiplicador do Alvo (ATR) input string asd43 = "----"; //---- input INPUT_ATR_DIARIO_X_PERIODOS inputAtrDiarioHabilitado = Desabilitado_Atr_Diario; //ATR Diário Maior que XX Pontos? input int inputFiltroAtrDiarioXPontos = 1800; //Se ativado o Filtro Acima, o filtro será de XX pontos input int inputFiltroAtrDiarioXPeriodos = 5; //Se ativado o Filtro Acima, O ATR será de XX períodos input string sdt4 = "----"; //---- input INPUT_ALVO_MIN_ENTRADA inputAlvoPelaMinMaxOuEntrada = Alvo_Pela_Minima_Ou_Maxima; //O Alvo será calculado Por: input TRALING_STOP inputTralingStop = Desativa_TralingStop; //Ativar Traling Stop da MME abaixo? input int inputMMTralingStop = 17; //Média Móvel Do Traling Stop, caso Ativado... input string a1312 = "----"; //---- input double multiplicadorStop = 1.0; // Multiplicador Stop em % | colocar 0 na frente = 0.5 == 50% input double breakeven_multiplicador = 2.0; //multiplicado ATR Breakeven //+------------------------------------------------------------------+ //| VARIAVEIS GLOBAIS | //+------------------------------------------------------------------+ CTrade trade; MqlTick tick; //--- VARIÁVEIS DO ROBÔ double media_movel_pequena = 0; double media_movel_media = 0; double media_movel_grande = 0; double media_movel_tralingstop = 0; double atr_stop_15 = 0; double atr_diario = 0; double atr_diario_filtro_pts = 0; string botao_maxima = ""; string botao_minima = ""; double maxima_do_dia = 0; double minima_do_dia = 0; double valor_do_stop_compra = 0; double alvo_compra = 0; double valor_do_stop_venda = 0; double alvo_venda = 0; ulong horario_executou_robo = TimeLocal(); string comprinha= ""; string vendinha = ""; //---VARIÁVEIS LOOP DE ORDENS E POSIÇÕES ----------------- bool compradoMercado = false, vendidoMercado = false, compradoPendente = false, vendidoPendente = false; bool compradoStop = false; bool vendidoStop = false; ulong ticketCompradoMercado = 0, ticketVendidoMercado = 0, ticketCompradoPendente = 0, ticketVendidoPendente = 0; ulong ticketVendidoStop = 0; ulong ticketCompradoStop = 0; double quantLotesPosicaoCompra = 0; double quantLotesPosicaoVenda = 0; double quantLotesOrdensVenda = 0; double quantLotesOrdensCompra = 0; double quantLotesOrdensStopCompra = 0; double quantLotesOrdensStopVenda = 0; uint quantPosicoesCompraExecutadasNoAtivo = 0; uint quantPosicoesVendaExecutadasNoAtivo = 0; uint quantPosicoesCompraExecutadasGlobal = 0; uint quantPosicoesVendaExecutadasGlobal = 0; uint quantOrdensCompraAbertasNoAtivo = 0; uint quantOrdensVendaAbertasNoAtivo = 0; uint quantOrdensCompraAbertasGlobal = 0; uint quantOrdensVendaAbertasGlobal = 0; double precoDeCompra = 0; double precoDeVenda = 0; double precoPendurouOrdemCompra = 0; double precoPendurouOrdemVenda = 0; double precoPendurouOrdemStopCompra = 0; double precoPendurouOrdemStopVenda = 0; double maiorOrdemDeCompra = 0; double menorOrdemDeVenda = 0; double primeiroPrecoOrdemDeVenda = 0; bool existem_ordem_entao_nao_pode_monitorar_compra = false; bool existem_ordem_entao_nao_pode_monitorar_venda = false; bool se_ta_vendido_no_ask_ou_mais = false; bool se_ta_comprado_no_bid_ou_menos = false; bool enviou_ordem_de_compra = false; //static bool enviou_ordem_de_venda = false; //static bool ordenStopExiste = false; string tipoOrdemAberta = "nada"; bool verificaHorarioPermitidoAbrirPosicao = false; static bool temQueZerarVenda = false; static bool temQueZerarCompra = false; static int quantos_trades_fez_no_dia = 0; bool jaDiminuiuUmaOrdemVenda = true; bool jaDiminuiuUmaOrdemCompra = true; double quantidadeContratos = 0; int minimoDeContratos = 0; double valorFinanceiroPorTickMiniIndice = 0.2; int valorFinanceiroPorTickIndiceCheio = 5; double multiplicadorFinanceiroDoContrato = 0.0; double valorStopEmReais = 0; string NomeTipoDeContrato = " "; double step = 0.0; double seraQueAredonda = 0.0; bool aredondaPeloTOPO = false; bool aredondaPeloFUNDO = false; bool podeTreidar = false; MqlRates candles5[415]; //para candles do 5 min MqlRates candlesDia[2]; //para dia anteriores double valorPorcentagemConta1_0 = 0.010; //1.0% double valorPorcentagemConta1_5 = 0.015; //1.5% double valorPorcentagemConta2_0 = 0.020; //2.0% double valorPorcentagemConta2_5 = 0.025; //1.5% double valorPorcentagemConta3_0 = 0.03; //3.0% double valorPorcentagemConta4_0 = 0.04; //4.0% double valorPorcentagemConta5_0 = 0.05; //5.0% double valorPorcentagemConta10_0 = 0.10; //10.0% double valorPorcentagemConta15_0 = 0.15; //15.0% double valorPorcentagemConta20_0 = 0.20; //20.0% double valorBalancoDaConta = 0; double RPeloBalancoDaConta = 0; static double precoDaLinhaATRAlta= 0.0; static double precoDaLinhaATRBaixa = 0.0; double barra5DeOntemHIGH= 0.0; double barra5DeOntemLOW= 0.0; datetime primeiroCandle5Horario; datetime chaveDiaOntem; string roteamento_symbol = ""; double tickerBase = SymbolInfoDouble(roteamento_symbol, SYMBOL_TRADE_TICK_SIZE); //aqui calcula o valor de 1 tick do mercado/ativo int n_ordens_enviadas = 0; // contador proteção envio massivo de ordens bool marcou_contagem_trades = false; double diferenca_entre_tickers = 0; bool not_printou = false; //-------------------------------------------------------- //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ ENUM_ACCOUNT_TRADE_MODE tipoConta = (ENUM_ACCOUNT_TRADE_MODE) AccountInfoInteger(ACCOUNT_TRADE_MODE); ENUM_ACCOUNT_MARGIN_MODE modoConta = (ENUM_ACCOUNT_MARGIN_MODE) AccountInfoInteger(ACCOUNT_MARGIN_MODE); //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { if (inputModoConta == mcHEDGING) trade.SetExpertMagicNumber(VALOR_NUMERO_MAGICO); //--- create timer EventSetTimer(SEGUNDOS_TIMER); SymbolSelect("IND$N",true); SymbolSelect("WIN$N",true); SymbolSelect(inputQualTickerAtivo,true); if(!VerificarInputs()) ExpertRemove(); ControleDeAcesso(NOME_NA_CORRETORA, NUMERO_CONTA_REAL, NUMERO_CONTA_DEMO, NUMERO_MAXIMO_CONTRATOS, DIA_DO_VENCIMENTO, MES_DO_VENCIMENTO, ANO_DO_VENCIMENTO); //chamada de função para controle de acesso ao robô! return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- destroy timer EventKillTimer(); if (inputTipoContrato == IndiceCheio) SymbolSelect("IND$N",false); if (inputTipoContrato == MiniIndice) SymbolSelect("WIN$N",false); //SymbolSelect(inputQualTickerAtivo,false); RemoverIndicadores(); if (inputModoConta == mcHEDGING) if (GlobalVariableCheck(NOME_NUMERO_MAGICO)) GlobalVariableDel(NOME_NUMERO_MAGICO); // REMOVER O NúMERO MáGICO } void OnTimer(void) { if (inputModoConta == mcHEDGING) trade.SetExpertMagicNumber(VALOR_NUMERO_MAGICO); ControleDeAcesso(NOME_NA_CORRETORA, NUMERO_CONTA_REAL, NUMERO_CONTA_DEMO, NUMERO_MAXIMO_CONTRATOS, DIA_DO_VENCIMENTO, MES_DO_VENCIMENTO, ANO_DO_VENCIMENTO); //chamada de função para controle de acesso ao robô! CriaLinhaATRMinimoDeAltaEBaixa(); //Print("HorarioFechamentoPregaoTodasOrdens() = ", HorarioFechamentoPregaoTodasOrdens()); //Print("HorarioFechamentoPregaoTodasOrdens2() = ", HorarioFechamentoPregaoTodasOrdens2()); if (HorarioFechamentoPregaoTodasOrdens2()) { if (!not_printou) { Print("Chegou no horário para fechamento de ordens e posições. Caso tenha alguma ordem, será fechada!"); not_printou = true; } FecharPosicaoAbertas(); FecharOrdensPendentesCompraDoAtivo(); // Ever | Que tal remover essa função do final do dia já que coloquei após o almoço né? FecharOrdensPendentesVendaDoAtivo(); FecharOrdensPendentesBuyStopAtivo(); FecharOrdensPendentesSellStopAtivo(); } if(HorarioFechamentoPregaoTodasOrdens()) { FecharPosicaoAbertas(); FecharOrdensPendentesCompraDoAtivo(); // Ever | Que tal remover essa função do final do dia já que coloquei após o almoço né? FecharOrdensPendentesVendaDoAtivo(); FecharOrdensPendentesBuyStopAtivo(); FecharOrdensPendentesSellStopAtivo(); } if(VerificarOrdensPosicoes()) { LogicaOperacional(); FecharPosicoesContaHedge(); modificarOrdemStopDaPosicaoDeCompra(); modificarOrdemStopDaPosicaoDeVenda(); AlvoDaCompra(); AlvoDaVenda(); TralingStop(); ProtecaoContraLooping(); //ProtecaoEnvioMassivoOrdens(); } if (!HorarioPermitidoAbrirPosicao() && verificaHorarioPermitidoAbrirPosicao) { //Print("Passou do Horário de almoço!"); verificaHorarioPermitidoAbrirPosicao = false; } } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { CriaLinhaATRMinimoDeAltaEBaixa(); if (HorarioFechamentoPregaoTodasOrdens2()) { FecharOrdensPendentesBuyStopAtivo(); FecharOrdensPendentesSellStopAtivo(); FecharPosicaoAbertas(); FecharOrdensPendentesCompraDoAtivo(); // Ever | Que tal remover essa função do final do dia já que coloquei após o almoço né? FecharOrdensPendentesVendaDoAtivo(); } if(HorarioFechamentoPregaoTodasOrdens()) { FecharPosicaoAbertas(); FecharOrdensPendentesCompraDoAtivo(); // Ever | Que tal remover essa função do final do dia já que coloquei após o almoço né? FecharOrdensPendentesVendaDoAtivo(); FecharOrdensPendentesBuyStopAtivo(); FecharOrdensPendentesSellStopAtivo(); } if(VerificarOrdensPosicoes()) { LogicaOperacional(); FecharPosicoesContaHedge(); modificarOrdemStopDaPosicaoDeCompra(); modificarOrdemStopDaPosicaoDeVenda(); AlvoDaCompra(); AlvoDaVenda(); TralingStop(); ProtecaoContraLooping(); //ProtecaoEnvioMassivoOrdens(); } if (!HorarioPermitidoAbrirPosicao() && verificaHorarioPermitidoAbrirPosicao) { //Print("Passou do Horário de almoço!"); verificaHorarioPermitidoAbrirPosicao = false; } } //+------------------------------------------------------------------+ //| FUNÇÕES OPERACIONAIS | //+------------------------------------------------------------------+ //--- bool LogicaOperacional() { if(!SymbolInfoTick(roteamento_symbol,tick)) { Print("ERRO: Dados de ticks não foram copiados corretamente"); return (false); } MediasEAtr(); bool filtro_do_atr_diario_em_pontos = true; if (inputAtrDiarioHabilitado == Habilitado_Atr_Diario && atr_diario_filtro_pts < inputFiltroAtrDiarioXPontos) { filtro_do_atr_diario_em_pontos = false; //marca o filtro como falso } //bool se_saiu_leilao = SeAtivoSaiuDoLeilao(); int desloc_primeira_barra_dia = SeAtivoSaiuDoLeilaoMarcarPrimeiraBarra(); //aqui pega o valor da função para saber quantas barras precisa deslocar para pegar max e minima da primeira barra static double maxima_primeira_barra = 0; static double minima_primeira_barra = 0; static bool marcou_primeira_barra = false; if(desloc_primeira_barra_dia == 0) marcou_primeira_barra = false; if(desloc_primeira_barra_dia != 0 && !marcou_primeira_barra) { maxima_primeira_barra = iHigh(_Symbol,PERIOD_CURRENT,desloc_primeira_barra_dia); minima_primeira_barra = iLow(_Symbol,PERIOD_CURRENT,desloc_primeira_barra_dia); precoDaLinhaATRAlta = maxima_primeira_barra + (MathRound(atr_stop_15*inputPercentualRompimento/tickerBase)*tickerBase)/100; precoDaLinhaATRBaixa = minima_primeira_barra - (MathRound(atr_stop_15*inputPercentualRompimento/tickerBase)*tickerBase)/100; primeiroCandle5Horario = iTime(_Symbol,PERIOD_CURRENT,desloc_primeira_barra_dia); quantos_trades_fez_no_dia = 0; marcou_primeira_barra = true; } //-- DECLARAR DUAS VARIÁVEIS BOOLEANAS QUE CORRESPONDERAM AOS FILTROS DA MÉDIA static bool filtro_uma_media_venda = false; static bool filtro_uma_media_compra = false; static bool filtro_duas_medias_venda = false; static bool filtro_duas_medias_compra = false; static bool filtro_tres_medias_venda = false; static bool filtro_tres_medias_compra = false; static bool filtro_leque_tres_medias_venda = false; static bool filtro_leque_tres_medias_compra = false; double fechamento_barra_anterior = iClose(_Symbol,PERIOD_CURRENT,1); maxima_do_dia = iHigh(_Symbol, PERIOD_D1, 0); static double maxima_do_dia_compra = 0; minima_do_dia = iLow(_Symbol,PERIOD_D1,0); static double minima_do_dia_venda = 0; double diferenca_maxima_minima = NormalizeDouble(maxima_do_dia - minima_do_dia, _Digits); double percentual_atr_atingido = ((diferenca_maxima_minima*100)/atr_diario); bool atingiu_atr_diario = false; bool diferenca_tickers_deixa_fazer_trade = true; double precoAtual = NormalizeDouble(tick.last, _Digits); double maxima_barra_rompeu = 0; //static double minima_barra_rompeu = 0; double diferenca_maxima_barra_rompeu = 0; double diferenca_minima_barra_rompeu = 0; double percentual_barra_rompeu_maxima = 0; double percentual_barra_rompeu_minima = 0; bool ja_passou_rompimento_minima = false; //Ever | Coloquei no scopo global bool ja_passou_rompimento_maxima = false; //static //bool enviou_ordem_de_compra = false; //static //bool enviou_ordem_de_venda = false; //static if(desloc_primeira_barra_dia == 0) { maxima_primeira_barra = 0; minima_primeira_barra = 0; maxima_barra_rompeu = 0; minima_barra_rompeu = 0; diferenca_maxima_barra_rompeu = 0; diferenca_minima_barra_rompeu = 0; percentual_barra_rompeu_maxima = 0; percentual_barra_rompeu_minima = 0; ja_passou_rompimento_minima = false; ja_passou_rompimento_maxima = false; enviou_ordem_de_compra = false; enviou_ordem_de_venda = false; quantos_trades_fez_no_dia = 0; marcou_contagem_trades = false; maxima_do_dia_compra = 0; minima_do_dia_venda = 0; } if(NovoDia()) { enviou_ordem_de_compra = false; enviou_ordem_de_venda = false; quantos_trades_fez_no_dia = 0; not_printou = false; } //CÁLCULO SE ATINGIU ATR DIARIO if(percentual_atr_atingido >= inputATRMaximoDia) atingiu_atr_diario = true; //SE ATINGIU O ATR DIARIO E TIVER ORDEM START(STOP) ABERTA, ENTAO CANCELA ESSAS ORDENS if (atingiu_atr_diario && VerificarOrdensPosicoes() && !compradoMercado && !vendidoMercado) { //se atingiu ATR do DIA e nao tenho posicao aberta if (ticketCompradoStop != 0) { //se eu tenho uma ordem stop/start de compra aberta FecharOrdensPendentesBuyStopAtivo(); //entao deleto essa ordem } else if (ticketVendidoStop != 0) { //se eu tenho uma ordem stop/start de venda aberta FecharOrdensPendentesSellStopAtivo(); //entao deleto essa ordem } } //CÁLCULO PERCENTUAL DO ATR15 QUE ROMPEU A MÍNIMA/MÁXIMA DA PRIMEIRA BARRA DO DIA if(HorarioPermitidoAbrirPosicao() && !ja_passou_rompimento_minima && fechamento_barra_anterior < minima_primeira_barra) { maxima_barra_rompeu = iHigh(_Symbol, PERIOD_CURRENT, 1); minima_barra_rompeu = iLow(_Symbol, PERIOD_CURRENT, 1); double fechamento_barra_rompeu = iClose(_Symbol, PERIOD_CURRENT, 1); diferenca_minima_barra_rompeu = NormalizeDouble(minima_primeira_barra - fechamento_barra_rompeu, _Digits); percentual_barra_rompeu_minima = ((diferenca_minima_barra_rompeu*100)/atr_stop_15); ja_passou_rompimento_minima = true; } if(HorarioPermitidoAbrirPosicao() && !ja_passou_rompimento_maxima && (maxima_primeira_barra > 0) && fechamento_barra_anterior > maxima_primeira_barra) { maxima_barra_rompeu = iHigh(_Symbol, PERIOD_CURRENT, 1); minima_barra_rompeu = iLow(_Symbol, PERIOD_CURRENT, 1); double fechamento_barra_rompeu = iClose(_Symbol, PERIOD_CURRENT, 1); diferenca_maxima_barra_rompeu = NormalizeDouble(fechamento_barra_rompeu - maxima_primeira_barra, _Digits); percentual_barra_rompeu_maxima = ((diferenca_maxima_barra_rompeu*100)/atr_stop_15); ja_passou_rompimento_maxima = true; //--- verificaHorarioPermitidoAbrirPosicao = true; //Ever | Se o pregão ja começou ativa chave pra zerar operações apenas 1 vez depois que sair do horário de almoço } //LÓGICA PIVO COMPRA bool valida_pivo_compra = false; //if(ja_passou_rompimento_maxima && !compradoMercado) if(!compradoMercado) { valida_pivo_compra = true; } //LÓGICA PIVO VENDA bool valida_pivo_venda = false; //if(ja_passou_rompimento_minima && !vendidoMercado) if(!vendidoMercado) { valida_pivo_venda = true; } //LÓGICA NOVA PARA NAO DEIXAR O ATIVO FAZER TRADE COM SPREAD GRANDE if (HorarioNoveECinco() && (inputTipoContrato == IndiceCheio || Dolar_Cheio)) { double minima_do_dia_do_ticker = iLow(inputQualTickerAtivo,PERIOD_D1,0); double maxima_do_dia_do_ticker = iHigh(inputQualTickerAtivo,PERIOD_D1,0); diferenca_entre_tickers = MathAbs(minima_do_dia-minima_do_dia_do_ticker); if (diferenca_entre_tickers >= (tickerBase*40)) diferenca_tickers_deixa_fazer_trade = false; } //LÓGICA DA VENDA PARA UMA MEDIAS //Ever | Filtro uma media if(fechamento_barra_anterior < media_movel_pequena) { filtro_uma_media_venda = true; } else { filtro_uma_media_venda = false; } //LÓGICA DA COMPRA PARA UMA MEDIAS //Ever | Filtro uma media if(fechamento_barra_anterior > media_movel_pequena) { filtro_uma_media_compra = true; } else { filtro_uma_media_compra = false; } //LÓGICA DA VENDA PARA DUAS MEDIAS if((fechamento_barra_anterior < media_movel_pequena) && ((fechamento_barra_anterior < media_movel_media) || (fechamento_barra_anterior < media_movel_grande))) { filtro_duas_medias_venda = true; } else { filtro_duas_medias_venda = false; } //LÓGICA DA COMPRA PARA DUAS MEDIAS if((fechamento_barra_anterior > media_movel_pequena) && ((fechamento_barra_anterior > media_movel_media) || (fechamento_barra_anterior > media_movel_grande))) { filtro_duas_medias_compra = true; } else { filtro_duas_medias_compra = false; } //LÓGICA DA VENDA PARA TRES MEDIAS if((fechamento_barra_anterior < media_movel_pequena) && (fechamento_barra_anterior < media_movel_media) && (fechamento_barra_anterior < media_movel_grande)) { filtro_tres_medias_venda = true; } else { filtro_tres_medias_venda = false; } //LÓGICA DA COMPRA PARA TRES MEDIAS if((fechamento_barra_anterior > media_movel_pequena) && (fechamento_barra_anterior > media_movel_media) && (fechamento_barra_anterior > media_movel_grande)) { filtro_tres_medias_compra = true; } else { filtro_tres_medias_compra = false; } //LÓGICA DA VENDA PARA LEQUE DE TRES MEDIAS if((fechamento_barra_anterior < media_movel_pequena) && (media_movel_pequena < media_movel_media) && (media_movel_media < media_movel_grande)) { filtro_leque_tres_medias_venda = true; } else { filtro_leque_tres_medias_venda = false; } //LÓGICA DA COMPRA PARA LEQUE DE TRES MEDIAS if((fechamento_barra_anterior > media_movel_pequena) && (media_movel_pequena > media_movel_media) && (media_movel_media > media_movel_grande)) { filtro_leque_tres_medias_compra = true; } else { filtro_leque_tres_medias_compra = false; } bool podeComprar = false; bool podeVender = false; bool podeComprarPivo = false; bool podeVenderPivo = false; if(inputFiltroDasMedias == DuasMedias) { podeComprar = (HorarioPermitidoAbrirPosicao()) && (filtro_duas_medias_compra) && (!atingiu_atr_diario) && (percentual_barra_rompeu_maxima >= inputPercentualRompimento) && (quantos_trades_fez_no_dia < inputMaximoTradesNoDia) && (diferenca_tickers_deixa_fazer_trade) && (filtro_do_atr_diario_em_pontos) && //(tick.last >= ((maxima_do_dia)-(tickerBase*15))) && (!enviou_ordem_de_compra); podeComprarPivo = (HorarioPermitidoAbrirPosicao()) && (filtro_duas_medias_compra) && (!atingiu_atr_diario) && (quantos_trades_fez_no_dia < inputMaximoTradesNoDia) && (diferenca_tickers_deixa_fazer_trade) && (filtro_do_atr_diario_em_pontos) && (enviou_ordem_de_compra) && (tick.last >= ((maxima_do_dia)-(tickerBase*15))) && // tire menos 50 = ((maxima_do_dia+5)-50)) (valida_pivo_compra); podeVender = (HorarioPermitidoAbrirPosicao()) && (filtro_duas_medias_venda) && (!atingiu_atr_diario) && (percentual_barra_rompeu_minima >= inputPercentualRompimento) && (quantos_trades_fez_no_dia < inputMaximoTradesNoDia) && (diferenca_tickers_deixa_fazer_trade) && (filtro_do_atr_diario_em_pontos) && //(tick.last <= ((minima_do_dia-tickerBase)+(tickerBase*15))) && (!enviou_ordem_de_venda); podeVenderPivo = (HorarioPermitidoAbrirPosicao()) && (filtro_duas_medias_venda) && (!atingiu_atr_diario) && (quantos_trades_fez_no_dia < inputMaximoTradesNoDia) && (diferenca_tickers_deixa_fazer_trade) && (filtro_do_atr_diario_em_pontos) && (enviou_ordem_de_venda) && (tick.last <= ((minima_do_dia)+(tickerBase*15))) && // ((minima_do_dia-5)+50)) (valida_pivo_venda); } else if(inputFiltroDasMedias == TresMedias) { podeComprar = (HorarioPermitidoAbrirPosicao()) && (filtro_tres_medias_compra) && (!atingiu_atr_diario) && (percentual_barra_rompeu_maxima >= inputPercentualRompimento) && (quantos_trades_fez_no_dia < inputMaximoTradesNoDia) && (diferenca_tickers_deixa_fazer_trade) && (filtro_do_atr_diario_em_pontos) && //(tick.last >= ((maxima_do_dia)-(tickerBase*15))) && (!enviou_ordem_de_compra); podeComprarPivo = (HorarioPermitidoAbrirPosicao()) && (filtro_tres_medias_compra) && (!atingiu_atr_diario) && (quantos_trades_fez_no_dia < inputMaximoTradesNoDia) && (diferenca_tickers_deixa_fazer_trade) && (enviou_ordem_de_compra) && (filtro_do_atr_diario_em_pontos) && (tick.last > ((maxima_do_dia)-(tickerBase*15))) && // ((maxima_do_dia+5)-50)) && (valida_pivo_compra); podeVender = (HorarioPermitidoAbrirPosicao()) && (filtro_tres_medias_venda) && (!atingiu_atr_diario) && (percentual_barra_rompeu_minima >= inputPercentualRompimento) && //Mudei de > para menos (quantos_trades_fez_no_dia < inputMaximoTradesNoDia) && (diferenca_tickers_deixa_fazer_trade) && (filtro_do_atr_diario_em_pontos) && //(tick.last <= ((minima_do_dia-tickerBase)+(tickerBase*15))) && (!enviou_ordem_de_venda); podeVenderPivo = (HorarioPermitidoAbrirPosicao()) && (filtro_tres_medias_venda) && (!atingiu_atr_diario) && (quantos_trades_fez_no_dia < inputMaximoTradesNoDia) && (diferenca_tickers_deixa_fazer_trade) && (enviou_ordem_de_venda) && (filtro_do_atr_diario_em_pontos) && (tick.last < ((minima_do_dia)+(tickerBase*15))) && // ((minima_do_dia-5)+50)) (valida_pivo_venda); } else if(inputFiltroDasMedias == LequeTresMedias) { podeComprar = (HorarioPermitidoAbrirPosicao()) && (filtro_leque_tres_medias_compra) && (!atingiu_atr_diario) && (percentual_barra_rompeu_maxima >= inputPercentualRompimento) && (quantos_trades_fez_no_dia < inputMaximoTradesNoDia) && (diferenca_tickers_deixa_fazer_trade) && (filtro_do_atr_diario_em_pontos) && //(tick.last >= ((maxima_do_dia)-(tickerBase*15))) && (!enviou_ordem_de_compra); podeComprarPivo = (HorarioPermitidoAbrirPosicao()) && (filtro_leque_tres_medias_compra) && (!atingiu_atr_diario) && (quantos_trades_fez_no_dia < inputMaximoTradesNoDia) && (diferenca_tickers_deixa_fazer_trade) && (enviou_ordem_de_compra) && (filtro_do_atr_diario_em_pontos) && (tick.last > ((maxima_do_dia)-(tickerBase*15))) && // ((maxima_do_dia+5)-50)) && (valida_pivo_compra); podeVender = (HorarioPermitidoAbrirPosicao()) && (filtro_leque_tres_medias_venda) && (!atingiu_atr_diario) && (percentual_barra_rompeu_minima >= inputPercentualRompimento) && //Mudei de > para menos (quantos_trades_fez_no_dia < inputMaximoTradesNoDia) && (diferenca_tickers_deixa_fazer_trade) && (filtro_do_atr_diario_em_pontos) && //(tick.last <= ((minima_do_dia-tickerBase)+(tickerBase*15))) && (!enviou_ordem_de_venda); podeVenderPivo = (HorarioPermitidoAbrirPosicao()) && (filtro_leque_tres_medias_venda) && (!atingiu_atr_diario) && (quantos_trades_fez_no_dia < inputMaximoTradesNoDia) && (diferenca_tickers_deixa_fazer_trade) && (enviou_ordem_de_venda) && (filtro_do_atr_diario_em_pontos) && (tick.last < ((minima_do_dia)+(tickerBase*15))) && // ((minima_do_dia-5)+50)) (valida_pivo_venda); } else if(inputFiltroDasMedias == SemMedias) { podeComprar = (HorarioPermitidoAbrirPosicao()) && (!atingiu_atr_diario) && (percentual_barra_rompeu_maxima >= inputPercentualRompimento) && (quantos_trades_fez_no_dia < inputMaximoTradesNoDia) && (diferenca_tickers_deixa_fazer_trade) && (filtro_do_atr_diario_em_pontos) && //(tick.last >= ((maxima_do_dia)-(tickerBase*15))) && (!enviou_ordem_de_compra); podeComprarPivo = (HorarioPermitidoAbrirPosicao()) && (!atingiu_atr_diario) && (quantos_trades_fez_no_dia < inputMaximoTradesNoDia) && (diferenca_tickers_deixa_fazer_trade) && (enviou_ordem_de_compra) && (filtro_do_atr_diario_em_pontos) && (tick.last >= ((maxima_do_dia+tickerBase)-(tickerBase*15))) && (valida_pivo_compra); podeVender = (HorarioPermitidoAbrirPosicao()) && (!atingiu_atr_diario) && (percentual_barra_rompeu_minima >= inputPercentualRompimento) && (quantos_trades_fez_no_dia < inputMaximoTradesNoDia) && (diferenca_tickers_deixa_fazer_trade) && (filtro_do_atr_diario_em_pontos) && //(tick.last <= ((minima_do_dia-tickerBase)+(tickerBase*15))) && (!enviou_ordem_de_venda); podeVenderPivo = (HorarioPermitidoAbrirPosicao()) && (!atingiu_atr_diario) && (quantos_trades_fez_no_dia < inputMaximoTradesNoDia) && (diferenca_tickers_deixa_fazer_trade) && (enviou_ordem_de_venda) && (filtro_do_atr_diario_em_pontos) && (tick.last <= ((minima_do_dia-tickerBase)+(tickerBase*15))) && (valida_pivo_venda); } else if(inputFiltroDasMedias == UmaMedia) { podeComprar = (HorarioPermitidoAbrirPosicao()) && (filtro_uma_media_compra) && (!atingiu_atr_diario) && (percentual_barra_rompeu_maxima >= inputPercentualRompimento) && (quantos_trades_fez_no_dia < inputMaximoTradesNoDia) && (diferenca_tickers_deixa_fazer_trade) && (filtro_do_atr_diario_em_pontos) && //(tick.last >= ((maxima_do_dia+tickerBase)-(tickerBase*15))) && (!enviou_ordem_de_compra); podeComprarPivo = (HorarioPermitidoAbrirPosicao()) && (filtro_uma_media_compra) && (!atingiu_atr_diario) && (quantos_trades_fez_no_dia < inputMaximoTradesNoDia) && (diferenca_tickers_deixa_fazer_trade) && (enviou_ordem_de_compra) && (filtro_do_atr_diario_em_pontos) && (tick.last >= ((maxima_do_dia+tickerBase)-(tickerBase*15))) && (valida_pivo_compra); podeVender = (HorarioPermitidoAbrirPosicao()) && (filtro_uma_media_venda) && (!atingiu_atr_diario) && (percentual_barra_rompeu_minima >= inputPercentualRompimento) && (quantos_trades_fez_no_dia < inputMaximoTradesNoDia) && (diferenca_tickers_deixa_fazer_trade) && (filtro_do_atr_diario_em_pontos) && //(tick.last <= ((minima_do_dia-tickerBase)+(tickerBase*15))) && (!enviou_ordem_de_venda); podeVenderPivo = (HorarioPermitidoAbrirPosicao()) && (filtro_uma_media_venda) && (!atingiu_atr_diario) && (quantos_trades_fez_no_dia < inputMaximoTradesNoDia) && (diferenca_tickers_deixa_fazer_trade) && (enviou_ordem_de_venda) && (filtro_do_atr_diario_em_pontos) && (tick.last <= ((minima_do_dia-tickerBase)+(tickerBase*15))) && (valida_pivo_venda); } //+------------------------------------------------------------------+ //| roteamento da compra | //+------------------------------------------------------------------+ if(inputPorcentagemConta == PorcentagemConta) { QuantidadeContratosPorPorcentagemDeConta(); } if(inputPorcentagemConta == RFixo) { QuantidadeContratosDoR(); } if(inputPorcentagemConta == LoteFixo) { quantidadeContratos = quantidadeDeContratosFixo; } //---aqui faz a contagem dos trades no dia e deleta a ordem if ((compradoMercado || vendidoMercado) && !marcou_contagem_trades) { quantos_trades_fez_no_dia++; marcou_contagem_trades = true; } if (marcou_contagem_trades && (!compradoMercado && !vendidoMercado)) marcou_contagem_trades = false; //-------- //---aqui deleta a ordem stop de compra caso tenha enviado e voltou 100 pontos if (compradoStop && vendidoMercado) { Print("A ordem Stop de Compra que estava pendurada para tomar posição foi fechada, pois tomou posição de venda"); FecharOrdensPendentesBuyStopAtivo(); enviou_ordem_de_compra = false; tipoOrdemAberta = "nada"; ordenStopExiste = false; } else if (vendidoStop && compradoMercado) { Print("A ordem Stop de Venda que estava pendurada para tomar posição foi fechada, pois tomou posição de compra"); FecharOrdensPendentesSellStopAtivo(); enviou_ordem_de_venda = false; tipoOrdemAberta = "nada"; ordenStopExiste = false; } //-------- //-------- if((podeComprar || podeComprarPivo) && !compradoMercado && !vendidoMercado && !compradoStop && (quantLotesPosicaoCompra < quantidadeContratos) && podeTreidar) { ordenStopExiste = true; // Ever | Chave pra validar loop de deletar ordens pendentes longe do preço e não entrar em loop de deletar ordens tipoOrdemAberta = "compra"; bool ok = false; double adicionar_ticks = tickerBase*inputTicksEntrada; valor_do_stop_compra = ((maxima_do_dia+adicionar_ticks) - (MathRound(atr_stop_15*multiplicadorStop/tickerBase)*tickerBase)); //alvo_compra = (maxima_do_dia+tickerBase) + (MathRound(inputMultiplicadorDoAlvo*atr_stop_15/tickerBase)*tickerBase); ok = trade.BuyStop(quantidadeContratos, maxima_do_dia+adicionar_ticks, roteamento_symbol, valor_do_stop_compra, 0, ORDER_TIME_DAY, DataExpiracao(), NOME_ROBO); enviou_ordem_de_compra = true; jaDiminuiuUmaOrdemCompra = false; // chave para validar diminuição do contador de trades apenas 1 vez por ordem, quando remover ordem stop no on tick n_ordens_enviadas++; //proteção envio massivo de ordens if(ok) { if(trade.ResultRetcode() == 10008 || trade.ResultRetcode() == 10009) { Print("Ordem de COMPRA BuyStop enviada com sucesso!"); } else { Print("ERRO1: COMPRA, BuyStop nao foi enviada"); } } else if (VerificarOrdensPosicoes()) { if (VerificarOrdensPosicoes() && !compradoMercado) { FecharOrdensPendentesBuyStopAtivo(); ok = trade.Buy(quantidadeContratos, roteamento_symbol, maxima_do_dia+tickerBase, valor_do_stop_compra, 0, NOME_ROBO); Print("O preço pulou o gatilho da compra, então o robô COMPROU A MERCADO"); enviou_ordem_de_compra = true; jaDiminuiuUmaOrdemCompra = false; n_ordens_enviadas++; } } // //CRIA LINHA BREAKEVEN COMPRA // datetime barraDaCompra = iTime(_Symbol,PERIOD_CURRENT,0); // ObjectCreate( // 0, // ID de gráfico // "comprinha", // Nome da linha // OBJ_HLINE, // Tipo da linha // 0, // Sub Window // barraDaCompra, // Datetime do objeto // maxima_do_dia+adicionar_ticks // Preço // ); // ObjectSetInteger(0,"comprinha",OBJPROP_STYLE,STYLE_DOT); // ObjectSetInteger(0,"comprinha",OBJPROP_COLOR,clrRed); // // // // // // if (precoAtual >= maxima_do_dia+adicionar_ticks) { // ok = trade.Buy(quantidadeContratos, roteamento_symbol, 0, valor_do_stop_compra, 0, NOME_ROBO); // Print("O robô COMPROU A MERCADO - Preço que tentou comprar = " + DoubleToString(maxima_do_dia+adicionar_ticks, _Digits)); // enviou_ordem_de_compra = true; // jaDiminuiuUmaOrdemCompra = false; // n_ordens_enviadas++; // } } else { //deletar objeto linha horizontal //if( ObjectFind(0,comprinha)>=0 ) ObjectDelete(0,comprinha); } //+------------------------------------------------------------------+ //| roteamento da venda | //+------------------------------------------------------------------+ if((podeVender || podeVenderPivo) && !compradoMercado && !vendidoMercado && !vendidoStop && (quantLotesPosicaoVenda < quantidadeContratos) && podeTreidar) { ordenStopExiste = true; // Ever | Chave pra validar loop de deletar ordens pendentes longe do preço e não entrar em loop de deletar ordens tipoOrdemAberta = "venda"; bool ok = false; double adicionar_ticks = tickerBase*inputTicksEntrada; valor_do_stop_venda = ((minima_do_dia-adicionar_ticks) + (MathRound(atr_stop_15*multiplicadorStop/tickerBase)*tickerBase)); //alvo_venda = (minima_do_dia-tickerBase) - (MathRound(inputMultiplicadorDoAlvo*atr_stop_15/tickerBase)*tickerBase); ok = trade.SellStop(quantidadeContratos, minima_do_dia-adicionar_ticks, roteamento_symbol, valor_do_stop_venda, 0, ORDER_TIME_DAY, DataExpiracao(), NOME_ROBO); enviou_ordem_de_venda = true; jaDiminuiuUmaOrdemVenda = false; // chave para validar diminuição do contador de trades apenas 1 vez por ordem, quando remover ordem stop no on tick n_ordens_enviadas++; //proteção envio massivo de ordens if(ok) { if(trade.ResultRetcode() == 10008 || trade.ResultRetcode() == 10009) { Print("Ordem de VENDA SellStop enviada com sucesso!"); } else { Print("ERRO1: VENDA, SellStop nao foi enviada"); } } else if (VerificarOrdensPosicoes()) { if (VerificarOrdensPosicoes() && !vendidoMercado) { FecharOrdensPendentesSellStopAtivo(); ok = trade.Sell(quantidadeContratos, roteamento_symbol, minima_do_dia-tickerBase, valor_do_stop_venda, 0, NOME_ROBO); Print("O preço pulou o gatilho da venda, então o robô VENDEU A MERCADO"); enviou_ordem_de_venda = true; jaDiminuiuUmaOrdemVenda = false; n_ordens_enviadas++; } } // //CRIA LINHA BREAKEVEN VENDA // datetime barraDaVenda = iTime(_Symbol,PERIOD_CURRENT,0); // ObjectCreate( // 0, // ID de gráfico // "vendinha", // Nome da linha // OBJ_HLINE, // Tipo da linha // 0, // Sub Window // barraDaVenda, // Datetime do objeto // minima_do_dia-adicionar_ticks // Preço // ); // ObjectSetInteger(0,"vendinha",OBJPROP_STYLE,STYLE_DOT); // ObjectSetInteger(0,"vendinha",OBJPROP_COLOR,clrRed); // // // if (precoAtual <= minima_do_dia-adicionar_ticks) { // ok = trade.Sell(quantidadeContratos, roteamento_symbol, 0, valor_do_stop_venda, 0, NOME_ROBO); // Print("O robô VENDEU A MERCADO - Preço que tentou vender = " + DoubleToString(minima_do_dia-adicionar_ticks, _Digits)); // enviou_ordem_de_venda = true; // jaDiminuiuUmaOrdemVenda = false; // n_ordens_enviadas++; // } } else { //deletar objeto linha horizontal //if( ObjectFind(0,vendinha)>=0 ) ObjectDelete(0,vendinha); } if (inputMostrarComentarios == Sim_MostrarOsComentarios) { string string_filtro_atr_diario = ""; if (inputAtrDiarioHabilitado == Habilitado_Atr_Diario) string_filtro_atr_diario = "\n Filtro Atr Diário em "+ (string)inputFiltroAtrDiarioXPontos + "pts, o ATR Diário está marcando " + DoubleToString(atr_diario_filtro_pts, _Digits) + "pts. Pode fazer trade? = " + (string)filtro_do_atr_diario_em_pontos; Comment("marcou_primeira_barra = " + (string)marcou_primeira_barra, "\nquantos_trades_fez_no_dia = (" + (string)quantos_trades_fez_no_dia + "/" + (string)inputMaximoTradesNoDia + ")" + " | marcou_contagem_trades = " + (string)marcou_contagem_trades, "\ndesloc_primeira_barra_dia = " + (string)desloc_primeira_barra_dia, "\nmedia_movel_pequena (" + (string)inputMMPequena + ") = " + DoubleToString(media_movel_pequena, _Digits), "\nmedia_movel_media (" + (string)inputMMMedia + ") = " + DoubleToString(media_movel_media, _Digits), "\nmedia_movel_grande (" + (string)inputMMGrande + ") = " + DoubleToString(media_movel_grande, _Digits), "\natr_stop_15 = " + DoubleToString(atr_stop_15, _Digits), "\natr_diario = " + DoubleToString(atr_diario, _Digits), "\nmaxima_primeira_barra = " + DoubleToString(maxima_primeira_barra, _Digits), "\nminima_primeira_barra = " + DoubleToString(minima_primeira_barra, _Digits), "\n", "\nfechamento_barra_anterior = " + DoubleToString(fechamento_barra_anterior, _Digits), "\nmaxima_do_dia = " + DoubleToString(maxima_do_dia, _Digits), "\nminima_do_dia = " + DoubleToString(minima_do_dia, _Digits), "\ndiferenca_maxima_minima = " + DoubleToString(diferenca_maxima_minima, _Digits), "\npercentual_atr_atingido = " + DoubleToString(percentual_atr_atingido, _Digits) + "% / " + (string)atingiu_atr_diario, "\n", "\nACCOUNT_BALANCE = " + DoubleToString(AccountInfoDouble(ACCOUNT_BALANCE), _Digits), "\nR Pelo Balanco Da Conta = "+ (string)RPeloBalancoDaConta, "\nmaxima_barra_rompeu = " + DoubleToString(maxima_barra_rompeu, _Digits), "\ndiferenca_maxima_barra_rompeu = " + DoubleToString(diferenca_maxima_barra_rompeu, _Digits), "\npercentual_barra_rompeu_maxima = " + DoubleToString(percentual_barra_rompeu_maxima, _Digits), "\nminima_barra_rompeu = " + DoubleToString(minima_barra_rompeu, _Digits), "\ndiferenca_minima_barra_rompeu = " + DoubleToString(diferenca_minima_barra_rompeu, _Digits), "\npercentual_barra_rompeu_minima = " + DoubleToString(percentual_barra_rompeu_minima, _Digits), "\n ja_passou_rompimento_maxima = ", ja_passou_rompimento_maxima, "\n ja_passou_rompimento_minima = ", ja_passou_rompimento_minima, "\nMathRound(atr_stop_15/5)*5) = " + (string)atr_stop_15, //"\nPossível Entrada Compra= " + DoubleToString((maxima_do_dia+tickerBase), _Digits), //"\nPossível Entrada Venda= " + DoubleToString((minima_do_dia-tickerBase), _Digits), "\n ------ " + "\nDiferença de ticks = " + DoubleToString(diferenca_entre_tickers, _Digits) + "pts / " + (string)diferenca_tickers_deixa_fazer_trade + " = deixa fazer trade" + "\nprecoDeCompra = " + DoubleToString(precoDeCompra, _Digits), "\nprecoDeVenda = " + DoubleToString(precoDeVenda, _Digits), //"\nprecoDeVenda + 5 = " + DoubleToString(precoDeVenda+(tickerBase*3), _Digits), //"\nprecoDeVenda + 5.0 = " + DoubleToString(precoDeVenda+(tickerBase*3), _Digits), //"\nstop = " + DoubleToString((maxima_do_dia+1) - atr_stop_15, _Digits), "\nBK Compra = " + DoubleToString((precoDeCompra) + (MathRound(atr_stop_15*breakeven_multiplicador/tickerBase)*tickerBase),_Digits), "\nBK Venda = " + DoubleToString((precoDeVenda) - (MathRound(breakeven_multiplicador*atr_stop_15/tickerBase)*tickerBase),_Digits), "\nAlvo Compra = " + string(MathRound(inputMultiplicadorDoAlvo*atr_stop_15/tickerBase)*tickerBase) + " pts -> " + DoubleToString(alvo_compra, _Digits), "\nAlvo Venda = " + string(MathRound(inputMultiplicadorDoAlvo*atr_stop_15/tickerBase)*tickerBase) + " pts -> " + DoubleToString(alvo_venda, _Digits), "\n ------ " + "\nenviou_ordem_de_compra = " + (string)enviou_ordem_de_compra, "\nenviou_ordem_de_venda = " + (string)enviou_ordem_de_venda, string_filtro_atr_diario + // "\nquantos_trades_fez_no_dia = " + (string)quantos_trades_fez_no_dia, "\n", "\n1 HorarioPermitidoAbrirPosicao= " + (string)HorarioPermitidoAbrirPosicao(), "\n2 Filtro_tres_medias_compra= " + (string)(filtro_tres_medias_compra), "\n3 !Atingiu_atr_diario= " + (string)!atingiu_atr_diario, "\n4 Percentual_barra_rompeu_maxima = " + (string)(percentual_barra_rompeu_maxima >= inputPercentualRompimento), "\n5 Enviou Ordem de Compra = " + (string)enviou_ordem_de_compra, "\n6 Enviou Ordem de Venda= " + (string)enviou_ordem_de_venda, "\n7 CompradoMercado= " + (string)compradoMercado, "\n8 VendidoMercado= " + (string)vendidoMercado, "\n" + "\nquantidadeContratos = " + (string)quantidadeContratos + "\n1 HorarioPermitidoAbrirPosicao= " + (string)HorarioPermitidoAbrirPosicao() + "\n2 filtro_tres_medias_venda= " + (string)(filtro_tres_medias_venda) + "\n3 !Atingiu_atr_diario= " + (string)!atingiu_atr_diario + "\n4 percentual_barra_rompeu_minima = " + (string)(percentual_barra_rompeu_minima >= inputPercentualRompimento) + " VALOR percentual_barra_rompeu_minima = " + DoubleToString(percentual_barra_rompeu_minima, _Digits) + "\n5 VALOR_NUMERO_MAGICO =" + (string)VALOR_NUMERO_MAGICO + "\n6 !Enviou Ordem de Venda= " + (string)!enviou_ordem_de_venda + "\n7 !CompradoMercado= " + (string)!compradoMercado + "\n8 !VendidoMercado= " + (string)!vendidoMercado + "\n9 !vendidoStop " + (string)!vendidoStop + "\n10 (quantos_trades_fez_no_dia < inputMaximoTradesNoDia) = " + (string)(quantos_trades_fez_no_dia < inputMaximoTradesNoDia) + "\n11 (quantLotesPosicaoVenda < quantidadeContratos) = " + (string)(quantLotesPosicaoVenda < quantidadeContratos) + "\n12 podeTreidar = " + (string)podeTreidar ); } return (true); } //--- bool modificarOrdemStopDaPosicaoDeCompra() { double se_atingir_bk_compra = ((precoDeCompra) + (MathRound(breakeven_multiplicador*atr_stop_15/tickerBase)*tickerBase)); double precoNovoStopDaPosicaoDeCompra = (precoDeCompra-(tickerBase*2)); static bool passou_pela_logica_compra = false; // static if (!compradoMercado) passou_pela_logica_compra = false; //CRIA LINHA BREAKEVEN COMPRA datetime barraDoBreakevenCompra = iTime(_Symbol,PERIOD_CURRENT,0); ObjectCreate( 0, // ID de gráfico "breakevenlineCompra1", // Nome da linha OBJ_HLINE, // Tipo da linha 0, // Sub Window barraDoBreakevenCompra, // Datetime do objeto se_atingir_bk_compra // Preço ); ObjectSetInteger(0,"breakevenlineCompra1",OBJPROP_STYLE,STYLE_DOT); ObjectSetInteger(0,"breakevenlineCompra1",OBJPROP_COLOR,clrBlue); //LÓGICA ORDEM STOP BREAKEVEN if (precoDeCompra != 0) { if((tick.last >= se_atingir_bk_compra) && !passou_pela_logica_compra) { passou_pela_logica_compra = true; int positionsTotal = PositionsTotal(); for(int i=0; i < positionsTotal && !IsStopped(); i++) { ulong posTicket = PositionGetTicket(i); if(PositionSelectByTicket(posTicket)) { ulong posMagic = PositionGetInteger(POSITION_MAGIC); string posSymbol = PositionGetString(POSITION_SYMBOL); ENUM_POSITION_TYPE posType = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); if(inputModoConta == mcNETTING) { if(posSymbol == roteamento_symbol) { if(posType == POSITION_TYPE_BUY) { bool ok = trade.PositionModify(posTicket, precoNovoStopDaPosicaoDeCompra, 0); if(ok) { if(trade.ResultRetcode() == 10008 || trade.ResultRetcode() == 10009) { Print("AQUIIIII - Ordem de STOP da Posição de Compra foi modificada para o BreakEven COMPRA"); } else { Print("O robô " + NOME_ROBO + " teve um problema ao mofidicar a Ordem Stop para o BreakEven " + roteamento_symbol); return(false); } } else { Print("ERRO: Erro ao enviar a modificação da Ordem de STOP da compra do ativo para o BreakEven " + roteamento_symbol); return(false); } } } } else { if(posSymbol == roteamento_symbol && posMagic == VALOR_NUMERO_MAGICO) { if(posType == POSITION_TYPE_BUY ) //Talvez adicionar ordem BUY STOP { bool ok = trade.PositionModify(posTicket, precoNovoStopDaPosicaoDeCompra, 0); if(ok) { if(trade.ResultRetcode() == 10008 || trade.ResultRetcode() == 10009) { //modificouOrdemStop = 1; Print("Ordem de STOP da Posição de Compra foi modificada para o BreakEven"); } else { Print("O robô " + NOME_ROBO + " teve um problema ao mofidicar a Ordem Stop para o BreakEven " + roteamento_symbol); return(false); } } else { Print("ERRO: Erro ao enviar a modificação da Ordem de STOP da compra do ativo para o BreakEven " + roteamento_symbol); return(false); } } } } } } } } return true; } //--- bool modificarOrdemStopDaPosicaoDeVenda() { double se_atingir_bk = ((precoDeVenda) - (MathRound(breakeven_multiplicador*atr_stop_15/tickerBase)*tickerBase)); double precoNovoStopDaPosicaoDeVenda = (precoDeVenda+(tickerBase*2)); static bool passou_pela_logica = false; if (!vendidoMercado) passou_pela_logica = false; //CRIA LINHA BREAKEVEN COMPRA datetime barraDoBreakevenVenda = iTime(_Symbol,PERIOD_CURRENT,0); ObjectCreate( 0, // ID de gráfico "breakevenlineVenda1", // Nome da linha OBJ_HLINE, // Tipo da linha 0, // Sub Window barraDoBreakevenVenda, // Datetime do objeto se_atingir_bk // Preço ); ObjectSetInteger(0,"breakevenlineVenda1",OBJPROP_STYLE,STYLE_DOT); ObjectSetInteger(0,"breakevenlineVenda1",OBJPROP_COLOR,clrBlue); //LÓGICA ORDEM STOP BREAKEVEN if (precoDeVenda != 0) { if((tick.last <= se_atingir_bk) && !passou_pela_logica) { passou_pela_logica = true; int positionsTotal = PositionsTotal(); for(int i=0; i < positionsTotal && !IsStopped(); i++) { ulong posTicket = PositionGetTicket(i); if(PositionSelectByTicket(posTicket)) { ulong posMagic = PositionGetInteger(POSITION_MAGIC); string posSymbol = PositionGetString(POSITION_SYMBOL); ENUM_POSITION_TYPE posType = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); if(inputModoConta == mcNETTING) { if(posSymbol == roteamento_symbol) { if(posType == POSITION_TYPE_SELL ) //Talvez adicionar ordem SELL STOP { bool ok = trade.PositionModify(posTicket, precoNovoStopDaPosicaoDeVenda, 0); if(ok) { if(trade.ResultRetcode() == 10008 || trade.ResultRetcode() == 10009) { //modificouOrdemStop = 1; Print("Ordem de STOP da Posição de Venda foi modificada para o BreakEven"); } else { Print("O robô " + NOME_ROBO + " teve um problema ao mofidicar a Ordem Stop para o BreakEven " + roteamento_symbol); return(false); } } else { Print("ERRO: Erro ao enviar a modificação da Ordem de STOP da compra do ativo para o BreakEven " + roteamento_symbol); return(false); } } } } else { if(posSymbol == roteamento_symbol && posMagic == VALOR_NUMERO_MAGICO) { if(posType == POSITION_TYPE_SELL) { bool ok = trade.PositionModify(posTicket, precoNovoStopDaPosicaoDeVenda, 0); if(ok) { if(trade.ResultRetcode() == 10008 || trade.ResultRetcode() == 10009) { //modificouOrdemStop = 1; Print("Ordem de STOP da Posição de Venda foi modificada para o BreakEven"); } else { Print("O robô " + NOME_ROBO + " teve um problema ao mofidicar a Ordem Stop para o BreakEven " + roteamento_symbol); return(false); } } else { Print("ERRO: Erro ao enviar a modificação da Ordem de STOP da compra do ativo para o BreakEven " + roteamento_symbol); return(false); } } } } } } } } return true; } //--- //bool FecharPosicoesContaHedge() { // // //+----------------------------------------------------------------+ // //| SE TIVER UMA COMPRA E VENDA POSICIONADAS, FECHA UMA PELA OUTRA | // //+----------------------------------------------------------------+ // if (inputModoConta == mcHEDGING) { // if (compradoMercado && vendidoMercado && (quantLotesVenda == quantLotesPosicaoVenda)) { // bool ok = trade.PositionCloseBy(ticketCompradoMercado, ticketVendidoMercado); // // if (ok) { // if (trade.ResultRetcode() == 10008 || trade.ResultRetcode() == 10009) { // Print("O robô " + NOME_ROBO + " executou a ZERAGEM TOTAL das " + valorTravadoQtdAcoesComprou + " açoes que deveria comprar, do ativo " + _Symbol); // } else { // Print("ERRO: Retorno inesperado do servidor (trade.PositionCloseBy)"); // // return(false); // } // } else { // Print("ERRO: Erro ao enviar trade.PositionCloseBy"); // // return(false); // } // } // /* // else if (compradoMercado && vendidoMercado && (quantLotesVenda > quantLotesPosicaoVenda)) { // bool ok = trade.PositionClosePartial(_Symbol, quantLotesPosicaoVenda, 0); // // if (ok) { // if (trade.ResultRetcode() == 10008 || trade.ResultRetcode() == 10009) { // Print("O robô " + NOME_ROBO + " executou a ZERAGEM PARCIAL de " + quantLotesPosicaoVenda + " de " + valorTravadoQtdAcoesComprou + " açoes do ativo " + _Symbol); // } else { // Print("ERRO: Retorno inesperado do servidor (trade.PositionClosePartial)"); // // return(false); // } // } else { // Print("ERRO: Erro ao enviar trade.PositionClosePartial"); // // return(false); // } // // } // */ // } // // return true; //} //--- Medias Móveis e ATR bool MediasEAtr() { //---MA int MediaMovelPequenaHandler = INVALID_HANDLE; int MediaMovelMediaHandler = INVALID_HANDLE; int MediaMovelGrandeHandler = INVALID_HANDLE; int MediaMovelTralingStopHandler = INVALID_HANDLE; int atrHandler = INVALID_HANDLE; int atrDiarioHandler = INVALID_HANDLE; int atrDiarioFiltroPtsHandler = INVALID_HANDLE; double MediaMovelPequenaBuffer[]; double MediaMovelMediaBuffer[]; double MediaMovelGrandeBuffer[]; double MediaMovelTralingStopBuffer[]; double atrBuffer[]; double atrDiarioBuffer[]; double atrDiarioFiltroPtsBuffer[]; ArraySetAsSeries(MediaMovelPequenaBuffer, true); ArraySetAsSeries(MediaMovelMediaBuffer, true); ArraySetAsSeries(MediaMovelGrandeBuffer, true); ArraySetAsSeries(MediaMovelTralingStopBuffer, true); ArraySetAsSeries(atrBuffer, true); ArraySetAsSeries(atrDiarioBuffer, true); ArraySetAsSeries(atrDiarioFiltroPtsBuffer, true); string simbolo_media_grande = "WIN$N"; string simbolo_media_media = "WIN$N"; string simbolo_ATR = "WIN$N"; roteamento_symbol = ""; if (inputTipoContrato == IndiceCheio) { simbolo_media_grande = "IND$N"; simbolo_media_media = "IND$N"; simbolo_ATR = "IND$N"; roteamento_symbol = inputQualTickerAtivo; } else if (inputTipoContrato == MiniIndice) { simbolo_media_grande = "WIN$N"; simbolo_media_media = "WIN$N"; simbolo_ATR = "WIN$N"; roteamento_symbol = inputQualTickerAtivo; } else if (inputTipoContrato == MiniDolar) { simbolo_media_grande = "WDO$N"; simbolo_media_media = "WDO$N"; simbolo_ATR = "WDO$N"; roteamento_symbol = inputQualTickerAtivo; } else if (inputTipoContrato == DolarCheio) { simbolo_media_grande = "DOL$N"; simbolo_media_media = "DOL$N"; simbolo_ATR = "DOL$N"; roteamento_symbol = inputQualTickerAtivo; } else { simbolo_media_grande = _Symbol; simbolo_media_media = _Symbol; simbolo_ATR = _Symbol; roteamento_symbol = _Symbol; } ////---AQUI DEFINE QUAL ATIVO VAI OPERAR //if (inputCrossOrder == Mini_Indice) { //roteamento_symbol = _Symbol; //} else if (inputCrossOrder == Ativa_CrossOrder_Indice) { //roteamento_symbol = _Symbol; //} else if (inputCrossOrder == Ativa_CrossOrder_Dolar) { //roteamento_symbol = _Symbol; //} //--- MediaMovelPequenaHandler = iMA(_Symbol, PERIOD_CURRENT, inputMMPequena, 0, MODE_EMA, PRICE_CLOSE); MediaMovelMediaHandler = iMA(simbolo_media_media, PERIOD_CURRENT, inputMMMedia, 0, MODE_EMA, PRICE_CLOSE); MediaMovelGrandeHandler = iMA(simbolo_media_grande, PERIOD_CURRENT, inputMMGrande, 0, MODE_EMA, PRICE_CLOSE); MediaMovelTralingStopHandler = iMA(_Symbol, PERIOD_CURRENT, inputMMTralingStop, 0, MODE_EMA, PRICE_CLOSE); atrHandler = iATR(simbolo_ATR, PERIOD_M15, inputValorATR); atrDiarioHandler = iATR(simbolo_ATR, PERIOD_D1, 20); atrDiarioFiltroPtsHandler = iATR(simbolo_ATR, PERIOD_D1, inputFiltroAtrDiarioXPeriodos); if(MediaMovelPequenaHandler != INVALID_HANDLE) CopyBuffer(MediaMovelPequenaHandler, 0, 0, 2, MediaMovelPequenaBuffer); if(MediaMovelMediaHandler != INVALID_HANDLE) CopyBuffer(MediaMovelMediaHandler, 0, 0, 2, MediaMovelMediaBuffer); if(MediaMovelGrandeHandler != INVALID_HANDLE) CopyBuffer(MediaMovelGrandeHandler, 0, 0, 2, MediaMovelGrandeBuffer); if(MediaMovelTralingStopHandler != INVALID_HANDLE) CopyBuffer(MediaMovelTralingStopHandler, 0, 0, 2, MediaMovelTralingStopBuffer); if(atrHandler != INVALID_HANDLE) CopyBuffer(atrHandler, 0, 0, 2, atrBuffer); if(atrDiarioHandler != INVALID_HANDLE) CopyBuffer(atrDiarioHandler, 0, 0, 2, atrDiarioBuffer); if(atrDiarioHandler != INVALID_HANDLE) CopyBuffer(atrDiarioFiltroPtsHandler, 0, 0, 5, atrDiarioFiltroPtsBuffer); media_movel_pequena = NormalizeDouble(MediaMovelPequenaBuffer[0], _Digits); media_movel_media = NormalizeDouble(MediaMovelMediaBuffer[0], _Digits); media_movel_grande = NormalizeDouble(MediaMovelGrandeBuffer[0], _Digits); media_movel_tralingstop = NormalizeDouble(MediaMovelTralingStopBuffer[1], _Digits); atr_stop_15 = NormalizeDouble(atrBuffer[0], _Digits); atr_diario = NormalizeDouble(atrDiarioBuffer[0], _Digits); atr_diario_filtro_pts = NormalizeDouble(atrDiarioFiltroPtsBuffer[1], _Digits); ChartIndicatorAdd(0,0,MediaMovelPequenaHandler); ChartIndicatorAdd(0,0,MediaMovelMediaHandler); ChartIndicatorAdd(0,0,MediaMovelGrandeHandler); //adicionando e removendo o atr do gráfico static bool habilitou_atr = false; if (inputAtrDiarioHabilitado == Habilitado_Atr_Diario && !habilitou_atr) { ChartIndicatorAdd(0,1,atrDiarioFiltroPtsHandler); habilitou_atr = true; } if (inputAtrDiarioHabilitado == Desabilitado_Atr_Diario && habilitou_atr) { habilitou_atr = false; RemoverIndicadores(); } //DELETAR A MME DO TRALINGSTOP CASO O TRALLINGSTOP SEJA DESATIVADO static bool removeu_indicador = false; if (inputTralingStop == Ativa_TralingStop) { ChartIndicatorAdd(0,0,MediaMovelTralingStopHandler); removeu_indicador = false; } else if ( (inputTralingStop == Desativa_TralingStop) && !removeu_indicador) { RemoverIndicadores(); removeu_indicador = true; } //if (!ChartIndicatorAdd(0,0,MediaMovelPequenaHandler)) Print("Erro ao adicionar a Média de " + inputMMPequena + " no gráfico"); //if (!ChartIndicatorAdd(0,0,MediaMovelMediaHandler)) Print("Erro ao adicionar a Média de " + inputMMMedia + " no gráfico"); //if (!ChartIndicatorAdd(0,0,MediaMovelGrandeHandler)) Print("Erro ao adicionar a Média de " + inputMMGrande + " no gráfico"); return true; } //--- bool VerificarInputs() { Print("NOME_NUMERO_MAGICO = ", NOME_NUMERO_MAGICO); Print("VALOR_NUMERO_MAGICO = ", VALOR_NUMERO_MAGICO); if(!TerminalInfoInteger(TERMINAL_TRADE_ALLOWED)) { Print("ERRO: Verifique se a negociação automatizada é permitida nas configurações do terminal!"); return false; } if(!MQLInfoInteger(MQL_TRADE_ALLOWED)) { Print("ERRO: A negociação automatizada é proibida nas configurações do Robô!"); return false; } if(inputModoConta == mcHEDGING) { if(GlobalVariableCheck(NOME_NUMERO_MAGICO)) { double valor = GlobalVariableGet(NOME_NUMERO_MAGICO); //Print("valor = " + valor); if(valor != 0 && valor != VALOR_NUMERO_MAGICO) { //Print("ERRO: Número Mágico incorreto!"); //return false; } //return true; } else GlobalVariableSet(NOME_NUMERO_MAGICO, VALOR_NUMERO_MAGICO); } if(inputModoConta == mcNETTING && modoConta != ACCOUNT_MARGIN_MODE_RETAIL_NETTING) { Print(modoConta); Print("ERRO: Este robô só poderá ser executado em conta !HEDGING!"); return false; } if(inputModoConta == mcHEDGING && modoConta != ACCOUNT_MARGIN_MODE_RETAIL_HEDGING) { Print(modoConta); Print("ERRO: Este robô só poderá ser executado em conta NETTING"); return false; } if (inputQualTickerAtivo == "") { Print("ERRO: Defina o ticker que será operado!!"); return false; } //if(inputQuantidadeContratos == 0) // AQUI talvez se colocar os lotes baseado em R pode Travar o robo no replay // { // Print("ERRO: É obrigatótio informar a Quantidade de Contratos!"); // return false; // } Print("Seja Bem Vindo! Eu sou o escravo da @ Gestão Trader. v2 "); Print("Acomode-se e aproveite a viagem. "); return true; } //--- bool RemoverIndicadores() { int subWindows = (int) ChartGetInteger(0, CHART_WINDOWS_TOTAL); for(int i = subWindows-1; i>=0; i--) { int inds = ChartIndicatorsTotal(0,i); if(inds >= 1) { for(int j = inds; j >= 0; j--) { string indName = ChartIndicatorName(0, i, j); ChartIndicatorDelete(0, i, indName); } } } return true; } //--- datetime DataExpiracao() { MqlRates barraAtuala[]; CopyRates(_Symbol, PERIOD_D1, 0, 1, barraAtuala); return barraAtuala[0].time + 86399; //'23:59:59' } //--- int SeAtivoSaiuDoLeilaoMarcarPrimeiraBarra() { static int contagem_de_barras = 0; static bool rodei_o_looping = false; static bool virou_alguma_barra_1_minuto = false; if(NovoDia() || (contagem_de_barras == 0)) { virou_alguma_barra_1_minuto = false; rodei_o_looping = false; contagem_de_barras = 0; } if(NovaBarra1Minuto() && !virou_alguma_barra_1_minuto) virou_alguma_barra_1_minuto = true; if(!rodei_o_looping) //para backtestar a funcao com gráfico parado { //if (virou_alguma_barra_1_minuto && !rodei_o_looping) { datetime hoje = iTime(_Symbol,PERIOD_CURRENT,0); MqlDateTime hoje_struct, barra; TimeToStruct(hoje,hoje_struct); int dia_hoje = (int)hoje_struct.day; int barra_atual = (int)barra.day; for(int i=1; i<200; i++) { datetime numero_barras_5_minutos = iTime(_Symbol,PERIOD_CURRENT,i); MqlDateTime numero_barras_5_minutos_struct; TimeToStruct(numero_barras_5_minutos,numero_barras_5_minutos_struct); int dia_da_contagem_barras = (int)numero_barras_5_minutos_struct.day; if(dia_da_contagem_barras == dia_hoje) contagem_de_barras++; } //Print("contagem_de_barras = ", contagem_de_barras); rodei_o_looping = true; } return (contagem_de_barras); } //--- bool NovaBarra1Minuto() { static datetime ultimaHora = 0; datetime ultimaHoraBarra = (datetime) SeriesInfoInteger(_Symbol, PERIOD_M1, SERIES_LASTBAR_DATE); if(ultimaHora == 0) { ultimaHora = ultimaHoraBarra; return false; } if(ultimaHora != ultimaHoraBarra) { ultimaHora = ultimaHoraBarra; return true; } return false; } //--- bool NovoDia() { static datetime today; if(today != iTime(_Symbol, PERIOD_D1, 0)) { today = iTime(_Symbol, PERIOD_D1, 0); //Print("É um novo dia: ", TimeToString(today)); return true; } else //Print("Não é um novo dia!"); return false; } //--- bool HorarioPermitidoAbrirPosicao() { string horaInicialAbrirPosicao = inputHoraInicialAbrirPosicao; //Aqui Seta o Horário que o robô vai começar a operar string horaLimiteComprar = inputHoraLimiteAbrirPosicao; //Aqui Seta o Horário que o robô vai parar de fazer entradas/operar MqlDateTime horaAtual, horarioLimiteAbrirPosicao, horarioInicialAbrirPosicao; TimeToStruct(TimeCurrent(), horaAtual); TimeToStruct(StringToTime(horaLimiteComprar), horarioLimiteAbrirPosicao); TimeToStruct(StringToTime(horaInicialAbrirPosicao), horarioInicialAbrirPosicao); if((horarioInicialAbrirPosicao.hour == horarioLimiteAbrirPosicao.hour) && (horaAtual.hour == horarioInicialAbrirPosicao.hour) && (horaAtual.min >= horarioInicialAbrirPosicao.min) && (horaAtual.min <= horarioLimiteAbrirPosicao.min)) return true; if((horarioInicialAbrirPosicao.hour != horarioLimiteAbrirPosicao.hour) && (horaAtual.hour == horarioInicialAbrirPosicao.hour) && (horaAtual.min >= horarioInicialAbrirPosicao.min)) return true; if((horarioInicialAbrirPosicao.hour != horarioLimiteAbrirPosicao.hour) && (horaAtual.hour != horarioLimiteAbrirPosicao.hour) && (horaAtual.hour != horarioInicialAbrirPosicao.hour) && (horaAtual.hour > horarioInicialAbrirPosicao.hour) && (horaAtual.hour < horarioLimiteAbrirPosicao.hour)) return true; if((horarioInicialAbrirPosicao.hour != horarioLimiteAbrirPosicao.hour) && (horaAtual.hour == horarioLimiteAbrirPosicao.hour) && (horaAtual.min <= horarioLimiteAbrirPosicao.min)) return true; if(horarioInicialAbrirPosicao.hour > horarioLimiteAbrirPosicao.hour) { FecharOrdensPendentesCompraDoAtivo(); // Por ever | Fecha ordens stop pendentes COMPRA após o almoço FecharOrdensPendentesVendaDoAtivo(); // Por ever | Fecha ordens stop pendentes COMPRA após o almoço ExpertRemove(); Print("ERRO: Os horários fornecidos estão inválidos!"); } return false; } //--- bool HorarioNoveECinco() { string horaInicialAbrirPosicao = "09:05"; //Aqui Seta o Horário que o robô vai começar a operar string horaLimiteComprar = "17:55"; //Aqui Seta o Horário que o robô vai parar de fazer entradas/operar MqlDateTime horaAtual, horarioLimiteAbrirPosicao, horarioInicialAbrirPosicao; TimeToStruct(TimeCurrent(), horaAtual); TimeToStruct(StringToTime(horaLimiteComprar), horarioLimiteAbrirPosicao); TimeToStruct(StringToTime(horaInicialAbrirPosicao), horarioInicialAbrirPosicao); if ((horarioInicialAbrirPosicao.hour == horarioLimiteAbrirPosicao.hour) && (horaAtual.hour == horarioInicialAbrirPosicao.hour) && (horaAtual.min >= horarioInicialAbrirPosicao.min) && (horaAtual.min <= horarioLimiteAbrirPosicao.min)) return true; if ((horarioInicialAbrirPosicao.hour != horarioLimiteAbrirPosicao.hour) && (horaAtual.hour == horarioInicialAbrirPosicao.hour) && (horaAtual.min >= horarioInicialAbrirPosicao.min)) return true; if ((horarioInicialAbrirPosicao.hour != horarioLimiteAbrirPosicao.hour) && (horaAtual.hour != horarioLimiteAbrirPosicao.hour) && (horaAtual.hour != horarioInicialAbrirPosicao.hour) && (horaAtual.hour > horarioInicialAbrirPosicao.hour) && (horaAtual.hour < horarioLimiteAbrirPosicao.hour)) return true; if ((horarioInicialAbrirPosicao.hour != horarioLimiteAbrirPosicao.hour) && (horaAtual.hour == horarioLimiteAbrirPosicao.hour) && (horaAtual.min <= horarioLimiteAbrirPosicao.min)) return true; return false; } //+------------------------------------------------------------------+ //--- bool HorarioFechamentoPregaoTodasOrdens() { string hora = inputHorarioVerao; MqlDateTime horaAtual, horarioLimiteFecharOrdem; TimeToStruct(TimeCurrent(), horaAtual); TimeToStruct(StringToTime(hora), horarioLimiteFecharOrdem); //Print("horarioFechamentoPregao = " + horarioLimiteFecharOrdem.day + "/" + horarioLimiteFecharOrdem.mon + "/" + horarioLimiteFecharOrdem.year + " " + horarioLimiteFecharOrdem.hour + ":" + horarioLimiteFecharOrdem.min); if(horaAtual.hour > horarioLimiteFecharOrdem.hour) return true; if((horaAtual.hour == horarioLimiteFecharOrdem.hour) && (horaAtual.min >= horarioLimiteFecharOrdem.min)) return true; return false; } bool HorarioFechamentoPregaoTodasOrdens2() { ushort hora1 = StringGetCharacter(inputHorarioVerao,0); ushort hora2 = StringGetCharacter(inputHorarioVerao,1); ushort min1 = StringGetCharacter(inputHorarioVerao,3); ushort min2 = StringGetCharacter(inputHorarioVerao,4); string valor_hora1 = ShortToString(hora1); string valor_hora2 = ShortToString(hora2); string valor_min1 = ShortToString(min1); string valor_min2 = ShortToString(min2); uint HoraInicial_ = uint(valor_hora1 + valor_hora2); uint MinInicial_ = uint(valor_min1 + valor_min2); uint HoraFinal_ = 18; uint MinFinal_ = 00; // StringSubstr -> proibido !!! -> torna o backtest extremamente lento !!! MqlRates dailyBar[]; int copied = CopyRates(_Symbol,PERIOD_D1,0,1,dailyBar); if(copied==1) { // datetime dateStart = dailyBar[0].time; // '2019.11.15 00:00:00' datetime tempoInicial = dailyBar[0].time + (HoraInicial_*60*60) + (MinInicial_*60); datetime tempoFinal = dailyBar[0].time + (HoraFinal_*60*60) + (MinFinal_*60); datetime timeNow = TimeCurrent(); // if( timeNow>=tempoInicial && timeNow maiorOrdemDeCompra) maiorOrdemDeCompra = NormalizeDouble(precoPendurouOrdemCompra, _Digits); } if(orderType == ORDER_TYPE_SELL_LIMIT) { quantOrdensVendaAbertasNoAtivo++; vendidoPendente = true; quantLotesOrdensVenda = (quantLotesOrdensVenda + NormalizeDouble(OrderGetDouble(ORDER_VOLUME_CURRENT), _Digits)); ticketVendidoPendente = orderTicket; precoPendurouOrdemVenda = NormalizeDouble(OrderGetDouble(ORDER_PRICE_OPEN), _Digits); } } } else { if((orderMagic == VALOR_NUMERO_MAGICO) && (orderType == ORDER_TYPE_BUY_LIMIT)) quantOrdensCompraAbertasGlobal++; if((orderMagic == VALOR_NUMERO_MAGICO) && (orderType == ORDER_TYPE_SELL_LIMIT)) quantOrdensVendaAbertasGlobal++; if(orderSymbol == roteamento_symbol && orderMagic == VALOR_NUMERO_MAGICO) { if(orderType == ORDER_TYPE_BUY_LIMIT) { quantOrdensCompraAbertasNoAtivo++; compradoPendente = true; quantLotesOrdensCompra = (quantLotesOrdensCompra + NormalizeDouble(OrderGetDouble(ORDER_VOLUME_CURRENT), _Digits)); ticketCompradoPendente = orderTicket; precoPendurouOrdemCompra = NormalizeDouble(OrderGetDouble(ORDER_PRICE_OPEN), _Digits); } if(orderType == ORDER_TYPE_SELL_LIMIT) { quantOrdensVendaAbertasNoAtivo++; vendidoPendente = true; quantLotesOrdensVenda = (quantLotesOrdensVenda + NormalizeDouble(OrderGetDouble(ORDER_VOLUME_CURRENT), _Digits)); ticketVendidoPendente = orderTicket; precoPendurouOrdemVenda = NormalizeDouble(OrderGetDouble(ORDER_PRICE_OPEN), _Digits); } } } } } //+---------------------------------------------------------------------------+ //| LOOP NAS POSIÇÕES - COMPRA/VENDA A MERCADO OU ORDENS QUE FORAM EXECUTADAS | //+---------------------------------------------------------------------------+ int positionsTotal = PositionsTotal(); for(int i=0; i < positionsTotal && !IsStopped(); i++) { ulong posTicket = PositionGetTicket(i); if(PositionSelectByTicket(posTicket)) { ulong posMagic = PositionGetInteger(POSITION_MAGIC); string posSymbol = PositionGetString(POSITION_SYMBOL); ENUM_POSITION_TYPE posType = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); if(inputModoConta == mcNETTING) { if(posType == POSITION_TYPE_BUY) quantPosicoesCompraExecutadasGlobal++; if(posType == POSITION_TYPE_SELL) quantPosicoesVendaExecutadasGlobal++; if(posSymbol == roteamento_symbol) { if(posType == POSITION_TYPE_BUY) { quantPosicoesCompraExecutadasNoAtivo++; compradoMercado = true; quantLotesPosicaoCompra = (quantLotesPosicaoCompra + NormalizeDouble(PositionGetDouble(POSITION_VOLUME), _Digits)); ticketCompradoMercado = posTicket; precoDeCompra = NormalizeDouble(PositionGetDouble(POSITION_PRICE_OPEN), 2); //if ((ask_primeira_melhor_oferta_preco - inputCentavosStopar) == precoDeCompra) se_ta_comprado_no_bid_ou_menos = true; //aqui marca se está comprado no preço do BID/melhor oferta de compra } if(posType == POSITION_TYPE_SELL) { quantPosicoesVendaExecutadasNoAtivo++; vendidoMercado = true; quantLotesPosicaoVenda = (quantLotesPosicaoVenda + NormalizeDouble(PositionGetDouble(POSITION_VOLUME), _Digits)); ticketVendidoMercado = posTicket; precoDeVenda = NormalizeDouble(PositionGetDouble(POSITION_PRICE_OPEN), 2); //if ((bid_primeira_melhor_oferta_preco + inputCentavosStopar) == precoDeVenda) se_ta_vendido_no_ask_ou_mais = true; //aqui marca se está vendido no preço do ASK/melhor oferta de venda } } } else { if((posMagic == VALOR_NUMERO_MAGICO) && (posType == POSITION_TYPE_BUY)) quantPosicoesCompraExecutadasGlobal++; if((posMagic == VALOR_NUMERO_MAGICO) && (posType == POSITION_TYPE_SELL)) quantPosicoesVendaExecutadasGlobal++; if(posSymbol == roteamento_symbol && posMagic == VALOR_NUMERO_MAGICO) { if(posType == POSITION_TYPE_BUY) { quantPosicoesCompraExecutadasNoAtivo++; compradoMercado = true; quantLotesPosicaoCompra = (quantLotesPosicaoCompra + NormalizeDouble(PositionGetDouble(POSITION_VOLUME), _Digits)); ticketCompradoMercado = posTicket; precoDeCompra = NormalizeDouble(PositionGetDouble(POSITION_PRICE_OPEN), 2); } if(posType == POSITION_TYPE_SELL) { quantPosicoesVendaExecutadasNoAtivo++; vendidoMercado = true; quantLotesPosicaoVenda = (quantLotesPosicaoVenda + NormalizeDouble(PositionGetDouble(POSITION_VOLUME), _Digits)); ticketVendidoMercado = posTicket; precoDeVenda = NormalizeDouble(PositionGetDouble(POSITION_PRICE_OPEN), 2); } } } } } //+------------------------------------------------------------------+ //| LOOP NAS ORDENS - COMPRA/VENDA STOP | //+------------------------------------------------------------------+ int ordersTotalStop = OrdersTotal(); for(int i=0; i < ordersTotalStop && !IsStopped(); i++) { ulong orderTicketStop = OrderGetTicket(i); if(OrderSelect(orderTicketStop)) { ulong orderMagic = OrderGetInteger(ORDER_MAGIC); string orderSymbol = OrderGetString(ORDER_SYMBOL); ENUM_ORDER_TYPE orderType = (ENUM_ORDER_TYPE)OrderGetInteger(ORDER_TYPE); if(inputModoConta == mcNETTING) { // if (orderType == ORDER_TYPE_BUY_LIMIT) quantOrdensCompraAbertas++; //if (orderType == ORDER_TYPE_SELL_LIMIT) quantOrdensVendaAbertas++; if(orderSymbol == roteamento_symbol) { if(orderType == ORDER_TYPE_BUY_STOP) { quantLotesOrdensStopCompra = NormalizeDouble(OrderGetDouble(ORDER_VOLUME_CURRENT), _Digits); compradoStop = true; precoPendurouOrdemStopCompra = NormalizeDouble(OrderGetDouble(ORDER_PRICE_OPEN), _Digits); ticketCompradoStop = orderTicketStop; } if(orderType == ORDER_TYPE_SELL_STOP) { quantLotesOrdensStopVenda = NormalizeDouble(OrderGetDouble(ORDER_VOLUME_CURRENT), _Digits); vendidoStop = true; precoPendurouOrdemStopVenda = NormalizeDouble(OrderGetDouble(ORDER_PRICE_OPEN), _Digits); ticketVendidoStop = orderTicketStop; } } } else { // if (orderType == ORDER_TYPE_BUY_LIMIT) quantOrdensCompraAbertas++; //if (orderType == ORDER_TYPE_SELL_LIMIT) quantOrdensVendaAbertas++; if(orderSymbol == roteamento_symbol && orderMagic == VALOR_NUMERO_MAGICO) { if(orderType == ORDER_TYPE_BUY_STOP) { quantLotesOrdensStopCompra = NormalizeDouble(OrderGetDouble(ORDER_VOLUME_CURRENT), _Digits); compradoStop = true; precoPendurouOrdemStopCompra = NormalizeDouble(OrderGetDouble(ORDER_PRICE_OPEN), _Digits); ticketCompradoStop = orderTicketStop; } if(orderType == ORDER_TYPE_SELL_STOP) { quantLotesOrdensStopVenda = NormalizeDouble(OrderGetDouble(ORDER_VOLUME_CURRENT), _Digits); vendidoStop = true; precoPendurouOrdemStopVenda = NormalizeDouble(OrderGetDouble(ORDER_PRICE_OPEN), _Digits); ticketVendidoStop = orderTicketStop; } } } } } return true; } //+------------------------------------------------------------------+ void QuantidadeContratosDoR() { //QUANTIDADE DE CONTRATOS EM R FIXO if(inputCrossOrder == Mini_Indice) { NomeTipoDeContrato = "Mini Indice"; multiplicadorFinanceiroDoContrato = valorFinanceiroPorTickMiniIndice; minimoDeContratos = 1; } if(inputCrossOrder == Indice_Cheio) { NomeTipoDeContrato = "Indice Cheio"; multiplicadorFinanceiroDoContrato = valorFinanceiroPorTickIndiceCheio; minimoDeContratos = 5; } //LIBERA TRADE SE QUANTIDADE DE CONTRATOS FOR MAIOR QUE 1 if(quantidadeContratos >= minimoDeContratos) { podeTreidar = true; } else { podeTreidar = false; } valorStopEmReais = ((MathRound(atr_stop_15/5))*5) * multiplicadorFinanceiroDoContrato; seraQueAredonda = valorDoREmReais/valorStopEmReais - MathFloor(valorDoREmReais/valorStopEmReais); if(seraQueAredonda >= 0.8) { quantidadeContratos = MathCeil(valorDoREmReais/valorStopEmReais) * minimoDeContratos; aredondaPeloTOPO = true; } else { quantidadeContratos = MathFloor(valorDoREmReais/valorStopEmReais) * minimoDeContratos; aredondaPeloFUNDO = true; } // return; } void QuantidadeContratosPorPorcentagemDeConta() { valorBalancoDaConta = AccountInfoDouble(ACCOUNT_BALANCE); //QUANTIDADE DE CONTRATOS BASEADO EM PORCENTAGEM DE CONTA if(inputPorcentagemConta1_5 == PorcentagemConta1_0) { RPeloBalancoDaConta = valorBalancoDaConta*valorPorcentagemConta1_0; } if(inputPorcentagemConta1_5 == PorcentagemConta1_5) { RPeloBalancoDaConta = valorBalancoDaConta*valorPorcentagemConta1_5; } if(inputPorcentagemConta1_5 == PorcentagemConta2_0) { RPeloBalancoDaConta = valorBalancoDaConta*valorPorcentagemConta2_0; } if(inputPorcentagemConta1_5 == PorcentagemConta2_5) { RPeloBalancoDaConta = valorBalancoDaConta*valorPorcentagemConta2_5; } if(inputPorcentagemConta1_5 == PorcentagemConta3_0) { RPeloBalancoDaConta = valorBalancoDaConta*valorPorcentagemConta3_0; } if(inputPorcentagemConta1_5 == PorcentagemConta4_0) { RPeloBalancoDaConta = valorBalancoDaConta*valorPorcentagemConta4_0; } if(inputPorcentagemConta1_5 == PorcentagemConta5_0) { RPeloBalancoDaConta = valorBalancoDaConta*valorPorcentagemConta5_0; } if(inputPorcentagemConta1_5 == PorcentagemConta10_0) { RPeloBalancoDaConta = valorBalancoDaConta*valorPorcentagemConta10_0; } if(inputPorcentagemConta1_5 == PorcentagemConta15_0) { RPeloBalancoDaConta = valorBalancoDaConta*valorPorcentagemConta15_0; } if(inputPorcentagemConta1_5 == PorcentagemConta20_0) { RPeloBalancoDaConta = valorBalancoDaConta*valorPorcentagemConta20_0; } //CONTINUA LOGICA COMO NA FUNÇÃO DE CALCULO DE R FIXO if(inputCrossOrder == Mini_Indice) { NomeTipoDeContrato = "Mini Indice"; multiplicadorFinanceiroDoContrato = valorFinanceiroPorTickMiniIndice; minimoDeContratos = 1; } if(inputCrossOrder == Indice_Cheio) { NomeTipoDeContrato = "Indice Cheio"; multiplicadorFinanceiroDoContrato = valorFinanceiroPorTickIndiceCheio; minimoDeContratos = 5; } //LIBERA TRADE SE QUANTIDADE DE CONTRATOS FOR MAIOR QUE 1 if(quantidadeContratos >= minimoDeContratos) { podeTreidar = true; } else { podeTreidar = false; } valorStopEmReais = ((MathRound(atr_stop_15/tickerBase))*tickerBase) * multiplicadorFinanceiroDoContrato; seraQueAredonda = RPeloBalancoDaConta/valorStopEmReais - MathFloor(RPeloBalancoDaConta/valorStopEmReais); if(seraQueAredonda >= 0.8) { quantidadeContratos = MathCeil(RPeloBalancoDaConta/valorStopEmReais) * minimoDeContratos; aredondaPeloTOPO = true; } else { quantidadeContratos = MathFloor(RPeloBalancoDaConta/valorStopEmReais) * minimoDeContratos; aredondaPeloFUNDO = true; } } //--- bool TralingStop() { double fechamento_ultima_barra = iClose(_Symbol,PERIOD_CURRENT,1); //fiz um comentario no traling stop //LÓGICA PARA FECHAR O TRALING STOP DA COMPRA.... if (compradoMercado && (fechamento_ultima_barra < media_movel_tralingstop) && (inputTralingStop == Ativa_TralingStop)) { FecharPosicaoAbertas(); //LÓGICA PARA FECHAR O TRALING STOP DA VENDA.... } else if (vendidoMercado && (fechamento_ultima_barra > media_movel_tralingstop) && (inputTralingStop == Ativa_TralingStop)) { FecharPosicaoAbertas(); } return true; } //--- bool AlvoDaCompra() { VerificarOrdensPosicoes(); //verifica a situação das ordens if (inputAlvoPelaMinMaxOuEntrada == Alvo_Pela_Entrada) { alvo_compra = (precoDeCompra + (MathRound(inputMultiplicadorDoAlvo*atr_stop_15/tickerBase)*tickerBase)); } else { alvo_compra = (maxima_do_dia + (MathRound(inputMultiplicadorDoAlvo*atr_stop_15/tickerBase)*tickerBase)); } //Print("alvo_compra = ",alvo_compra); static bool enviou_alvo_da_compra = false; if (!compradoMercado) { enviou_alvo_da_compra = false; FecharOrdensPendentesVendaDoAtivo2(); } //--------marcador de XXs para enfiar o alvo--------- ulong hora_atual_servidor = TimeCurrent(); static bool esperou_XXs_para_colocar_alvos = false; //inicialmente a variavel é falsa static bool marcou_horario_da_posicao = false; //inicialmente a variavel é falsa, vc nao tem posicao static ulong horario_da_posicao = 999999999999; int segundos_esperar_para_colocar_ordem_alvo = 30; //espera XX segundos para colocar o alvo if (!marcou_horario_da_posicao && compradoMercado) { horario_da_posicao = TimeCurrent(); //marca que tem posicao de compra ou venda marcou_horario_da_posicao = true; //sim, agora vc tem posicao } if (hora_atual_servidor > (horario_da_posicao+segundos_esperar_para_colocar_ordem_alvo)) { //ora, se tem posicao, entao comeca a conta 30s para, depois, marcar uma variavel positiva para colocar a ordem esperou_XXs_para_colocar_alvos = true; //marca a variavel positiva para colocar a ordem } if (!compradoMercado) { //se nao tem mais posicao, volta todas as variaveis para a posicao inicial marcou_horario_da_posicao = false; //volta a variavel para seu estado original esperou_XXs_para_colocar_alvos = false; //volta a variavel para seu estado original horario_da_posicao = 999999999999; } //---------------------------------------------------- if (compradoMercado && esperou_XXs_para_colocar_alvos && VerificarOrdensPosicoes() && !vendidoPendente && (quantLotesPosicaoCompra <= quantidadeContratos) && !enviou_alvo_da_compra) { bool ok = trade.SellLimit(quantLotesPosicaoCompra, alvo_compra, roteamento_symbol, 0, 0, ORDER_TIME_DAY, DataExpiracao(), NOME_ROBO); enviou_alvo_da_compra = true; n_ordens_enviadas++; //proteção envio massivo de ordens if(ok) { if(trade.ResultRetcode() == 10008 || trade.ResultRetcode() == 10009) { Print("Alvo da Compra enviado com sucesso!"); } else { Print("ERRO1: Alvo da Compra"); } } else { Print("ERRO2: Alvo da Compra"); } } //SE CHEGOU NO ALVO, FECHA A MERCADO POSIÇÕES REMANESCENTES if (compradoMercado && (quantLotesPosicaoCompra < quantidadeContratos) && (tick.last > (alvo_compra-(tickerBase*10)))) FecharPosicaoAbertas(); return true; } //--- bool AlvoDaVenda() { VerificarOrdensPosicoes(); //verifica a situação das ordens if (inputAlvoPelaMinMaxOuEntrada == Alvo_Pela_Entrada) { alvo_venda = (precoDeVenda - (MathRound(inputMultiplicadorDoAlvo*atr_stop_15/tickerBase)*tickerBase)); } else { alvo_venda = (minima_do_dia - (MathRound(inputMultiplicadorDoAlvo*atr_stop_15/tickerBase)*tickerBase)); } static bool enviou_alvo_da_venda = false; if (!vendidoMercado) { enviou_alvo_da_venda = false; FecharOrdensPendentesCompraDoAtivo2(); } //--------marcador de XXs para enfiar o alvo--------- ulong hora_atual_servidor = TimeCurrent(); static bool esperou_XXs_para_colocar_alvos = false; //inicialmente a variavel é falsa static bool marcou_horario_da_posicao = false; //inicialmente a variavel é falsa, vc nao tem posicao static ulong horario_da_posicao = 999999999999; int segundos_esperar_para_colocar_ordem_alvo = 30; //espera XX segundos para colocar o alvo if (!marcou_horario_da_posicao && vendidoMercado) { horario_da_posicao = TimeCurrent(); //marca que tem posicao de compra ou venda marcou_horario_da_posicao = true; //sim, agora vc tem posicao } if (hora_atual_servidor > (horario_da_posicao+segundos_esperar_para_colocar_ordem_alvo)) { //ora, se tem posicao, entao comeca a conta 30s para, depois, marcar uma variavel positiva para colocar a ordem esperou_XXs_para_colocar_alvos = true; //marca a variavel positiva para colocar a ordem } if (!vendidoMercado) { //se nao tem mais posicao, volta todas as variaveis para a posicao inicial marcou_horario_da_posicao = false; //volta a variavel para seu estado original esperou_XXs_para_colocar_alvos = false; //volta a variavel para seu estado original horario_da_posicao = 999999999999; } //---------------------------------------------------- if (vendidoMercado && esperou_XXs_para_colocar_alvos && VerificarOrdensPosicoes() && !compradoPendente && (quantLotesPosicaoVenda <= quantidadeContratos) && !enviou_alvo_da_venda) { bool ok = trade.BuyLimit(quantLotesPosicaoVenda, alvo_venda, roteamento_symbol, 0, 0, ORDER_TIME_DAY, DataExpiracao(), NOME_ROBO); enviou_alvo_da_venda = true; n_ordens_enviadas++; //proteção envio massivo de ordens if(ok) { if(trade.ResultRetcode() == 10008 || trade.ResultRetcode() == 10009) { Print("Alvo da Venda enviado com sucesso!"); } else { Print("ERRO1: Alvo da Venda"); } } else { Print("ERRO2: Alvo da Venda"); } } //SE CHEGOU NO ALVO, FECHA A MERCADO POSIÇÕES REMANESCENTES if (vendidoMercado && (quantLotesPosicaoVenda < quantidadeContratos) && (tick.last < (alvo_venda+(tickerBase*(tickerBase*2))))) FecharPosicaoAbertas(); return true; } //--- bool FecharPosicoesContaHedge() { VerificarOrdensPosicoes(); //verifica a situação das ordens //+----------------------------------------------------------------+ //| SE TIVER UMA COMPRA E VENDA POSICIONADAS, FECHA UMA PELA OUTRA | //+----------------------------------------------------------------+ if (inputModoConta == mcHEDGING) { if (compradoMercado && vendidoMercado && (quantLotesPosicaoCompra == quantLotesPosicaoVenda)) { double quantidade_que_comprou_ou_vendeu = quantLotesPosicaoCompra; bool ok = trade.PositionCloseBy(ticketCompradoMercado, ticketVendidoMercado); if (ok) { if (trade.ResultRetcode() == 10008 || trade.ResultRetcode() == 10009) { Print("O robô " + NOME_ROBO + " executou a ZERAGEM TOTAL da posição de " + DoubleToString(quantidade_que_comprou_ou_vendeu, _Digits) + " contrato/açoes, do ativo " + _Symbol); } else { Print("ERRO1: Retorno inesperado do servidor (trade.PositionCloseBy)"); return(false); } } else { Print("ERRO2: Erro ao enviar trade.PositionCloseBy"); return(false); } } } return true; } //+------------------------------------------------------------------+ bool ProtecaoContraLooping() { ulong hora_atual = TimeLocal(); //double posicoesEordensAbertas = NormalizeDouble(quantPosicoesExecutadasGlobal+quantOrdensCompraAbertas, _Digits); if (((inputModoDeMercado == ContaReal) || (tipoConta == ACCOUNT_TRADE_MODE_REAL)) && (hora_atual > (horario_executou_robo+30))) { if ((quantLotesPosicaoCompra || quantLotesPosicaoVenda) > quantidadeContratos) { Print("MOTIVO 1: APARENTEMENTE O ROBÔ ENTROU EM LOOP NO ATIVO " + roteamento_symbol + " E FOI PARADO."); FecharOrdensPendentesCompraDoAtivo(); FecharOrdensPendentesVendaDoAtivo(); FecharPosicaoAbertas(); ExpertRemove(); } if ((quantLotesOrdensVenda || quantLotesOrdensCompra) > quantidadeContratos) { Print("MOTIVO 2: APARENTEMENTE O ROBÔ ENTROU EM LOOP NO ATIVO " + roteamento_symbol + " E FOI PARADO, VEJA SE NÃO TOMOU MAIS POSIÇÃO QUE O SETADO NO CAIXA. FAVOR VERIFICAR O QUE HOUVE ANTES DE RODAR DE NOVO"); FecharOrdensPendentesCompraDoAtivo(); FecharOrdensPendentesVendaDoAtivo(); FecharPosicaoAbertas(); ExpertRemove(); } if ((quantLotesOrdensStopCompra || quantLotesOrdensStopVenda) > quantidadeContratos) { Print("MOTIVO 3: APARENTEMENTE O ROBÔ ENTROU EM LOOP NO ATIVO " + roteamento_symbol + " E FOI PARADO, VEJA SE NÃO TOMOU MAIS POSIÇÃO QUE O SETADO NO CAIXA. FAVOR VERIFICAR O QUE HOUVE ANTES DE RODAR DE NOVO"); FecharOrdensPendentesCompraDoAtivo(); FecharOrdensPendentesVendaDoAtivo(); FecharPosicaoAbertas(); ExpertRemove(); } if (quantos_trades_fez_no_dia > 7) { Print("MOTIVO 4: APARENTEMENTE O ROBÔ ENTROU EM LOOP NO ATIVO " + roteamento_symbol + " E FOI PARADO, VEJA SE NÃO TOMOU MAIS POSIÇÃO QUE O SETADO NO CAIXA. FAVOR VERIFICAR O QUE HOUVE ANTES DE RODAR DE NOVO"); FecharOrdensPendentesCompraDoAtivo(); FecharOrdensPendentesVendaDoAtivo(); FecharPosicaoAbertas(); ExpertRemove(); } } return true; } bool ProtecaoEnvioMassivoOrdens() { if (inputModoDeMercado == Backtest) { int segundos_pausar_robo = 3600; int intervalo_segundos = 4; int n_maximo_ordens_enviadas_em_x_segundos = 5; static ulong hora_que_enviou_a_primeira_ordem = 0; static bool marcou_hora_primeira_ordem = false; ulong hora_atual_servidor = TimeCurrent(); if (n_ordens_enviadas == 1 && !marcou_hora_primeira_ordem) { hora_que_enviou_a_primeira_ordem = TimeCurrent(); marcou_hora_primeira_ordem = true; } if (hora_atual_servidor >= (hora_que_enviou_a_primeira_ordem+intervalo_segundos)) { n_ordens_enviadas = 0; hora_que_enviou_a_primeira_ordem = 0; marcou_hora_primeira_ordem = false; } if (n_ordens_enviadas >= n_maximo_ordens_enviadas_em_x_segundos) { FecharPosicaoAbertas(); FecharOrdensPendentesCompraDoAtivo(); FecharOrdensPendentesVendaDoAtivo(); FecharOrdensPendentesBuyStopAtivo(); FecharOrdensPendentesSellStopAtivo(); FecharPosicaoAbertas(); Print("ROBÔ FECHADO - ENVIO MASSIVO DE ORDENS - ProtecaoEnvioMassivoOrdens()"); ExpertRemove(); } } return true; } //void CriaLinhaATRMinimoDeAlta() //{ // //CRIA LINHA ATR MINIMO DE ALTA // // datetime criaLinhaATRMinimoDeAlta = iTime(_Symbol,PERIOD_CURRENT,0); // ObjectCreate( // 0, // ID de gráfico // "linhaATRMinimoDeAlta", // Nome da linha // OBJ_HLINE, // Tipo da linha // 0, // Sub Window // criaLinhaATRMinimoDeAlta, // Datetime do objeto // precoDaLinhaATRAlta // Preço // ); // // ObjectSetInteger(0,"linhaATRMinimoDeAlta",OBJPROP_STYLE,STYLE_DOT); // ObjectSetInteger(0,"linhaATRMinimoDeAlta",OBJPROP_COLOR,clrGray); void CriaLinhaATRMinimoDeAltaEBaixa() { CopyRates(_Symbol,PERIOD_M5,0,114,candles5); CopyRates(_Symbol,PERIOD_D1,0,2,candlesDia); for(int i=0; i<114; i++) { if(TimeToString(candles5[i].time, TIME_DATE) == TimeToString(candlesDia[0].time, TIME_DATE)) { barra5DeOntemHIGH = candles5[i].high; barra5DeOntemLOW = candles5[i].low; chaveDiaOntem = candlesDia[0].time; //CRIA LINHA DE ALTA ObjectCreate(0, "linhaHigh", OBJ_TREND,0,primeiroCandle5Horario,precoDaLinhaATRAlta,tick.time,precoDaLinhaATRAlta); ObjectSetInteger(0,"linhaHigh", OBJPROP_COLOR,clrYellow); ObjectSetInteger(0,"linhaHigh",OBJPROP_STYLE,STYLE_DOT); ObjectSetInteger (0, "linhaHigh", OBJPROP_RAY_RIGHT,false); //CRIA LINHA DE BAIXA ObjectCreate(0, "linhaLow", OBJ_TREND,0,primeiroCandle5Horario,precoDaLinhaATRBaixa,tick.time,precoDaLinhaATRBaixa); ObjectSetInteger(0,"linhaLow", OBJPROP_COLOR,clrYellow); ObjectSetInteger (0, "linhaLow", OBJPROP_RAY_RIGHT,false); ObjectSetInteger(0,"linhaLow",OBJPROP_STYLE,STYLE_DOT); } } } bool ControleDeAcesso(string nome_cadastrado, long conta_real_producao, long conta_demo, int numero_maximo_contratos, int dia, int mes, int ano) { datetime dataAtt = TimeCurrent(); string data_completa = ""; long numero_da_conta_real = AccountInfoInteger(ACCOUNT_LOGIN); string nome_do_usuario_na_corretora = AccountInfoString(ACCOUNT_NAME); string nome_backtest = "Tester"; //aqui faz a conversao da data caso o usuário esqueça de digitar um "0" antes.... if (((dia == 1) || (dia == 2 ) || (dia == 3 ) || (dia == 4) || (dia == 5) || (dia == 6) || (dia == 7) || (dia == 8) || (dia == 9)) && ((mes != 1) && (mes != 2) && (mes != 3) && (mes != 4) && (mes != 5) && (mes != 6) && (mes != 7) && (mes != 8) && (mes != 9))) { data_completa = (string)ano + "." + (string)mes + ".0" + (string)dia + " 00:00"; } else if (((dia != 1) && (dia != 2 ) && (dia != 3 ) && (dia != 4) && (dia != 5) && (dia != 6) && (dia != 7) && (dia != 8) && (dia != 9)) && ((mes == 1) || (mes == 2) || (mes == 3) || (mes == 4) || (mes == 5) || (mes == 6) || (mes == 7) || (mes == 8) || (mes == 9))) { data_completa = (string)ano + ".0" + (string)mes + "." + (string)dia + " 00:00"; } else if (((dia == 1) || (dia == 2 ) || (dia == 3 ) || (dia == 4) || (dia == 5) || (dia == 6) || (dia == 7) || (dia == 8) || (dia == 9)) && ((mes == 1) || (mes == 2) || (mes == 3) || (mes == 4) || (mes == 5) || (mes == 6) || (mes == 7) || (mes == 8) || (mes == 9))) { data_completa = (string)ano + ".0" + (string)mes + ".0" + (string)dia + " 00:00"; } else { data_completa = (string)ano + "." + (string)mes + "." + (string)dia + " 00:00"; } datetime vencimentoRobo = StringToTime(data_completa); //if (tipoConta == ACCOUNT_TRADE_MODE_DEMO) vencimentoRobo = D'2030.01.01 00:00'; //se o robô é conta demo.. entao vence numa data futura bem pra frente.. a pessoa pode usar... //Print("Data Atual = ", dataAtt); //Print("Data Vencimento Robo = ", vencimentoRobo); //Print("A data atual chegou no vencimento? = ", (dataAtt >= vencimentoRobo)); if (dataAtt >= vencimentoRobo) { Print("Prazo de Validade Vencido, Favor Contactar o Administrador"); ExpertRemove(); return false; } if ((nome_cadastrado != "") && (nome_cadastrado != nome_do_usuario_na_corretora) && (nome_backtest != nome_do_usuario_na_corretora)) { //PARA HABILITAR BACKTEST //if ((nome_cadastrado != "") && (nome_cadastrado != nome_do_usuario_na_corretora)) { //PARA DESABILITAR BACKTEST Print("O nome do usuário na corretora não é o mesmo da licença do robô. Favor contactar o Administrador!"); Print("O nome do usuário dono da licença é " + NOME_NA_CORRETORA + ", e você quer logar com a conta cujo titular é " + nome_do_usuario_na_corretora + "."); Print("----------"); ExpertRemove(); return false; } //aqui faz o controle pelo numero de contratos... if ((tipoConta == ACCOUNT_TRADE_MODE_REAL) && (quantidadeContratos > numero_maximo_contratos)) { Print("Você não pode operar " + (string)quantidadeContratos + " contratos, precisamos de liquidez para todo mundo.. Por favor, diminua para até " + (string)numero_maximo_contratos + " contratos."); Print("Se estiver utilizando BackTest... FAÇA EM CONTA DEMO!!!."); ExpertRemove(); return false; } //aqui faz o controle pelo numero da conta... if ((tipoConta == ACCOUNT_TRADE_MODE_REAL) && (numero_da_conta_real != conta_real_producao)) { Print("Essa conta NÃO está habilitada para operar no ambiente real. Contate o pessoal da @ Gestão Trader..."); Print("Essa conta NÃO está habilitada para operar no ambiente real. Contate o pessoal da @ Gestão Trader..."); ExpertRemove(); return false; } //aqui faz o controle pelo numero da conta... if ((tipoConta == ACCOUNT_TRADE_MODE_DEMO) && (numero_da_conta_real != conta_demo)) { Print("Essa conta NÃO está habilitada para operar. Contate o pessoal da @ Gestão Trader..."); Print("Essa conta NÃO está habilitada para operar. Contate o pessoal da @ Gestão Trader..."); ExpertRemove(); return false; } return true; }