Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 1518

 
Encontrei um novo indicador, queria colocá-lo em minha EA, mas o problema é que ele abre negócios em todas as velas. Você pode me dizer como fazê-lo abrir somente com um sinal de seta?
//------------------------------------------------------------------
#property copyright "Hill"
#property link      "Romio.com"
//------------------------------------------------------------------
#property indicator_separate_window
#property indicator_buffers 6
#property indicator_color1 Orange
#property indicator_color2 DarkGray
#property indicator_color3 Orange
#property indicator_color4 LimeGreen
#property indicator_style2 STYLE_DOT
#property indicator_style3 STYLE_DOT
#property indicator_style4 STYLE_DOT
//

//
//
//
//
//

extern int    RsiLength  = 4;
extern int    RsiPrice   = PRICE_CLOSE;
extern int    HalfLength = 5;
extern int    DevPeriod  = 100;
extern int    Sise       = 10;
extern double Deviations = 1.0;
extern bool   UseAlert   = true;
extern bool   DrawArrows = true;

color ColorDn = Crimson;
color ColorUp = DodgerBlue;
int     CodDn = 222;
int     CodUp = 221;

string   Font = "Verdana";

// ti init() if(ObjectFind("100s")<0)GetText(3,"100s","BuySell Pro",LawnGreen,5,5,7);


string PrefixArrow = "ArrowsHill";

double buffer1[];
double buffer2[];
double buffer3[];
double buffer4[];

double up[];
double dn[];

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
  {
   HalfLength=MathMax(HalfLength,1);
   SetIndexBuffer(0,buffer1);
   SetIndexBuffer(1,buffer2);
   SetIndexBuffer(2,buffer3);
   SetIndexBuffer(3,buffer4);

   SetIndexStyle(4,DRAW_ARROW,0,2,Blue);
   SetIndexArrow(4,233);
   SetIndexBuffer(4,up);

   SetIndexStyle(5,DRAW_ARROW,0,2,Red);
   SetIndexArrow(5,234);
   SetIndexBuffer(5,dn);


   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit()
  {
   DellObj(PrefixArrow);

   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   int i,j,k,counted_bars=IndicatorCounted();
   if(counted_bars<0)
      return(-1);
   if(counted_bars>0)
      counted_bars--;
   int limit=MathMin(Bars-1,Bars-counted_bars+HalfLength);

   static datetime timeLastAlert = NULL;

   for(i=limit; i>=0; i--)
      buffer1[i] = iRSI(NULL,0,RsiLength,RsiPrice,i);
   for(i=limit; i>=0; i--)
     {
      double dev  = iStdDevOnArray(buffer1,0,DevPeriod,0,MODE_SMA,i);
      double sum  = (HalfLength+1)*buffer1[i];
      double sumw = (HalfLength+1);
      for(j=1, k=HalfLength; j<=HalfLength; j++, k--)
        {
         sum  += k*buffer1[i+j];
         sumw += k;
         if(j<=i)
           {
            sum  += k*buffer1[i-j];
            sumw += k;
           }
        }
      buffer2[i] = sum/sumw;
      buffer3[i] = buffer2[i]+dev*Deviations;
      buffer4[i] = buffer2[i]-dev*Deviations;

      if(buffer1[i] >= buffer3[i] /*&& buffer1[i+1] < buffer3[i+1]*/)
        {
         dn[i] = buffer3[i];
         if(DrawArrows)
            ArrowDn(Time[i], High[i]);

         if(UseAlert && i == 0 && Time[0] != timeLastAlert)
           {
            Alert("Signal DOWN!");
            timeLastAlert = Time[0];
           }
        }

      if(buffer1[i] <= buffer4[i] /*&& buffer1[i+1] > buffer4[i+1] */)
        {
         up[i] = buffer4[i];
         if(DrawArrows)
            ArrowUp(Time[i], Low[i]);

         if(UseAlert && i == 0 && Time[0] != timeLastAlert)
           {
            Alert("Signal UP!");
            timeLastAlert = Time[0];
           }
        }
     }
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void ArrowUp(datetime tim,double pr)
  {
   if(ObjectFind(PrefixArrow+"TextUp"+tim)==-1)
     {
      if(ObjectCreate(PrefixArrow+"TextUp"+tim,OBJ_TEXT,0,tim,pr-GetDistSdvig()))
         ObjectSetText(PrefixArrow+"TextUp"+tim,CharToStr(CodUp),Sise,"WingDings",ColorUp);
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void ArrowDn(datetime tim,double pr)
  {
   if(ObjectFind(PrefixArrow+"TextDn"+tim)==-1)
     {
      if(ObjectCreate(PrefixArrow+"TextDn"+tim,OBJ_TEXT,0,tim,pr+GetDistSdvig()))
         ObjectSetText(PrefixArrow+"TextDn"+tim,CharToStr(CodDn),Sise,"WingDings",ColorDn);
     }
  }
extern double TextSdvigMnoj = 2;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double GetDistSdvig()
  {
   return(iATR(NULL, 0, 100, 1) * TextSdvigMnoj);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void DellObj(string dell)
  {
   string name;
   for(int i = ObjectsTotal()-1 ; i >=0 ; i--)
     {
      name = ObjectName(i);
      if(StringFind(name, dell) != EMPTY)
         ObjectDelete(name);
     }
  }
//+------------------------------------------------------------------+
Arquivos anexados:
 
jarikn:
Encontrei um novo indicador, queria colocá-lo na EA, mas o problema é que ele abre negócios em todas as velas. Por favor, informe como fazê-lo abrir somente no sinal de seta

Antes de mais nada, o indicador não é nada novo, mas muito antigo. Tão antigas que suas interfaces estão desatualizadas mesmo para 4

Em segundo lugar, ele refaz o caminho. Exatamente na metade do comprimento (5 barras por padrão, definidas em parâmetros)

e finalmente - como abrir negócios para o Expert Advisor depende de 90% da EA, ou seja, sem o código EA, tudo é inútil

 
Maxim Kuznetsov:

Antes de mais nada, o indicador não é nada novo, mas muito antigo. Tão antigas que suas interfaces são obsoletas mesmo para 4

Em segundo lugar, ele refaz o caminho. Exatamente na metade do comprimento (5 barras por padrão, definidas em parâmetros)

E finalmente - como abrir negócios para o Expert Advisor depende 90% da EA, ou seja, sem o código EA, tudo é inútil

Ok. Entendi. Por exemplo, se pegarmos 2 indicadores com períodos diferentes e escrevermos a condição *se 1 indicador mostrar a seta para cima e 2 indicadores mostrarem a seta para cima em uma vela, nos dê um alerta e uma seta no gráfico*. Você sabe como isto pode ser implementado? Preciso adicionar um buffer ou posso criar um indicador que siga os sinais de ambos? E se você não for difícil, dê um exemplo de como fazer isso

 
jarikn:

ok. Entendi. Por exemplo, se pegarmos 2 indicadores com períodos diferentes e escrevermos a seguinte condição *se 1 indicador mostrar a seta para cima e 2 indicadores mostrarem a seta para cima em uma vela, isso gerará, por exemplo, um alerta e uma seta no gráfico*. Você sabe como isto pode ser implementado? Preciso adicionar um buffer ou posso criar um indicador que siga os sinais de ambos? E se você não for difícil, dê um exemplo de como fazer isso

Você adiciona dois iCustom com períodos diferentes ao seu Consultor Especialista e (talvez) você ficará feliz.
 
MakarFX:
Adicione dois iCustom com períodos diferentes à sua EA e (talvez) você ficará feliz.

OK, vou tentar. Obrigado.

 

Olá novamente )))) Quem pode me dizer qual é o indicador?

<*.ex* arquivo eliminado

 

Estou tentando escrever um indicador como ZigZag pelo número de pontos passados.

Receio não ter conhecimentos suficientes para escrevê-lo eu mesmo, por isso decidi reescrever o indicador de outra pessoa.

Isto é o que eu tenho.

#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_SECTION
#property indicator_color1  clrCrimson
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input int      Points=50;
//--- indicator buffers
int Trend=1,InTrend;
datetime ttime;
double Last_High,Last_Low;
double Buffer01[],Buffer02[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   IndicatorBuffers(2);
   IndicatorDigits(Digits);
//--- indicator buffers mapping
   SetIndexBuffer(0,Buffer01);
   SetIndexBuffer(1,Buffer02);
   SetIndexEmptyValue(0,0);
//---
   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[])
  {
//---
   int limit=rates_total-prev_calculated-2;
   if(limit<2) return(0);
   for(int i=limit; i>=0;i--)
     {
      if(time[i]!=ttime) {InTrend=InTrend+1; ttime=time[i];}
      Buffer01[i]=0;
      Buffer02[i]= open[i]; 
      if(Buffer02[i+1]>Last_High && Trend==1)   InTrend=1;
      if(Buffer02[i+1]<Last_Low  && Trend==0)   InTrend=1;
      if(Buffer02[i+1]>Last_High) Last_High=Buffer02[i+1];
      if(Buffer02[i+1]<Last_Low ) Last_Low =Buffer02[i+1];
      //----
      if(Trend==1 && Buffer02[i+1]<Last_High-Points*Point && InTrend>1)
        {
         Trend=0;
         if(i+InTrend<ArraySize(Buffer01))
         Buffer01[i+InTrend]=Buffer02[i+InTrend];
         Last_High=Buffer02[i+1];
         Last_Low=Buffer02[i+1];
         InTrend=1;
        }
      if(Trend==0 && Buffer02[i+1]>Last_Low+Points*Point && InTrend>1)
        {
         Trend=1;
         if(i+InTrend<ArraySize(Buffer01))
         Buffer01[i+InTrend]=Buffer02[i+InTrend];
         Last_Low=Buffer02[i+1];
         Last_High=Buffer02[i+1];
         InTrend=1;
        }
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Parece estar desenhando corretamente, mas está atrasado.

O preço passou de 50 pontos, mas o indicador não saca.

Por favor, ajude-me a resolver este problema.

 
MakarFX:

Ajude a resolver o problema, por favor.

Aqui está o ponto por ponto ZZ postado para MT5

https://www.mql5.com/ru/forum/318267#comment_12508440


deve funcionar em MT4 se você mudar a numeração no ciclo principal de cálculo

 
Igor Makanu:

aqui está o ponto por ponto ZZ postado para mt5

https://www.mql5.com/ru/forum/318267#comment_12508440


Deve funcionar em MT4 se você renumerar o ciclo principal de cálculo

Igor, obrigado, mas o MT4 não funciona corretamente.


Por favor, diga-me o que tem que estar correto.

 
Encontrei um problema assim. Eu coloquei o indicador mt2 no mt4. ele deve ler os buffers indicadores e quando a seta aparecer deve abrir automaticamente as negociações em opções binárias. mas o problema é que eu o tenho abrindo negociações a cada vela nova e somente para cima. Quem sabe o que está errado?
Arquivos anexados:
Screenshot_8.png  121 kb
123.mq4  5 kb
Razão: