Olá a todos,
Gostaria de compartilhar uma experiência recente com vocês sobre um erro que encontrei em meu código no MQL5.
Recentemente, estava trabalhando em um novo robô de negociação que utilizava mídias móveis como indicadores. Mais não conseguir prosseguir com o teste pois o código apresentou falha em compilar.
Embora seja um erro simples, eu gostaria de ressaltar a importância de verificar o código com cuidado para evitar esses tipos de erros. O MQL5 é uma linguagem poderosa, mas qualquer pequeno erro pode ter um grande impacto no desempenho do robô.
Por isso, sempre verifiquem cuidadosamente o código antes de colocá-lo em operação. Compartilhe essa experiência na esperança de ajudar outros desenvolvedores a evitar esses erros e melhorar o desempenho de seus robôs de negociação.
Solicito o apoio de todos em ajuda a resolver esse código simples, mais que até o momento eu não conseguir finalizar.
Obrigado por ler e bons negócios!
Segue o código:
//+------------------------------------------------------------------+
//| Moving Average EA |
//| Baseado no código disponível em: |
//| https://www.mql5.com/en/code/14640 |
//+------------------------------------------------------------------+
// Inclui bibliotecas padrão do MQL5
#include <trade\trade.mqh>
#include <Arrays\ArrayObj.mqh>
// Variáveis globais
CTrade trade; // Manipulador da negociação
int stoploss; // Stop Loss inicial
int stoploss_positivo; // Stop Loss ajustado para breakeven
int MagicNumber = 20210330; // Número mágico para as ordens
double lot = 0.1; // Tamanho da posição
int fast_MA = 5; // Período da média móvel rápida
int slow_MA = 10; // Período da média móvel lenta
// Vetores de dados para as médias móveis
double ma_fast[];
double ma_slow[];
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- Inicializa a série temporal para os vetores
ArraySetAsSeries(ma_fast, true);
ArraySetAsSeries(ma_slow, true);
//--- Define as médias móveis a serem utilizadas
int fast_MA_handle = iMA(_Symbol, _Period, fast_MA, 0, MODE_SMA, PRICE_CLOSE);
int slow_MA_handle = iMA(_Symbol, _Period, slow_MA, 0, MODE_SMA, PRICE_CLOSE);
//--- Retorna um sinal de sucesso para a inicialização do expert
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
// Se o expert for chamado no início de uma nova barra
if(isNewBar())
{
// Copia os valores das médias móveis para os vetores
int copy_fast_MA = CopyBuffer(fast_MA_handle, 0, 0, 3, ma_fast);
int copy_slow_MA = CopyBuffer(slow_MA_handle, 0, 0, 3, ma_slow);
// Se os vetores estiverem preenchidos
if(copy_fast_MA == 3 && copy_slow_MA == 3)
{
// Sinal de compra quando a média móvel rápida cruza acima da média móvel lenta
bool buy_signal = ma_fast[1] < ma_slow[1] && ma_fast[2] > ma_slow[2];
// Sinal de venda quando a média móvel rápida cruza abaixo da média móvel lenta
bool sell_signal = ma_fast[1] > ma_slow[1] && ma_fast[2] < ma_slow[2];
// Verifica se já há uma posição aberta
if(PositionSelect(_Symbol))
{
// Se for uma posição de compra
if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
{
// Ajusta o stop loss para breakeven
if(_Bid - PositionGetDouble(POSITION_PRICE_OPEN) > stoploss_positivo)
trade.PositionModify(PositionGetInteger(POSITION_TICK), _Symbol, 0, _Bid - stoploss_positivo * _Point, 0, 0);
}
// Se for uma posição de venda
else if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
{
// Ajusta o stop loss para breakeven
if(PositionGetDouble(POSITION_PRICE_OPEN) - _Ask > stoploss_positivo)
trade.PositionModify(PositionGetInteger(POSITION_TICK), _Symbol, 0, PositionGetDouble(POSITION_PRICE_OPEN) - stoploss_positivo * _Point, 0, 0);
}
}
// Se não houver posição aberta
else
{
// Se houver sinal de compra
if(buy_signal)
{
// Entra em posição de compra
trade.Buy(lotSize, _Symbol, 0, 0, 0, "Entrada de Compra");
}
// Se houver sinal de venda
else if(sell_signal)
{
// Entra em posição de venda
trade.Sell(lotSize, _Symbol, 0, 0, 0, "Entrada de Venda");
}
}
}
De mais detalhes e post na area de freelancer. Ninguem quer trabalhar de graça pra voce e não entendi que problema voce se refere inclusive.
De mais detalhes e post na area de freelancer. Ninguem quer trabalhar de graça pra voce e não entendi que problema voce se refere inclusive.
Ricardo Rodrigues Lucca
Bom dia!
Meu caro muito obrigado pelo seu retorno, e pela sua dica no post fico muito grato.
Pois bem, o mesmo erro encontrado no meu código foi o mesmo encontrado no código que vc disponibilizou.
Segue anexo o print do erro, assim tento ser mais claro.
Ricardo Rodrigues Lucca
Bom dia!
Meu caro muito obrigado pelo seu retorno, e pela sua dica no post fico muito grato.
Pois bem, o mesmo erro encontrado no meu código foi o mesmo encontrado no código que vc disponibilizou.
Segue anexo o print do erro, assim tento ser mais claro.
- 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
Olá a todos,
Gostaria de compartilhar uma experiência recente com vocês sobre um erro que encontrei em meu código no MQL5.
Recentemente, estava trabalhando em um novo robô de negociação que utilizava mídias móveis como indicadores. Mais não conseguir prosseguir com o teste pois o código apresentou falha em compilar.
Embora seja um erro simples, eu gostaria de ressaltar a importância de verificar o código com cuidado para evitar esses tipos de erros. O MQL5 é uma linguagem poderosa, mas qualquer pequeno erro pode ter um grande impacto no desempenho do robô.
Por isso, sempre verifiquem cuidadosamente o código antes de colocá-lo em operação. Compartilhe essa experiência na esperança de ajudar outros desenvolvedores a evitar esses erros e melhorar o desempenho de seus robôs de negociação.
Solicito o apoio de todos em ajuda a resolver esse código simples, mais que até o momento eu não conseguir finalizar.
Obrigado por ler e bons negócios!
Segue o código:
//+------------------------------------------------------------------+
//| Moving Average EA |
//| Baseado no código disponível em: |
//| https://www.mql5.com/en/code/14640 |
//+------------------------------------------------------------------+
// Inclui bibliotecas padrão do MQL5
#include <trade\trade.mqh>
#include <Arrays\ArrayObj.mqh>
// Variáveis globais
CTrade trade; // Manipulador da negociação
int stoploss; // Stop Loss inicial
int stoploss_positivo; // Stop Loss ajustado para breakeven
int MagicNumber = 20210330; // Número mágico para as ordens
double lot = 0.1; // Tamanho da posição
int fast_MA = 5; // Período da média móvel rápida
int slow_MA = 10; // Período da média móvel lenta
// Vetores de dados para as médias móveis
double ma_fast[];
double ma_slow[];
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- Inicializa a série temporal para os vetores
ArraySetAsSeries(ma_fast, true);
ArraySetAsSeries(ma_slow, true);
//--- Define as médias móveis a serem utilizadas
int fast_MA_handle = iMA(_Symbol, _Period, fast_MA, 0, MODE_SMA, PRICE_CLOSE);
int slow_MA_handle = iMA(_Symbol, _Period, slow_MA, 0, MODE_SMA, PRICE_CLOSE);
//--- Retorna um sinal de sucesso para a inicialização do expert
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
// Se o expert for chamado no início de uma nova barra
if(isNewBar())
{
// Copia os valores das médias móveis para os vetores
int copy_fast_MA = CopyBuffer(fast_MA_handle, 0, 0, 3, ma_fast);
int copy_slow_MA = CopyBuffer(slow_MA_handle, 0, 0, 3, ma_slow);
// Se os vetores estiverem preenchidos
if(copy_fast_MA == 3 && copy_slow_MA == 3)
{
// Sinal de compra quando a média móvel rápida cruza acima da média móvel lenta
bool buy_signal = ma_fast[1] < ma_slow[1] && ma_fast[2] > ma_slow[2];
// Sinal de venda quando a média móvel rápida cruza abaixo da média móvel lenta
bool sell_signal = ma_fast[1] > ma_slow[1] && ma_fast[2] < ma_slow[2];
// Verifica se já há uma posição aberta
if(PositionSelect(_Symbol))
{
// Se for uma posição de compra
if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
{
// Ajusta o stop loss para breakeven
if(_Bid - PositionGetDouble(POSITION_PRICE_OPEN) > stoploss_positivo)
trade.PositionModify(PositionGetInteger(POSITION_TICK), _Symbol, 0, _Bid - stoploss_positivo * _Point, 0, 0);
}
// Se for uma posição de venda
else if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
{
// Ajusta o stop loss para breakeven
if(PositionGetDouble(POSITION_PRICE_OPEN) - _Ask > stoploss_positivo)
trade.PositionModify(PositionGetInteger(POSITION_TICK), _Symbol, 0, PositionGetDouble(POSITION_PRICE_OPEN) - stoploss_positivo * _Point, 0, 0);
}
}
// Se não houver posição aberta
else
{
// Se houver sinal de compra
if(buy_signal)
{
// Entra em posição de compra
trade.Buy(lotSize, _Symbol, 0, 0, 0, "Entrada de Compra");
}
// Se houver sinal de venda
else if(sell_signal)
{
// Entra em posição de venda
trade.Sell(lotSize, _Symbol, 0, 0, 0, "Entrada de Venda");
}
}
}