Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 824

 
lil_lil:

Danke, wie schreibe ich eine Schleife, um die Nummer des Balkens zu finden, der die beiden MAs kreuzt, wenn die ersten beiden Punkte des Algorithmus erfüllt sind und es Werte der beiden MAs auf dem ersten Balken gibt?

/

.


Aha, Sie haben es also doch nicht durch Arrays gelöst.

Hinweis: Die Lösung über Arrays (Kopieren der LETZTEN DREI Werte aus den Indikatoren in die Arrays First[], Second[] und Third[]) ist dasKreuzen von zwei iMAs- OnTick():

//--- We look for crossing of two indicators
   double   First[];
   double   Second[];
   double   Third[];
   ArraySetAsSeries(First,true);    // index [0] - the most right bar on a charts
   ArraySetAsSeries(Second,true);   // index [0] - the most right bar on a charts
   ArraySetAsSeries(Third,true);    // index [0] - the most right bar on a charts
   int      buffer_num=0;           // indicator buffer number 
   int      start_pos=0;            // start position 
   int      count=3;                // amount to copy 
   if(!iMAGet(handle_iMA_First,buffer_num,start_pos,count,First))
      return;
   if(!iMAGet(handle_iMA_Second,buffer_num,start_pos,count,Second))
      return;
   if(InpFilterMA)
      if(!iMAGet(handle_iMA_Third,buffer_num,start_pos,count,Third))
         return;
//--- step 1: check in the arrays bars [0] and [1]
   if(First[0]>Second[0] && First[1]<Second[1]) // buy
     {
      if(InpFilterMA)
         if(Third[0]>=First[0])
            return;
      if(!RefreshRates())
        {
         PrevBars=iTime(1);
         return;
        }
      double sl=m_symbol.Bid()-InpStopLoss*m_adjusted_point;
      double tp=m_symbol.Ask()+InpTakeProfit*m_adjusted_point;
      OpenBuy(sl,tp);
      return;
     }
   else if(First[0]<Second[0] && First[1]>Second[1]) // sell
     {
      if(InpFilterMA)
         if(Third[0]<=First[0])
            return;
      if(!RefreshRates())
        {
         PrevBars=iTime(1);
         return;
        }
      double sl=m_symbol.Ask()+InpStopLoss*m_adjusted_point;
      double tp=m_symbol.Bid()-InpTakeProfit*m_adjusted_point;
      OpenSell(sl,tp);
      return;
     }
//--- step 2: on a step of 1 crossing haven't found. check in the arrays bars [0] and [2]
   if(First[0]>Second[0] && First[2]<Second[2]) // buy
     {
      //--- search in history
      if(SearchPositions(iTime(start_pos+3),iTime(start_pos)))
         return;
      if(!RefreshRates())
        {
         PrevBars=iTime(1);
         return;
        }
      double sl=m_symbol.Bid()-InpStopLoss*m_adjusted_point;
      double tp=m_symbol.Ask()+InpTakeProfit*m_adjusted_point;
      OpenBuy(sl,tp);
      return;
     }
   else if(First[0]<Second[2] && First[1]>Second[2]) // sell
     {
      //--- search in history
      if(SearchPositions(iTime(start_pos+3),iTime(start_pos)))
         return;
      if(!RefreshRates())
        {
         PrevBars=iTime(1);
         return;
        }
      double sl=m_symbol.Ask()+InpStopLoss*m_adjusted_point;
      double tp=m_symbol.Bid()-InpTakeProfit*m_adjusted_point;
      OpenSell(sl,tp);
      return;
     }


In Ihrem Fall (ein Wert nach dem anderen) sieht die Schleife wie folgt aus:

   int      signal=0;                                 // "-1" -> Sell; "0" -> Not signal; "1" -> Buy
   double   MA1_curr=iMAGet(handle_iMA_1,0);          // the value of the 1st MA on i bar
   double   MA2_curr=iMAGet(handle_iMA_2,0);          // the value of the 1st MA on i bar
   for(int i=0;i<100;i++)
     {
      double   MA1_prev=iMAGet(handle_iMA_1,i+1);     // the value of the 1st MA on i+1 th bar
      double   MA2_prev=iMAGet(handle_iMA_2,i+1);     // the value of the 1st MA on i+1 th bar
      //---
      signal=0;                                       // "-1" -> Sell; "0" -> Not signal; "1" -> Buy
      if(MA1_prev<MA2_prev && MA1_curr>MA2_curr)
         signal=1;
      else if(MA1_prev>MA2_prev && MA1_curr<MA2_curr)
         signal=-1;
      //---
      MA1_curr=MA1_prev;
      MA2_curr=MA2_prev;
     }

MA1_curr - der Wert des Indikators MA1 auf bar #i, MA1_prev - der Wert des Indikators MA1 auf bar #i+1
MA2_curr - der Wert des Indikators MA2 auf bar #i, MA2_prev - der Wert des Indikators MA2 auf bar #i+1

Wenn Sie eine Kreuzung erhalten (die Variable signalisiert entweder "-1" oder "1"), ist der Wert von i die Nummer des Balkens, in dem die Kreuzung stattgefunden hat.

Dies ist der einfachste Algorithmus, um den Crossover zu finden, aber nicht der genaueste.

 
Vladimir Karputov:

Ja, Sie haben sich entschieden, doch keine Arrays zu verwenden...


Danke, Ihr andererMA Cross EA wurde als Beispiel verwendet

Ich möchte es am dritten oder fünften oder...n Balken nach dem Überqueren eingeben

Wladimir Karputow:

In Ihrem Fall (Sie erhalten einen Wert) sieht der Zyklus wie folgt aus

Warum gibt es keinen Ausgang aus der Schleife, wenn eine Kreuzung gefunden wird?

Können diese Bedingungen außerhalb der Schleife gestellt werden?

 if(signal==-1)num_bar_b=i;
 if(signal==1)num_bar_s=i;

.

 

Guten Tag. Könnten Sie mir bitte sagen, in welchem Format ich historische Daten vom Finam- oder MFD.ru-Server herunterladen kann, um den Kursverlauf zu importieren? Ich kann es überhaupt nicht tun. Ich kann sie nur von txt nach csv speichern, das ist alles.

 
Eol:

Guten Tag. Könnten Sie mir bitte sagen, in welchem Format ich historische Daten vom Finam- oder MFD.ru-Server herunterladen kann, um den Kursverlauf zu importieren? Ich kann es überhaupt nicht tun. Ich kann sie nur von txt nach csv speichern, das ist alles.


Sie müssen in MetaTrader 5 nichts herunterladen :) - Sobald Sie eine Verbindung zu einem Handelsserver herstellen, steht Ihnen der echte Tickverlauf zur Verfügung. Blick in RichtungCopyTicks

 
Vladimir Karputov:

In MetaTrader 5 müssen Sie nichts herunterladen :) - Sobald Sie sich mit dem Handelsserver verbinden, steht Ihnen der echte Tickverlauf zur Verfügung. Blick in RichtungCopyTicks


Ich brauche nur russische Aktien im Wert von 10 Jahren. Mein Makler gibt mir nicht so viel, und es ist unwahrscheinlich, dass ich einen finde.

 
5.0 Build 1755

Beschreibung des Problems

Guten Abend, habe eine Frage zu MQL5, wenn Sie helfen können.
Ich habe noch keine Lehrbücher über 5.
Die Frage ist.


#property indicator_level1 30 - Ich habe den Parameter definiert. Wenn ich den Indikator in das Diagramm lade. Ich habe verstanden.
Ich ändere die Linie mit der Funktion ColorBuffer[], wenn die Linie unter diesen Parameter abfällt.

Ich habe hier ein Problem. Wenn ich den Indikator öffne und den Parameter für einen anderen ändere, wird die Füllstandslinie auch nach dem Laden des Indikators dort platziert, aber der Indikator berechnet sie anhand des Parameters, der zuvor festgelegt wurde, d.h. #property indicator_level1 30

Wie sollte ich diese Ebene ansprechen, um sie zur Laufzeit ändern zu können?

- Ich habe bereits versucht, den Parameter zu überprüfen. Und berechnen Sie die gesamte Indikatorkette neu.
Aber es wird immer noch nicht so gezeichnet, wie ich es möchte!

Hilfe!
:)

Abfolge der Maßnahmen

RSI.mqh

#Eigenschaft indicator_level1 30

#Eigenschaft indicator_level2 70


In der Beschreibung Calculaite Code. Am Ende der Zeile, wo die Linie durch For geht, habe ich die Funktion hinzugefügt, die Farbe der Linie zu ändern, wenn sie unter diesem Niveau liegt.
ExtColorsBuffer [i] =0;
if (ExtRSIBuffer [i]> indicator_level2& indicator_levelcolor!=NULL) {
ExtColorsBuffer [i] =1;
}
if (ExtRSIBuffer [i]< indicator_level1& indicator_levelcolor!=NULL) {
ExtColorsBuffer [i] =2;

Erwartetes Ergebnis


Ich sehe das gleiche wie auf dem Bild, aber wenn ich Einstellungen öffnen und ändern level indicator_level1 / 2 in den Prozess der Verwendung des Indikators erhalte ich ein Redraw. Der Indikator wird neu gezeichnet, so dass er seine Farbe ändert, wenn die Linie ein Niveau überschreitet. Aber für mich ist es auf dem gleichen Niveau wie vorher :)

Mehr Infos

...

Dateien:
rrgpusgf5g.png  69 kb
 
Ivan Stepanenko:
5.0 Build 1755

Beschreibung des Problems

Guten Abend, habe eine Frage zu MQL5, wenn Sie helfen können.
Ich habe noch keine Lehrbücher über 5.
Die Frage ist.


#property indicator_level1 30 - Ich habe den Parameter definiert. Wenn ich den Indikator in das Diagramm lade. Ich habe verstanden.
Ich ändere die Linie mit der Funktion ColorBuffer[], wenn die Linie unter diesen Parameter abfällt.

Ich habe hier ein Problem. Wenn ich den Indikator öffne und den Parameter für einen anderen ändere, wird die Füllstandslinie auch nach dem Laden des Indikators dort platziert, aber der Indikator berechnet sie anhand des Parameters, der zuvor festgelegt wurde, d.h. #property indicator_level1 30

Wie sollte ich diese Ebene ansprechen, um sie zur Laufzeit ändern zu können?

- Ich habe bereits versucht, den Parameter zu überprüfen. Und berechnen Sie die gesamte Indikatorkette neu.
Aber es wird immer noch nicht so gezeichnet, wie ich es möchte!

Hilfe!
:)

Abfolge der Maßnahmen

RSI.mqh

#Eigenschaft indicator_level1 30

#Eigenschaft indicator_level2 70


In der Beschreibung Calculaite Code. Am Ende der Zeile, wo die Linie durch For geht, habe ich die Funktion hinzugefügt, die Farbe der Linie zu ändern, wenn sie unter diesem Niveau liegt.
ExtColorsBuffer [i] =0;
if (ExtRSIBuffer [i]> indicator_level2& indicator_levelcolor!=NULL) {
ExtColorsBuffer [i] =1;
}
if (ExtRSIBuffer [i]< indicator_level1& indicator_levelcolor!=NULL) {
ExtColorsBuffer [i] =2;

Erwartetes Ergebnis


Ich sehe das gleiche wie auf dem Bild, aber wenn ich Einstellungen öffnen und ändern level indicator_level1 / 2 in den Prozess der Verwendung des Indikators erhalte ich ein Redraw. Der Indikator wird neu gezeichnet, so dass er seine Farbe ändert, wenn die Linie ein Niveau überschreitet. Aber für mich ist es auf dem gleichen Niveau wie vorher :)

Mehr Infos

...

IndicatorSetInteger(INDICATOR_LEVELCOLOR,0,clrCrimson);      // Поменяет цвет самого первого по счёту уровня на цвет Crimson
IndicatorSetInteger(INDICATOR_LEVELCOLOR,1,clrDeepSkyBlue);  // Поменяет цвет второго по счёту уровня на цвет DeepSkyBlue
 
Ivan Stepanenko:
5.0 Build 1755

Beschreibung des Problems

Guten Abend, habe eine Frage zu MQL5, wenn Sie helfen können.
Ich habe noch keine Lehrbücher über 5.
Die Frage ist.

Ich würde gerne wissen, warum mir die Antwort in einem separaten Thema nicht gefällt.

Dies ist das Forum für Handel, automatisierte Handelssysteme und Strategietests.

Ich brauche Hilfe in MQL5 #property indicator_level

Alexey Viktorov, 2018.01.31 09:06

Igor, wir liegen beide falsch. Ich habe die Aufgabe nicht sofort verstanden...

Neben der #property-Direktive können Sie die Indikatorstufe mit der Funktion

IndicatorSetDouble(INDICATOR_LEVELVALUE,0,20);

Dementsprechend sollte dieser Wert in den Parametern für eingehende Indikatoren festgelegt werden. In diesem Fall wird der Pegel um den angegebenen Wert gezeichnet und sollte um diesen Wert geändert werden.

Testfall

#property indicator_separate_window
#property indicator_buffers     1
#property indicator_type1       DRAW_LINE
#property indicator_plots       1
#property indicator_color1      clrGreenYellow
#property indicator_level1      0
#property indicator_levelcolor  clrPurple

input double level = 0.6;
double buf[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0, buf, INDICATOR_DATA);
   IndicatorSetDouble(INDICATOR_LEVELVALUE, 0, level);
//---
   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 i = 0, limit = prev_calculated == 0 ? 0 : rates_total-1;
    for(i = limit; i < rates_total; i++)
     {
      buf[i] = i%2;
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Ich hoffe, es ist nicht schwierig, die Farbe entsprechend der in den Eingabeparametern festgelegten Stufe zu ändern.
 

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Wanzen, Wanzen, Fragen

Aleksey Rodionov, 2018.02.06 16:31

Hier ist ein interessantes Beispiel:

Print("Баланс на счёте = ",AccountInfoDouble(ACCOUNT_BALANCE));
printf("ACCOUNT_BALANCE =  %G",AccountInfoDouble(ACCOUNT_BALANCE));


Wenn Sie %G in pintf entfernen, wird der Wert nicht angezeigt, aber in Print wird er ohne %G angezeigt.

Auch in Print wird der Saldowert 10000.0 angezeigt, in printf aber nur die ganze Zahl 10000

Ich bin mehr daran interessiert, was der Unterschied zwischen Print und Printf ist und vor allem, warum es nicht ohne %G angezeigt wird. Ich habe in dem Nachschlagewerk nichts verstanden.


 

Hallo Kollegen, ich habe eine Frage, ich versuche, ein Widget meines Signals in die Signatur des Forums "Forex Money" einzufügen, aber sie haben HTML deaktiviert oder blockiert, gibt es eine Möglichkeit, es in eine URL zu konvertieren?

Hier ist der Code <iframe frameborder="0" width="220" height="140" src="https://www.mql5.com/ru/signals/widget/signal/328l?t=green"></iframe>