Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 1518

 
Ho trovato un nuovo indicatore, volevo metterlo nel mio EA, ma il problema è che apre i trade su ogni candela. Puoi dirmi come farlo aprire solo al segnale della freccia?
//------------------------------------------------------------------
#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);
     }
  }
//+------------------------------------------------------------------+
 
jarikn:
Ho trovato un nuovo indicatore, volevo metterlo nell'EA, ma il problema è che apre trade su ogni candela. Si prega di consigliare come farlo aprire solo sul segnale della freccia

Prima di tutto, l'indicatore non è affatto nuovo, ma molto vecchio. Così vecchio che le sue interfacce sono superate anche per il 4

In secondo luogo, ridisegna. Esattamente a metà lunghezza (5 barre di default, impostate nei parametri)

e infine - come aprire trade per Expert Advisor dipende dal 90% dell'EA, cioè, senza il codice EA, tutto è inutile

 
Maxim Kuznetsov:

Prima di tutto, l'indicatore non è affatto nuovo, ma molto vecchio. Così vecchio che le sue interfacce sono obsolete anche per 4

In secondo luogo, ridisegna. Esattamente a metà lunghezza (5 barre di default, impostate nei parametri)

E infine - come aprire trade per Expert Advisor dipende al 90% dall'EA, cioè senza il codice EA, tutto è inutile

Ok. Capito. Per esempio, se prendiamo 2 indicatori con periodi diversi e scriviamo la condizione *se 1 indicatore mostra la freccia verso l'alto e 2 indicatori mostrano la freccia verso l'alto su una candela, ci danno un allarme e una freccia sul grafico*. Sapete come questo può essere implementato? Devo aggiungere un buffer o posso creare un indicatore che segua i segnali di entrambi? E se non sei duro, dai un esempio di come farlo

 
jarikn:

Ok, capito. Per esempio, se prendiamo 2 indicatori con periodi diversi e scriviamo la seguente condizione *se 1 indicatore mostra la freccia verso l'alto e 2 indicatori mostrano la freccia verso l'alto su una candela, allora ci danno un allarme e una freccia sul grafico*. Sapete come questo può essere implementato? Devo aggiungere un buffer o posso creare un indicatore che segua i segnali di entrambi? E se non sei duro, dai un esempio di come farlo

Aggiungete due iCustom con periodi diversi al vostro Expert Advisor e (forse) sarete felici.
 
MakarFX:
Aggiungi due iCustom con periodi diversi al tuo EA e (forse) sarai felice.

Ok, farò un tentativo, grazie.

 

Ciao di nuovo )))) Chi può dirmi qual è l'indicatore?

<*.ex* file cancellato

 

Sto cercando di scrivere un indicatore come ZigZag per il numero di punti passati.

Temo di non avere abbastanza conoscenze per scriverlo io stesso, così ho deciso di riscrivere l'indicatore di qualcun altro.

Questo è quello che ho ottenuto.

#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);
  }
//+------------------------------------------------------------------+

Sembra disegnare correttamente, ma è in ritardo.

Il prezzo ha superato i 50 punti ma l'indicatore non disegna.

Per favore aiutatemi a risolvere questo problema.

 
MakarFX:

Aiuta a risolvere il problema, per favore.

ecco il punto per punto zz per mt5

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


dovrebbe funzionare in MT4 se si cambia la numerazione nel ciclo di calcolo principale

 
Igor Makanu:

Ecco il punto per punto che ZZ ha postato per mt5

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


Dovrebbe funzionare in MT4 se rinumerate il ciclo di calcolo principale

Igor, grazie, ma MT4 non funziona correttamente.


Per favore, ditemi cosa deve essere corretto.

 
Ho incontrato un problema simile. Il problema è che apre i trade ogni nuova candela e solo verso l'alto. Chi sa cosa c'è che non va?
File:
Screenshot_8.png  121 kb
123.mq4  5 kb
Motivazione: