Discussão do artigo "Guia passo a passo para iniciantes para escrever um Expert Advisor no MQL5" - página 29

 
O arquivo dentro do download está errado, por favor, corrija-o.
 

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.

So formulieren Sie das Pflichtenheft eines Auftrages für einen Handelsroboter
So formulieren Sie das Pflichtenheft eines Auftrages für einen Handelsroboter
  • www.mql5.com
Handeln Sie nach Ihrer eigenen Strategie? Wenn Sie Ihre Handelsregeln formalisieren und als Algorithmus für ein Programm beschreiben können, wäre es doch besser, Ihren Handel einem automatisierten Expert Advisor anzuvertrauen. Ein Roboter braucht weder Schlaf noch Nahrung und ist keinen menschlichen Schwächen unterworfen. In diesem Artikel zeigen wir Ihnen, wie Sie, um einen Handelsroboter im Freelance-Service in Auftrag zu geben, das sogenannte Pflichtenheft erstellen.
 

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.

Arquivos anexados:
myFirstEA.mq5  25 kb
 

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();

}

//+------------------------------------------------------------------+

Discover new MetaTrader 5 opportunities with MQL5 community and services
Discover new MetaTrader 5 opportunities with MQL5 community and services
  • 2023.05.27
  • www.mql5.com
MQL5: language of trade strategies built-in the MetaTrader 5 Trading Platform, allows writing your own trading robots, technical indicators, scripts and libraries of functions
 
Joosy #:

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.

Handelsereignisse in MetaTrader 5
Handelsereignisse in MetaTrader 5
  • www.mql5.com
Eine Überwachung des aktuellen Status eines Handels-Account bedeutet offene Positions und Order kontrollieren zu können. Bevor ein Handelssignal zu einem Abschluss wird, sollte es vom Client-Terminal als Anfrage zum Handels-Server geschickt werden, wo es in eine Order-Warteschlange gestellt wird und auf seine Bearbeitung wartet. Eine Anfrage vom Handels-Server annehmen, sie löschen, wenn sie abläuft oder auf ihrer Grundlage einen Abschluss ausführen - alle diese Handlungen haben Handelsereignisse zur Folge, und der Handels-Server informiert das Terminal entsprechend darüber.
 
Carl Schreiber #:

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:

   bool Buy_opened = false, Sell_opened = false; // variáveis para manter o resultado da posição aberta

Mas, posteriormente, elas são definidas novamente se houver uma posição correspondente.

   if(PositionSelect(_Symbol) == true) { // temos uma posição aberta

      if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) {

         Buy_opened = true;  //É uma compra

      }

      if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL) {

         Sell_opened = true; // É uma venda

      }

   }

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😉

Einen Expert Advisor mit Hilfe des MQL5 Objekt-orientierten Programmieransatzes schreiben
Einen Expert Advisor mit Hilfe des MQL5 Objekt-orientierten Programmieransatzes schreiben
  • www.mql5.com
Dieser Beitrag beschäftigt sich mit dem Objekt-orientierten Ansatz, um das zu machen, was wir bereits im Artikel "Schrittweiser Leitfaden zum Schreiben eines Expert Advisors in MQL5 für Anfänger" getan haben - einen einfachen Expert Advisor erstellen. Die meisten Menschen glauben, das sei schwer, doch ich darf Ihnen versichern: wenn Sie diesen Beitrag gelesen haben, dann können Sie Ihren eigenen Objekt-orientierten Expert Advisor schreiben.
 
Joosy #:
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;

   bool Buy_opened = false, Sell_opened = false; // variáveis para manter o resultado da posição aberta
   
   for(int i=0; i < PositionsTotal(); i++) {
      ticket = PositionGetTicket(i);
      if(PositionGetString(POSITION_SYMBOL) == _Symbol && PositionGetInteger(POSITION_MAGIC) == EA_Magic) {
         if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) { 
            Buy_opened = true; 
         }
         if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL) { 
            Sell_opened = true; 
         }
      }   
   }
 

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.

Arquivos anexados:
my_first_ea.mq5  12 kb
 

Testador - "Modo de preenchimento não suportado"

Tentei em 3 corretoras diferentes. Qual é o problema?