Então pessoal... na hora da compra e da venda, pelo menos na minha cabeça não sei, era pra comprar ou vender encerrar a operação, esperar surgir a próxima hora de entrar, porem ele buga ele abre varias operações ao mesmo tempo, se eu tiro a compra ou a venda ele faz tudo certinho, porem com os dois juntos ele buga, não sei se me consegui fazer entender, mas caso alguém tenha entendido meu problema, me da uma ajuda ae, dês de já muito obrigado.
Esse código é seu? Fou você que o programou?
Sim !
Sim !
Rodei um teste do seu código por aqui no BRA50 em modelagem OHLC e aparentemente sem anormalidades. Já no teste com Ticks Reais, percebi que em alguns momentos ele realiza diversas operações dentro da mesma barra. Se o problema é esse, minha sugestão é que você faça um controle para abrir novas operações somente após uma nova barra. Inclusive existe um artigo (e uma classe já pronta) que pode te ajudar a escrever esse controle:

- www.mql5.com
Rodei um teste do seu código por aqui no BRA50 em modelagem OHLC e aparentemente sem anormalidades. Já no teste com Ticks Reais, percebi que em alguns momentos ele realiza diversas operações dentro da mesma barra. Se o problema é esse, minha sugestão é que você faça um controle para abrir novas operações somente após uma nova barra. Inclusive existe um artigo (e uma classe já pronta) que pode te ajudar a escrever esse controle:
Obrigado meu querido, vou dar uma olhada e tentar arrumar, abração.
....
#include <Trade\Trade.mqh> CTrade trade; #include <Trade\SymbolInfo.mqh> CSymbolInfo simbolo; datetime m_last_time; bool m_comprado, m_vendido; //+------------------------------------------------------------------+ //| Parametros de Enrtada | //+------------------------------------------------------------------+ input string Titulo_1 =""; //--- Parametros de Contratos input double LotedeEntrada = 0.01; //--- Valor do Lote de Entrada input double TakeProfit = 100.0; //--- Stop Gain da Operação input double StopLoss = 40.0; //--- Stop Loss da Operação //-------------------------------- input string Titulo_2 =""; //--- Parametros de Porcentagem input int PorcentagemDeGain = 0; //--- Porcentagem diária Gain input int PorcentagemDeLoss = 0; //--- Porcentagem diária Loss //-------------------------------- double Lote_inicial = LotedeEntrada; input int Lote_multiplicador = 2; //--- Martingale input int Lote_maximo = 10; double GL_lote_atual; //+------------------------------------------------------------------+ //| Monitoramento | //+------------------------------------------------------------------+ int gl_ordens = 0; //--- Essa Váriável vai ser usada para definir compra, venda ou nãop fazer nada ulong magicNum = 1212; //--- Magic number é tipo um código pra esse rôbo em especifico, para n ter problema em usar mais de um ao mesmo tempo bool gl_openPosition = false; //--- Tenho posição aberta ou não ? long gl_positonType = -1; //--- Estou compradou ou vendido ? //+------------------------------------------------------------------+ //| Dando valor e Estilo das Médias | //+------------------------------------------------------------------+ input string Titulo_3 =""; //--- Parametros da Média móvel Rápida input int ma_Fast = 8; //--- Período da média móvel Rápida input ENUM_MA_METHOD ma_Fast_method = MODE_SMA; //--- Metodo da média móvel Rápida //------------------------------- input string Titulo_4 =""; //--- Parametros da Média móvel Lenta input int ma_Slow = 20; //--- Período da média móvel Lenta input ENUM_MA_METHOD ma_Slow_method = MODE_SMA; //--- Metodo da média móvel Lenta //+------------------------------------------------------------------+ //| Data e Hora | //+------------------------------------------------------------------+ input int hAbertura = 20; //--- Horário de abertura input int mAbertura = 0; //--- Minuto de abertura input int hFechamento = 17; //--- Horário de fechamento input int mFechamento = 30; //---- Minuto de fechamento //+------------------------------------------------------------------+ //| Handles | //+------------------------------------------------------------------+ int iMA_fast_handle = INVALID_HANDLE; int iMA_slow_handle = INVALID_HANDLE; //+------------------------------------------------------------------+ //| Buffers | //+------------------------------------------------------------------+ double iMA_fast_buffer[]; double iMA_slow_buffer[]; //+------------------------------------------------------------------+ //| Gestão de elementos Gráficos | //+------------------------------------------------------------------+ bool GLinitHandle1 = false; bool GLinitHandle2 = false; bool GLgrafico_1 = false; bool GLgrafico_2 = false; //+------------------------------------------------------------------+ //| Vereficando quantidades de Ordens Abertas | //+------------------------------------------------------------------+ bool Abertas = false; //+------------------------------------------------------------------+ //| | //| Expert initialization function | //| | //+------------------------------------------------------------------+ int OnInit() { //+------------------------------------------------------------------+ //| Análise de Váriaveis de parametros de Entrada | //+------------------------------------------------------------------+ if(LotedeEntrada >= 3.0) //--- Não vai permitir o robô operar com o lote muito grande { Print("Vai quebrar a conta, melhor parar por hoje."); return(INIT_FAILED); } if(TakeProfit <= 0) //--- Não vai permitir o robô operar sem um Take Profit { Print("Esqueceu de por o Take meu querido."); return(INIT_FAILED); } if(StopLoss <= 0) //--- Não vai permitir o robô operar sem um Stop Loss { Print("Cara vc não colocou o STOPLOSS, vai dar ruim, arruma lá."); return(INIT_FAILED); } //+------------------------------------------------------------------+ //| Análise de Variáveis das Médias Moveis | //+------------------------------------------------------------------+ if(ma_Fast <= 0) { Print("O periodo da Média Movel Rápida não pode ser menor ou igual a Zero."); return(INIT_FAILED); } if(ma_Slow <= 0) { Print("O periodo da Média Movel Lenta não pode ser menor ou igual a Zero."); return(INIT_FAILED); } if(ma_Slow < ma_Fast) { Print("O periodo da Média Movel Lenta nunca pode ser menor que a Média Movel Rápida."); return(INIT_FAILED); } //+------------------------------------------------------------------+ //| Handles | //+------------------------------------------------------------------+ iMA_fast_handle = iMA(_Symbol,_Period,ma_Fast,0,ma_Fast_method,PRICE_CLOSE); if(iMA_fast_handle == INVALID_HANDLE) { Print("Deu ruim da hora de criar a média rápida =( .",GetLastError()); return(INIT_FAILED); } else { GLinitHandle1 = true; } //------ iMA_slow_handle = iMA(_Symbol,_Period,ma_Slow,0,ma_Slow_method,PRICE_CLOSE); if(iMA_slow_handle == INVALID_HANDLE) { Print("Deu ruim na hora de criar a média lenta =( .",GetLastError()); return(INIT_FAILED); } else { GLinitHandle2 = true; } //+------------------------------------------------------------------+ //| ArraySetAsSeries | //+------------------------------------------------------------------+ if(!ArraySetAsSeries(iMA_fast_buffer,true)) { Print("Erro na criação do ArraySetAsSeries para iMA_fast_buffer.: ",GetLastError()); //--- Aqui básicamente estamos invertendo a ordem return(INIT_FAILED); //--- cronológica que o metatrader utiliza, } //--- no caso do passado pro presente tanto na fast //--- quanto na slow. if(!ArraySetAsSeries(iMA_slow_buffer,true)) { Print("Erro na criação do ArraySetAsSeries para iMA_slow_buffer.: ",GetLastError()); return(INIT_FAILED); } //+------------------------------------------------------------------+ //| Colocando os indicadores no gráfico | //+------------------------------------------------------------------+ if(!ChartIndicatorAdd(ChartID(),0,iMA_fast_handle)) { Print("Erro na plotagem do indicador iMA_fast_handle no gráfico."); return(INIT_FAILED); } else { GLgrafico_1 = true; } if(!ChartIndicatorAdd(ChartID(),0,iMA_slow_handle)) { Print("Erro na plotagem do indicador iMA_slow_handle no gráfico."); return(INIT_FAILED); } else { GLgrafico_2 = true; } Print("O Rôbo foi inicializado boa sorte"); GL_lote_atual = Lote_inicial; return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { ResetLastError(); Comment(""); //+------------------------------------------------------------------+ //| Liberação dos Indicadores | //+------------------------------------------------------------------+ if(GLinitHandle1==true && !IndicatorRelease(iMA_fast_handle)) Print("Erro na liberação do iMA_fast_handle. ",GetLastError()); if(GLinitHandle2==true && !IndicatorRelease(iMA_slow_handle)) Print("Erro na liberação do iMA_slow_handle. ",GetLastError()); //+------------------------------------------------------------------+ //| Array Free | //+------------------------------------------------------------------+ ArrayFree(iMA_fast_buffer); //--- Libera um buffer de qualquer array dinâmico e define o tamanho da dimensão zero para 0. ArrayFree(iMA_slow_buffer); //+------------------------------------------------------------------+ //| Retirando os Indicadores do Gráfico | //+------------------------------------------------------------------+ string iMA_fast_chart =ChartIndicatorName(0,0,0); if(GLgrafico_1 && !ChartIndicatorDelete(0,0,iMA_fast_chart)) Print("Erro na hora de remover aiMA_fast_chart. ",GetLastError()); string iMA_slow_chart =ChartIndicatorName(0,0,0); if(GLgrafico_2 && !ChartIndicatorDelete(0,0,iMA_slow_chart)) Print("Erro na hora de remover aiMA_slow_chart. ",GetLastError()); Print("Deinicialização executada."); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { // --se tiver função de trailling fica fora do evento de nova barra if(IsNewBar()) { ResetLastError(); CheckPosition(); //+------------------------------------------------------------------+ //| Inicializando Copy Buffer | //+------------------------------------------------------------------+ if(CopyBuffer(iMA_fast_handle,0,0,3,iMA_fast_buffer)!=3) { Print("Erro ao atualizar o indicador da Média Móvel Rápida.; ",GetLastError()); //--- Aqui eu to pegando o valor da Média Rápida e return; //--- Jogando pra dentro do buffer, pegando os 3 ultimos candles } if(CopyBuffer(iMA_slow_handle,0,0,3,iMA_slow_buffer)!=3) //--- Aqui eu to pegando o valor da Média Lenta e { //--- Jogando pra dentro do buffer, pegando os 3 ultimos candles Print("Erro ao atualizar o indicador da Média Móvel Lenta.; ",GetLastError()); return; } //+------------------------------------------------------------------+ //| Definindo Horários e dias da semana pra operar | //+------------------------------------------------------------------+ MqlDateTime DT; //--- Aqui eu crio a estrutura TimeCurrent(DT); //--- Aqui onde eu a populo //+------------------------------------------------------------------+ //| Atualiza Posição | //+------------------------------------------------------------------+ gl_openPosition = PositionSelect(_Symbol); if(gl_openPosition==true) { gl_positonType = PositionGetInteger(POSITION_TYPE); GL_lote_atual = PositionGetDouble(POSITION_VOLUME); } else { gl_positonType = WRONG_VALUE; } //+------------------------------------------------------------------+ //| Compra | //+------------------------------------------------------------------+ if(iMA_fast_buffer[0] > iMA_slow_buffer[0] && iMA_fast_buffer[1] < iMA_slow_buffer[1]) { gl_ordens=1; } //+------------------------------------------------------------------+ //| Hold de Compra | //+------------------------------------------------------------------+ //if(gl_openPosition==true && // gl_positonType==POSITION_TYPE_BUY && // gl_ordens==1) // { // gl_ordens=0; //--- Restrição de Compra. // } //+------------------------------------------------------------------+ //| Venda | //+------------------------------------------------------------------+ if(iMA_fast_buffer[0] < iMA_slow_buffer[0] && iMA_fast_buffer[1] > iMA_slow_buffer[1]) { gl_ordens=-1; } //+------------------------------------------------------------------+ //| Hold de Venda | //+------------------------------------------------------------------+ //if(gl_openPosition==true && // gl_positonType==POSITION_TYPE_SELL && // gl_ordens==-1) // { // gl_ordens=0; //--- Restrição de Venda. // } //+------------------------------------------------------------------+ //| Atualiza variaveis e horário | //+------------------------------------------------------------------+ if(gl_ordens!= 0) { MqlTick price_info; ZeroMemory(price_info); if(!SymbolInfoTick(_Symbol,price_info)) //--- Atualizando o simbolo da janela especifica (Symbol) { Print("Falha na atualização de preço: ",GetLastError()); return; } //+------------------------------------------------------------------+ //| Compra | //+------------------------------------------------------------------+ if(gl_ordens==1 && !m_comprado) { double SL= (StopLoss * _Point); double TP = (TakeProfit * _Point); trade.Buy(GL_lote_atual, _Symbol, price_info.ask, price_info.ask-SL, price_info.ask+TP, "[COMPRA]"); Print("Executada Ordem de Compra. ",GetLastError()); } //+------------------------------------------------------------------+ //| Venda | //+------------------------------------------------------------------+ if(gl_ordens==-1 && !m_vendido) { double SL = (StopLoss * _Point); double TP = (TakeProfit * _Point); trade.Sell(GL_lote_atual, _Symbol, price_info.bid, price_info.bid+SL, price_info.bid-TP, "[VENDA]"); return; Print("Executada Ordem de Venda. ",GetLastError()); } } } } //+------------------------------------------------------------------+ bool IsNewBar(void) { datetime time[]; if(CopyTime(simbolo.Name(), Period(), 0, 1, time) < 1) return false; if(time[0] == m_last_time) return false; return m_last_time = time[0]; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void CheckPosition(void) { if(PositionSelect(Symbol())) { //--- se a posição for comprada if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY) { m_comprado = true; m_vendido = false; } //--- se a posição for vendida if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL) { m_vendido = true; m_comprado = false; } } else { m_comprado = false; m_vendido = false; } } //+------------------------------------------------------------------+

- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
Então pessoal... na hora da compra e da venda, pelo menos na minha cabeça não sei, era pra comprar ou vender encerrar a operação, esperar surgir a próxima hora de entrar, porem ele buga ele abre varias operações ao mesmo tempo, se eu tiro a compra ou a venda ele faz tudo certinho, porem com os dois juntos ele buga, não sei se me consegui fazer entender, mas caso alguém tenha entendido meu problema, me da uma ajuda ae, dês de já muito obrigado.