Die Sprache MQL5 von Grund auf selbst erlernen - Seite 84

 
Georgiy Merts #:

Genau das sage ich auch!

Und Sie sagen: "Keiner hat es gesehen". Niemand ist daran interessiert - also hat es niemand gesehen (Clowns sind nicht interessiert - sie haben es nicht gesehen). Diejenigen, die sich dafür interessieren - sie haben es gesehen.

Ich habe mich bei den Moderatoren über den Clown beschwert und werde das auch weiterhin tun, bis du gesperrt wirst.
 
Vladimir Baskakov #:
Ich habe mich bei den Moderatoren über den Clown beschwert und werde das so lange tun, bis du gebannt wirst.

Oh, hat den Igel mit seinem bloßen Hintern erschreckt...

 
Georgiy Merts #:

Oh, hat den Igel mit seinem bloßen Hintern erschreckt...

Ich bin nicht in Eile.
 
Georgiy Merts #:

Ich sehe das Problem nicht.

Richtig. Ein gefülltes Array wird deklariert, und dann - wird es wieder gefüllt, mit anderen Daten. Meiner Meinung nach ist das ein akzeptabler Fehler für einen Anfänger.

Und ist es ein Fehler?

Wenn ich Variablen und Arrays deklariere, MUSS ich sie SOFORT FÜLLEN. Wenn zum Zeitpunkt der Deklaration der genaue Wert nicht bekannt ist, fülle ich ihn mit einem wissentlich ungültigen Wert. Wenn eine Variable ohne Initialisierung deklariert und dann verwendet wird, kann sie zufällige Werte enthalten, die während der Arbeit verwendet werden, und das Ergebnis dieser Arbeit wird falsch sein und es wird sehr schwierig sein, das Problem zu finden (ich habe es mehr als einmal gefunden).

Aber wenn eine Variable gleich bei der Erstellung mit einem ungültigen Wert initialisiert wird, wird man bei der Verwendung einer nicht initialisierten Variable sofort feststellen, dass sie irgendeinen Müll enthält, und es wird einfach sein, herauszufinden, woher dieser kommt und zu sehen, dass die Variable ohne Initialisierung verwendet wurde.

Ich persönlich denke also, dass es eine gute Praxis ist, ein bereits befülltes Array zu deklarieren. Aber wir sollten dort WRONG_VALUE-Werte nehmen.

Ich habe überhaupt nichts gegen die Initialisierung von Variablen und sogar Arrays. Zum Beispiel so

int ExtHandle[21] = {};

wird ebenfalls ein initialisiertes Array sein. Aber auch dies ist in diesem Fall nicht notwendig, da das gesamte Array in OnInit() gefüllt wird. Ich sehe also keine Notwendigkeit dafür. Und selbst Pinocchio mit seinen Äpfeln funktioniert hier nicht, denn bevor die Werte verwendet (gelesen) werden, werden sie bereits initialisiert.

 
Alexey Viktorov #:

Ich habe nichts dagegen, Variablen oder sogar Arrays zu initialisieren. Zum Beispiel so

wird ebenfalls ein initialisiertes Array sein. Aber selbst dies ist in diesem speziellen Fall nicht notwendig, da in OnInit() das gesamte Array gefüllt wird. Ich sehe also keine Notwendigkeit dafür. Und selbst Pinocchio mit seinen Äpfeln wird hier nicht funktionieren, da die Werte bereits initialisiert sind, bevor sie verwendet (gelesen) werden.

Äh... Und wo wird sie "initialisiert"? Nach dem Code wird ein solches Array mit Müll gefüllt.

Meiner Meinung nach ist es gute Praxis, bei der Erstellung mit nicht ungültigen Werten zu initialisieren, wie ich bereits gesagt habe:

int ExtHandle[3] = {WRONG_VALUE;WRONG_VALUE;WRONG_VALUE};

Wenn das Array groß ist, ist es natürlich unvernünftig, es mit dieser Methode zu füllen. In diesem Fall verwende ich die DEBUG-Version, in der ich auch große Arrays mit nicht ungültigen Werten fülle, während in der RELEASE-Version keine Füllung erfolgt.

Diese Praxis hat mich wiederholt vor der Verwendung nicht initialisierter Variablen bewahrt.

 
SanAlex #:

Ihr Name im Code - den Code, den Sie eingerichtet haben, habe ich unter Ihrem Namen erstellt, um zu wissen. Aber es hat nicht funktioniert.


Und wer ist schuld an Ihren schlechten Händen?

Auf dem Bild können Sie sehen, dass der berechnete Wert 9,08253 und nach der Konvertierung 9,08 ist, und erzählen Sie mir nichts von 1 in 16 Dezimalstellen.

Und auch, wenn Sie einen Wert erhalten, der unter dem Mindestvolumen liegt

Ich musste eine weitere Variable eingeben, um zu zeigen...

 
Georgiy Merts #:

Ähm ... Und wo würde sie "initialisiert" werden? Nach dem Code wäre ein solches Array voll mit Unrat.

Meiner Meinung nach ist es gute Praxis, bei der Erstellung mit ungültigen Werten zu initialisieren, wie ich bereits gesagt habe:

Wenn das Array groß ist, ist es natürlich unvernünftig, es mit dieser Methode zu füllen. In diesem Fall verwende ich die DEBUG-Version, in der ich auch große Arrays mit nicht ungültigen Werten fülle, während in der RELEASE-Version keine Füllung erfolgt.

Diese Praxis hat mich wiederholt vor der Verwendung nicht initialisierter Variablen bewahrt.

Genau hier, in der hervorgehobenen Schleife. Und beachten Sie, dass ich nur über ein Feld gesprochen habe.

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

Selbststudium in MQL5 von Grund auf

SanAlex, 2021.11.29 07:17

Ich kann nicht verstehen, was Sie reden. Ich habe es mit meinen eigenen Händen. Was meinen Sie? der Code ist aus dem Terminal, aber die Art und Weise selbst, wie die Öffnung ein paar Paare in den Tester zu implementieren, habe ich persönlich das Ergebnis erreicht.

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

Zeigen Sie mir, wo ich den Code von Ihnen übernommen habe.

//+------------------------------------------------------------------+

//|                        Copyright 2021, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//---
#include <Trade\Trade.mqh>
//---
CTrade ExtTrade;
//+------------------------------------------------------------------+
input double MaximumRisk        = 0.02; // Maximum Risk in percentage
//---
int    ExtHandle[]= {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
double LotsRisk[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
string symb_name[]= {"EURUSD","GBPUSD","USDCHF","USDJPY","USDCAD","AUDUSD","AUDNZD",
                     "AUDCAD","AUDCHF","AUDJPY","CHFJPY","EURGBP","EURAUD","EURCHF",
                     "EURJPY","EURNZD","EURCAD","GBPCHF","GBPJPY","CADCHF","GBPAUD"
                    };

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   ExtTrade.SetExpertMagicNumber(0);
   ExtTrade.SetMarginMode();
//---
   for(int i=0; i<20; i++)
     {
      ExtTrade.SetTypeFillingBySymbol(symb_name[i]);
      //--- Moving Average indicator
      ExtHandle[i]=iMA(symb_name[i],_Period,12,6,MODE_SMA,PRICE_CLOSE);
      if(ExtHandle[i]==INVALID_HANDLE)
        {
         printf("Error creating MA indicator");
         return(INIT_FAILED);
        }
     }
//---
   return(INIT_SUCCEEDED);
  }


Ich habe alles aus dem Code entfernt, was nicht mit unserem Dialog zu tun hat. Na ja, fast alles...

 
Alexey Viktorov #:

Genau dort, in der hervorgehobenen Schleife. Und beachten Sie, dass ich nur von einem Feld gesprochen habe.

Ja, das ist richtig. Meiner Meinung nach eine normale Praxis.

 
SanAlex #:

Diese ist fast fertig - ich muss nur noch unnötige, nicht funktionierende Funktionen entfernen. Dieser Multicurrency Expert Advisor stammt aus diesem "MACD Sample.mq5".

Ich habe anscheinend alles Unnötige entfernt, damit es funktioniert. Ich muss es noch auf den Geschmack bringen und werde es dann hier veröffentlichen.

Bildschirmfoto 2021-11-29 155519

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

Das ist das, was ich bis jetzt habe - vielleicht macht es jemand besser

Dateien:
00001_Mult.mq5  15 kb
 
Alexey Viktorov #:

Ich hoffe wirklich, dass Sie das nicht geschrieben haben...

Hier ist eine funktionierende Funktion

Alles, was Sie tun müssen, ist, die Risikogröße einzugeben, um nicht von der vollen freien Marge zu profitieren...

Guten Tag und gute Laune an alle!

Es hat mich viel Zeit gekostet, Arrays zu verstehen und zu untersuchen, aber ich habe das Ergebnis schon, denn ich habe den Code der Funktion, die das Risiko für 12 Währungspaare berechnet, selbst geschrieben.

Mit freundlichen Grüßen, Vladimir.

//+------------------------------------------------------------------+
//| Входные параметры советника                                      |
//+------------------------------------------------------------------+

input double   Risk0=1.0;           //Риск для валютной пары EURUSD (% от баланса)
.
.
.
.
input double   Risk11=1.0;           //Риск для валютной пары EURJPY (% от баланса)

//+------------------------------------------------------------------+
//| Функция Money_Management рассчитывает размер лота в зависимости  |
//| от риска, заданного во входных параметрах советника.             |
//+------------------------------------------------------------------+
double Money_Management()
  {
//--- объявляем динамический массив
   double risk[];
//--- устанавливаем размер массива
   ArrayResize(risk,12);
//--- заполняем массив значениями риска
   ArrayFill(risk,0,1,Risk0);
   ArrayFill(risk,1,1,Risk1);
   ArrayFill(risk,2,1,Risk2);
   ArrayFill(risk,3,1,Risk3);
   ArrayFill(risk,4,1,Risk4);
   ArrayFill(risk,5,1,Risk5);
   ArrayFill(risk,6,1,Risk6);
   ArrayFill(risk,7,1,Risk7);
   ArrayFill(risk,8,1,Risk8);
   ArrayFill(risk,9,1,Risk9);
   ArrayFill(risk,10,1,Risk10);
   ArrayFill(risk,11,1,Risk11);
//---
   double price=0.0;
   double margin=0.0;
   double MaximumRisk=risk[11]/100;
//---
   if(!SymbolInfoDouble(_Symbol,SYMBOL_ASK,price))
      return(0.0);
   if(!OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,1.0,price,margin))
      return(0.0);
   if(margin<=0.0)
      return(0.0);
//---
   double min_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
   double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
//---
   double lot=NormalizeDouble(AccountInfoDouble(ACCOUNT_MARGIN_FREE)*MaximumRisk/margin,2);
//---
   if(lot<min_volume)
      lot=min_volume;
   if(lot>max_volume)
      lot=max_volume;
   return(lot);
  }
//+------------------------------------------------------------------+
Grund der Beschwerde: