Boa tarde,
Estou iniciando na programação de robôs e estou tendo uma dificuldade em ajustar o volume de compra para poder abrir uma posição.
Após pesquisar em vários topicos do fórum, consegui montar um robô básico de compra, porém a função de volume esta retornando o valor zerado.
Segue abaixo o código do robô básico:
//+------------------------------------------------------------------+
//| TESTE3.mq5 |
//| Copyright 2021, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
//+------------------------------------------------------------------+
//| INPUT |
//+------------------------------------------------------------------+
#include <Trade/Trade.mqh>
CTrade trade;
input int lote = 1;
double stop_loss;
double take_profit;
double last_price;
//+------------------------------------------------------------------+
//| FUNÇÃO VOLUME COMPRA |
//+------------------------------------------------------------------+
double GetAgressionVolumeBuy(ENUM_TIMEFRAMES timeframe = PERIOD_M1) {
double volumeBuy = 0;
MqlTick ticks[];
int size = CopyTicksRange(_Symbol, ticks, COPY_TICKS_TRADE, iTime(_Symbol, timeframe, 0) *1000, TimeCurrent()*1000);
if(size > 0) {
for(int i = 0; i < size; i++) {
if((ticks[i].flags & TICK_FLAG_BUY) == TICK_FLAG_BUY)
volumeBuy = ticks[i].volume_real;
}
}
return volumeBuy;
}
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
if (isnewbar())
{
if (GetAgressionVolumeBuy(PERIOD_M1)>=1)
{
last_price = SymbolInfoDouble(_Symbol,SYMBOL_LAST);
stop_loss = last_price-4.0 ;
take_profit = last_price+4.0 ;
trade.PositionOpen(_Symbol,ORDER_TYPE_BUY,lote,0,stop_loss,take_profit,"TESTE");
}
}
}
//+------------------------------------------------------------------+
bool isnewbar()
{
static datetime last_time=0;
datetime lastbar_time=(datetime)SeriesInfoInteger(Symbol(),Period(),SERIES_LASTBAR_DATE);
if(last_time==0)
{
last_time=lastbar_time;
return(false);
}
if(last_time!=lastbar_time)
{
last_time=lastbar_time;
return(true);
}
return(false);
}
Desde de já agradeço qualquer colaboração,
Boa tarde, Felipe.
Talvez isso te ajude.
https://www.mql5.com/pt/docs/constants/structures/mqltick
- www.mql5.com
Boa noite,
Agradeço sua ajuda mas verifiquei após vários testes que o problema não estava no código mas no testador que não armazena dados do mercado brasileiro...pelo menos no mini dólar que estou testando...quando iniciei os testes com a bolsa aberta e os dados ao vivo os códigos que estou testando funcionaram.
Obrigado mais uma vez por responder,
Um abraço
Boa noite,
Agradeço sua ajuda mas verifiquei após vários testes que o problema não estava no código mas no testador que não armazena dados do mercado brasileiro...pelo menos no mini dólar que estou testando...quando iniciei os testes com a bolsa aberta e os dados ao vivo os códigos que estou testando funcionaram.
Obrigado mais uma vez por responder,
Um abraço
Olá Felipe
Evite usar estratégias puramente baseadas em ticks, isso devido a ausência de histórico deles, e isso dá uma divergência muito grande rodando nos backtests. Recomendo o uso de OHLC e realizar as entradas somente nos candles já fechados. Isso vai trazer mais assertividade e convergirá o seu backtest com o a execução em horário do mercado
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
Boa tarde,
Estou iniciando na programação de robôs e estou tendo uma dificuldade em ajustar o volume de compra para poder abrir uma posição.
Após pesquisar em vários topicos do fórum, consegui montar um robô básico de compra, porém a função de volume esta retornando o valor zerado.
Segue abaixo o código do robô básico:
//+------------------------------------------------------------------+
//| TESTE3.mq5 |
//| Copyright 2021, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
//+------------------------------------------------------------------+
//| INPUT |
//+------------------------------------------------------------------+
#include <Trade/Trade.mqh>
CTrade trade;
input int lote = 1;
double stop_loss;
double take_profit;
double last_price;
//+------------------------------------------------------------------+
//| FUNÇÃO VOLUME COMPRA |
//+------------------------------------------------------------------+
double GetAgressionVolumeBuy(ENUM_TIMEFRAMES timeframe = PERIOD_M1) {
double volumeBuy = 0;
MqlTick ticks[];
int size = CopyTicksRange(_Symbol, ticks, COPY_TICKS_TRADE, iTime(_Symbol, timeframe, 0) *1000, TimeCurrent()*1000);
if(size > 0) {
for(int i = 0; i < size; i++) {
if((ticks[i].flags & TICK_FLAG_BUY) == TICK_FLAG_BUY)
volumeBuy = ticks[i].volume_real;
}
}
return volumeBuy;
}
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
if (isnewbar())
{
if (GetAgressionVolumeBuy(PERIOD_M1)>=1)
{
last_price = SymbolInfoDouble(_Symbol,SYMBOL_LAST);
stop_loss = last_price-4.0 ;
take_profit = last_price+4.0 ;
trade.PositionOpen(_Symbol,ORDER_TYPE_BUY,lote,0,stop_loss,take_profit,"TESTE");
}
}
}
//+------------------------------------------------------------------+
bool isnewbar()
{
static datetime last_time=0;
datetime lastbar_time=(datetime)SeriesInfoInteger(Symbol(),Period(),SERIES_LASTBAR_DATE);
if(last_time==0)
{
last_time=lastbar_time;
return(false);
}
if(last_time!=lastbar_time)
{
last_time=lastbar_time;
return(true);
}
return(false);
}
Desde de já agradeço qualquer colaboração,