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

 
Artyom Trishkin:
Dobbiamo guardare più in profondità...

Più in profondità, dov'è?

Tutti i tentativi, con il nuovo indicatore, portano a un blocco.

E con l'indicatore, che è invariato, c'è un singhiozzo momentaneo.

Quale potrebbe essere la soluzione?

 
mila.com:

Più in profondità, dov'è?

Tutti i tentativi, con il nuovo indicatore, risultano in un blocco.

E con l'indicatore invariato, c'è un singhiozzo momentaneo.

Quale potrebbe essere la soluzione?

Nel tuo indicatore - invece di usare in esso i dati di altri indicatori personalizzati, in particolare - cerca frattali di qualsiasi dimensione, basta fare una funzione per cercare tali frattali e lavorare con loro.
 
Artyom Trishkin:
Basta creare funzioni per trovare tali frattali e lavorare con essi.

Per te, è una cosa semplice da fare).

ma per me è un compito impossibile.

Una funzione come questa?


bool isDnFractal(int bar,int max,const double &low[])
  {
//---
   for(int i=1; i<=max; i++) {
      if(i<=leftSide && low[bar]>low[bar-i])    return(false);
      if(i<=rightSide && low[bar]>=low[bar+i])  return(false);
      }
//---
   return(true);
  }

È un frattale inferiore.

Come usarlo?

 
mila.com:

Per te, è più facile da fare).

Ma per me è un compito impossibile.

Come impiantare la funzione di quell'indicatore nel mio?


bool isDnFractal(int bar,int max,const double &low[])
  {
//---
   for(int i=1; i<=max; i++) {
      if(i<=leftSide && low[bar]>low[bar-i])    return(false);
      if(i<=rightSide && low[bar]>=low[bar+i])  return(false);
      }
//---
   return(true);
  }

Bene, vi serve per restituire il prezzo di un frattale sulla barra richiesta. Qui, ho fatto un semplice indicatore. Ha due funzioni che potete prendere da esso e usare nel vostro - le ho organizzate appositamente come funzioni - con controlli per valori non validi.

//+------------------------------------------------------------------+
//|                                             iFreeNumFractals.mq4 |
//|              Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Artem A. Trishkin, Skype artmedia70"
#property link      "https://login.mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot UpperFractal
#property indicator_label1  "UpperFractal"
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot LowerFractal
#property indicator_label2  "LowerFractal"
#property indicator_type2   DRAW_ARROW
#property indicator_color2  clrSteelBlue
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- input parameters
input          int      LeftNum=2;     // Количество баров слева
int leftNum;     // Количество баров слева
input          int      RightNum=2;    // Количество баров справа
int rightNum;    // Количество баров справа
//--- indicator buffers
double         BufferUpperFractal[];
double         BufferLowerFractal[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,BufferUpperFractal);
   SetIndexBuffer(1,BufferLowerFractal);
//--- setting a code from the Wingdings charset as the property of PLOT_ARROW
   PlotIndexSetInteger(0,PLOT_ARROW,159);
   PlotIndexSetInteger(1,PLOT_ARROW,159);
   SetIndexArrow(0,217);
   SetIndexArrow(1,218);
//---
   leftNum=(LeftNum<1?1:LeftNum);
   rightNum=(RightNum<1?1:RightNum);
//---
   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[])
  {
//---
   if(rates_total<leftNum+rightNum) return(0);
   int limit=rates_total-prev_calculated;
   if(limit>0) {
      ArrayInitialize(BufferUpperFractal,0.0);
      ArrayInitialize(BufferUpperFractal,0.0);
      limit=rates_total-leftNum-1;
      }
   //---
   for(int i=limit; i>rightNum; i--) {
      if(GetFreeUpperFractal(i,limit,high,leftNum,rightNum)>0) BufferUpperFractal[i]=high[i];
      if(GetFreeLowerFractal(i,limit,low ,leftNum,rightNum)>0) BufferLowerFractal[i]=low[i];
      }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+----------------------------------------------------------------------------+
double GetFreeLowerFractal(int shift,const int limit,const double &low[],int left_dimension=2,int right_dimension=2) {
   if(left_dimension<1)  left_dimension=1;
   if(right_dimension<1) right_dimension=1;
   if(shift-right_dimension<1 || shift+left_dimension>limit-1) return(-1);
   for(int i=shift; i>shift-right_dimension; i--) if(low[i]>low[i-1]) return(-1);
   for(int i=shift; i<shift+left_dimension; i++)  if(low[i]>low[i+1]) return(-1);
   return(low[shift]);
}
//+----------------------------------------------------------------------------+
double GetFreeUpperFractal(int shift,const int limit,const double &high[],int left_dimension=2,int right_dimension=2) {
   if(left_dimension<1)  left_dimension=1;
   if(right_dimension<1) right_dimension=1;
   if(shift-right_dimension<1 || shift+left_dimension>limit-1) return(-1);
   for(int i=shift; i>=shift-right_dimension; i--) if(high[i]<high[i-1]) return(-1);
   for(int i=shift; i<=shift+left_dimension; i++)  if(high[i]<high[i+1]) return(-1);
   return(high[shift]);
}
//+----------------------------------------------------------------------------+
 

Per staccare le funzioni per ottenere frattali arbitrari dall'indicatore, non dovremmo passare gli array high[] e low[] e i valori limite per riferimento.

Poiché il nostro codice è molto vicino a MQL5, dovremo rifiutare le funzioni High[], Low[], iHigh() e iLow(). Ecco come apparirà in questo indicatore:

//+------------------------------------------------------------------+
//|                                             iFreeNumFractals.mq4 |
//|              Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Artem A. Trishkin, Skype artmedia70"
#property link      "https://login.mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot UpperFractal
#property indicator_label1  "UpperFractal"
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot LowerFractal
#property indicator_label2  "LowerFractal"
#property indicator_type2   DRAW_ARROW
#property indicator_color2  clrSteelBlue
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- input parameters
input          int      LeftNum=2;     // Количество баров слева
int leftNum;     // Количество баров слева
input          int      RightNum=2;    // Количество баров справа
int rightNum;    // Количество баров справа
//--- indicator buffers
double         BufferUpperFractal[];
double         BufferLowerFractal[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,BufferUpperFractal);
   SetIndexBuffer(1,BufferLowerFractal);
//--- setting a code from the Wingdings charset as the property of PLOT_ARROW
   // PlotIndexSetInteger(0,PLOT_ARROW,217);
   // PlotIndexSetInteger(1,PLOT_ARROW,218);
   SetIndexArrow(0,217);
   SetIndexArrow(1,218);
//---
   leftNum=(LeftNum<1?1:LeftNum);
   rightNum=(RightNum<1?1:RightNum);
//---
   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[])
  {
//---
   if(rates_total<leftNum+rightNum) return(0);
   int limit=rates_total-prev_calculated;
   if(limit>0) {
      ArrayInitialize(BufferUpperFractal,0.0);
      ArrayInitialize(BufferUpperFractal,0.0);
      limit=rates_total-leftNum-1;
      }
   //---
   for(int i=limit; i>rightNum; i--) {
      if(GetFreeUpperFractal(Symbol(),PERIOD_CURRENT,i,leftNum,rightNum)>0) BufferUpperFractal[i]=high[i];
      if(GetFreeLowerFractal(Symbol(),PERIOD_CURRENT,i,leftNum,rightNum)>0) BufferLowerFractal[i]=low[i];
      }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+----------------------------------------------------------------------------+
double GetFreeLowerFractal(const string symbol_name,ENUM_TIMEFRAMES timeframe,int shift,int left_dimension=2,int right_dimension=2) {
   int bars=Bars(symbol_name,timeframe);
   if(left_dimension<1)  left_dimension=1;
   if(right_dimension<1) right_dimension=1;
   if(shift-right_dimension<1 || shift+left_dimension>bars-1) return(-1);
   for(int i=shift; i>shift-right_dimension; i--) if(GetPriceLow(symbol_name,timeframe,i)>GetPriceLow(symbol_name,timeframe,i-1)) return(-1);
   for(int i=shift; i<shift+left_dimension; i++)  if(GetPriceLow(symbol_name,timeframe,i)>GetPriceLow(symbol_name,timeframe,i+1)) return(-1);
   return(GetPriceLow(symbol_name,timeframe,shift));
}
//+----------------------------------------------------------------------------+
double GetFreeUpperFractal(const string symbol_name,ENUM_TIMEFRAMES timeframe,int shift,int left_dimension=2,int right_dimension=2) {
   int bars=Bars(symbol_name,timeframe);
   if(left_dimension<1)  left_dimension=1;
   if(right_dimension<1) right_dimension=1;
   if(shift-right_dimension<1 || shift+left_dimension>bars-1) return(-1);
   for(int i=shift; i>=shift-right_dimension; i--) if(GetPriceHigh(symbol_name,timeframe,i)<GetPriceHigh(symbol_name,timeframe,i-1)) return(-1);
   for(int i=shift; i<=shift+left_dimension; i++)  if(GetPriceHigh(symbol_name,timeframe,i)<GetPriceHigh(symbol_name,timeframe,i+1)) return(-1);
   return(GetPriceHigh(symbol_name,timeframe,shift));
}
//+----------------------------------------------------------------------------+
double GetPriceHigh(const string symbol_name, ENUM_TIMEFRAMES timeframe, int shift){
   double array[1];
   if(CopyHigh(symbol_name,timeframe,shift,1,array)==1) return(array[0]);
   return(-1);
}
//+----------------------------------------------------------------------------+
double GetPriceLow(const string symbol_name, ENUM_TIMEFRAMES timeframe, int shift){
   double array[1];
   if(CopyLow(symbol_name,timeframe,shift,1,array)==1) return(array[0]);
   return(-1);
}
//+----------------------------------------------------------------------------+
Tuttavia, dovremmo anche controllare per -1 dalle funzioni GetPriceHigh() e GetPriceLow()
 
Ciao, consigliare come fare un EA utilizzando 15 minuti time frame per controllare il valore ogni 20 minuti, diciamo a 9-20, 9-40 seguito da crossover RSI e se il livello è attraversato in venti minuti, controllare il cambiamento del prezzo. Questo è quello che devo risolvere:
if (Hour()==9 && (Minute() == 20) && (RSI>70))
Price2==Bid;
     {
      if (Hour()==9 && (Minute() == 40) && (Bid<Price2))
  
         {
          ticket=OrderSend(Symbol(),OP_SELL, Lts, Bid, SP,0,0, NULL, Magic, 0, Blue);
          return(0);
         }
     }

Cioè, diciamo che a 9-20 l'RSI è stato attraversato. Voglio che il mio EA ricordi il prezzo alle 9-20 e alle 9-40 controlli gli ultimi 20 minuti rispetto al prezzo alle 9-20. Se sta scendendo, aprirà uno short. Grazie mille.
 
strongflex:
Ciao, consigliare come fare Expert Advisor utilizzando 15 minuti time frame per controllare il valore ogni 20 minuti, diciamo a 9-20, 9-40 seguita da crossover RSI e se il livello è attraversato in venti minuti, controllato il cambiamento di prezzo. Questo è quello che devo risolvere:
if (Hour()==9 && (Minute() == 20) && (RSI>70))
Price2==Bid;
     {
      if (Hour()==9 && (Minute() == 40) && (Bid<Price2))
  
         {
          ticket=OrderSend(Symbol(),OP_SELL, Lts, Bid, SP,0,0, NULL, Magic, 0, Blue);
          return(0);
         }
     }

Cioè, diciamo che a 9-20 l'RSI è stato attraversato. Voglio che il mio EA ricordi il prezzo alle 9-20 e alle 9-40 controlli gli ultimi 20 minuti rispetto al prezzo alle 9-20. Se sta scendendo, aprirà uno short. Grazie mille.

:)

Cosa succede se si esegue l'Expert Advisor a 9.22?

E se c'è un guasto al sistema o al terminale? Il prezzo sarà perso.

Cioè, dovete cercare ciò che era 20 minuti fa quando arriva il momento di questo controllo. È arrivato il momento in cui i minuti sono maggiori o uguali a un multiplo di venti - controlla lo stato di RSI sulla barra, che era 20 minuti fa. Se ha il giusto crossover, allora procedete come previsto...

Tuttavia, su M15 non si può determinare l'ora esatta dell'attraversamento e il prezzo esatto, ma si può guardare il prezzo su M1 - almeno 15 volte più preciso.

 
Artyom Trishkin:

:)

Cosa succede se si esegue l'EA a 9.22?

Cosa succede se c'è un guasto al sistema o al terminale? Il prezzo sarà perso.

Cioè, dovete cercare ciò che era 20 minuti fa quando arriva il momento di questo controllo. È arrivato il momento in cui i minuti sono maggiori o uguali a un multiplo di venti - controlla lo stato di RSI sulla barra, che era 20 minuti fa. Se ha l'incrocio desiderato, allora si procede come previsto...

Tuttavia, su M15 non si può determinare l'ora esatta dell'attraversamento e il prezzo esatto, ma si può guardare il prezzo su M1 - almeno 15 volte più preciso.

Ok, ho capito che non posso farlo))) Ragazzi, chi può scrivere questa parte del codice? Pagherò 1000 rubli
 
strongflex:
Ok, capisco che non posso farcela con esso)))) ragazzi che possono scrivere questa parte del codice? Pagherò 1000 rubli
double rci20 = iRSI(NULL,PERIOD_M1,14,PRICE_CLOSE,20);//RCI 20 минут назад.
   Comment("RSI = ",rci20);

E dove sono i mille?

(scherzando)

 
Alekseu Fedotov:
double rci20 = iRSI(NULL,PERIOD_M1,14,PRICE_CLOSE,20);//RCI 20 минут назад.
   Comment("RSI = ",rci20);

E dove sono i mille?

(scherzando)

La RSI deve essere di 15 minuti. Abbiamo bisogno che l'EA controlli ogni 20 minuti dall'apertura del mercato (9-00, 9-20, 9-40 ecc.) Diciamo che al 10-20 c'è un cross da sotto a sopra il livello 70, ricorda il prezzo e al 10-40 controlla se il prezzo è inferiore al 10-20 e apre uno short.