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

 
Bom dia, se alguém puder me ajudar, por favor. No meu entendimento, fiz tudo o que está indicado no artigo. Mas não consigo ter duas operações abertas simultâneas, além do que entendo que o autor queria fazer para não colocar compra se já havia compra ou venda se já havia venda. Minha estratégia, por exemplo, envia um sinal de venda quando tenho uma ordem de compra aberta e, em vez de abrir uma venda, o código fecha a operação de compra sem que ela consiga tocar o tp/sl. Assim, fico sem nenhuma compra ou venda. A venda fecha a compra e a compra fecha a venda. Estou usando apenas um par, apenas um período de tempo e apenas um tamanho de lote em minha estratégia. Você pode me dizer como posso ter a compra e a venda abertas ao mesmo tempo se isso acionar a estratégia? Ou seja, que as ordens sejam fechadas SOMENTE por tp/sl. Muito obrigado desde já.
 
Ótimo artigo!
 
Sella170:
Alguém sabe se posso utilizar esse EA para mini-índice ou mini-dólar ?
Sim, é possível utilizar o EA com o mouse arrastando para gráfico ou menu > inserir > Expert advisor > {nomedoseurobo}.

Espero esclarecido sua dúvida.

 
Muito obrigado pelo excelente artigo. Onde e como seria possível implementar o módulo Intraday Time Filter em seu código?
 

Olá pessoal, bom dia.

Estou no "Testador de Estratégia" com este arquivo do final do Guia e ele aparece o seguinte erro:

*o erro já foi conversado aqui neste artigo, porém nenhuma solução escrita deu certo comigo e preciso de suas ajudas.


OF      0       12:44:39.040    EA_ADX (XAUUSD,H1)      2020.01.03 19:00:00   Alert: The Buy order request could not be completed -error:4756
ED      2       12:44:39.043    Trades  2020.01.03 20:00:00   failed market buy 0.1 XAUUSD sl: 1549.09 tp: 1549.16 [Invalid stops]
JP      0       12:44:39.043    EA_ADX (XAUUSD,H1)      2020.01.03 20:00:00   Alert: The Buy order request could not be completed -error:4756
ER      2       12:44:39.049    Trades  2020.01.03 21:00:00   failed market buy 0.1 XAUUSD sl: 1549.90 tp: 1549.97 [Invalid stops]
MR      0       12:44:39.049    EA_ADX (XAUUSD,H1)      2020.01.03 21:00:00   Alert: The Buy order request could not be completed -error:4756
PP      2       12:44:39.053    Trades  2020.01.03 22:00:00   failed market buy 0.1 XAUUSD sl: 1548.16 tp: 1548.23 [Invalid stops]


O arquivo é o do final do Guia.

Como resolver este problema?

 
surfdoode2:


Também continuo com esse erro depois de fazer as duas correções sugeridas:

ZeroMemory(mrequest);

e também

if(Buy_opened || Sell_opened)

Alguém pode me ajudar com o erro 4756? Parece que não é possível colocar uma ordem de compra.

Verifique se você usou a função SymbolInfoTick e escreveu essa parte do código:

//--- Obtenha a última cotação de preço usando a estrutura MQL5 MqlTick
   if(!SymbolInfoTick(_Symbol,latest_price))
     {
      Alert("Error getting the latest price quote - error:",GetLastError(),"!!");
      return;
     }
Documentation on MQL5: Market Info / SymbolInfoTick
Documentation on MQL5: Market Info / SymbolInfoTick
  • www.mql5.com
SymbolInfoTick - Market Info - MQL5 Reference - Reference on algorithmic/automated trading language for MetaTrader 5
 
Há um erro na lógica do algoritmo aqui:
 //--- Do we have positions opened already?
     bool Buy_opened= false ;   // variable to hold the result of Buy opened position
     bool Sell_opened= false ; // variable to hold the result of Sell opened position
    
     if ( PositionSelect ( _Symbol ) == true )   // we have an opened position
    {
         if ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_BUY )
         {
            Buy_opened = true ;   //It is a Buy
         }
         else if ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_SELL )
         {
            Sell_opened = true ; // It is a Sell
         }
    }

Como PositionSelect seleciona a primeira posição para _Symbol, se o EA abrir uma posição de compra, a variável Sell_opened sempre será falsa enquanto a posição de compra estiver aberta, fazendo com que várias posições de venda sejam realizadas sempre que houver um sinal de venda.

Para corrigir isso e saber se há posições de compra e venda abertas simultaneamente, a seguinte lógica pode ser usada:

 //--- Do we have positions opened already?
   bool Buy_opened = false ;   // variable to hold the result of Buy opened position
   bool Sell_opened = false ; // variables to hold the result of Sell opened position

   if ( PositionSelect ( _Symbol ) == true ) // we have an opened position
   {
       for ( int i= 0 ;i< PositionsTotal ();i++){
	 
         PositionSelectByTicket ( PositionGetTicket (i));

         if ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_SELL )
         {
            Sell_opened = true ; // It is a Sell
         } else if ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_BUY )
         {
            Buy_opened = true ; //It is a Buy
         }
      }
   
Documentação sobre MQL5: Funções de Negociação / PositionSelect
Documentação sobre MQL5: Funções de Negociação / PositionSelect
  • www.mql5.com
PositionSelect - Funções de Negociação - Referência MQL5 - Referência sobre algorítimo/automatização de negociação na linguagem para MetaTrader 5
 
Vitor Gama Barreto:

Olá pessoal, bom dia.

Estou no "Testador de Estratégia" com este arquivo do final do Guia e ele aparece o seguinte erro:

*o erro já foi conversado aqui neste artigo, porém nenhuma solução escrita deu certo comigo e preciso de suas ajudas.



O arquivo é o do final do Guia.

Como resolver este problema?

Verifique o preço de venda que está solicitando, para isso use breakpoint para depurar as variáveis mrequest.price, mrequest.sl e mrequest.tp 

Tente mudar

mrequest.type_filling = ORDER_FILLING_FOK;                               // Order execution type

para:

mrequest.type_filling = ORDER_FILLING_IOC;                               // Order execution type


Alguns papeis tem regras de Stop Loss minimo, leia mais aqui: https://www.mql5.com/pt/forum/319474

ERRO 4756 - INVALID PRICE
ERRO 4756 - INVALID PRICE
  • 2019.08.06
  • www.mql5.com
Ja tentei de tudo, por favor, preciso muito da ajuda de voces!! alguem pode me dar uma luz??? E retorna o : 2019.08.05 13:42:51.236 Core 1 2019.08...
 

Olá,

Muito obrigado pelo artigo, Samuel, você é demais!

Foi um pouco difícil fazê-lo funcionar com minha corretora porque o artigo está no modo "net" e tive que procurar informações para colocá-lo no modo "hedging". O primeiro problema que encontrei foi com o mrequest.type_filling .

Para o corretor XM, o que funciona é:

mrequest.type_filling = ORDER_FILLING_IOC;                                          // Tipo de execução da ordem

Se você não souber qual deles o seu MT5 permite, minha recomendação é usar a função TypeFilling() em um Print(TypeFilling()) ou um Comment( TypeFilling()) e ele retorna o tipo; se ele informar que é 1 (ORDER_FILLING_FOK) ou 2 (ORDER_FILLING_IOC), você saberá qual deles deve colocar(https://www.mql5.com/docs/constants/tradingconstants/orderproperties#enum_order_type_filling) porqueORDER_FILLING_FOK (1) não funciona para mim com essa corretora.


Depois que isso for corrigido, o problema é que o PositionSelect abre muitas posições. Embora Samuel não diga isso em sua estratégia, entendo que o objetivo é abrir uma única posição de compra ou venda (o que vier primeiro) com os critérios estabelecidos (as 4 etapas booleanas) e que, até que essa posição seja fechada, não podemos abrir outra.

O que eu fiz foi alterar esse código ...

//--- não temos erros, portanto, continuamos.
//--- Já temos posições abertas?
    bool Buy_opened=false;  // variável que armazena o resultado da posição aberta Purchase
    bool Sell_opened=false; // variável que armazena o resultado da posição aberta Venda
    
    if (PositionSelect(_Symbol) ==true)  // temos uma posição aberta
    {
         if (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
         {
            Buy_opened = true;  // É uma compra
         }
         else if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
         {
            Sell_opened = true; // It's a Sale
         }
    }

Para este...

//--- Como não há erros, continuamos.
//--- Já temos posições abertas?
   bool Buy_opened = false;               // Variável que armazena o resultado da posição de compra aberta
   bool Sell_opened = false;              // Variável que armazena o resultado da posição de venda aberta
   
   // Vamos examinar todas as ordens para ver se há alguma em aberto.
   for(int i = 0; i < PositionsTotal(); i++)   
        {
         ulong ticket = PositionGetTicket(i);
         PositionSelectByTicket(ticket);
    
    if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
         {
          Buy_opened = true;       // é uma compra
         }
         else if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
         {
          Sell_opened = true;      // é uma venda
         }
   }

// se houver uma posição aberta, esperamos até que a operação ativa seja fechada (tocando o SL ou oTP).
   if (Buy_opened || Sell_opened) return; 

Observação: Logo após vem a linha...

//--- Copie o preço de fechamento da barra anterior para a barra atual, que é a barra1.
   p_close=mrate[1].close;

Dessa forma, funcionou bem para mim. Espero que seja útil para você.

Com os melhores cumprimentos.

 
surfdoode2:


Também continuo com esse erro depois de fazer as duas correções sugeridas:

ZeroMemory(mrequest);

e também

if(Buy_opened || Sell_opened)

Alguém pode me ajudar com o erro 4756? Parece que não é possível colocar uma ordem de compra.


Talvez o tipo de preenchimento de sua corretora seja ORDER_FILLING_IOC, você pode tentar editar o código a partir de:

mrequest.type_filling = ORDER_FILLING_FOK;

Para:

mrequest.type_filling = ORDER_FILLING_IOC;

Eu tive o mesmo problema e agora o resolvi com sucesso