Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 6. - pagina 44

 

Quindi, se tutto va bene, la forma finale della funzione.

double ATR_Max() {
int i;
double m;
datetime tim;
iATR_H1_PER = 15;// период
if ( tim != Time[0] ) {  
while( i < WindowBarsPerChart() ) {
double a = iATR( NULL, 0, iATR_H1_PER, i );
   if ( m < a ) {
   m = a;
   }
   i++;
   tim = Time[0];
  }
}
Alert( " Максимальное значение ATR для видимого количества баров равно - ", m );
return(m);
} 
 
dr.Vasgenich :

Quindi, se tutto va bene, la forma finale della funzione.

Dr.Vasgenich :

Quindi, se tutto va bene, la forma finale della funzione.

Penso che tim = Time[0] sarebbe meglio posizionato dopo il ciclo ...perché chiedere Time[0] è fatto su tutte le barre visibili - non è razionale.
 
Boeing747 :
Penso che tim = Time[0] sarebbe meglio posizionato dopo il ciclo ...perché chiedere Time[0] è fatto su tutte le barre visibili - non è razionale.
Grazie per la correzione. Il numero di errori cresce esponenzialmente a notte))))
 
dr.Vasgenich :
Grazie per la correzione. Il numero di errori cresce esponenzialmente a notte))))
esponenzialmente )). comunque, dovrei andare a letto anch'io. se hai bisogno di qualcosa, fammi sapere))
 
Buon pomeriggio. Sapete se è possibile cambiare i parametri dell'indicatore al volo in mql4?
L'idea è semplice: l'indicatore ZigZag è installato sul grafico. Lo script dovrebbe essere scritto e il tasto di scelta rapida dovrebbe essere collegato ad esso. Premendolo, i parametri dello zigzag saranno cambiati sul grafico.
 

Continuando l'argomento attuale di trovare un filtro ad alta volatilità. Ecco il codice di un filtro esistente di WSR

extern string ____ = "Фильтр волатильности";
extern bool VolatilityFilter              = FALSE;
extern int VolaFilter                     = 25; //--- (15 1 30)
double pp;
double pd;

int init()

   if (Digits < 4) {
      pp = 0.01;
      pd = 2;
   } else {
      pp = 0.0001;
      pd = 4;
   }

Ecco la funzione stessa:

bool CheckVolatility() {
   double HeightFilter_a = NormalizeDouble(VolaFilter * pp, pd);
   bool restrict = false;
   if (NormalizeDouble(iHigh(NULL, PERIOD_M5, 1) - iLow(NULL, PERIOD_M5, 1), pd) > HeightFilter_a) restrict = true;
   if (NormalizeDouble(iHigh(NULL, PERIOD_M5, 2) - iLow(NULL, PERIOD_M5, 2), pd) > HeightFilter_a) restrict = true;
   return (restrict);
}

Così, la funzione controlla i valori delle due barre precedenti e se sono troppo grandi, restituisce TRUE. La questione è come migliorarla piacevolmente: fare in modo che questa funzione cerchi grandi candele su più candele. Per esempio 24.

 
satorifx :
Buon pomeriggio. Sapete se è possibile cambiare i parametri dell'indicatore al volo in mql4?
L'idea è semplice: l'indicatore ZigZag è installato sul grafico. Lo script dovrebbe essere scritto e il tasto di scelta rapida dovrebbe essere collegato ad esso. Appena lo premo, i parametri di ZigZag cambieranno sul grafico.
Esiste una tale possibilità.
 

Ho fatto un Expert Advisor fatto in casa per testare il trading, ma non riesco a capire una cosa...

Bay/sell è aperto usando le MA massime e minime

// Condizione per aprire la posizione BUY
if(MA_L1<MA_L0&&Ask<=MA_L0&MA_0>MA_1&&HA_up>HA_dw)

// Condizione per aprire una posizione SELL
if(MA_H1>MA_H0&&Bid>=MA_H0&MA_0<MA_1&HA_up<HA_dw)

#include <b-Lots.mqh>
extern double TrailingStop = 30;
extern double Sploss = 15;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start() {
   double HA_up,HA_dw;
   double MA_H0,MA_H1,MA_L0,MA_L1,MA_0,MA_1;
   int i, cnt, ticket, total;
   bool flag=true;

   if(Bars<100) {
      Print("bars less than 100");
      return(0); 
   }
// Проверяем стоит ли открываться
   
   cnt=OrdersHistoryTotal()-1;
   for(i=cnt;i>=0;i--) {
      if(!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY )) continue;
      if(OrderOpenTime()>=Time[0]) { // Time[0] - если позиция открывается на нулевом баре текущего символа
         flag=false;
         break;
      }
   }
   cnt=OrdersTotal()-1;
   for(i=cnt;i>=0;i--) {
      if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
      if(OrderOpenTime()>=Time[0]) { // Time[0] - если позиция открывается на нулевом баре текущего символа
         flag=false;
         break;
      }
   }
   if(!flag) return(0); 
//-----------------------------------------------
   MA_H0=iMA(0,0,3,0,MODE_SMA,PRICE_HIGH,0);
   MA_H1=iMA(0,0,3,0,MODE_SMA,PRICE_HIGH,1);
   MA_0=iMA(0,0,3,0,MODE_EMA,PRICE_MEDIAN,0);
   MA_1=iMA(0,0,3,0,MODE_EMA,PRICE_MEDIAN,1);
   MA_L0=iMA(0,0,3,0,MODE_SMA,PRICE_LOW,0);
   MA_L1=iMA(0,0,3,0,MODE_SMA,PRICE_LOW,1);
   HA_up=iCustom(0,0,"Heiken Ashi",3,0);
   HA_dw=iCustom(0,0,"Heiken Ashi",2,0);

//задали все данные 

   total=OrdersTotal();
   if(total<1) 
     {
      // Проверка свободной маржи
      if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }
      // Условие открытие позиции BUY
      if(MA_L1<MA_L0&&Ask<=MA_L0&&MA_0>MA_1&&HA_up>HA_dw)
        {
         Lots=GetSizeLot();
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,5,Bid-Sploss*Point,0,"",16384,0,Green);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
           }
         else Print("Error opening BUY order : ",GetLastError()); 
         return(0); 
        }
      // Условие открытие позиции SELL
      if(MA_H1>MA_H0&&Bid>=MA_H0&&MA_0<MA_1&&HA_up<HA_dw)
        {
         Lots=GetSizeLot();
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,5,Ask+Sploss*Point,0,"",16384,0,Red);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
           }
         else Print("Error opening SELL order : ",GetLastError()); 
         return(0); 
        }
      return(0);
     }
    
   for(cnt=0;cnt<total;cnt++)
     {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL &&   
         OrderSymbol()==Symbol())  
        {
         if(OrderType()==OP_BUY)   // длинная позиция открыта
           {
           if(NormalizeDouble (MathAbs(MA_H0-Bid),Digits)<Point)
                {
                 OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); 
                 return(0); 
                }
            // трейлинг-стоп для длинной позиции
            if(TrailingStop>0)  
              {                 
               if(Bid-OrderOpenPrice()>Point*TrailingStop)
                 {
                  if(OrderStopLoss()<Bid-Point*TrailingStop)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
                     return(0);
                    }
                 }
              }
           }
         else 
           {
           if(NormalizeDouble (MathAbs(MA_L0-Ask),Digits)<Point)
              {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); 
               return(0); 
              }
            // трейлинг-стоп для короткой позиции
            if(TrailingStop>0)  
              {                 
               if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
                 {
                  if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
                     return(0);
                    }
                 }
              }
           }
        }
     }
   return(0);
  }
Domanda: se la posizione sulla candela corrente non è chiusa (le condizioni non sono arrivate), come chiuderla sulla prossima candela, quando corrisponde a MA_0= iMA ( 0, 0, 3, 0, MODE_EMA, PRICE_MEDIAN, 0 );

Abbiamo una condizione di chiusura: attraversare il massimo o il minimo della candela corrente, ma abbiamo bisogno che la posizione si chiuda sulla prossima candela dopo essere stata aperta.

Possiamo scrivere se ( NormalizeDouble ( MathAbs (MA_0-Ask), Digits )< Point ), ma come soddisfare la condizione della seconda candela aperta.


Se puoi rispondere con del codice, l'esempio è più chiaro.
 
Zhunko :
Esiste una tale possibilità.

Grazie per la risposta incredibilmente dettagliata.

Bisogna davvero essere dei sapientoni per capire che se una nuova persona arriva sul forum con una domanda, ha bisogno di una soluzione specifica o di un link a qualcosa di simile, non di una stupida scusa che "tutto è possibile"?

 
satorifx :

Grazie per la risposta incredibilmente dettagliata.

Bisogna davvero essere dei sapientoni per capire che se una nuova persona arriva sul forum con una domanda, ha bisogno di una soluzione specifica o di un link a qualcosa di simile, non di una stupida scusa che "tutto è possibile"?

Le persone che cercano di fare qualcosa da sole vengono aiutate qui. Ti guidano nella giusta direzione, ti spiegano, ecc...

Hai fatto una domanda e hai avuto una risposta. Hai provato a iniziare a scrivere qualcosa da solo?

Quando fai una domanda in un certo formato, pensa prima a che tipo di risposta otterrai al formato della domanda...