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

 
MrBrooklin #:

Was genau verstehen Sie nicht? Wie erstellt man eine EA-Initialisierungsfunktion? Dann versuchen Sie, diesen Artikel für Anfänger zu studieren.

Mit freundlichen Grüßen, Vladimir.

und was bedeutet es, zu initialisieren))))) es ist nicht klar, eine Person)))))

 
Valeriy Yastremskiy #:

und was meinen Sie mit initialisieren))))) es ist irgendwie unklar für die Person)))))

Guten Abend, Valery! Wir öffnen den der Person vorgeschlagenen Artikel und finden dort zunächst eine kurze Beschreibung:

Далее идет функция инициализации советника. Это функция вызывается первой после запуска советника или смены графика и вызывается только один раз.

Этот раздел - лучшее место для проведения проверок, чтобы убедиться в правильности работы нашего советника.

Например, можно проверить, достаточно ли баров на графике для работы нашего советника и т.п.

Также это лучшее место для получения хэндлов технических индикаторов, которые будут использоваться (в нашем случае это индикаторы ADX и Moving Average).

und dann eine ausführlichere:

int OnInit()
  {
//--- Получить хэндл индикатора ADX
   adxHandle=iADX(NULL,0,ADX_Period);
//--- Получить хэндл индикатора Moving Average
   maHandle=iMA(_Symbol,_Period,MA_Period,0,MODE_EMA,PRICE_CLOSE);
//--- Нужно проверить, не были ли возвращены значения Invalid Handle
   if(adxHandle<0 || maHandle<0)
     {
      Alert("Ошибка при создании индикаторов - номер ошибки: ",GetLastError(),"!!");
     }

Im Allgemeinen sollte er zumindest diesen Artikel zuerst lesen. ))

Mit freundlichen Grüßen, Vladimir.

 

Guten Tag zusammen!

Ich bin dabei, mein Selbststudium fortzusetzen und bin wieder auf eine Verwirrung gestoßen. Hier ist der Skriptcode:

//+------------------------------------------------------------------+
//| Input variables                                                  |
//+------------------------------------------------------------------+
input uchar candles = 60;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   MqlRates price_array[];
   double price_low[];
   ArraySetAsSeries(price_low, true);
   ArraySetAsSeries(price_array, true);
   int copy_low = CopyLow(_Symbol, _Period, 0, candles, price_low);
   if(copy_low > 0)
     {
      int candle_low = ArrayMinimum(price_low, 0, candles);
      int Data = CopyRates(_Symbol, _Period, 0, candles, price_array);
      ObjectCreate(0, "UpwardTrendline", OBJ_TREND, 0, price_array[candle_low].time, price_array[candle_low].low,
                   price_array[0].time, price_array[0].low,0);
      ObjectSetInteger(0, "UpwardTrendline", OBJPROP_COLOR, Blue);
      ObjectSetInteger(0, "UpwardTrendline", OBJPROP_STYLE, STYLE_SOLID);
      ObjectSetInteger(0, "UpwardTrendline", OBJPROP_WIDTH, 3);
      ObjectSetInteger(0, "UpwardTrendline", OBJPROP_RAY_RIGHT, true);
     }
  }
//+------------------------------------------------------------------+

Das Skript sollte eine Trendlinie als Segment zeichnen. Dazu habe ich den ersten und den zweiten Punkt gesetzt, um dieses Segment zu zeichnen. In der Dokumentation steht auch, dass man zwei Ankerpunkte braucht, um eine Trendlinie zu erstellen. Ich denke, ich habe alles so gemacht, wie es gemacht werden sollte. Nach meinem Verständnis ist der zweite Punkt auch ein Extrempunkt, aber aus irgendeinem Grund wird er nicht als Segment, sondern als Strahl gezeichnet.


Könnten Sie mir bitte sagen, wo ich mich geirrt habe?

Mit freundlichen Grüßen, Vladimir.

 

MrBrooklin #:
     

      ObjectSetInteger(0, "UpwardTrendline", OBJPROP_COLOR, Blue);
      ObjectSetInteger(0, "UpwardTrendline", OBJPROP_STYLE, STYLE_SOLID);
      ObjectSetInteger(0, "UpwardTrendline", OBJPROP_WIDTH, 3);
      ObjectSetInteger(0, "UpwardTrendline", OBJPROP_RAY_RIGHT, true);
ObjectSetInteger(0, "UpwardTrendline", OBJPROP_RAY_RIGHT, false);
 
Artyom Trishkin #:

Danke, Artyom! Mann, ich hatte nicht genug Intelligenz, um eine so einfache und offensichtliche Sache zu verstehen. Gott segne dich!

Mit freundlichen Grüßen, Vladimir.

 

Guten Morgen und gute Laune, liebe Leute!

Das war's! "Ich komme, euer Dach!" Das bin ich. Ich lasse das Skript laufen:

//+------------------------------------------------------------------+
//|                                              Count_Pos (v.2).mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Calculate positions Buy and Sell                                 |
//+------------------------------------------------------------------+
void Calc_Pos(uint pos_buy,uint pos_sell)
  {
   for(int i=0; i<PositionsTotal(); i++)
     {
      PositionGetSymbol(i);
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
         pos_buy++;
      if(
         PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
         pos_sell++;
     }
   Print("pos_buy ",pos_buy);
   Print("pos_sell ",pos_sell);
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   uint count_buy=0, count_sell=0;
   Calc_Pos(count_buy,count_sell);
   Print("По символу ",_Symbol," открыто: ",count_buy," длинных позиций");
   Print("По символу ",_Symbol," открыто: ",count_sell," коротких позиций");
  }
//+------------------------------------------------------------------+

und ich bekomme das hier:

2023.11.22 07:59:29.375 Count_Pos (v.2) (EURUSDrfd,M1)  pos_buy 0
2023.11.22 07:59:29.375 Count_Pos (v.2) (EURUSDrfd,M1)  pos_sell 2
2023.11.22 07:59:29.375 Count_Pos (v.2) (EURUSDrfd,M1)  По символу EURUSDrfd открыто: 0 длинных позиций
2023.11.22 07:59:29.375 Count_Pos (v.2) (EURUSDrfd,M1)  По символу EURUSDrfd открыто: 0 коротких позиций

und es sollte zwei Short-Positionen geben. Könnten Sie mir bitte sagen, wo ich einen Fehler gemacht habe?

Mit freundlichen Grüßen, Vladimir.

 
MrBrooklin #:

Guten Morgen und gute Laune, allerseits!

Das war's! "Ich komme, euer Dach!" Das bin ich. Ich führe das Drehbuch aus:

und ich bekomme das hier:

und es sollten zwei Short-Positionen sein. Könnten Sie mir bitte sagen, wo ich einen Fehler gemacht habe?

Mit freundlichen Grüßen, Vladimir.

Die letzten beiden Ausdrucke

geben den Wert von Variablen aus

uint count_buy=0, count_sell=0;

aus, die initialisiert sind, denen aber nichts weiter zugewiesen wurde.
D.h. alles funktioniert wie geschrieben - keine Wunder.

 
Alexander Sevastyanov #:

Die letzten beiden Drucke

gibt den Wert der Variablen

aus, die initialisiert sind, denen aber nichts weiter zugewiesen wurde.
D.h. alles funktioniert wie geschrieben - keine Wunder.

Hallo, Alexander. Genau da war ich ratlos. Was soll denn zugewiesen werden? Ich denke, die Funktion Calc_Pos(count_buy, countsell) sollte funktionieren, oder verstehe ich das falsch?

Mit freundlichen Grüßen, Vladimir.

 
MrBrooklin #:

Hallo, Alexander. Da bin ich nicht weitergekommen. Was soll zugewiesen werden? Ich denke die Funktion Calc_Pos(count_buy, countsell) sollte funktionieren, oder verstehe ich das falsch?

Mit freundlichen Grüßen, Vladimir.

1. Du deklarierst und initialisierst zwei Variablen.

uint count_buy=0, count_sell=0;

2. Du übergibst ihre Werte an die Funktion.

Calc_Pos(count_buy,count_sell);

Es ist nicht ganz klar, warum man das tut.
Dann gibt man die Werte dieser Variablen aus. Aber sie wurden nirgends verändert,
, und es werden Nullen ausgegeben. Alles funktioniert wie geschrieben.

P.S. Um Ihren Plan zu verstehen: Sie können diese beiden Variablen als global deklarieren.
Zum Beispiel so:

//+------------------------------------------------------------------+
//|                                              Count_Pos (v.2).mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"

   uint pos_buy=0, pos_sell=0;  // это глобальные переменные

//+------------------------------------------------------------------+
//| Calculate positions Buy and Sell                                 |
//+------------------------------------------------------------------+
void Calc_Pos()
  {
   for(int i=0; i<PositionsTotal(); i++)
     {
      PositionGetSymbol(i);
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
         pos_buy++;
      if(
         PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
         pos_sell++;
     }
   Print("pos_buy ",pos_buy);
   Print("pos_sell ",pos_sell);
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   Calc_Pos();
   Print("По символу ",_Symbol," открыто: ",pos_buy," длинных позиций");
   Print("По символу ",_Symbol," открыто: ",pos_sell," коротких позиций");
  }
//+------------------------------------------------------------------+
 
Alexander Sevastyanov #:

1. Sie deklarieren und initialisieren zwei Variablen.

2. Sie übergeben deren Werte an die Funktion.

Es ist nicht ganz klar, warum man das tut.
Geben Sie dann die Werte dieser Variablen aus. Sie sind aber nirgends verändert worden,
bzw. werden mit Nullen ausgegeben. Alles funktioniert wie geschrieben.

P.S. Um Ihren Plan zu verstehen: Sie können diese beiden Variablen als global deklarieren.
Zum Beispiel so:

Vielen Dank, Alexander. Deine Korrektur hat den Code zum Laufen gebracht. Um ehrlich zu sein, habe ich festgestellt, dass ich selbst in drei Punkten verwirrt war. Ich muss die Übergabe von Argumenten an eine Funktion noch einmal lernen. Offenbar habe ich hier ein völliges Missverständnis.

Mit freundlichen Grüßen, Vladimir.