Problemas de criação de EA com a Modalmais em MQL5, usando o MT5. - página 2

 
Rogerio Giannetti Torres:

Oh Luis,

por favor seriedade, não invente nada e nem post código truncado... uma leitura rápida em "EA macd" dá para ver que não vai compilar.

Que? Como assim?


Ele está rodando normalmente o MACD, ele calcula e consegue comprar quando o MACD está positivo e vender quando está negativo.


Tudo está sendo compilado normalmente, só usei em um outro EA para testar a importação de funções de um outro programa no meu EA.


Estou com um problema sério aqui, não sei se você leu tudo, mas falei que a ordem foi colocada. Ela só não fecha quando o preço atinge o Take Profit ou o Stop Loss.


Não entendi o motivo da sua resposta...

 
Luis Fernando Boschiero Kumruyan:


Luis,

o MACD.mq5 que você postou não pode estar rodando por que não compila!

Eu tentei ajudar., enfim boa sorte



 
Rogerio Giannetti Torres:

Luis,

o MACD.mq5 que você postou não pode estar rodando por que não compila!

Eu tentei ajudar., enfim boa sorte



Ele só dá problema de event handling, mas quando importado e a função dele chamada dentro do meu EA principal funciona....

Poxa, sem motivo pra responder desse jeito..

Aqui está o MESMO código, mas com a função dentro do próprio EA:

//+------------------------------------------------------------------+
//|                                                    testeMACD.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#include <Trade\Trade.mqh>
CTrade trade;
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+

void OnInit() {
   trade.SetTypeFilling(ORDER_FILLING_RETURN); 
}

void OnTick() {
   
   double macd = checarMacd(9,21,9);
   
   double Ask = SymbolInfoDouble(Symbol(),SYMBOL_ASK);
   double Bid = SymbolInfoDouble(Symbol(),SYMBOL_BID);

   if(Ask > Bid && Ask > 0 && Bid > 0) {
      if(PositionsTotal() == 0) {
         if(macd > 0) {
            trade.Buy(1,_Symbol, Ask, Ask-5, Ask+5,"Comprou!");
         } else if(macd < 0) {
            trade.Sell(1,_Symbol, Bid, Bid + 5, Bid - 5,"Vendeu!");
         }
      }
   }   
}

double checarMacd(int fast, int slow, int periodo) {
   double macd = iMACD(Symbol(),PERIOD_M5, fast, slow, periodo, PRICE_CLOSE);
   
   return macd;
}


De qualquer forma, você sendo um programador experiente, como eu já vi no seu perfil, pode ver que o problema não é esse.

Você por acaso chegou a ver o print que eu mandei como anexo? Se você viu, sabe (sendo um programador) que esta ordem nunca entraria se o MACD não estivesse funcionando...


Mesmo com esse código atualizado, o TP e o SL são simplesmente ignorados.


Ainda pode tentar me ajudar?

 
Luis Fernando Boschiero Kumruyan:


Luis,

lamento dizer que seu programa está totalmente errado, você está testando o valor do handle que no caso é igual 10 (first custom indicator)  e não o valor do MACD. Segue um modelo para os próximos EA que for desenvolver em MQL5.

//+------------------------------------------------------------------+
//|                                                    testeMACD.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh> 

CTrade      cTrade;    // classe cTrade
CSymbolInfo cSymbol;   // classe cSymbolInfo 

int      macdHandle,nBars,nBarsAnt;
double   macdValue[],macdSignal[];
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+

int OnInit()
  {
   cTrade.SetTypeFilling(ORDER_FILLING_RETURN);
   cSymbol.Name(_Symbol); 

   macdHandle=iMACD(_Symbol,_Period,9,21,9,PRICE_CLOSE);
   if(macdHandle==INVALID_HANDLE)
     {
      //--- mensagem sobre a falha e a saída do código de erro 
      PrintFormat("Falha ao criar o manipulador do indicador iMACD para o símbolo %s/%s, código de erro %d",
                  _Symbol,
                  EnumToString(_Period),
                  GetLastError());
      //--- o EA é interrompido
      return(INIT_FAILED);
     }
//--- 

   nBars=Bars(_Symbol,_Period);
   nBarsAnt=nBars;
   return(INIT_SUCCEEDED);

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
  
   nBars=Bars(_Symbol,_Period);
   if(nBars==nBarsAnt) return; // Só processa  barra fechada 
   nBarsAnt=nBars;

   double Ask = SymbolInfoDouble(_Symbol,SYMBOL_ASK);
   double Bid = SymbolInfoDouble(_Symbol,SYMBOL_BID);
   if( ! (Ask>Bid && Ask>0 && Bid>0) ) return; // Em leilão ou ticks com problema return !?
    
   if(!PositionSelect(_Symbol)) // Se não existe posição aberta para _Symbol
     {
     
      CopyBuffer(macdHandle,MAIN_LINE,0,1,macdValue); 
      if(macdValue[0]>0)
        {
         cTrade.Buy(1,_Symbol,Ask,Ask-5,Ask+5,"Comprou!");
        }
      if(macdValue[0]<0) 
        {
         cTrade.Sell(1,_Symbol,Bid,Bid+5,Bid-5,"Vendeu!");
        }
     }
     
  }
//+------------------------------------------------------------------+
 
Rogerio Giannetti Torres:

Luis,

lamento dizer que seu programa está totalmente errado, você está testando o valor do handle que no caso é igual 10 (first custom indicator)  e não o valor do MACD. Segue um modelo para os próximos EA que for desenvolver em MQL5.


Nossa muito obrigado pelo comentário! Eu tenho muitas coisas erradas ainda no meu código, por que ainda estava tentando resolver o problema da Ordem não fechando..

Mas ainda estou aprendendo e com certeza vou estudar muito!


Vou estudar seu código!


Eu acabei resolvendo o problema!!! Não era nada do meu código, eu não acredito o quão idiota eu sou por não ter visto isso.... O testador estava configurado para moeda USD, não BRL..........................


Muito obrigado a todos que tentaram me ajudar!! Vou estudar as respostas e os códigos.


Boa tarde gente :)

 
Luis Fernando Boschiero Kumruyan:

Olá, estou entrando agora neste rumo de programação de EAs com MQL. Já sou programador já faz um tempo e não sei direito qual está sendo meu problema aqui.

Estou tentando criar ordens de compra e venda (cada uma com seu take profit e stop loss). Tentei usar o MT5 com uma conta na XP. Em uma conta demo, eu consigo enviar ordens tanto com o MqlTradeRequest, quanto com o Trade.mqh.
Quando tento fazer isso com a Modal, não consegui criar orders com o Trade.mqh, mas consegui com o MqlTradeRequest.

Meu problema está sendo nas orders mesmo. Elas aparece no gráfico do Strategy Tester com a linha padrão da order e as 2 linhas vermelhas (uma de sl e outra de tp), mas o preço, quando passa por essa linha, não fecha a order. Ela continua aberta como se eu nunca tivesse colocado um tp.


Alguém pode tentar me ajudar?


Esse é o código que funciona com as 2 corretoras:

  • A parte do ORDER_FILLING_RETURN eu coloquei por causa da Modal, que não funciona com outro tipo de preenchimento
  • O Ask é uma variável que eu criei mesmo apenas para pegar o preço de mercado para compra
  • Estou tentando operar em Mini Dólar


Aqui eu usei a biblioteca Trade.mqh:


Como eu disse, nesses 2 casos aí de cima as ordens são enviadas e aparecem no histórico com o SL e o TP, mas quando o preço passa por eles nada acontece!!


Coloquei 2 imagens em anexo mostrando o gráfico e a ordem aberta no histórico, pra vocês verem que eu não estou louco.


Quem puder ajudar, já agradeço!

No dólar o tick é de 0,5 mas isso não significa 0,5 pontos não. 0,5 pontos significa 500 pontos. Conta sempre o ponto se conta a partir do primeiro zero antes da vírgula. Então em vez de colocar ASK+50 no seu stop você vai botar ASK+5000, isso significa que é o ASK mais 10 ticks. Faça só essa alteração que deve dar certo, se não der me avisa. 

 
Luis Fernando Boschiero Kumruyan:

Olá, estou entrando agora neste rumo de programação de EAs com MQL. Já sou programador já faz um tempo e não sei direito qual está sendo meu problema aqui.

Estou tentando criar ordens de compra e venda (cada uma com seu take profit e stop loss). Tentei usar o MT5 com uma conta na XP. Em uma conta demo, eu consigo enviar ordens tanto com o MqlTradeRequest, quanto com o Trade.mqh.
Quando tento fazer isso com a Modal, não consegui criar orders com o Trade.mqh, mas consegui com o MqlTradeRequest.

Meu problema está sendo nas orders mesmo. Elas aparece no gráfico do Strategy Tester com a linha padrão da order e as 2 linhas vermelhas (uma de sl e outra de tp), mas o preço, quando passa por essa linha, não fecha a order. Ela continua aberta como se eu nunca tivesse colocado um tp.


Alguém pode tentar me ajudar?


Esse é o código que funciona com as 2 corretoras:

  • A parte do ORDER_FILLING_RETURN eu coloquei por causa da Modal, que não funciona com outro tipo de preenchimento
  • O Ask é uma variável que eu criei mesmo apenas para pegar o preço de mercado para compra
  • Estou tentando operar em Mini Dólar


Aqui eu usei a biblioteca Trade.mqh:


Como eu disse, nesses 2 casos aí de cima as ordens são enviadas e aparecem no histórico com o SL e o TP, mas quando o preço passa por eles nada acontece!!


Coloquei 2 imagens em anexo mostrando o gráfico e a ordem aberta no histórico, pra vocês verem que eu não estou louco.


Quem puder ajudar, já agradeço!

No Deviation ponha 1000 ou 2000
Razão: