Jede Anfängerfrage, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 6. - Seite 44

 

So, hoffentlich die endgültige Form der Funktion.

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 :

So, hoffentlich die endgültige Form der Funktion.

Dr.Vasgenich :

So, hoffentlich die endgültige Form der Funktion.

Ich denke, tim = Time[0] wäre besser nach der Schleife platziert ... denn die Abfrage von Time[0] erfolgt für alle sichtbaren Balken - das ist nicht rational.
 
Boeing747 :
Ich denke, tim = Time[0] sollte besser nach der Schleife platziert werden ... denn die Abfrage von Time[0] erfolgt für alle sichtbaren Balken - das ist nicht rational.
Danke für die Korrektur. Die Zahl der Fehler wächst exponentiell bei Nacht))))
 
dr.Vasgenich :
Danke für die Korrektur. Die Zahl der Fehler steigt bei Nacht exponentiell an))))
exponentiell )). aber ich sollte auch ins bett gehen. wenn sie etwas brauchen, lassen sie es mich wissen))
 
Guten Tag. Wissen Sie, ob es möglich ist, die Parameter des Indikators in mql4 während des laufenden Betriebs zu ändern?
Die Idee ist einfach: Der ZigZag-Indikator wird auf dem Chart installiert. Das Skript sollte geschrieben und mit einer Tastenkombination versehen werden, bei deren Betätigung die Zickzack-Parameter im Diagramm geändert werden.
 

Das aktuelle Thema der Suche nach einem Filter mit hoher Volatilität wird fortgesetzt. Hier ist der Code eines bestehenden Filters von 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;
   }

Hier ist die Funktion selbst:

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);
}

Die Funktion prüft also die Werte der beiden vorangegangenen Balken, und wenn sie zu groß sind, gibt sie TRUE zurück. Die Frage ist, wie man es verbessern kann und wie man es für große Kerzen auf mehr Kerzen aussehen lassen kann. Zum Beispiel 24.

 
satorifx :
Guten Tag. Wissen Sie, ob es möglich ist, die Parameter des Indikators in mql4 während des laufenden Betriebs zu ändern?
Die Idee ist einfach: Der ZigZag-Indikator wird auf dem Chart installiert. Das Skript sollte geschrieben und die Tastenkombination damit verknüpft werden. Sobald ich sie drücke, ändern sich die ZigZag-Parameter im Chart.
Es gibt eine solche Möglichkeit.
 

Ich habe einen hausgemachten Expert Advisor erstellt, um den Handel zu testen, aber ich kann eine Sache nicht herausfinden...

Bucht/Verkauf wird anhand der maximalen und minimalen MAs eröffnet

// Bedingung für die Eröffnung der BUY-Position
if(MA_L1<MA_L0&&Ask<=MA_L0&MA_0>MA_1&&HA_up>HA_dw)

// Bedingung für die Eröffnung einer SELL-Position
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);
  }
Frage: Die Position auf der aktuellen Kerze ist nicht geschlossen (die Bedingungen sind nicht gekommen). Wie kann man sie auf der nächsten Kerze schließen, wenn sie MA_0= iMA ( 0, 0, 3, 0, MODE_EMA, PRICE_MEDIAN, 0 );

Wir haben eine Bedingung, um sie zu schließen: Überschreiten des Hochs oder Tiefs der aktuellen Kerze, aber wir brauchen die Position, um auf der nächsten Kerze zu schließen, nachdem sie geöffnet wurde.

Wir können schreiben, wenn ( NormalizeDouble ( MathAbs (MA_0-Ask), Digits )< Point ), aber wie erfüllt man die Bedingung der zweiten offenen Kerze.


Wenn Sie mit Code antworten können, wird das Beispiel deutlicher.
 
Zhunko :
Es gibt eine solche Möglichkeit.

Vielen Dank für die unglaublich ausführliche Antwort.

Muss man wirklich ein Klugscheißer sein, um zu verstehen, dass eine neue Person, die mit einer Frage ins Forum kommt, eine konkrete Lösung oder einen Link zu etwas Ähnlichem braucht, und nicht eine dumme Ausrede, dass "alles möglich ist"?

 
satorifx :

Vielen Dank für die unglaublich ausführliche Antwort.

Muss man wirklich ein Klugscheißer sein, um zu verstehen, dass eine neue Person, die mit einer Frage ins Forum kommt, eine konkrete Lösung oder einen Link zu etwas Ähnlichem braucht, und nicht eine dumme Ausrede, dass "alles möglich ist"?

Menschen, die versuchen, etwas auf eigene Faust zu unternehmen, erhalten hier Hilfe. Sie leiten einen in die richtige Richtung, erklären, usw. ...

Sie haben eine Frage gestellt und eine Antwort erhalten. Haben Sie schon einmal versucht, selbst etwas zu schreiben?

Wenn Sie eine Frage in einem bestimmten Format stellen, überlegen Sie zunächst, welche Art von Antwort Sie auf das Format der Frage erhalten werden...