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

 
sile:

Hallo.

Bitte um Hilfe.

Signal, wenn die Indikatorlinien auf dem ersten Balken gekreuzt werden.

Die Position wird korrekt beim ersten Takt eröffnet, wenn die Verschiebung ma_shiftT = 0 und ma_shiftD = 0 ist. Wenn die Verschiebung ma_shiftT = -1 und ma_shiftD = 1 ist, wird die Position beim dritten oder vierten Takt eröffnet.

Was muss ich tun, um eine Position zu eröffnen, wenn sie auf dem ersten Balken gekreuzt wird?


input int      ma_shiftT=-1;
input int      ma_shiftD=1;
int iTEMAHandle;   // хэндл индикатора iTEMA
int iDEMAHandle;    // хэндл индикатора
double ma1Val[]; // динамические массивы для хранения численных значений  для каждого бара
double maVal[];  // 

//+------------------------------------------------------------------+
int OnInit()
  {
//---
m_symbol.Name(Symbol());  
//--- Получить хэндл индикатора iTEMA
iTEMAHandle=iTEMA(_Symbol,PERIOD_CURRENT,30,ma_shiftT,PRICE_CLOSE);;
//---Получить хэндл индикатора
iDEMAHandle=iDEMA(_Symbol,PERIOD_CURRENT,30,ma_shiftD,PRICE_CLOSE);;
  
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- освобождаем хэндлы индикаторов
   IndicatorRelease(iTEMAHandle);

   IndicatorRelease(iDEMAHandle);
   }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
  
  //--- массив значений индикатора
   ArraySetAsSeries(ma1Val,true);

//--- массив значений индикатора
   ArraySetAsSeries(maVal,true);
  
  if(CopyRates(_Symbol,_Period,0,5,mrate)<0)
     {
      Alert("Ошибка копирования исторических данных - ошибка:",GetLastError(),"!!");
      return;
     }
//====
  if(CopyBuffer(iTEMAHandle,0,0,5,ma1Val)<0)
     {
      Alert("Ошибка копирования буферов индикатора TEMA - номер ошибки:",GetLastError(),"!!");
      return;
     }
   if(CopyBuffer(iDEMAHandle,0,0,5,maVal)<0)
     {
      Alert("Ошибка копирования буферов индикатора DEMA - номер ошибки:",GetLastError());
      return;
     }

   bool Sell_Condition_3=(maVal[2]<=ma1Val[2]);
   bool Sell_Condition_4=(maVal[1]>ma1Val[1]);
  
   if(Sell_Condition_3 && Sell_Condition_4)
   {
   // открываю позицию SELL
   }
  }

Erstens: Warum 5 Indikatorwerte kopieren, wenn Sie nur einen verwenden?

Zweitens: Die Position der Indikatorlinien bedeutet nicht, dass sie sich kreuzen.

Es genügt, 2 Werte zu kopieren, beginnend mit dem ersten Wert.

CopyBuffer(iTEMAHandle, 0, 1, 2, ma1Val)

CopyBuffer(iDEMAHandle, 0, 1, 2, maVal)

Die einzige Möglichkeit, um festzustellen, ob es einen Schnittpunkt gibt, besteht darin, die Position der Linien auf dem zweiten und dem ersten Balken zu vergleichen. FÜR DIE ANSTEHENDE AUFGABE.

Es ist notwendig, die Richtung der Array-Indexierung zu berücksichtigen. In diesem Fall erhalten wir

if(maVal[0] <= ma1Val[0] && maVal[1] > ma1Val[1])

Wenn die Bedingung erfüllt ist, ist die Tatsache der Überschneidung offensichtlich. Die Richtung der Kreuzung können Sie selbst bestimmen.


ps; Oh, richtig... Ich habe mir die Definition der Tatsache der Überschneidung nicht genau angesehen. In jedem Fall sind zusätzliche Werte nicht erforderlich. Das hat Sie wahrscheinlich verwirrt.

 
sile:

Hallo.

Bitte um Hilfe.

Signal, wenn die Indikatorlinien auf dem ersten Balken gekreuzt werden.

Die Position wird korrekt beim ersten Takt geöffnet, wenn die Verschiebung ma_shiftT = 0 und ma_shiftD = 0 ist. Wenn die Verschiebung ma_shiftT = -1 und ma_shiftD = 1 ist, wird die Position beim dritten oder vierten Takt geöffnet.

Was sollte ich tun, um eine Position zu eröffnen, wenn sie sich auf dem ersten Balken kreuzt?


input int      ma_shiftT=-1;
input int      ma_shiftD=1;
int iTEMAHandle;   // хэндл индикатора iTEMA
int iDEMAHandle;    // хэндл индикатора
double ma1Val[]; // динамические массивы для хранения численных значений  для каждого бара
double maVal[];  // 

//+------------------------------------------------------------------+
int OnInit()
  {
//---
m_symbol.Name(Symbol());  
//--- Получить хэндл индикатора iTEMA
iTEMAHandle=iTEMA(_Symbol,PERIOD_CURRENT,30,ma_shiftT,PRICE_CLOSE);;
//---Получить хэндл индикатора
iDEMAHandle=iDEMA(_Symbol,PERIOD_CURRENT,30,ma_shiftD,PRICE_CLOSE);;
  
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- освобождаем хэндлы индикаторов
   IndicatorRelease(iTEMAHandle);

   IndicatorRelease(iDEMAHandle);
   }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
  
  //--- массив значений индикатора
   ArraySetAsSeries(ma1Val,true);

//--- массив значений индикатора
   ArraySetAsSeries(maVal,true);
  
  if(CopyRates(_Symbol,_Period,0,5,mrate)<0)
     {
      Alert("Ошибка копирования исторических данных - ошибка:",GetLastError(),"!!");
      return;
     }
//====
  if(CopyBuffer(iTEMAHandle,0,0,5,ma1Val)<0)
     {
      Alert("Ошибка копирования буферов индикатора TEMA - номер ошибки:",GetLastError(),"!!");
      return;
     }
   if(CopyBuffer(iDEMAHandle,0,0,5,maVal)<0)
     {
      Alert("Ошибка копирования буферов индикатора DEMA - номер ошибки:",GetLastError());
      return;
     }

   bool Sell_Condition_3=(maVal[2]<=ma1Val[2]);
   bool Sell_Condition_4=(maVal[1]>ma1Val[1]);
  
   if(Sell_Condition_3 && Sell_Condition_4)
   {
   // открываю позицию SELL
   }
  }

Ich habe ein Beispiel angehängt, um Ihnen zu helfen - in diesem Beispiel kopiere ich nicht mehrere Werte, sondern einen nach dem anderen. Wenn Sie vergleichen, was mein Beispiel zurückgibt und was Ihr Beispiel zurückgibt, sollten Sie sehen, wie die Indizierung in den Arrays in Ihrem Beispiel erfolgt (d.h. Sie sollten verstehen, wo ein Element von Takt 1 im Array gespeichert wird und wo ein Element von Takt 2 gespeichert wird).

Wie man mit meinem Beispiel arbeitet:

Ich habe speziell für die Beispieleinstellungen eine Diagrammvorlage mit demselben Namen wie das Beispiel erstellt und gespeichert - "Two iMA Shift minus shift plus.tpl". Speichern Sie diese Vorlage im Ordner \MQL5\Profiles\Templates auf Ihrem Terminal. Wenn Sie nun den Tester starten, wird der Tester diese Vorlage aufnehmen und Sie werden so ein schönes Bild im Tester haben:

Unbenannt

Wenn er eine Kreuzung erkennt, hält das Prüfgerät an der Richtlinie

//---
   if(ma_one_1<ma_two_1 && ma_one_2>ma_two_2)
     {
      string text="ma_one_1 = "+DoubleToString(ma_one_1,Digits()+1)+"\n"+
                  "ma_two_1 = "+DoubleToString(ma_two_1,Digits()+1)+"\n"+
                  "ma_one_2 = "+DoubleToString(ma_one_2,Digits()+1)+"\n"+
                  "ma_two_2 = "+DoubleToString(ma_two_2,Digits()+1);
      Comment(text);
      DebugBreak();
     }

und Sie können im Tester mit dem "Fadenkreuz" über die Balken fahren und die Werte der Indikatoren auf Balken 1 und Balken 2 sehen (das "Datenfenster" einbeziehen).

 

Hallo!

Ich habe eine Frage zum Spread bei FOREX.

Wenn sich der Spread ausweitet, wird ASK erhöht, BID gesenkt oder bewegen sich beide symmetrisch in unterschiedliche Richtungen?

 
Sergey Zhukov:

Hallo!

Ich habe eine Frage zum Spread bei FOREX.

Wenn sich der Spread ausweitet, steigt dann ASK und sinkt BID oder bewegen sich beide symmetrisch in unterschiedliche Richtungen?

Es kann so oder so sein. Eines bleibt jedoch gleich: Der Spread ist die Differenz zwischen dem Ask-Kurs und dem Bid-Kurs.
 
Vladimir Karputov:
Es kann alles sein, was Sie wollen. Eines bleibt jedoch gleich: Der Spread ist die Differenz zwischen dem Ask-Kurs und dem Bid-Kurs.
Habe ich richtig verstanden, dass sie sich gleichzeitig aufeinander zubewegen können, wenn sich die Spanne zu verringern beginnt?
 
Sergey Zhukov:
Habe ich das richtig verstanden, dass sie sich gleichzeitig aufeinander zubewegen können, wenn sich die Spanne zu verringern beginnt?

"Eines bleibt gleich: Der Spread ist die Differenz zwischen dem Ask-Kurs und dem Bid-Kurs."

Es gibt keine anderen Gesetze.

 
Vladimir Karputov:

"Eines bleibt gleich: Der Spread ist die Differenz zwischen dem Ask-Kurs und dem Bid-Kurs."

Es gibt keine anderen Gesetze.

Was meinen Sie, wenn ich einen Kauf tätige und der Spread sich auszuweiten beginnt, der Ask steigt und der Bid sinkt, sollte ich die Position schließen oder warten, bis der Ask sinkt?
 
Sergey Zhukov:
Was denken Sie, wenn ich einen Kauf getätigt habe und der Spread sich auszuweiten beginnt, der Ask steigt und der Bid sinkt, sollte ich die Position schließen oder warten, bis der Ask sinkt?

Ein Kauf (BUY-Position) wird zum Geldkurs geschlossen.

Eine weitere Frage, die Sie sich wahrscheinlich stellen, lautet: "Was tun in Zeiten extrem hoher Volatilität?". Die Antwort ist, dass jeder anders entscheidet.

 
Vladimir Karputov:

Ein Kauf (BUY-Position) wird zum Geldkurs geschlossen.

Eine weitere Frage, die Sie sich wahrscheinlich stellen, lautet: "Was tun in Zeiten extrem hoher Volatilität?". Die Antwort ist, dass jeder anders entscheidet.

Ja, das stimmt, das meinte ich mit ultrahoher Volatilität, ich werde versuchen, im Forum zu suchen, danke.
 
Vladimir Karputov:

Ein Kauf (BUY-Position) wird zum Geldkurs geschlossen.

Eine weitere Frage, die Sie sich wahrscheinlich stellen, lautet: "Was tun in Zeiten extrem hoher Volatilität?". Die Antwort ist, dass jeder anders entscheidet.

Ja, nun... Wo findet man einen solchen Makler... Können Sie mir einen Link geben?