Problemas de criação de EA com a Modalmais em MQL5, usando o MT5.

 

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
MqlTradeRequest mrequest;
MqlTradeResult mresult;
      
ZeroMemory(mrequest);
      
mrequest.action = TRADE_ACTION_DEAL;
mrequest.price = NormalizeDouble(Ask,1);
mrequest.symbol = _Symbol;
mrequest.volume = 1;
mrequest.magic = 1234;
mrequest.type = ORDER_TYPE_BUY;
mrequest.sl = Ask - 10;
mrequest.tp = Ask + 10;
mrequest.deviation=100;
mrequest.type_filling = ORDER_FILLING_RETURN;

OrderSend(mrequest,mresult);


Aqui eu usei a biblioteca Trade.mqh:

trade.Buy(1,_Symbol,Ask,Ask-40, Ask+50,0);


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!

Arquivos anexados:
 
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!

Olá, Luis Fernando!

Tenho alguns clientes que têm conta na Modal. Alguns erros eu ainda não entendi a lógica, mas eles acontecem e nós tentamos resolver como for possível. A Modal é onde mais vi esses erros. E a conta demo reage diferente da conta real. 


Experimente fazer o seguinte: Na função OnInit, adicione a linha abaixo


trade.SetTypeFilling(ORDER_FILLING_RETURN);      //Para corretora Modal



E não deixe mais esta linha no seu código:

mrequest.type_filling = ORDER_FILLING_RETURN;

Experimente e veja se surte algum efeito.
 
Sonia Tait:

Olá, Luis Fernando!

Tenho alguns clientes que têm conta na Modal. Alguns erros eu ainda não entendi a lógica, mas eles acontecem e nós tentamos resolver como for possível. A Modal é onde mais vi esses erros. E a conta demo reage diferente da conta real. 


Experimente fazer o seguinte: Na função OnInit, adicione a linha abaixo


trade.SetTypeFilling(ORDER_FILLING_RETURN);      //Para corretora Modal



E não deixe mais esta linha no seu código:

Olá Sonia!

Obrigado pela resposta!

Eu tentei fazer isso que você falou e deu certo para abrir a Order, mas ela não fecha nunca..

Estou tentando no Testador de Estratégias da conta real do MT5 da Modal.. A ordem é colocada, junto com o SL e o TP, mas ainda assim, quando o preço passa pelo TP ou SL a ordem não é fechada. (Se eu entro comprado e o preço sobe até meu TP, nada acontece. Não aparece que ordem é fechada e portanto meu programa não pode iniciar outra operação. Ela só fecha quando eu mesmo interrompo o programa)

Não sei mais o que fazer =/

PS: No meu programa, eu não consigo usar o OrdesTotal(), pois ele fica sempre 0, eu estou usando o PositionsTotal(), que muda sempre que eu abro a ordem de compra. Isso está certo?

PS 2: Eu coloquei uma imagem em anexo com o gráfico, com meu Stop Loss sendo ignorado.
Arquivos anexados:
 
Luis Fernando Boschiero Kumruyan:

Olá Sonia!

Obrigado pela resposta!

Eu tentei fazer isso que você falou e deu certo para abrir a Order, mas ela não fecha nunca..

Estou tentando no Testador de Estratégias da conta real do MT5 da Modal.. A ordem é colocada, junto com o SL e o TP, mas ainda assim, quando o preço passa pelo TP ou SL a ordem não é fechada. (Se eu entro comprado e o preço sobe até meu TP, nada acontece. Não aparece que ordem é fechada e portanto meu programa não pode iniciar outra operação. Ela só fecha quando eu mesmo interrompo o programa)

Não sei mais o que fazer =/

PS: No meu programa, eu não consigo usar o OrdesTotal(), pois ele fica sempre 0, eu estou usando o PositionsTotal(), que muda sempre que eu abro a ordem de compra. Isso está certo?

PS 2: Eu coloquei uma imagem em anexo com o gráfico, com meu Stop Loss sendo ignorado.

OrdersTotal() costuma funcionar sim, para as ordens abertas.

Pergunta: Quando você inicia o robô, aparece uma caixa com 2 abas: uma chamada Parâmetros de Entrada e outra chamada Comum. Vc está habilitando as 2 caixas da aba Comum?

 
Sonia Tait:

OrdersTotal() costuma funcionar sim, para as ordens abertas.

Pergunta: Quando você inicia o robô, aparece uma caixa com 2 abas: uma chamada Parâmetros de Entrada e outra chamada Comum. Vc está habilitando as 2 caixas da aba Comum?

Eu não abro o robô, apenas seleciono ele no Testador de Estratégias. Meu "robô" ainda está muito simples, apenas tenta abrir uma Order com SL e TP. Não tem nenhum parâmetro de entrada.


Eu vou colocar aqui meu código completo (que é tão simples quanto parece):

//+------------------------------------------------------------------+
//|                                                      testeEA.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 initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   trade.SetTypeFilling(ORDER_FILLING_RETURN); 
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick() {

   double Ask = SymbolInfoDouble(_Symbol,SYMBOL_ASK);
   double Bid = SymbolInfoDouble(_Symbol,SYMBOL_BID);
   
   if(PositionsTotal() == 0) {
      //trade.Buy(1,_Symbol,Ask,Ask-5, Ask+10,0);
      trade.BuyStop(1,Ask,_Symbol, Ask-5, Ask + 10, ORDER_TIME_DAY,0, NULL);
   }
   
}

Eu tentei usar o BuyStop pra ver se muda alguma coisa, mas dá na mesma =/


É estranho por que a Ordem aparece no gráfico, com as linhas de TP e SL, mas simplesmente nada acontece quando o preço passa por essas 2 últimas.

 

BuyStop é diferente de Buy. 

Buy é compra a mercado. O BuyStop é uma ordem que é disparada quando atinge um certo preço.

Talvez seja interessante você dar uma pesquisada sobre os tipos de ordem.

Existe outros tipos... Dá uma olhada aqui na classe CTrade:
https://www.mql5.com/pt/docs/standardlibrary/tradeclasses/ctrade/ctradebuy

Do lado esquerdo tem alguns tipos. Às vezes convém pegar exemplo de código de robô simples pronto só para pegar o jeito deles. 

Experimenta isso aqui:
if(PositionsTotal()==0){

if(!trade.Buy(1,Symbol(),Ask,Ask-5,Ask+10,"Comprou!"))

      Print("Buy() method failed. Return code=",trade.ResultRetcode(),". Code description: ",trade.ResultRetcodeDescription());

}

Assim, se falhar de novo, pode ser que apareça o motivo na aba Diário

Documentação sobre MQL5: Biblioteca Padrão / Classes de negociação / CTrade / Buy
Documentação sobre MQL5: Biblioteca Padrão / Classes de negociação / CTrade / Buy
  • www.mql5.com
A conclusão bem sucedida do método Buy(...) nem sempre significa a execução bem sucedida da operação de negociação. É necessário verificar o resultado da solicitação da negociação (código de retorno do...
 
Na vdd, assim ele vai mostrar motivo se não comprar... 
 
Sonia Tait:

BuyStop é diferente de Buy. 

Buy é compra a mercado. O BuyStop é uma ordem que é disparada quando atinge um certo preço.

Talvez seja interessante você dar uma pesquisada sobre os tipos de ordem.

Existe outros tipos... Dá uma olhada aqui na classe CTrade:
https://www.mql5.com/pt/docs/standardlibrary/tradeclasses/ctrade/ctradebuy

Do lado esquerdo tem alguns tipos. Às vezes convém pegar exemplo de código de robô simples pronto só para pegar o jeito deles. 

Experimenta isso aqui:
if(PositionsTotal()==0){

if(!trade.Buy(1,Symbol(),Ask,Ask-5,Ask+10,"Comprou!"))

      Print("Buy() method failed. Return code=",trade.ResultRetcode(),". Code description: ",trade.ResultRetcodeDescription());

}

Assim, se falhar de novo, pode ser que apareça o motivo na aba Diário


Eu tentei usar isso, mas a ordem é colocada normalmente =/ Não to entendendo mais nada.


Eu vou colocar outro print aqui em anexo.. Parece que ele dá erro em uma primeira ordem por eu não usar o NormalizeDouble e tentar mandar a ordem com um preço quebrado, mas a segunda entra, ela é executada, não retorna erro nenhum, aparece no histórico, só não pega o SL e o TP...


Muito estranho isso...


ATUALIZAÇÃO:

É estranho.. mas se eu coloco o Take Profit fixo em 3930 (o preço atual é 3923) e tiro o limitador de 1 order por vez, quando o preço chega acima de 3930, a ordem de venda é executada =/
Nesse momento, ele vende tudo que eu tinha comprado.


Logo em seguida começa a dar erro, pois o preço continua subindo e, sendo o TP fixo, dá erro de Invalid Stops nas próximas orders.


Não faz o menor sentido o que está acontecendo T-T


ATUALIZAÇÃO 2 (menos sentido ainda):


Se eu coloco o TP fixo a 3930.0 e o if principal só ativar quando o preço for 3930.5 (meio ponto acima do TP - deveria dar o erro de Invalid Stops, pois o TP não pode ser menor que o preço de entrada), ele compra em 3930.5 e vende em 3930.......

Se eu tento aumentar o preço fixo de compra pra 3931, ele dá erro de Invalid Stops.


Eu to fazendo alguma coisa muuuuito errada pra estar dando esse tipo de erro??

Arquivos anexados:
log.png  56 kb
 
Luis Fernando Boschiero Kumruyan:


Olá Luis,

você está enfrentando três problemas.

1) A série WDOF19 iniciou em 03/12, preços antes dessa data  não estão normalizado, então coloque como data inicial para teste dia 03/12.

2) Os preços para o Dólar tem que obedecer o step de 0,50... Ou seja 3292.00 3292,50 3293,00 3293,50 3294,00 .... 3293.960 não é um preço correto use a função NormalizePrice da classe cSymbol para normalizar os preços AT, SL e TP.

3) Faça os testes de leilão de abertura, ou seja: se já abriu um novo candle depois do OnInit() e se o preço Ask e Bid   estão corretos (Ask > Bid e  Ask > 0  e Bid > 0), isso deve ser feito no inicio do OnTick();

Espero que ajude.

At.te

Rogério

 
Rogerio Giannetti Torres:

Olá Luis,

você está enfrentando três problemas.

1) A série WDOF19 iniciou em 03/12, preços antes dessa data  não estão normalizado, então coloque como data inicial para teste dia 03/12.

2) Os preços para o Dólar tem que obedecer o step de 0,50... Ou seja 3292.00 3292,50 3293,00 3293,50 3294,00 .... 3293.960 não é um preço correto use a função NormalizePrice da classe cSymbol para normalizar os preços AT, SL e TP.

3) Faça os testes de leilão de abertura, ou seja: se já abriu um novo candle depois do OnInit() e se o preço Ask e Bid   estão corretos (Ask > Bid e  Ask > 0  e Bid > 0), isso deve ser feito no inicio do OnTick();

Espero que ajude.

At.te

Rogério

Olá Rogério,

  1. Eu ajustei para o Tester iniciar no dia 03/12 (erro meu, nem tinha pensado nisso)
  2. Eu não consegui achar a função NormalizePrice, mas o estranho é que a ordem é colocada e realizada...
  3. Eu fiz o teste de preços do Bid e Ask em cada Tick

Resultado - Não mudou nada...


Eu vou colocar aqui o meu código pra você ver se eu estou esquecendo de algo, junto com um print da tela, para ver que eu não estou ficando maluco.


Aqui está o código principal do meu 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 "macd.mq5"
#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!");
         }
      }
   }   
}


Criei um EA também para calcular o MACD para cada Tick como sinal simples de entrada (só pra testar)... O código é esse:

//+------------------------------------------------------------------+
//|                                                         macd.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"

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


Como você pode ver, o programa é extremamente simples, não tem nenhum segredo em lugar nenhum, apenas o básico do básico. E não funciona de jeito nenhum =/


No print, a seta azul é onde meu EA comprou (a ordem foi colocada, como você pode ver na parte de baixo da imagem)

As setas vermelhas são os lugares onde o TP e o SL foram simplesmente ignorados....


Muito obrigado pela ajuda, se puder continuar tentando, agradeço desde já!

Print -> erro.png

Arquivos anexados:
erro.png  60 kb
 
Luis Fernando Boschiero Kumruyan:


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.

Razão: