Para aqueles que querem testar o mercado "off-line"

 

Pessoal,

Para aqueles que querem testar/debugar suas estratégias e ver como se comportam os parâmetros de colocação de ordem, segue um exemplo com OnTimer().

//+------------------------------------------------------------------+
//|                                                        teste.mq5 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetTimer(5);

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();

  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   MqlTradeRequest request;
   MqlTradeResult result;

   ZeroMemory(request);
   ZeroMemory(result);

   request.action=TRADE_ACTION_DEAL;
   request.type=ORDER_TYPE_BUY;
   request.symbol = _Symbol;
   request.volume = 1;
   request.type_filling=ORDER_FILLING_FOK;
   request.price=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
   request.sl=0;
   request.tp=0;
   request.deviation=20;

   if(OrderSend(request,result))
     {
      Print("OK");
     }
   else
     {
      Print("NOK");
     }

   Sleep(3000);

   bool openPosition=PositionSelect(_Symbol);
   long positionType=PositionGetInteger(POSITION_TYPE);
   double currentVolume=PositionGetDouble(POSITION_VOLUME);

   Print("openPosition: ",openPosition);
   Print("positionType: ",positionType);
   Print("currentVolume: ",currentVolume);
  }
//+------------------------------------------------------------------+
 

Bom dia Youtrade.

Quais são as vantagens de se testar off-line?

 
tcferreira:

Bom dia Youtrade.

Quais são as vantagens de se testar off-line?

Eu uso muito quando quero entender com mais detalhes o comportamento de determinada variável, função e/ou analisar os resultados de uma estratégia.

Quando você usa o OnTimer(), veja que eu coloquei vários Print() para que eu possa ver o conteúdo das variáveis.

Eu posso por exemplo colocar alguns if() para fazer com que o meu EA se comporte de uma forma particular para eu continuar as minhas investigações forçando certas condições.

Outra vantagem é que se fosse fosse usar OnTick(), o mercado deveria estar "aberto" ou seja, você pode fazer a noite por exemplo.

[]s

Coutinho 

 
YouTrade:

...

Outra vantagem é que se fosse fosse usar OnTick(), o mercado deveria estar "aberto" ou seja, você pode fazer a noite por exemplo.

...

Olá Coutinho, ótimo tópico, e se, nesse caso, chamarmos a OnTick() dentro da OnTimer(), o que aconteceria?
 
YouTrade:

Eu uso muito quando quero entender com mais detalhes o comportamento de determinada variável, função e/ou analisar os resultados de uma estratégia.

Quando você usa o OnTimer(), veja que eu coloquei vários Print() para que eu possa ver o conteúdo das variáveis.

Eu posso por exemplo colocar alguns if() para fazer com que o meu EA se comporte de uma forma particular para eu continuar as minhas investigações forçando certas condições.

Outra vantagem é que se fosse fosse usar OnTick(), o mercado deveria estar "aberto" ou seja, você pode fazer a noite por exemplo.

[]s

Coutinho 

Se o mercado está fechado, mesmo dentro de OnTimer você não conseguirá enviar nenhuma ordem, logo nenhuma de suas variáveis de interesse (openPosition, positionType e currentVolume) irá mudar de estado ...
 
Malacarne:
Se o mercado está fechado, mesmo dentro de OnTimer você não conseguirá enviar nenhuma ordem, logo nenhuma de suas variáveis de interesse (openPosition, positionType e currentVolume) irá mudar de estado ...

De acordo. No programa acima na verdade tem dois pontos.

O primeiro é dar uma olhada na sintaxe das variáveis pois eu estava vendo qual das request.xxx eu realmente precisava e fui fazendo por eliminação e para "acionar" o programa eu fiz via OnTimer().

A segunda parte é á que vc tem mais razão. Eu fiz uma conta demo de FX pra testar o envio. Acabei misturando as duas.

Tks 

 
figurelli:
Olá Coutinho, ótimo tópico, e se, nesse caso, chamarmos a OnTick() dentro da OnTimer(), o que aconteceria?

Pra mim funcionou normalmente como se estivesse chamando a OnTick() dada a entrada de um novo tick de mercado. A única diferença aqui é que nao ocorreria a atualização dos valores "de mercado".

De qquer forma, o EA respondeu com NOK a minha solicitação de envio de ordem. Perdi algo ?

//+------------------------------------------------------------------+
//|                                                       teste3.mq5 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetTimer(5);

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   MqlTradeRequest request;
   MqlTradeResult result;

   ZeroMemory(request);
   ZeroMemory(result);

   request.action=TRADE_ACTION_DEAL;
   request.type=ORDER_TYPE_BUY;
   request.symbol = _Symbol;
   request.volume = 1;
   request.type_filling=ORDER_FILLING_FOK;
   request.price=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
   request.sl=0;
   request.tp=0;
   request.deviation=20;

   if(OrderSend(request,result))
     {
      Print("OK");
     }
   else
     {
      Print("NOK");
     }
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   OnTick();
  }
//+------------------------------------------------------------------+
 

Olá Coutinho,

Parabéns, a provocação do OnTick() era justamente para mostrar que na prática você está tentando simular um tick que não existe, já que o mercado está parado, o que deve ser feito com todo cuidado. 

E, portanto, você matou a charada de que não iria atualizar os dados de mercado.

Mas existe uma aplicação muito relevante para o que você propõe, e que utilizo em algumas situações, principalmente quando é possível testar algoritmos que não dependam de dados de mercado (e eles são cada vez mais frequentes nas avançadas estratégias existentes hoje no mercado, principalmente quando se trabalha com dados remotos).

Estou falando do debugger. Você já experimentou utilizar o debugger nesse seu código, mesmo offline? Sim, ele vai funcionar normalmente. 

Então, se você tem uma lógica assim, mesmo estando offline, pode utilizar a funcionalidade do debugger do MetaEditor para simular passo a passo um algoritmo desse perfil (por exemplo tuas rotinas de relatório, ou acesso à banco de dados, ou logs, etc), o que muitas vezes pode ser útil quando não se pode esperar pela abertura do mercado e se quer validar passo a passo um algoritmo que não depende de dados de mercado.

 
figurelli:

Olá Coutinho,

Parabéns, a provocação do OnTick() era justamente para mostrar que na prática você está tentando simular um tick que não existe, já que o mercado está parado, o que deve ser feito com todo cuidado. 

E, portanto, você matou a charada de que não iria atualizar os dados de mercado.

Mas existe uma aplicação muito relevante para o que você propõe, e que utilizo em algumas situações, principalmente quando é possível testar algoritmos que não dependam de dados de mercado (e eles são cada vez mais frequentes nas avançadas estratégias existentes hoje no mercado, principalmente quando se trabalha com dados remotos).

Estou falando do debugger. Você já experimentou utilizar o debugger nesse seu código, mesmo offline? Sim, ele vai funcionar normalmente. 

Então, se você tem uma lógica assim, mesmo estando offline, pode utilizar a funcionalidade do debugger do MetaEditor para simular passo a passo um algoritmo desse perfil (por exemplo tuas rotinas de relatório, ou acesso à banco de dados, ou logs, etc), o que muitas vezes pode ser útil quando não se pode esperar pela abertura do mercado e se quer validar passo a passo um algoritmo que não depende de dados de mercado.

Oi Figurelli !

Não conheço não ... ta no pipeline de "coisas a fazer" kkk

Acabei de configurar 2 servidores remotos pra gastar menos US$ mandando pra fora. Funciona bem né ? (pict anexa)

Com relação ao debugger, vou dar uma "sapiada" da meia noite às seis da manhã ;)

Obrigado pela atenção. 

Arquivos anexados:
Capturar.PNG  39 kb
 
YouTrade:

Oi Figurelli !

Não conheço não ... ta no pipeline de "coisas a fazer" kkk

Acabei de configurar 2 servidores remotos pra gastar menos US$ mandando pra fora. Funciona bem né ? (pict anexa)

Com relação ao debugger, vou dar uma "sapiada" da meia noite às seis da manhã ;)

Obrigado pela atenção. 

De nada, obrigado por compartilhar!
Razão: