Discussão do artigo "Guia passo a passo para iniciantes para escrever um Expert Advisor no MQL5" - página 29
Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
Olá a todos,
Atualmente, tenho o EA do Samuel em execução em uma conta de demonstração e estou bastante satisfeito. Boa programação!
Ele mostra uma boa negociação de tempos em tempos, mas tem um ponto fraco:
As opções de VENDA se acumulam nos pontos de inflexão no vale dos gráficos e o mesmo acontece nos picos correspondentes com as opções de COMPRA, que, em seguida, atingem os livros maciçamente como negativos. Eu gostaria de reprogramar isso, ou seja, COMPRAS no dia, VENDAS no pico, mas até agora minhas tentativas falharam. Também tenho apenas um conhecimento rudimentar de MQL5.
Alguém pode me ajudar?
SG e muito obrigado!
Isso geralmente não funciona porque os outros pontos em que o EA assume uma posição lucrativa também são revertidos ....
Mas leia isto:
Especificações do EA-freelancer: https://www.mql5.com/pt/articles/4368
Indi: https://www.mql5.com/pt/articles/4304
Como encomendar um robô de negociação em MQL5 e MQL4: https: //www.mql5.com/de/articles/117
Com essas dicas, você pode especificar sua ideia com mais precisão, seja apenas para você ver se funciona ou para pedir a alguém que a faça, com ou sem pagamento.
Olá a todos (especialmente ao querido autor)
Eu codifiquei junto com este artigo. Gostei muito e aprendi muito com ele.
Obrigado por escrever um artigo tão informativo.
No entanto, estou com um problema. Meu EA não fez nenhuma ordem. Baixei o código do autor, mas ele também não fez nenhuma ordem.
Como o artigo tem 13 anos, presumo que o código esteja desatualizado. Alguém pode me ajudar?
Meu código está no arquivo abaixo. Desde já, agradeço a todos.
Olá, quero avisá-lo de que sou iniciante, portanto, não diga muitos palavrões, se é que há algum)
Eu queria criar um Expert Advisor por meio do gerador (e tudo parece estar bem, mas há um porém)
Eu gostaria de abrir uma operação não imediatamente após o fechamento da anterior, mas, por exemplo, após uma vela,
Tentei escrever algo, mas no final dá um erro.
Alguém pode me ajudar com isso ou indicar qual é o erro e como corrigi-lo?
E aqui está o código real:
//+------------------------------------------------------------------+
//| ParExpert.mq5 |
//| Copyright 2022, MetaQuotes Ltd.
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link"https://www.mql5.com"
#property version "1.00"
//+------------------------------------------------------------------+
//| Incluir |
//+------------------------------------------------------------------+
#include <Expert\Expert.mqh>
//--- sinais disponíveis
#include <Expert\Signal\SignalSAR.mqh>
//--- trilhas disponíveis
#include <Expert\Trailing\TrailingFixedPips.mqh>
//--- gerenciamento de dinheiro disponível
#include <Expert\Money\MoneyFixedLot.mqh>
//+------------------------------------------------------------------+
//| Entradas
//+------------------------------------------------------------------+
//--- entradas para especialista
input string Expert_Title = "ParExpert"; // Nome do documento
ulong Expert_MagicNumber = 24195; //
bool Expert_EveryTick = false; //--- entradas para o sinal principal
//--- entradas para o sinal principal
input int Signal_ThresholdOpen = 10; //Valor do limiar do sinal para abrir [0...100]
input int Signal_ThresholdClose = 0; // Valor do limite do sinal para fechar [0...100]
input double Signal_PriceLevel = 0,0; // Nível de preço para executar uma negociação
input double Signal_StopLevel = 500; // Nível de stop loss (em pontos)
input double Signal_TakeLevel = 70; // Nível de take profit (em pontos)
input int Signal_Expiration = 4; //Vencimento das ordens pendentes (em barras)
input double Signal_SAR_Step = 0,02; // Incremento de velocidade SAR parabólico (0,02,0,2)
input double Signal_SAR_Maximum = 0,2; // Parabolic SAR(0,02,0,2) Taxa máxima
input double Signal_SAR_Weight = 0,6; // Parabolic SAR(0,02,0,2) Peso [0...1,0]
//--- entradas para trailing
input int Trailing_FixedPips_StopLevel = 0; // Nível de trailing de stop loss (em pontos)
input int Trailing_FixedPips_ProfitLevel= 10; // Nível de trailing de Take Profit (em pontos)
//--- entradas para dinheiro
input double Money_FixLot_Percent = 10.0; // Porcentagem
input double Money_FixLot_Lots = 0,1; // Volume fixo
//--- entradas para cooldown de negociação
input int Expert_TradeCooldown = 1; // Período de resfriamento entre as negociações (em barras)
//+------------------------------------------------------------------+
//| Objeto global de especialista
//+------------------------------------------------------------------+
CExpert ExtExpert;
//+------------------------------------------------------------------+
//| Função de inicialização do especialista |
//+------------------------------------------------------------------+
int OnInit()
{
//--- Inicialização do expert
if (!ExtExpert.Init(Symbol(), Period(), Expert_EveryTick, Expert_MagicNumber))
{
//--- falhou
printf(__FUNCTION__ + ": erro ao inicializar o especialista");
ExtExpert.Deinit();
return (INIT_FAILED);
}
//--- Criando sinal
CExpertSignal *signal = new CExpertSignal;
if (signal == NULL)
{
//--- falhou
printf(__FUNCTION__ + ": erro ao criar o sinal");
ExtExpert.Deinit();
return (INIT_FAILED);
}
//---
ExtExpert.InitSignal(signal);
signal.ThresholdOpen(Signal_ThresholdOpen);
signal.ThresholdClose(Signal_ThresholdClose);
signal.PriceLevel(Signal_PriceLevel);
signal.StopLevel(Signal_StopLevel);
signal.TakeLevel(Signal_TakeLevel);
signal.Expiration(Signal_Expiration);
//--- Criando o filtro CSignalSAR
CSignalSAR *filter0 = novo CSignalSAR;
Se (filter0 == NULL)
{
//--- falhou
printf(__FUNCTION__ + ": erro ao criar o filtro0");
ExtExpert.Deinit();
return (INIT_FAILED);
}
signal.AddFilter(filter0);
//--- Definir os parâmetros do filtro
filter0.Step(Signal_SAR_Step);
filter0.Maximum(Signal_SAR_Maximum);
filter0.Weight(Signal_SAR_Weight);
//--- Criação do objeto trailing
CTrailingFixedPips *trailing = novo CTrailingFixedPips;
if (trailing == NULL)
{
//--- falhou
printf(__FUNCTION__ + ": erro ao criar o trailing");
ExtExpert.Deinit();
return (INIT_FAILED);
}
//--- Adicionar trailing ao expert (será excluído automaticamente))
if (!ExtExpert.InitTrailing(trailing))
{
//--- falhou
printf(__FUNCTION__ + ": erro ao inicializar o trailing");
ExtExpert.Deinit();
return (INIT_FAILED);
}
//--- Definir parâmetros do trailing
trailing.StopLevel(Trailing_FixedPips_StopLevel);
trailing.ProfitLevel(Trailing_FixedPips_ProfitLevel);
//--- Criação do objeto dinheiro
CMoneyFixedLot *money = new CMoneyFixedLot;
if (money == NULL)
{
//--- falhou
printf(__FUNCTION__ + ": erro ao criar dinheiro");
ExtExpert.Deinit();
return (INIT_FAILED);
}
//--- Adicionar dinheiro ao especialista (será excluído automaticamente))
if (!ExtExpert.InitMoney(money))
{
//--- falhou
printf(__FUNCTION__ + ": erro ao inicializar o dinheiro");
ExtExpert.Deinit();
return (INIT_FAILED);
}
//--- Definir parâmetros do dinheiro
dinheiro.Porcentagem(Money_FixLot_Percent);
money.Lots(Money_FixLot_Lots);
//--- Verificar os parâmetros de todos os objetos de negociação
if (!ExtExpert.ValidationSettings())
{
//--- falhou
ExtExpert.Deinit();
return (INIT_FAILED);
}
//--- Ajuste de todos os indicadores necessários
if (!ExtExpert.InitIndicators())
{
//--- falhou
printf(__FUNCTION__ + ": erro ao inicializar os indicadores");
ExtExpert.Deinit();
return (INIT_FAILED);
}
//--- Inicializar a variável de tempo da última negociação
datetime lastTradeTime = 0;
ExtExpert.SetVariable("LastTradeTime", lastTradeTime);
//--- ok
return (INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de desinicialização do expert
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
ExtExpert.Deinit();
}
//+------------------------------------------------------------------+
//| Função do manipulador de eventos "Tick"
//+------------------------------------------------------------------+
void OnTick()
{
//--- Verificar o tempo desde a última negociação
datetime lastTradeTime = ExtExpert.GetVariable("LastTradeTime");
int cooldownBars = Bars - ExtExpert.GetBarShiftByTime(Symbol(), Period(), lastTradeTime);
Se (cooldownBars < Expert_TradeCooldown)
{
//--- O período de resfriamento da negociação não terminou, pule a abertura de uma nova negociação
retornar;
}
ExtExpert.OnTrade();
}
//+------------------------------------------------------------------+
//| Função do manipulador de eventos "Trade".
//+------------------------------------------------------------------+
void OnTrade()
{
ExtExpert.OnTrade();
}
//+------------------------------------------------------------------+
//| Função do manipulador de eventos "Timer"
//+------------------------------------------------------------------+
void OnTimer()
{
ExtExpert.OnTimer();
}
//+------------------------------------------------------------------+
Olá a todos😊
@Mario31415927
Isso ocorre simplesmente porque no ticker, toda vez que um novo período ou nova barra (qualquer que seja) as variáveis:
são redefinidas, independentemente de as posições já estarem abertas ou não.
Isso pode ser encontrado com relativa rapidez no código.
No entanto, surge a questão de saber se essa era a intenção e, em caso afirmativo, como todas as posições são fechadas novamente?
Talvez eu não esteja entendendo o tipo de ordem TRADE_ACTION_DEAL nesse contexto?
O processo da ordem de negociação também poderia ser simplesmente adaptado à classe de negociação Trade. Como, por exemplo:
Atenciosamente:-)Leia: https://www.mql5.com/pt/articles/232
Isso explica a diferença e as relações entre ordens, posições e negócios. Estas últimas refletem os processos de registro no lado do corretor.
Leia: https://www.mql5.com/pt/articles/232
Isso explica a diferença e as relações entre ordens, posições e negócios. Estas últimas refletem os processos de registro no lado do corretor.
Olá, Carl,
obrigado pela dica!
No entanto, preciso me corrigir.
É verdade que as variáveis são redefinidas para cada novo período de tempo:
Mas, posteriormente, elas são definidas novamente se houver uma posição correspondente.
No entanto, estou experimentando o fenômeno de que a compra (POSITION_TYPE_BUY) é consultada corretamente, mas não a venda (POSITION_TYPE_SELL). A variável simplesmente não está mais definida?
Tenho que depurar o código passo a passo. Isso só pode ser um erro lógico😉
Sell_opened = true; // É uma venda
Oh, meu Deus, estou tão atento hoje.
Ele só é consultado uma vez. Esse é o erro;-)
Todas as posições devem ser pesquisadas da seguinte forma;
De fato, foi um erro, parece ser um arquivo da Web.
Eu mesmo o reescrevi com base no conteúdo e fiz o upload. Não sei se há algum detalhe, pois sou novo no assunto. Espero que isso ajude.
Testador - "Modo de preenchimento não suportado"
Tentei em 3 corretoras diferentes. Qual é o problema?