AJUSTE VOLUME DE COMPRA

 

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,

 
Felipe Marcelino:

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

Documentação sobre MQL5: Constantes, Enumeradores e Estruturas / Estruturas de Dados / Estrutura para Preços Correntes
Documentação sobre MQL5: Constantes, Enumeradores e Estruturas / Estruturas de Dados / Estrutura para Preços Correntes
  • www.mql5.com
Estrutura para Preços Correntes - Estruturas de Dados - Constantes, Enumeradores e Estruturas - Referência MQL5 - Referência sobre algorítimo/automatização de negociação na linguagem para MetaTrader 5
 

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

 
Felipe Marcelino:

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

Razão: