Variável de distorção da Média no EA

 

Boa tarde pessoal,


Tenho um indicador externo que pega a Media Móvel e me mostra no gráfico com mais duas linhas, sendo uma para cima da media e outra para baixo da media. O distanciamento é definido de acordo com o valor inserido no input linha_up e linha_down. O meu problema esta sendo na hora de incluir ele no EA, pois quando defino o periodo no EA ele me traz a media correta, mas nao sei importar essas linhas de distanciamento. Segue abaixo o arquivo de indicador e o comando dado no EA 

#property indicator_chart_window
#property indicator_buffers 3
#property indicator_plots   3
//--- plot mmHandle
#property indicator_label1  "mmHandle"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrYellow
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot linha_up
#property indicator_label2  "linha_up"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrGray
#property indicator_style2  STYLE_DOT
#property indicator_width2  1
//--- plot linha_down
#property indicator_label3  "linha_down"
#property indicator_type3   DRAW_LINE
#property indicator_color3  clrGray
#property indicator_style3  STYLE_DOT
#property indicator_width3  1

//--- input parameters
input int               ma_periodo=7;
input ENUM_MA_METHOD    ma_metodo = MODE_EMA; //*       Tipo de Média
ENUM_APPLIED_PRICE      ma_preco = PRICE_CLOSE;//Preço para Média
input int               ma_desloc = 0;//*       Deslocamento da Média
input int               linha_up=50;
input int               linha_down=50;
int                     mmHandle;
//--- indicator buffers
double         mmHandleBuffer[];
double         linha_upBuffer[];
double         linha_downBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,mmHandleBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,linha_upBuffer,INDICATOR_DATA);
   SetIndexBuffer(2,linha_downBuffer,INDICATOR_DATA);
   
   //--- Inverter a indexação das variáveis de preço
   
   ArraySetAsSeries(mmHandleBuffer,true);
   ArraySetAsSeries(linha_upBuffer,true);
   ArraySetAsSeries(linha_downBuffer,true);
   
   mmHandle = iMA(_Symbol, _Period, ma_periodo, ma_desloc, ma_metodo, ma_preco);
   
  if(mmHandle==INVALID_HANDLE)
   {
      Print("Erro ao criar média móvel - erro", GetLastError());
      return(INIT_FAILED);
   }
   
   string short_name=StringFormat("Média Móvel (%u, %s)",ma_periodo,StringSubstr(EnumToString(ma_metodo),5));
   IndicatorSetString(INDICATOR_SHORTNAME,short_name);
   PlotIndexSetString(0,PLOT_LABEL,short_name);
   //IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
  
//---
   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[])
  {
//---
for(int i=0;i<rates_total;i++)
   {
CopyBuffer(mmHandle,0,0,i,mmHandleBuffer);

linha_upBuffer[i]=mmHandleBuffer[i] + (linha_up);
linha_downBuffer[i]=mmHandleBuffer[i] - (linha_down);

}
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

EA

#resource "\\Indicators\\mmIndicator.ex5"

input int               ma_periodo = 7; //*       Período da Média
input ENUM_MA_METHOD    ma_metodo = MODE_EMA; //*       Tipo de Média
input int               ma_desloc = 0;//*       Deslocamento da Média
input double            distorcao = 5; //*       Gatilho Variação da Média(DX)
input double            linha_up = 50;//*       Variação acima da Média(DX)
input double            linha_down = -50;//*       Variação abaixo da Média(DX)

double                        mmArray[];
int                           mmHandle = INVALID_HANDLE;

      mmHandle = iCustom(_Symbol, _Period, "::Indicators\\mmIndicator", ma_periodo);
      ArraySetAsSeries(mmArray, true);
      ChartIndicatorAdd(ChartID(), 0,mmHandle);
 
brucfrs:

Boa tarde pessoal,


Tenho um indicador externo que pega a Media Móvel e me mostra no gráfico com mais duas linhas, sendo uma para cima da media e outra para baixo da media. O distanciamento é definido de acordo com o valor inserido no input linha_up e linha_down. O meu problema esta sendo na hora de incluir ele no EA, pois quando defino o periodo no EA ele me traz a media correta, mas nao sei importar essas linhas de distanciamento. Segue abaixo o arquivo de indicador e o comando dado no EA 

EA

Você tem que criar +2 buffers no EA, e ler depois com CopyBuffer(), usando o seu
mmHandle 

Perceba que o CopyBuffer() recebe em um dos parâmetros, o número do buffer a ler, conforme foram criados no seu indicador.


;)

 

Boa tarde,


No caso criei mais 2 buffers iguais do indicador.


double                        mmArray[];
double                        linha_upBuffer[];
double                        linha_downBuffer[];

      mmHandle = iCustom(_Symbol, _Period, "::Indicators\\FreitasIndicator", ma_periodo);
      ArraySetAsSeries(mmArray, true);
      ArraySetAsSeries(linha_upBuffer,true);
      ArraySetAsSeries(linha_downBuffer,true);
      
      ChartIndicatorAdd(ChartID(), 0,mmHandle);

e meu CopyBuffer está assim ainda dentro do EA. Tenho que criar mais 2 CopyBuffers também? obrigado

   if(CopyBuffer(mmHandle, 0, 0, 3, mmArray)<0)
     {
      Alert("Erro ao copiar dados da média móvel: ", GetLastError());
      return;
     }




Flavio Jarabeck:
Você tem que criar +2 buffers no EA, e ler depois com CopyBuffer(), usando o seu

Perceba que o CopyBuffer() recebe em um dos parâmetros, o número do buffer a ler, conforme foram criados no seu indicador.


;)

 
   if(CopyBuffer(mmHandle, 0, 0, 3, mmArray)<0)
     {
      Alert("Erro ao copiar dados da média móvel: ", GetLastError());
      return;
     }
        if(CopyBuffer(mmHandle, 0, 0, 3, linha_upBuffer)<0)
     {
      Alert("Erro ao copiar dados da média móvel: ", GetLastError());
      return;
     }
        if(CopyBuffer(mmHandle, 0, 0, 3, linha_downBuffer)<0)
     {
      Alert("Erro ao copiar dados da média móvel: ", GetLastError());
      return;
     }
Segue a inclusão de mais 2 CopyBuffers, porem alterei o input do EA e no gráfico ainda permanece o linha_up e down do input do indicador.
 
BRUNO CONTE DE FREITAS:
Segue a inclusão de mais 2 CopyBuffers, porem alterei o input do EA e no gráfico ainda permanece o linha_up e down do input do indicador.

O código acima está errado... leia atentamente a documentação dos parâmetros do CopyBuffer(), ela fará toda a diferença pra você em programação de EAs daqui pra frente...

Sugiro também trocar Alert() por Print(), assim não fica saltando popups à toa. Os Print()'s são exibidos na aba Experts. (e melhore as mensagens, se der pau, as mensagens são idênticas...)

Está quase lá...

;)

 

Certo Flavio, vou ler a documentação, já fiz as alterações sugeridas. Obrigado por enquanto. Acho que essa seria a única opção né da imagem abaixo (Em Anexo), onde você coloca o nivel de linha da MM.


Flavio Jarabeck:

O código acima está errado... leia atentamente a documentação dos parâmetros do CopyBuffer(), ela fará toda a diferença pra você em programação de EAs daqui pra frente...

Sugiro também trocar Alert() por Print(), assim não fica saltando popups à toa. Os Print()'s são exibidos na aba Experts. (e melhore as mensagens, se der pau, as mensagens são idênticas...)

Está quase lá...

;)

Porque a Hospedagem Virtual no MetaTrader 4 e no MetaTrader 5 são Melhores que os VPS Usuais
Porque a Hospedagem Virtual no MetaTrader 4 e no MetaTrader 5 são Melhores que os VPS Usuais
  • www.mql5.com
Alugar um servidor virtual diretamente dos terminais MetaTrader 4 e MetaTrader 5 é a melhor maneira de garantir um trabalho ininterrupto de seus robôs de negociação e das assinaturas de Sinais. Essencialmente, ele é análogo a um VPS, no entanto, ele é melhor e mais adequado para atender às necessidades e desafios que um trader se depara. O...
Arquivos anexados:
mm.png  6 kb
 
BRUNO CONTE DE FREITAS:

Certo Flavio, vou ler a documentação, já fiz as alterações sugeridas. Obrigado por enquanto. Acho que essa seria a única opção né da imagem abaixo (Em Anexo), onde você coloca o nivel de linha da MM.


hey, peraí... esses parâmetros são apenas para VISUALMENTE você ter níveis para trade manual. Seu EA não precisa disso.

Os buffers vão te dar todas essas informações numéricas. Aí vc trata como quiser dentro do código...

;)

 

Isso, seria visual mesmo, as entradas pela distorção ja esta funcionando, só queria deixar visível essas linhas para eu poder fazer estatísticas também.


Flavio Jarabeck:

hey, peraí... esses parâmetros são apenas para VISUALMENTE você ter níveis para trade manual. Seu EA não precisa disso.

Os buffers vão te dar todas essas informações numéricas. Aí vc trata como quiser dentro do código...

;)

 
BRUNO CONTE DE FREITAS:

Isso, seria visual mesmo, as entradas pela distorção ja esta funcionando, só queria deixar visível essas linhas para eu poder fazer estatísticas também.


Ah, ok!

No código do seu INDICADOR, você pode incluir mais linhas via programação:. Segue exemplo de codificação de um dos meus indicadores - configurado no OnInit():

    IndicatorSetInteger( INDICATOR_DIGITS, Digits() );
    IndicatorSetInteger( INDICATOR_LEVELS, 6 );
    IndicatorSetDouble( INDICATOR_LEVELVALUE, 0, inpExtremeOverbought );
    IndicatorSetDouble( INDICATOR_LEVELVALUE, 1, inpOverbought );
    IndicatorSetDouble( INDICATOR_LEVELVALUE, 2, inpOversold );
    IndicatorSetDouble( INDICATOR_LEVELVALUE, 3, inpExtremeOversold );
    IndicatorSetDouble( INDICATOR_LEVELVALUE, 4, inpFlatNegative );
    IndicatorSetDouble( INDICATOR_LEVELVALUE, 5, inpFlatPositive );
    IndicatorSetString( INDICATOR_LEVELTEXT, 0, "Extreme overbought" );
    IndicatorSetString( INDICATOR_LEVELTEXT, 1, "Overbought" );
    IndicatorSetString( INDICATOR_LEVELTEXT, 2, "Oversold" );
    IndicatorSetString( INDICATOR_LEVELTEXT, 3, "Extreme oversold" );
    IndicatorSetString( INDICATOR_LEVELTEXT, 4, "Flat" );
    IndicatorSetString( INDICATOR_LEVELTEXT, 5, "Flat" );
 

Bom dia Flavio, juro que tentei de tudo mas nao consegui fazer funcionar. Quando abro um grafico limpo e arrasto somente o indicador, ele exibe na tela sem problemas e caso eu alterar a linha up e down ele atualiza no grafico. Porem quando chamo ele pelo EA ele abre com as linha up e down definidas no indicador, mas quando abro o EA para alterar os paramentros por exemplo de 50 pontos para 100 pontos da media ai ja da erro.


Flavio Jarabeck:

Ah, ok!

No código do seu INDICADOR, você pode incluir mais linhas via programação:. Segue exemplo de codificação de um dos meus indicadores - configurado no OnInit():

Arquivos anexados:
MM_EA.PNG  13 kb
 

Os paramentros do indicador esta mesma coisa que postei no começo do topico. No EA, pelo que entendi fiz umas alteração mas sem resultado positivo.

double                        mmHandleBuffer[];
double                        linha_upBuffer[];
double                        linha_downBuffer[];
int                           mmHandle = INVALID_HANDLE;

int OnInit()
  {
      mmHandle = iCustom(_Symbol, _Period, "::Indicators\\FreitasIndicator", ma_periodo,ma_metodo,ma_preco,ma_desloc,linha_up,linha_down);

      ArraySetAsSeries(mmHandleBuffer, true);
      ArraySetAsSeries(linha_upBuffer,true);
      ArraySetAsSeries(linha_downBuffer,true);
      
      ChartIndicatorAdd(ChartID(), 0,mmHandle);
}
void OnTick()
  {
             if(CopyBuffer(mmHandle, 0, 0, 3, mmHandleBuffer)<0)
      {
         Print("Erro ao copiar dados da Média Móvel: ", GetLastError());
         return;
      }
     Print("mmHandleBuffer",mmHandleBuffer[0]);
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
     if(CopyBuffer(mmHandle, 1, 0, 3, linha_upBuffer)<0)
      {
         Print("Erro ao copiar dados da Variação acima da Média: ", GetLastError());
         return;
      }
     Print("linha_upBuffer",linha_upBuffer[0]);
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+      
     if(CopyBuffer(mmHandle, 2, 0, 3, linha_downBuffer)<0)
      {
         Print("Erro ao copiar dados da Variação abaixo da Média: ", GetLastError());
         return;
      }
     Print("linha_downBuffer",linha_downBuffer[0]);
}


BRUNO CONTE DE FREITAS:

Bom dia Flavio, juro que tentei de tudo mas nao consegui fazer funcionar. Quando abro um grafico limpo e arrasto somente o indicador, ele exibe na tela sem problemas e caso eu alterar a linha up e down ele atualiza no grafico. Porem quando chamo ele pelo EA ele abre com as linha up e down definidas no indicador, mas quando abro o EA para alterar os paramentros por exemplo de 50 pontos para 100 pontos da media ai ja da erro.


Razão: