Tudo sobre Programação, com código fonte exemplo - página 13

Para adicionar comentários, por favor Faça o login ou registrar
Rogerio Figurelli
Moderador
58782
Rogerio Figurelli  

Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação

EA a partir de indicador personalizado

wlysan, 2019.08.18 00:37

Olá, sou novato na programação com o mql5.

Estou tendo dificuldades em criar um EA a partir de um indicador personalizado, eu só quero obter os dados de um indicador que criar e manipulá-los no robô de maneira simples.

Estou tentando algo como o código abaixo, mas parece não ser o caminho certo, eu tomei como base a chamada de um indicador iMA simples.

void OnTick()

{

double stopATR_Array[];

int stopATR_Handle;

stopATR_Array = iCustom(_Symbol, _Period, "StopATR", 10, 1);

ArraySetAsSeries(stopATR_Array, true);

CopyBuffer(stopATR_Handle, 0, 0, 3, stopATR_Array);

}

Alguém poderia me dar o caminho das pedras? Eu encontrei vários códigos diferentes, porem alguns bem complexos e com muitos rodeios.


Rogerio Figurelli
Moderador
58782
Rogerio Figurelli  

Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação

Como listar todas as opções em negociação de um ativo(symbol)?

Trader_Patinhas, 2018.07.01 23:34

Olá Thadeu,

Segue um script que eu construí para listar todas as opções de um ativo escolhido e suas principais propriedades:

#define UNDERLYING_STOCK "PETR"   // ativo para a qual se deseja a lista de opcoes negociadas 

int OnStart(void)
{
   // Para cada ativo negociado no mercado ...
   
   for ( int i = 0 ; i < SymbolsTotal(false) ; i++ )
   {
      // Obtem o ticker do ativo
       
      string  symbolName = SymbolName(i,false);
      
      // Se os 4 primeiros caracteres do ticker corresponderem ao ativo subjacente desejado
      // e o ativo for uma opcao (valor do strike diferente de zero),
      // imprime informacoes da opcao
      
      if ( StringSubstr(symbolName,0,4) == UNDERLYING_STOCK && SymbolInfoDouble(symbolName,SYMBOL_OPTION_STRIKE) > 0 ) 
      {
         PrintFormat
         (
            "%10s - %4s  Vencimento: %s  Strike: %5.2f  Tipo: %s  Descricao: <%s>" , 
            symbolName ,
            StringSubstr ( EnumToString ( (ENUM_SYMBOL_OPTION_RIGHT) SymbolInfoInteger ( symbolName , SYMBOL_OPTION_RIGHT ) ) , 20 ),
            TimeToString ( SymbolInfoInteger ( symbolName , SYMBOL_EXPIRATION_TIME ), TIME_DATE ), 
            SymbolInfoDouble  ( symbolName , SYMBOL_OPTION_STRIKE ),
            StringSubstr ( EnumToString ( (ENUM_SYMBOL_OPTION_MODE) SymbolInfoInteger ( symbolName , SYMBOL_OPTION_MODE ) ) , 19 ),
            SymbolInfoString  ( symbolName , SYMBOL_DESCRIPTION )
         );
      }
   }
   
   return(0);
}

Na corretora Modalmais, que costuma preencher corretamente todas as propriedades das opções, o script imprime o resultado no terminal assim (abaixo apenas um trecho da resposta, pois para a PETR4 são centenas de opções):

 PETRV17 -  PUT  Vencimento: 2018.10.16  Strike: 16.96  Tipo: EUROPEAN  Descricao: <PETRE FM    PN   16,96>
PETRC267 - CALL  Vencimento: 2019.03.19  Strike: 26.71  Tipo: EUROPEAN  Descricao: <PETRE       PN   26,71>
PETRC277 - CALL  Vencimento: 2018.03.20  Strike: 27.75  Tipo: EUROPEAN  Descricao: <PETRE       PN   27,75>
PETRC262 - CALL  Vencimento: 2018.03.20  Strike: 26.25  Tipo: EUROPEAN  Descricao: <PETRE       PN   26,25>
 PETRD26 - CALL  Vencimento: 2018.04.17  Strike: 26.00  Tipo: AMERICAN  Descricao: <PETR        PN   26,00>
 PETRE27 - CALL  Vencimento: 2018.05.22  Strike: 27.00  Tipo: AMERICAN  Descricao: <PETR        PN   27,00>
PETRC265 - CALL  Vencimento: 2018.03.20  Strike: 26.50  Tipo: AMERICAN  Descricao: <PETR        PN   26,50>
PETRE195 - CALL  Vencimento: 2018.05.22  Strike: 19.50  Tipo: AMERICAN  Descricao: <PETR        PN   19,50>
 PETRE26 - CALL  Vencimento: 2018.05.22  Strike: 26.00  Tipo: AMERICAN  Descricao: <PETR        PN   26,00>
etc...

O problema é que nem todas as corretoras preenchem corretamente as propriedades das opções. Se for este o caso da sua corretora, vc vai ter que ter algum "jogo de cintura" (obter o strike analisando a descrição, obter o vencimento com base na quinta letra do ticker, etc.).

obs: se a sua corretora não preencher nem o strike, vc vai ter que mexer no código para eliminar o filtro que seleciona somente ativos com strike maior que zero, senão não vai aparecer nada. Nesse caso, podem aparecer na lista outros tipos derivativos da ação que não sejam opções e vc vai ter que ter mais "jogo de cintura" ainda pra filtrar (por exemplo: descartar os tickers cujo ultimo caracter não for numérico.

Espero ter ajudado.

Abraços 


Rogerio Figurelli
Moderador
58782
Rogerio Figurelli  

Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação

Dúvida sobre a função ZeroMemory()

Márcio Hermes, 2019.08.09 02:01


Com base no seu retorno, vou explanar como o EA está desenvolvido para fins de alinhar a nossa conversa.

1º - o desenvolvimento do código está em dois arquivos tradicionais(.mq5 e .mqh). 

Observei que em vários exemplos aqui na comunidade, o pessoal gosta de deixar todo o código no próprio .mq5.

2º - no arquivo .mq5 é feito o #include e criado uma variável (ou um objeto) da classe incluída, como mostrado no exemplo de código abaixo:

#include  "TradeFIIDialog_V3.mqh"

 CTradeFIIDialog ExtDialog;
 CString ticker;

3º - logo, a partir dos eventos de OnTick(), OnTrade(), OnChartEvent(), e inclusive OnBookEvent(), a brincadeira começa. Inclusive são gerados eventos de botões.

4º - feito este preâmbulo, vamos aos fatos. A função que está incluída logo abaixo, contém as tradicionais variáveis do tipo MqlTradeRequest e MqlTradeResult.

Ambas variáveis MqlTradeRequest e MqlTradeResult  são declaradas de foma local, ou seja, dentro da função. Se realmente entendi sua explanação, e se estamos "falando a mesma língua", seria necessário então usar a função  ZeroMemory(), antes de "montar" a ordem de compra, para garantir que todas as variáveis sejam inicializadas com valores "padrão". Se não entendi de forma correta, aponte-me o erro, por favor.

Está postado toda a função:

double CTradeFIIDialog::TradeBuyOnBID(void){
      
   string_volume.Assign(m_edit_volume_cotas_negociar.Text()); // coleta o volume digitado pelo usuário
   
   double volume_digitado = STD(string_volume.Str()); // converte o volume de String para double
   
   double volume_livre_para_comprar = STD(m_edit_cotas_livres_para_comprar.Text());
   
   if(volume_livre_para_comprar <= 0){
       MessageBox("Não há COTAS LIVRES para lançar a ordem de COMPRA.", "Erro: Cotas Insuficientes",0);
         
      // limpar os valores
      string_volume.Clear(); // limpa os valores da variável global           
      return -1; // retorna um valor padrão
      
   }else if(volume_digitado > volume_livre_para_comprar){
       MessageBox("O volume de cotas digitado é maior que o volume "
                        + "de cotas disponíveis para comprar.\n"
                        + "Não é possível lançar a ordem de COMPRA."
                        , "Erro: Cotas Insuficientes",0);
            
      // limpar os valores
      string_volume.Clear(); // limpa os valores da variável global           
      return -1; // retorna um valor padrão
        
   }else if(volume_digitado <= 0){
      volume_digitado = volume_livre_para_comprar;
      
   }
      
//--- declare and initialize the trade request and result of trade request
   MqlTradeRequest request={0};
   MqlTradeResult  result={0};
//--- parameters of request
   request.action    = TRADE_ACTION_PENDING;        // ordem pendente
   request.symbol    = Symbol();                    // symbol (ticker)
   request.volume    = volume_digitado;             // volume do tipo double
   request.type      = ORDER_TYPE_BUY_LIMIT;        // ordem de compra do tipo limit
   request.type_time = ORDER_TIME_DAY;              // válido para o dia
   request.price     = SymbolInfoDouble(_Symbol,SYMBOL_BID);                       // price for opening
   request.magic     = MAGIC_NUMBER;  
   request.type_filling =  ORDER_FILLING_RETURN;                 
   request.comment   = "Trade Buy On BID: BOTÃO COMPRA BID";
   
   //limpar valor
   string_volume.Clear();  
   m_edit_volume_cotas_negociar.Text(""); 
   
             
//--- send the request
   if(OrderSend(request,result)){
      PrintFormat("OrderSend Success! retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order); 
       
      // ordem enviada
      return result.price;
   }else{
      PrintFormat("OrderSend error %d",GetLastError());     // if unable to send the request, output the error code
     
      ResetLastError();   
      // erro no envio
      return -1;
   }
  
   return -1;
} // end função double CTradeFIIDialog::TradeBuyOnBID(void)


Já nesta função, as variáveis MqlTradeRequest e MqlTradeResult também são declaradas de forma local, dentro da função, porém como se trata de uma iteração, onde há uma busca por uma ordem em específico, se faz necessário a utilização da função  ZeroMemory() para garantir que todas as variáveis sejam inicializadas com o valor "padrão", antes da próxima iteração. Segue código abaixo:

void CTradeFIIDialog::OnButtonCancelarOrdemDeVenda(void){
   bool isPressed = m_button_automatico_habilita_SELL.Pressed();
   
   if(isPressed){
      m_button_automatico_habilita_SELL.Color(clrBlack);
      m_button_automatico_habilita_SELL.ColorBackground(clrDarkGray);
      m_button_automatico_habilita_SELL.ColorBorder(clrDarkGray); 
      m_button_automatico_habilita_SELL.Text("AUTO SELL LIMIT OFF");
      m_button_automatico_habilita_SELL.Pressed(false);      
      m_edit_automatico_valor_SELL.ReadOnly(false);
   }     
   
   int ordersTotal = OrdersTotal();
    
   MqlTradeRequest request = {0};
   MqlTradeResult result = {0};
   
   for(int i = ordersTotal - 1; i >= 0; i--) {
     if(OrderGetTicket(i) > 0) {
       if((OrderGetString(ORDER_SYMBOL) == Symbol())
          && (OrderGetInteger(ORDER_MAGIC) == MAGIC_NUMBER)
          && (OrderGetInteger(ORDER_TYPE) == ORDER_TYPE_SELL_LIMIT)) {
         
         request.action = TRADE_ACTION_REMOVE;
         request.order = OrderGetTicket(i);
         if(!OrderSend(request, result)) {
           PrintFormat("CheckCloseAll - remove order sell limit - ", 
                      __FUNCTION__, ": OrderSend error %d", GetLastError());
           ResetLastError();            
         }      
         ZeroMemory(request);
         ZeroMemory(result);
       }
     }
   }
   
   if(isPressed){
      m_edit_automatico_valor_SELL.ReadOnly(true);
      m_button_automatico_habilita_SELL.Pressed(true);
      m_button_automatico_habilita_SELL.Color(clrWhite);
      m_button_automatico_habilita_SELL.ColorBackground(clrRed);
      m_button_automatico_habilita_SELL.ColorBorder(clrRed);
      m_button_automatico_habilita_SELL.Text("AUTO SELL LIMIT ON");
   }
}

Grande abraço.


Rogerio Figurelli
Moderador
58782
Rogerio Figurelli  

Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação

Zero Divide em dois indicadores em TF menores

prsc, 2019.08.22 17:45

Procurando solução para esse erro e lendo aqui sobre os pontos positivos e negativos, acabei encontrando um detalhe, nem vou chamar de erro que pode gerar esse erro de divisão, isso foi no meu caso.

Eu tenho um loop for que soma o volume para fazer uma média, sei que tem como usar o indicador do próprio mt5, mas preferi fazer na mão.

Em um indicador configurado para timeframe de 5 minutos estava funcionando, e em outro que fiz com o mesmo código, mas com resultados para 2 minutos ficou dando esse erro.

Até que notei uma única diferença entre ambos, onde eu usava direto o vetor Volume[] no de 5 minutos, e acabei resumindo instânciando vol[i] = volume[i], e usando o vol[i] em todo o código.

Mas no loop isso começou a gerar o erro de divisão, então voltei para o modo antigo deixando assim:

for(int j = 1; j <= len; j++){
        soma += volume[j-1];
}

Então parou o erro, e testei voltando para "vol", e o erro volta a acontecer.

Se alguém puder explicar porque pode acontecer isso seria interessante.


Rogerio Figurelli
Moderador
58782
Rogerio Figurelli  

Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação

Dúvida sobre a função ZeroMemory()

Márcio Hermes, 2019.08.09 02:01


Com base no seu retorno, vou explanar como o EA está desenvolvido para fins de alinhar a nossa conversa.

1º - o desenvolvimento do código está em dois arquivos tradicionais(.mq5 e .mqh). 

Observei que em vários exemplos aqui na comunidade, o pessoal gosta de deixar todo o código no próprio .mq5.

2º - no arquivo .mq5 é feito o #include e criado uma variável (ou um objeto) da classe incluída, como mostrado no exemplo de código abaixo:

#include  "TradeFIIDialog_V3.mqh"

 CTradeFIIDialog ExtDialog;
 CString ticker;

3º - logo, a partir dos eventos de OnTick(), OnTrade(), OnChartEvent(), e inclusive OnBookEvent(), a brincadeira começa. Inclusive são gerados eventos de botões.

4º - feito este preâmbulo, vamos aos fatos. A função que está incluída logo abaixo, contém as tradicionais variáveis do tipo MqlTradeRequest e MqlTradeResult.

Ambas variáveis MqlTradeRequest e MqlTradeResult  são declaradas de foma local, ou seja, dentro da função. Se realmente entendi sua explanação, e se estamos "falando a mesma língua", seria necessário então usar a função  ZeroMemory(), antes de "montar" a ordem de compra, para garantir que todas as variáveis sejam inicializadas com valores "padrão". Se não entendi de forma correta, aponte-me o erro, por favor.

Está postado toda a função:

double CTradeFIIDialog::TradeBuyOnBID(void){
      
   string_volume.Assign(m_edit_volume_cotas_negociar.Text()); // coleta o volume digitado pelo usuário
   
   double volume_digitado = STD(string_volume.Str()); // converte o volume de String para double
   
   double volume_livre_para_comprar = STD(m_edit_cotas_livres_para_comprar.Text());
   
   if(volume_livre_para_comprar <= 0){
       MessageBox("Não há COTAS LIVRES para lançar a ordem de COMPRA.", "Erro: Cotas Insuficientes",0);
         
      // limpar os valores
      string_volume.Clear(); // limpa os valores da variável global           
      return -1; // retorna um valor padrão
      
   }else if(volume_digitado > volume_livre_para_comprar){
       MessageBox("O volume de cotas digitado é maior que o volume "
                        + "de cotas disponíveis para comprar.\n"
                        + "Não é possível lançar a ordem de COMPRA."
                        , "Erro: Cotas Insuficientes",0);
            
      // limpar os valores
      string_volume.Clear(); // limpa os valores da variável global           
      return -1; // retorna um valor padrão
        
   }else if(volume_digitado <= 0){
      volume_digitado = volume_livre_para_comprar;
      
   }
      
//--- declare and initialize the trade request and result of trade request
   MqlTradeRequest request={0};
   MqlTradeResult  result={0};
//--- parameters of request
   request.action    = TRADE_ACTION_PENDING;        // ordem pendente
   request.symbol    = Symbol();                    // symbol (ticker)
   request.volume    = volume_digitado;             // volume do tipo double
   request.type      = ORDER_TYPE_BUY_LIMIT;        // ordem de compra do tipo limit
   request.type_time = ORDER_TIME_DAY;              // válido para o dia
   request.price     = SymbolInfoDouble(_Symbol,SYMBOL_BID);                       // price for opening
   request.magic     = MAGIC_NUMBER;  
   request.type_filling =  ORDER_FILLING_RETURN;                 
   request.comment   = "Trade Buy On BID: BOTÃO COMPRA BID";
   
   //limpar valor
   string_volume.Clear();  
   m_edit_volume_cotas_negociar.Text(""); 
   
             
//--- send the request
   if(OrderSend(request,result)){
      PrintFormat("OrderSend Success! retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order); 
       
      // ordem enviada
      return result.price;
   }else{
      PrintFormat("OrderSend error %d",GetLastError());     // if unable to send the request, output the error code
     
      ResetLastError();   
      // erro no envio
      return -1;
   }
  
   return -1;
} // end função double CTradeFIIDialog::TradeBuyOnBID(void)


Já nesta função, as variáveis MqlTradeRequest e MqlTradeResult também são declaradas de forma local, dentro da função, porém como se trata de uma iteração, onde há uma busca por uma ordem em específico, se faz necessário a utilização da função  ZeroMemory() para garantir que todas as variáveis sejam inicializadas com o valor "padrão", antes da próxima iteração. Segue código abaixo:

void CTradeFIIDialog::OnButtonCancelarOrdemDeVenda(void){
   bool isPressed = m_button_automatico_habilita_SELL.Pressed();
   
   if(isPressed){
      m_button_automatico_habilita_SELL.Color(clrBlack);
      m_button_automatico_habilita_SELL.ColorBackground(clrDarkGray);
      m_button_automatico_habilita_SELL.ColorBorder(clrDarkGray); 
      m_button_automatico_habilita_SELL.Text("AUTO SELL LIMIT OFF");
      m_button_automatico_habilita_SELL.Pressed(false);      
      m_edit_automatico_valor_SELL.ReadOnly(false);
   }     
   
   int ordersTotal = OrdersTotal();
    
   MqlTradeRequest request = {0};
   MqlTradeResult result = {0};
   
   for(int i = ordersTotal - 1; i >= 0; i--) {
     if(OrderGetTicket(i) > 0) {
       if((OrderGetString(ORDER_SYMBOL) == Symbol())
          && (OrderGetInteger(ORDER_MAGIC) == MAGIC_NUMBER)
          && (OrderGetInteger(ORDER_TYPE) == ORDER_TYPE_SELL_LIMIT)) {
         
         request.action = TRADE_ACTION_REMOVE;
         request.order = OrderGetTicket(i);
         if(!OrderSend(request, result)) {
           PrintFormat("CheckCloseAll - remove order sell limit - ", 
                      __FUNCTION__, ": OrderSend error %d", GetLastError());
           ResetLastError();            
         }      
         ZeroMemory(request);
         ZeroMemory(result);
       }
     }
   }
   
   if(isPressed){
      m_edit_automatico_valor_SELL.ReadOnly(true);
      m_button_automatico_habilita_SELL.Pressed(true);
      m_button_automatico_habilita_SELL.Color(clrWhite);
      m_button_automatico_habilita_SELL.ColorBackground(clrRed);
      m_button_automatico_habilita_SELL.ColorBorder(clrRed);
      m_button_automatico_habilita_SELL.Text("AUTO SELL LIMIT ON");
   }
}

Grande abraço.


Rogerio Figurelli
Moderador
58782
Rogerio Figurelli  

Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação

Profit < 0 só de um ativo

sergiomt, 2019.08.24 18:35

Tô testando um EA que trabalha com dois ativos ao mesmo tempo. Lá nos input´s estes dois ativos estão configurados como symbols0 e symbols1. O trecho do código abaixo mostra a abertura de uma posição quando já houver 2 compras abertas (count_buys==2) no symbols0. O que devo incluir, de mais simples, para que só abra mais posições se o Profit deste símbolo (só deste) estiver menor que zero ?

Algo do tipo: if(Use_Symbol0 && count_buys==2 && m_symbols0.Profit() < 0) = Sei que não é bem assim, só coloquei para minha dúvida ficar mais clara. Profit só de um determinado símbolo (ativo), que inclusive pode ter várias ordens abertas ao mesmo tempo.  


if(Use_Symbol0 && count_buys==2)

   OpenPosition(m_symbols0.Name(),PosType,Symbol0_Lot);


GRATO


Rogerio Figurelli
Moderador
58782
Rogerio Figurelli  

Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação

Minha EA encerra operações e incia novas antes do esperado sem adicionar stop loss ou gain

Leonardo Fernandez, 2019.08.14 23:15

Ola,


     Criei uma EA no meta editor usando o Expert Advisor (gerar), o problema é o seguinte, eu determinei um stop loss e um gain, porem, no primeiro trade que a EA faz no dia ela adiciona o STOP loss e o GAIN mas depois disso antes mesmo de chegar no loss ou no gain ela encerra a operação e inicia outra só que dessa vez ela não adiciona o stop loss nem o stop gain e fica operando "aleatoriamente" sem utilizar as regras de stop.


Basicamente o seguinte: Minha EA não espera uma operação terminar para iniciar outra, e quando incia ela não adiciona stop loss nem o gain.

Nos backtests ela funciona perfeitamente, porem, quando colocada no mercado em tempo real (demo) ela tem esse comportamento.

Existe alguma forma de contornar isso? Lembrando que não escrevi o código, é o código padrão do expert advisor (gerar).


//+------------------------------------------------------------------+
//| Include                                                          |
//+------------------------------------------------------------------+
#include <Expert\Expert.mqh>
//--- available signals
#include <Expert\Signal\SignalMA.mqh>
#include <Expert\Signal\SignalMACD.mqh>
//--- available trailing
#include <Expert\Trailing\TrailingNone.mqh>
//--- available money management
#include <Expert\Money\MoneyFixedLot.mqh>
//+------------------------------------------------------------------+
//| Inputs                                                           |
//+------------------------------------------------------------------+
//--- inputs for expert
input string             Expert_Title            ="EA";     // Document name
ulong                    Expert_MagicNumber      =31589;       // 
bool                     Expert_EveryTick        =false;       // 
//--- inputs for main signal
input int                Signal_ThresholdOpen    =10;          // Signal threshold value to open [0...100]
input int                Signal_ThresholdClose   =10;          // Signal threshold value to close [0...100]
input double             Signal_PriceLevel       =0.0;         // Price level to execute a deal
input double             Signal_StopLevel        =50.0;        // Stop Loss level (in points)
input double             Signal_TakeLevel        =50.0;        // Take Profit level (in points)
input int                Signal_Expiration       =4;           // Expiration of pending orders (in bars)
input int                Signal_MA_PeriodMA      =9;           // Moving Average(9,0,MODE_SMA,...) Period of averaging
input int                Signal_MA_Shift         =0;           // Moving Average(9,0,MODE_SMA,...) Time shift
input ENUM_MA_METHOD     Signal_MA_Method        =MODE_SMA;    // Moving Average(9,0,MODE_SMA,...) Method of averaging
input ENUM_APPLIED_PRICE Signal_MA_Applied       =PRICE_CLOSE; // Moving Average(9,0,MODE_SMA,...) Prices series
input double             Signal_MA_Weight        =1.0;         // Moving Average(9,0,MODE_SMA,...) Weight [0...1.0]
input int                Signal_MACD_PeriodFast  =12;          // MACD(12,24,9,PRICE_CLOSE) Period of fast EMA
input int                Signal_MACD_PeriodSlow  =24;          // MACD(12,24,9,PRICE_CLOSE) Period of slow EMA
input int                Signal_MACD_PeriodSignal=9;           // MACD(12,24,9,PRICE_CLOSE) Period of averaging of difference
input ENUM_APPLIED_PRICE Signal_MACD_Applied     =PRICE_CLOSE; // MACD(12,24,9,PRICE_CLOSE) Prices series
input double             Signal_MACD_Weight      =1.0;         // MACD(12,24,9,PRICE_CLOSE) Weight [0...1.0]
//--- inputs for money
input double             Money_FixLot_Percent    =10.0;        // Percent
input double             Money_FixLot_Lots       =5.0;         // Fixed volume
//+------------------------------------------------------------------+
//| Global expert object                                             |
//+------------------------------------------------------------------+
CExpert ExtExpert;
//+------------------------------------------------------------------+
//| Initialization function of the expert                            |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Initializing expert
   if(!ExtExpert.Init(Symbol(),Period(),Expert_EveryTick,Expert_MagicNumber))
     {
      //--- failed
      printf(__FUNCTION__+": error initializing expert");
      ExtExpert.Deinit();
      return(INIT_FAILED);
     }
//--- Creating signal
   CExpertSignal *signal=new CExpertSignal;
   if(signal==NULL)
     {
      //--- failed
      printf(__FUNCTION__+": error creating signal");
      ExtExpert.Deinit();
      return(INIT_FAILED);
     }
//---
   ExtExpert.InitSignal(signal);
   signal.ThresholdOpen(Signal_ThresholdOpen);
   signal.ThresholdClose(Signal_ThresholdClose);
   signal.PriceLevel(Signal_PriceLevel);
   signal.StopLevel(Signal_StopLevel);
   signal.TakeLevel(Signal_TakeLevel);
   signal.Expiration(Signal_Expiration);
//--- Creating filter CSignalMA
   CSignalMA *filter0=new CSignalMA;
   if(filter0==NULL)
     {
      //--- failed
      printf(__FUNCTION__+": error creating filter0");
      ExtExpert.Deinit();
      return(INIT_FAILED);
     }
   signal.AddFilter(filter0);
//--- Set filter parameters
   filter0.PeriodMA(Signal_MA_PeriodMA);
   filter0.Shift(Signal_MA_Shift);
   filter0.Method(Signal_MA_Method);
   filter0.Applied(Signal_MA_Applied);
   filter0.Weight(Signal_MA_Weight);
//--- Creating filter CSignalMACD
   CSignalMACD *filter1=new CSignalMACD;
   if(filter1==NULL)
     {
      //--- failed
      printf(__FUNCTION__+": error creating filter1");
      ExtExpert.Deinit();
      return(INIT_FAILED);
     }
   signal.AddFilter(filter1);
//--- Set filter parameters
   filter1.PeriodFast(Signal_MACD_PeriodFast);
   filter1.PeriodSlow(Signal_MACD_PeriodSlow);
   filter1.PeriodSignal(Signal_MACD_PeriodSignal);
   filter1.Applied(Signal_MACD_Applied);
   filter1.Weight(Signal_MACD_Weight);
//--- Creation of trailing object
   CTrailingNone *trailing=new CTrailingNone;
   if(trailing==NULL)
     {
      //--- failed
      printf(__FUNCTION__+": error creating trailing");
      ExtExpert.Deinit();
      return(INIT_FAILED);
     }
//--- Add trailing to expert (will be deleted automatically))
   if(!ExtExpert.InitTrailing(trailing))
     {
      //--- failed
      printf(__FUNCTION__+": error initializing trailing");
      ExtExpert.Deinit();
      return(INIT_FAILED);
     }
//--- Set trailing parameters
//--- Creation of money object
   CMoneyFixedLot *money=new CMoneyFixedLot;
   if(money==NULL)
     {
      //--- failed
      printf(__FUNCTION__+": error creating money");
      ExtExpert.Deinit();
      return(INIT_FAILED);
     }
//--- Add money to expert (will be deleted automatically))
   if(!ExtExpert.InitMoney(money))
     {
      //--- failed
      printf(__FUNCTION__+": error initializing money");
      ExtExpert.Deinit();
      return(INIT_FAILED);
     }
//--- Set money parameters
   money.Percent(Money_FixLot_Percent);
   money.Lots(Money_FixLot_Lots);
//--- Check all trading objects parameters
   if(!ExtExpert.ValidationSettings())
     {
      //--- failed
      ExtExpert.Deinit();
      return(INIT_FAILED);
     }
//--- Tuning of all necessary indicators
   if(!ExtExpert.InitIndicators())
     {
      //--- failed
      printf(__FUNCTION__+": error initializing indicators");
      ExtExpert.Deinit();
      return(INIT_FAILED);
     }
//--- ok
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Deinitialization function of the expert                          |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ExtExpert.Deinit();
  }
//+------------------------------------------------------------------+
//| "Tick" event handler function                                    |
//+------------------------------------------------------------------+
void OnTick()
  {
   ExtExpert.OnTick();
   
  }
//+------------------------------------------------------------------+
//| "Trade" event handler function                                   |
//+------------------------------------------------------------------+
void OnTrade()
  {
   ExtExpert.OnTrade();
  }
//+------------------------------------------------------------------+
//| "Timer" event handler function                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   ExtExpert.OnTimer();
  }
//+------------------------------------------------------------------+

Rogerio Figurelli
Moderador
58782
Rogerio Figurelli  

Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação

Novo indicador de volume para mini ínidce da B3

kuramaua brazil, 2019.08.20 17:43

Não estou conseguindo colocar estes dois indicadores na CODEBASE, o que devo fazer ?

https://www.mql5.com/pt/code/26421/


indicador 1:

//+------------------------------------------------------------------+
//|                                      VolumeLevelM1M5winfutV2.mq5 |
//|            by kuramaua Copyright 2018, MetaQuotes Software Corp. |
//|                                                 https://mql5.com |
//+------------------------------------------------------------------+
// Nível de volume para BMF mini índice timeframes M1 ou M5 recomendado.
// Função: Detector de Big Player no mini índice da B3 
#property copyright "by kuramaua Copyright 2018, MetaQuotes Software Corp."
#property link      "https://mql5.com"
#property version   "1.00"
#property description "Volume Level WinFut indicator"
#property indicator_separate_window
#property indicator_buffers 10
#property indicator_plots   10
//15
#property indicator_type1   DRAW_HISTOGRAM 
#property indicator_color1  clrWhite  
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2
//high 15
#property indicator_type2   DRAW_HISTOGRAM
#property indicator_color2  clrBlue 
#property indicator_style2  STYLE_SOLID
#property indicator_width2  2
#property indicator_type3   DRAW_HISTOGRAM 
#property indicator_color3  clrRed 
#property indicator_style3  STYLE_SOLID
#property indicator_width3  2
//low 14
#property indicator_type4   DRAW_HISTOGRAM 
#property indicator_color4  clrBlue
#property indicator_style4  STYLE_SOLID
#property indicator_width4  2
#property indicator_type5   DRAW_HISTOGRAM 
#property indicator_color5  clrRed
#property indicator_style5  STYLE_SOLID
#property indicator_width5  2
//13
#property indicator_type6   DRAW_HISTOGRAM 
#property indicator_color6  clrWhite  
#property indicator_style6  STYLE_SOLID
#property indicator_width6  2
//
#property indicator_type7   DRAW_HISTOGRAM
#property indicator_color7  clrRed 
#property indicator_style7  STYLE_SOLID
#property indicator_width7  2
#property indicator_type8   DRAW_HISTOGRAM 
#property indicator_color8  clrBlue 
#property indicator_style8  STYLE_SOLID
#property indicator_width8  2
#property indicator_type9   DRAW_HISTOGRAM 
#property indicator_color9  clrOrange
#property indicator_style9  STYLE_SOLID
#property indicator_width9  2
#property indicator_type10   DRAW_HISTOGRAM 
#property indicator_color10  clrGreen
#property indicator_style10  STYLE_SOLID
#property indicator_width10  2
#property indicator_level1     1
#property indicator_level2     2
#property indicator_level3     3
#property indicator_level4     4
#property indicator_level5     5
#property indicator_level6     6
#property indicator_level7     7
#property indicator_level8     8
#property indicator_level9     9
#property indicator_level10     10
#property indicator_level11     11
#property indicator_level12     12
#property indicator_level13     13
#property indicator_level14     14
#property indicator_levelcolor clrBlack
#property indicator_levelstyle STYLE_SOLID
//--- indicator buffers
double      whiteUp[]; //15
double         BufferHH[];
double         BufferHL[];
double         BufferLH[];
double         BufferLL[];
double      whiteDw[]; //13
double         BufferH1[];
double         BufferH2[];
double         BufferH3[];
double         BufferH4[];

bool emAlta;
int volumeLevel[12];
enum eNível {
   Nível_1, Nível_2,Nível_3,Nível_4,Nível_5,Nível_6,Nível_7,Nível_8,Nível_9,Nível_10,Nível_11,Nível_12
};

input eNível Nível_Superior=9; //Nível superior de atuação.
input eNível Nível_Inferior=7; //Nível inferior de atuação.

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,whiteUp,INDICATOR_DATA);
   SetIndexBuffer(1,BufferHH,INDICATOR_DATA);
   SetIndexBuffer(2,BufferHL,INDICATOR_DATA);
   SetIndexBuffer(3,BufferLH,INDICATOR_DATA);
   SetIndexBuffer(4,BufferLL,INDICATOR_DATA);
   SetIndexBuffer(5,whiteDw,INDICATOR_DATA);
   SetIndexBuffer(6,BufferH1,INDICATOR_DATA);
   SetIndexBuffer(7,BufferH2,INDICATOR_DATA);
   SetIndexBuffer(8,BufferH3,INDICATOR_DATA);
   SetIndexBuffer(9,BufferH4,INDICATOR_DATA);
//--- setting indicator parameters
   IndicatorSetString(INDICATOR_SHORTNAME,".");
   IndicatorSetInteger(INDICATOR_DIGITS,0); //Digits());
//--- setting buffer arrays as timeseries
   ArraySetAsSeries(whiteUp,true);
   ArraySetAsSeries(BufferHH,true);
   ArraySetAsSeries(BufferHL,true);
   ArraySetAsSeries(BufferLH,true);
   ArraySetAsSeries(BufferLL,true);
   ArraySetAsSeries(whiteDw,true);
   ArraySetAsSeries(BufferH1,true);
   ArraySetAsSeries(BufferH2,true);
   ArraySetAsSeries(BufferH3,true);
   ArraySetAsSeries(BufferH4,true);
//---
   volumeLevel[0]=1000;
   volumeLevel[1]=2000;
   volumeLevel[2]=3000;
   volumeLevel[3]=4000;
   volumeLevel[4]=8000;
   volumeLevel[5]=12000;
   volumeLevel[6]=16000;
   volumeLevel[7]=32000;
   volumeLevel[8]=48000;
   volumeLevel[9]=64000;
   volumeLevel[10]=128000;
   volumeLevel[11]=192000;
   
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   long v;
//---
   ArraySetAsSeries(open,true);
   ArraySetAsSeries(high,true);
   ArraySetAsSeries(low,true);
   ArraySetAsSeries(close,true);
   ArraySetAsSeries(volume,true);
//---
   if(rates_total<4) return 0;
//---
   int limit=rates_total-prev_calculated;
   if(limit>1)
     {
      limit=rates_total-1;
      ArrayInitialize(whiteUp,15);
      ArrayInitialize(BufferHH,EMPTY_VALUE);
      ArrayInitialize(BufferHL,EMPTY_VALUE);
      ArrayInitialize(BufferLH,EMPTY_VALUE);
      ArrayInitialize(BufferLL,EMPTY_VALUE);
      ArrayInitialize(whiteDw,13);
      ArrayInitialize(BufferH1,EMPTY_VALUE);
      ArrayInitialize(BufferH2,EMPTY_VALUE);
      ArrayInitialize(BufferH3,EMPTY_VALUE);
      ArrayInitialize(BufferH4,EMPTY_VALUE);
     }

//---
   for(int i=limit; i>=0 && !IsStopped(); i--)
     {
      whiteUp[i]=15;
      whiteDw[i]=13;
      
      if(close[i]>=open[i])
         emAlta=true;
      else
         emAlta=false;
         
      v=volume[i];
      if(v<= volumeLevel[Nível_1])  { //1000
         BufferH4[i]=0;
         BufferH3[i]=0;
         BufferH2[i]=0;
         BufferH1[i]=0;
         sinalizarDireção(Nível_1,i);
      } else if(v<= volumeLevel[Nível_2]) { //2000
         BufferH4[i]=1;
         BufferH3[i]=0;
         BufferH2[i]=0;
         BufferH1[i]=0;
         sinalizarDireção(Nível_2,i);
      } else if(v<= volumeLevel[Nível_3]) { //3000
         BufferH4[i]=2;
         BufferH3[i]=0;
         BufferH2[i]=0;
         BufferH1[i]=0;
         sinalizarDireção(Nível_3,i);
      } else if(v<= volumeLevel[Nível_4]) { //4000
         BufferH4[i]=3;
         BufferH3[i]=0;
         BufferH2[i]=0;
         BufferH1[i]=0;
         sinalizarDireção(Nível_4,i);
      } else if(v<= volumeLevel[Nível_5]) { //8000
         BufferH4[i]=3;
         BufferH3[i]=4;
         BufferH2[i]=0;
         BufferH1[i]=0;
         sinalizarDireção(Nível_5,i);
      } else if(v<= volumeLevel[Nível_6]) { //12000
         BufferH4[i]=3;
         BufferH3[i]=5;
         BufferH2[i]=0;
         BufferH1[i]=0;
         sinalizarDireção(Nível_6,i);
      } else if(v<= volumeLevel[Nível_7]) { //16000
         BufferH4[i]=3;
         BufferH3[i]=6;
         BufferH2[i]=0;
         BufferH1[i]=0;
         sinalizarDireção(Nível_7,i);
      } else if(v<= volumeLevel[Nível_8]) { //32000
         BufferH4[i]=3;
         BufferH3[i]=6;
         BufferH2[i]=7;
         BufferH1[i]=0;
         sinalizarDireção(Nível_8,i);
      } else if(v<= volumeLevel[Nível_9]) { //48000
         BufferH4[i]=3;
         BufferH3[i]=6;
         BufferH2[i]=8;
         BufferH1[i]=0;
         sinalizarDireção(Nível_9,i);
      } else if(v<= volumeLevel[Nível_10]) { //64000
         BufferH4[i]=3;
         BufferH3[i]=6;
         BufferH2[i]=9;
         BufferH1[i]=0;
         sinalizarDireção(Nível_10,i);
      } else if(v<= volumeLevel[Nível_11]) { //128000
         BufferH4[i]=3;
         BufferH3[i]=6;
         BufferH2[i]=9;
         BufferH1[i]=10;
         sinalizarDireção(Nível_11,i);
      } else if(v<= volumeLevel[Nível_12]) { //192000
         BufferH4[i]=3;
         BufferH3[i]=6;
         BufferH2[i]=9;
         BufferH1[i]=11;
         sinalizarDireção(Nível_12,i);
      } else {
         BufferH4[i]=3;
         BufferH3[i]=6;
         BufferH2[i]=9;
         BufferH1[i]=12;
         sinalizarDireção(Nível_12,i);
      }
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
void sinalizarDireção(int n, int i)
{
   if(Nível_Inferior<=n) {
      if(emAlta) {
         BufferLH[i]=14;
         BufferLL[i]=0;
      }
      else {
         BufferLH[i]=0;
         BufferLL[i]=14;
      }
   }
   else {
      BufferLH[i]=0;
      BufferLL[i]=0;
   }
   if(Nível_Superior<=n) {
      if(emAlta) {
         BufferHH[i]=15;
         BufferHL[i]=0;
      }
      else {
         BufferHH[i]=0;
         BufferHL[i]=15;
      }
   }
   else {
      BufferHH[i]=0;
      BufferHL[i]=0;
   }
}

indicador 2: Intra Volume para decisões rápidas.

//+------------------------------------------------------------------+
//|                                                IntraVolumeM1.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                                 https://mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://mql5.com"
#property version   "1.00"
#property description "Intra Volume indicator"
#property indicator_separate_window
#property indicator_buffers 5
#property indicator_plots   5
#property indicator_type1   DRAW_HISTOGRAM 
#property indicator_color1  clrWhite  
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2
#property indicator_type2   DRAW_HISTOGRAM 
#property indicator_color2  clrRed 
#property indicator_style2  STYLE_SOLID
#property indicator_width2  2
#property indicator_type3   DRAW_HISTOGRAM 
#property indicator_color3  clrBlue 
#property indicator_style3  STYLE_SOLID
#property indicator_width3  2
#property indicator_type4   DRAW_HISTOGRAM 
#property indicator_color4  clrOrange
#property indicator_style4  STYLE_SOLID
#property indicator_width4  2
#property indicator_type5   DRAW_HISTOGRAM 
#property indicator_color5  clrGreen
#property indicator_style5  STYLE_SOLID
#property indicator_width5  2
#property indicator_level1     1
#property indicator_level2     2
#property indicator_level3     3
#property indicator_level4     4
#property indicator_level5     5
#property indicator_level6     6
#property indicator_level7     7
#property indicator_level8     8
#property indicator_level9     9
#property indicator_level10     10
#property indicator_level11     11
#property indicator_level12     12
#property indicator_levelcolor clrBlack
#property indicator_levelstyle STYLE_SOLID
//--- indicator buffers
double         BufferH1[];
double         BufferH2[];
double         BufferH3[];
double         BufferH4[];
double         BufferH5[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,BufferH1,INDICATOR_DATA);
   SetIndexBuffer(1,BufferH2,INDICATOR_DATA);
   SetIndexBuffer(2,BufferH3,INDICATOR_DATA);
   SetIndexBuffer(3,BufferH4,INDICATOR_DATA);
   SetIndexBuffer(4,BufferH5,INDICATOR_DATA);
//--- setting indicator parameters
   IndicatorSetString(INDICATOR_SHORTNAME,".");
   IndicatorSetInteger(INDICATOR_DIGITS,0); //Digits());
//--- setting buffer arrays as timeseries
   ArraySetAsSeries(BufferH1,true);
   ArraySetAsSeries(BufferH2,true);
   ArraySetAsSeries(BufferH3,true);
   ArraySetAsSeries(BufferH4,true);
   ArraySetAsSeries(BufferH5,true);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   static int barraAnterior=99;
   long v;
   int barraAtual;
   int i;
   MqlTick lasttick;       // Para receber os últimos dados do tick
   if(prev_calculated<1) {
      ArrayInitialize(BufferH1,13);
      ArrayInitialize(BufferH2,0);
      ArrayInitialize(BufferH3,0);
      ArrayInitialize(BufferH4,0);
      ArrayInitialize(BufferH5,0);
   }
   if(SymbolInfoTick(_Symbol,lasttick)==false) return 0;
   barraAtual =int(int(lasttick.time%60)/2);
//---
   if(ArrayGetAsSeries(volume)==false) {
      ArraySetAsSeries(volume,true);
   }
//---
   if(rates_total<35) return 0;
//---
   if(barraAtual<barraAnterior) {
      for(i=0;i<33;i++) {
         BufferH5[i]=0;
         BufferH4[i]=0;
         BufferH3[i]=0;
         BufferH2[i]=0;
         barraAnterior=-1;
      }
      BufferH1[0]=13;
   }
   barraAnterior= barraAtual;
//---
      i=29-barraAtual;
      BufferH1[i]=13;
      v=volume[0];
      if(v<=1000)  {
         BufferH5[i]=0;
         BufferH4[i]=0;
         BufferH3[i]=0;
         BufferH2[i]=0;
      } else if(v<=2000) {
         BufferH5[i]=1;
         BufferH4[i]=0;
         BufferH3[i]=0;
         BufferH2[i]=0;
      } else if(v<=3000) {
         BufferH5[i]=2;
         BufferH4[i]=0;
         BufferH3[i]=0;
         BufferH2[i]=0;
      } else if(v<=4000) {
         BufferH5[i]=3;
         BufferH4[i]=0;
         BufferH3[i]=0;
         BufferH2[i]=0;
      } else if(v<=8000) {
         BufferH5[i]=3;
         BufferH4[i]=4;
         BufferH3[i]=0;
         BufferH2[i]=0;
      } else if(v<=12000) {
         BufferH5[i]=3;
         BufferH4[i]=5;
         BufferH3[i]=0;
         BufferH2[i]=0;
      } else if(v<=16000) {
         BufferH5[i]=3;
         BufferH4[i]=6;
         BufferH3[i]=0;
         BufferH2[i]=0;
      } else if(v<=32000) {
         BufferH5[i]=3;
         BufferH4[i]=6;
         BufferH3[i]=7;
         BufferH2[i]=0;
      } else if(v<=48000) {
         BufferH5[i]=3;
         BufferH4[i]=6;
         BufferH3[i]=8;
         BufferH2[i]=0;
      } else if(v<=64000) {
         BufferH5[i]=3;
         BufferH4[i]=6;
         BufferH3[i]=9;
         BufferH2[i]=0;
      } else if(v<=128000) {
         BufferH5[i]=3;
         BufferH4[i]=6;
         BufferH3[i]=9;
         BufferH2[i]=10;
      } else if(v<=192000) {
         BufferH5[i]=3;
         BufferH4[i]=6;
         BufferH3[i]=9;
         BufferH2[i]=11;
      } else {
         BufferH5[i]=3;
         BufferH4[i]=6;
         BufferH3[i]=9;
         BufferH2[i]=12;
      }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

timeframe M1 Timeframe M5


Rogerio Figurelli
Moderador
58782
Rogerio Figurelli  

Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação

ativa função do EA ao mudar de tick

Márcio Hermes, 2019.08.22 00:50


//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
      
  }

Se entendi sua necessidade:

 - Insira este trecho no arquivo .mq5, caso o mesmo não exista.

 - Se por acaso esta função já está inserida, é ela que monitora mudança de tick.

Bons negócios.


Rogerio Figurelli
Moderador
58782
Rogerio Figurelli  

Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação

Limpar Array Estatico ou tirar o erro que tenho de array fora de range.

Maylon Sales, 2016.07.16 15:06

Bom dia .

Como faço para limpar o buffer de um array Estático ? 

E porque quando executo o código a baixo da erro de array fora de range no UpFractal_1 ? 

Para tirar esse erro eu defini o arrei como Estatico ->  double UpFractal_1[10];

Porem agora preciso limpar o baffer do UpFractal_1 mas a função ArrayFree() Somente limpa os array Dinâmicos.

Por favor me ajudem. 

for(i=0;i<3;i++)
        {
         for(; n<Bars(_Symbol,_Period); n++)
           {

            if(FractalUp[n]!=EMPTY_VALUE)
               break;
           }
         UpFractal_1[i]=FractalUp[n];
         n++;
        }

Para adicionar comentários, por favor Faça o login ou registrar