Utilizar valor do indicador

 

Bom dia, por gentileza, estou iniciando na programação de EAs, estou com a ideia de construir um robo baseado num indicador específico que baixei, mas para isso preciso utilizar um valor gerado por esse indicador, como faço para utilizar o valor que está no círculo vermelho na imagem em anexo?


indicador


O código do indicador é  seguinte:


//+------------------------------------------------------------------+
//|                                                   BullsBears.mq5 |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//|                                                   vasbsm@mail.ru |
//+------------------------------------------------------------------+
#property copyright   "2009, MetaQuotes Software Corp."
#property link        "http://www.mql5.com"
#property description "Bulls Bears Power"
//--- indicator settings ---
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   1
#property indicator_type1   DRAW_HISTOGRAM
#property indicator_color1  CornflowerBlue
#property indicator_width1  2
//--- input parameters ---
input int InpPeriod=13; // Period
input ENUM_MA_METHOD TypeMA=MODE_EMA;           // Smoothing method
input ENUM_APPLIED_PRICE TypePrice=PRICE_CLOSE; // Applied price
//--- Buffers
double    ExtBBBuffer[];
double    ExtTempBuffer[];
//--- MA handle
int       ExtEmaHandle;
//--- initialization function
void OnInit()
  {
//--- define buffers
   SetIndexBuffer(0,ExtBBBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ExtTempBuffer,INDICATOR_CALCULATIONS);
//--- set buffer accuracy
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits+1);
//--- set draw begin
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,InpPeriod-1);
//--- set indicator name
   IndicatorSetString(INDICATOR_SHORTNAME,"Bulls Bears Power("+(string)InpPeriod+")");
//--- average 
   ExtEmaHandle=iMA(NULL,0,InpPeriod,0,TypeMA,TypePrice);
  }
//--- 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 &TickVolume[],
                const long &Volume[],
                const int &Spread[])
  {
   int i,limit;

   if(rates_total<InpPeriod) return(0); // insufficient bars for calculation

   int calculated=BarsCalculated(ExtEmaHandle);

   if(calculated<rates_total)
     {
      Print("The last calculated bar is ",calculated,". Error.",GetLastError());
      return(0);
     }

   int to_copy;
   if(prev_calculated>rates_total || prev_calculated<0) to_copy=rates_total;
   else
     {
      to_copy=rates_total-prev_calculated;
      if(prev_calculated>0) to_copy++;
     }

   if(CopyBuffer(ExtEmaHandle,0,0,to_copy,ExtTempBuffer)<=0)
     {
      Print("Error in call of CopyBuffer",GetLastError());
      return(0);
     }

   if(prev_calculated<InpPeriod)limit=InpPeriod;
   else limit=prev_calculated-1;

//--- Calculation of the indicator
   for(i=limit;i<rates_total;i++)
     {
      ExtBBBuffer[i]=High[i]+Low[i]-2*ExtTempBuffer[i];
     }
   return(rates_total);
  }
//+------------------------------------------------------------------+


Muito Obrigado!

 
jdmaster:

Bom dia, por gentileza, estou iniciando na programação de EAs, estou com a ideia de construir um robo baseado num indicador específico que baixei, mas para isso preciso utilizar um valor gerado por esse indicador, como faço para utilizar o valor que está no círculo vermelho na imagem em anexo?



O código do indicador é  seguinte:



Muito Obrigado!

Você terá de inserir o indicador no seu EA e a partir dai, tratar e manipular as informações geradas pelo indicador através do código de seu EA. Leia o artigo abaixo, deve ajuda-lo.

[ ]'s

Como chamar indicadores no MQL5
Como chamar indicadores no MQL5
  • www.mql5.com
No MQL5 existem diversas formar para chamar indicadores e a maioria destas formas é realizada usando as funções IndicatorCreate() e iCustom(). Além disso, estas funções apenas retornam o handle indicador e o trabalho adicional nos indicadores é feito por ele. Então o que é handle? Como lidar com as funções IndicatorCreate() e iCustom()? E como...
 
Joscelino Celso de Oliveira:

Você terá de inserir o indicador no seu EA e a partir dai, tratar e manipular as informações geradas pelo indicador através do código de seu EA. Leia o artigo abaixo, deve ajuda-lo.

[ ]'s

Obrigado pela atenção Joscelino, li o artigo e é muito interessante, mas por ser iniciante, embora tenha entendido a teoria, a prática pra mim é mais desafiadora, o exemplo deixa claro como buscar o indicador, mas o valor em si é um pouco mais obscuro para mim, no indicador cujo código enviei como exemplo, os atributos a serem passados ao comando iCustom são os "inputs"??? mas e o valor do indicador na prática como buscá-lo???


Obrigado...

 
jdmaster:

Bom dia, por gentileza, estou iniciando na programação de EAs, estou com a ideia de construir um robo baseado num indicador específico que baixei, mas para isso preciso utilizar um valor gerado por esse indicador, como faço para utilizar o valor que está no círculo vermelho na imagem em anexo?



O código do indicador é  seguinte:



Muito Obrigado!

Primeiro, use o iCustom pra obter o handle do indicador...

A partir daí use o CopyBuffer(), vc tem exemplos diss em qq indicador básico do CODEBASE...

No CopyBuffer é que a mágica acontece... Você precisa informar pra ele o Handle do indicador, o vetor pra onde esses valores serão copiados, etc... Mas, a informac'~ao primordial é o No. do Buffer que ele vai ler...


No seu caso, o número do Buffer estará nas definic'~oes de SetIndexBuffer do indicador...

//--- define buffers
   SetIndexBuffer(0,ExtBBBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ExtTempBuffer,INDICATOR_CALCULATIONS);

ou é Buffer 0, ou é buffer 1...


;)

 
Minions Labs:

Primeiro, use o iCustom pra obter o handle do indicador...

A partir daí use o CopyBuffer(), vc tem exemplos diss em qq indicador básico do CODEBASE...

No CopyBuffer é que a mágica acontece... Você precisa informar pra ele o Handle do indicador, o vetor pra onde esses valores serão copiados, etc... Mas, a informac'~ao primordial é o No. do Buffer que ele vai ler...


No seu caso, o número do Buffer estará nas definic'~oes de SetIndexBuffer do indicador...

ou é Buffer 0, ou é buffer 1...


;)

Muito obrigado pela atenção!
 
Olá amigos, agradeço a ajuda, mas não obtive sucesso em pegar o valor do indicador postado acima....mais alguma ideia por favor?
 
jdmaster:
Olá amigos, agradeço a ajuda, mas não obtive sucesso em pegar o valor do indicador postado acima....mais alguma ideia por favor?

Bom dia,

se você postar o programa eu posso ajudar, use o  anexador de código para colar o programa..

 
Rogerio Giannetti Torres:

Bom dia,

se você postar o programa eu posso ajudar, use o  anexador de código para colar o programa..


Olá amigo, antecipo meus agradecimentos, bem, eu apaguei o que fiz pra tentar partir de outro princípio, por enquanto não tenho nenhum programa, mas se lhe ajudar, enviei acima o código do indicador e uma imagem com um círculo vermelho indicando o valor que necessito pegar.


Mais uma vez, muito obrigado pela atenção...

 
jdmaster:


.... mas se lhe ajudar, enviei acima o código do indicador e uma imagem com um círculo vermelho indicando o valor que necessito pegar.

Me ajudar???   Não entendi.

Enfim, quando você estiver fazendo o EA e quiser ajuda poste o programa.


 
Rogerio Giannetti Torres:

Olá amigo, obrigado pela atenção, falei a respeito do código do indicador pq não tenho um programa já que apaguei aquele que tinha feito, queria começar do zero, com outra ideia, não consegui usar o icustom, como alguns colegas indicaram, a referência ao indicador foi na expectativa de que com seus conhecimentos vc conseguisse me direcionar sobre como pegar o valor que desejo (na foto com círculo vermelho acima).


Muito obrigado, grande abraço...

 

Boa noite,

tá aí um EA prontinho com seu indicador

//+------------------------------------------------------------------+
//|                                                 Exp_jdmaster.mq5 |
//+------------------------------------------------------------------+

#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>

input double               inpLote=800;            // Volume
input int                  inpPeriodo=21;          // Período bulls
input ENUM_MA_METHOD       inpTypeMA=MODE_EMA;     // Smoothing method
input ENUM_APPLIED_PRICE   inpTypePrice=PRICE_CLOSE;// Applied price
input double               inpSignalBP=0.15;       // Signal para trade
input double               inpStopLoss=20;         // Stop loss
input double               inpTakeProfit=20;       // Take profit

int            bullsHandle;
double         bullsValue[];

double         ask,bid,ssl,ttp;

ulong          magicNumber=1942;

bool           flagOnTrade=false;

CTrade      cTrade;
CSymbolInfo cSymbol;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   cSymbol.Name(_Symbol);
   cTrade.SetExpertMagicNumber(magicNumber);
   
   bullsHandle=iCustom(_Symbol,_Period,"Downloads//BullsBears",inpPeriodo,inpTypeMA,inpTypePrice);
   
   if(bullsHandle==INVALID_HANDLE)
     {
      PrintFormat("Falha ao criar o manipulador do indicador BullsBears para o símbolo %s/%s, código de erro %d",
                  _Symbol,
                  EnumToString(_Period),
                  GetLastError());
      return(INIT_FAILED);
     }
   ChartIndicatorAdd(0,0,bullsHandle);
   ssl=cSymbol.NormalizePrice(inpStopLoss*cSymbol.Point());
   ttp=cSymbol.NormalizePrice(inpTakeProfit*cSymbol.Point());
   ArraySetAsSeries(bullsValue,true);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
   ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
   bid=SymbolInfoDouble(_Symbol,SYMBOL_BID);
   if(ask<=bid) return;

   if(CopyBuffer(bullsHandle,0,0,1,bullsValue)<0)
     {
      Print("Erro ao copiar bullsValue: ");
      return;
     }
   if(!flagOnTrade)
     {
      ResetLastError();
      if(bullsValue[0]>inpSignalBP)
        {
         if(!cTrade.Buy(inpLote,_Symbol,ask,ask-ssl,ask+ttp,StringFormat("BullsPower: %+6.4f",bullsValue[0])))
           {
            Alert(" Erro ao emitir Buy: ",_LastError," Result: ",cTrade.ResultRetcodeDescription());
            return;
           }
        }
      if(bullsValue[0]<-inpSignalBP)
        {
         if(!cTrade.Sell(inpLote,_Symbol,bid,bid+ssl,bid-ttp,StringFormat("BullsPower: %+6.4f",bullsValue[0])))
           {
            Alert(" Erro ao emitir Sell: ",_LastError," Result: ",cTrade.ResultRetcodeDescription());
            return;
           }
        }
     }
  }
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
   ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
   if(type==TRADE_TRANSACTION_DEAL_ADD)
     {
      long     deal_entry        =0;
      string   deal_symbol       ="";
      long     deal_magic        =0;
      if(HistoryDealSelect(trans.deal))
        {
         deal_symbol=HistoryDealGetString(trans.deal,DEAL_SYMBOL);
         deal_magic=HistoryDealGetInteger(trans.deal,DEAL_MAGIC);
         deal_entry=HistoryDealGetInteger(trans.deal,DEAL_ENTRY);
         if(deal_symbol==Symbol() && deal_magic==magicNumber  && (ENUM_DEAL_ENTRY)deal_entry==DEAL_ENTRY_IN)
            flagOnTrade=true;
         if(deal_symbol==Symbol() && deal_magic==magicNumber  && (ENUM_DEAL_ENTRY)deal_entry==DEAL_ENTRY_OUT)
            flagOnTrade=false;
        }
     }
  }
//+------------------------------------------------------------------+
Razão: