Diskussion zum Artikel "Erzeugung von Multi-Expert Advisors auf Grundlage von Handelsmodellen" - Seite 3

 
Serj_Che:

Ich denke, der Artikel sollte umbenannt werden - warum sollte man es einfach machen, wenn man es kompliziert machen kann.

Guter Punkt.

Interessant:

Zumindest habe ich verstanden (oder ich glaube, ich habe verstanden), was der Autor den Lesern vermitteln wollte.

Das ist es, wovon ich spreche. Jeder hat die Essenz des Geschriebenen verstanden. Wer von denen, die es lesen, wird die beigefügten Codes als eine fertige Implementierung einer Entwicklungsstufe ansehen? Praktisch niemand außer dem Autor. Der Artikel erwies sich als eine Einführung, aus der man nur die Idee, nicht aber den Code übernehmen kann. Und dafür hätte man nicht so viele Buchstaben machen müssen.

Wenn Sie sich selbst als Lader bezeichnen, dann gehen Sie in den Körper. Wenn du beschließt, andere zu unterrichten oder deine eigenen Erfahrungen weiterzugeben, dann solltest du beim Schreiben über jedes Wort und die Struktur der Informationen, die du präsentierst, nachdenken. Wenn die Gedanken wandern und man sich in die Weite begeben und über alles in der Welt schreiben will, dann gibt es nichts, was man mit dem Schreiben von Artikeln grundlegend planen sollte. Und die Worte, dass dies die Version 1.0 beta ist, sind nicht angebracht. Denn es verdirbt den Ruf eines kompetenten Programmierers.

Ich wünsche mir, dass die Forumsleitung mehr auf die veröffentlichten Materialien achtet und eine strengere Kontrolle der Autorenarbeiten (nicht nur Artikel, sondern auch Codes) durchführt. Und nur um die Zahl der Veröffentlichungen aufzufüllen, sollte man nicht alles auf einmal nehmen. Damit es nicht so kommt wie bei Codebase in MQL4. Wirklich wertvolle Arbeiten ohne Analogien gehen hinter hunderten von 1.0 Beta-Versionen verloren.

 

Руководству форума желаю...

1. Sagen Sie mir nicht, wie ich schreiben soll oder was ich schreiben soll.

2. Sagen Sie der MetaQuotes Software Corporation nicht, welche Marketingpolitik sie verfolgen und wie sie Autoren für ihr Produkt bewerten und auswählen soll.

Betrachten Sie diese Punkte nicht als einen Wunsch, sondern als eine Warnung. Wenn Sie in dem meinem Artikel gewidmeten Forumsthread weiterhin Negativität verbreiten und MetaQuotes auch noch vorschreiben, was und wie es zu tun hat, wird dies von mir als Versuch angesehen, die von mir geleistete Arbeit zu verunglimpfen und die Professionalität des MetaQuotes-Teams in Frage zu stellen. In diesem Fall werde ich eine entsprechende Beschwerde bei den Moderatoren dieses Bereichs einreichen, und ich habe ernsthafte Gründe zu glauben, dass der Konflikt zwischen mir und Ihnen zu meinen Gunsten gelöst wird.

Lassen Sie uns die Angelegenheit nicht zur offiziellen Klärung der Beziehungen bringen und einfach zu einer gütlichen Einigung kommen: Sie werden aufhören, in dem meinem Artikel gewidmeten Thread Informationen zu schreiben, die in keiner Weise mit dem hier behandelten Thema zusammenhängen, und aufhören, die von mir geleistete Arbeit zu verunglimpfen. Es wäre besser, wenn Sie überhaupt nichts mehr hier posten würden. Ich verstehe Ihren Standpunkt, Sie haben ihn auf den vorhergehenden Seiten zum Ausdruck gebracht. Ich bin nicht damit einverstanden, und Sie sind nicht mit meiner Meinung einverstanden. Ich denke, wir sind beide intelligente Menschen, und lassen Sie uns diese nutzlose Polemik beenden.

 
udmurt2:

Ich wünsche mir, dass die Leitung des Forums mehr auf die veröffentlichten Materialien achtet und eine strengere Kontrolle der Arbeiten der Autoren (nicht nur Artikel, sondern auch Codes) durchführt. Und nur um die Zahl der Veröffentlichungen aufzufüllen, sollte man nicht alles auf einmal nehmen. Damit es nicht so kommt wie bei Codebase in MQL4. Wirklich wertvolle Arbeiten ohne Analogien gehen hinter hunderten von 1.0 Beta-Versionen verloren.

+1

Ich denke, dass der Abschnitt "Artikel " sollte für die Verbraucher nützlich sein !!! Nadelektsya, nicht erschrecken und verwirren sie !

Und jetzt - "Chukcha ist ein Schriftsteller, Chukcha ist nicht ein Leser" .....

 

>>> Stellen Sie sich vor,Ihr einziger Expert Advisor handelt mehrere Dutzend Handelsstrategien, auf allen verfügbaren Instrumenten und auf allen möglichen Zeitrahmen gleichzeitig! Darüber hinaus ist dieser Expert Advisor im Tester perfekt getestet und ein oder mehrere Money-Management-Systeme sind für alle darin enthaltenen Strategien verfügbar.

Das ist genau die Art und Weise, wie mein Expert Advisor-Handel bei der Meisterschaft organisiert ist. Alles, wie es mir scheint, ist einfacher. Die Hauptsache ist, dass man alles richtig konzipiert und nicht alles auf einen Haufen wirft.

//+------------------------------------------------------------------+
//|Wachsamkeitsstufen.mq5 |
//| Copyright 2010, MetaQuotes Software Corp. | |
//|http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"

#include <Vigor\Strategy.mqh>

#include <Vigor\TradeSignal.mqh>
#include <Vigor\ADXMAStrategy.mqh>
#include <Vigor\ADXStrategy.mqh>
#include <Vigor\MAVSimpleStrategy.mqh>
#include <Vigor\Order.mqh>
#include <Vigor\Dispatcher.mqh>
#include <Vigor\AdaptiveStrategy.mqh>
CDispatcher dispatcher;

//+------------------------------------------------------------------+
//| Experteninitialisierungsfunktion|
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   int myTick = 60;
   EventSetTimer(myTick);
   dispatcher.tickSeconds = myTick;

  //-- Dispatcher-Objekt arbeitet mit Aufträgen, Strategie-Objekte 
// befassen sich nur mit Signalen und arbeiten nicht mit dem Markt

  //-- einfache handelsstrategien separat. erben der klasse CStrategy
 //-Strategien
   CMAVStrategy *s4 = new CMAVStrategy();
   s4.Symbol = "EURGBP";
   s4.onBars = true;
   s4.TimeFrame = PERIOD_M5;
   s4.HourStart = 7;
   s4.HourEnd = 18;
   s4.Risk = 0.1;
   s4.takeProfit = 2000;
   s4.stopLoss = 450;
   s4.trailingStop = 77;
   s4.lots = 0.1;
   s4.maxLots = 5;
  //-benutzerdefiniert;
   s4.period1 = 2;
   s4.max = 0.0025;
   s4.sensity = 0.39;
   s4.unsensity = 0.53;
   s4.init();
   dispatcher.strategies.Add(s4);



  //-Strategien
   CADXStrategy *s2 = new CADXStrategy();
   s2.Symbol = "GBPUSD";
   s2.onBars = true;
   s2.TimeFrame = PERIOD_M5;
   //s2.mHourStart = 0;
   //s2.mHourEnd = 24;
   s2.Risk = 0.13;
   s2.takeProfit = 2000;
   s2.stopLoss = 360;
   s2.trailingStop = 150;
   s2.lots = 0.1;
   s2.maxLots = 5;
  //-benutzerdefiniert
   s2.period = 17;
   s2.level = 0.0042;
   s2.init();
   dispatcher.strategies.Add(s2);

  //-etc.


  //-- adaptive Strategie, die in sich eine virtuelle 
//trade der verbundenen Liste enthält (wieder CStrategy Erben), 
//auch CStrategy Erben und für dispetcher'a gibt es keinen Unterschied.
   CAdaptiveStrategy *sadapt4 = new CAdaptiveStrategy();
   sadapt4.onBars = false;
   sadapt4.mRisk = 0.13;
   sadapt4.lots = 0.1;
   sadapt4.performance_variant = 2;
   sadapt4.maxLots = 5;
   sadapt4.init();
        
        // ***************************************** M30
        CADXStrategy *s_gbpjpy1 = new CADXStrategy();    s_gbpjpy1.Symbol = "GBPJPY";    s_gbpjpy1.onBars = true;    s_gbpjpy1.TimeFrame = PERIOD_M30;  s_gbpjpy1.takeProfit = 2000; s_gbpjpy1.trailingStop = 70; s_gbpjpy1.lots = 0.1; s_gbpjpy1.maxLots = 5; 
        s_gbpjpy1.stopLoss = 300;  s_gbpjpy1.init();
        sadapt4.strategies.Add(s_gbpjpy1); // alles in die adaptive Strategie aufnehmen
        // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
        //  и т.д.
        // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
        


  dispatcher.strategies.Add(sadapt4);


 // Füllen Sie es mit dem, was Sie wollen

  return(0);
  }
//+------------------------------------------------------------------+
//| Experten-Deinitialisierungsfunktion|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   EventKillTimer();
   
  }
//+------------------------------------------------------------------+
//| Experten-Tick-Funktion|
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   dispatcher.control();
  }
//+------------------------------------------------------------------+
 

Das von Ihnen angeführte Beispiel ist dem meinen sehr ähnlich. Es gibt weniger Unterschiede, als es den Anschein haben mag. Alles ist auch durch Klassen implementiert und jede Klasse-Strategie hat ihre eigenen unabhängigen Parameter. Der größte Unterschied liegt in ihrem Layout, in Ihrem Fall werden alle Strategien vom Dispatcher gehandhabt, in meinem werden sie in einer Liste vom Typ CObject gehandhabt. In der Tat ist mein Ansatz nicht viel komplizierter als Ihrer, wir sprechen nur über die gleichen Dinge, aber in einer anderen Sprache.

Ursprünglich wollte ich mit meinem Ansatz eine beliebige Kombination von drei "Multis" lösen: Multitimeframe, Multistrategy, Multitool. Jetzt sehe ich ihn als viel mehr als das. Im zweiten Teil denke ich daran, das Problem der Entscheidungen des Experten zu behandeln. Der Expert Advisor wird entscheiden, wie er handelt, was er handelt und wann er handelt. All dies ermöglicht meinen Ansatz. Wahrscheinlich auch Ihr Ansatz, und das ist gut so, denn mehrere Lösungen für ein und dieselbe Sache sind eine Entwicklung.

Übrigens, können Sie sich die Implementierung des Dispatchers selbst ansehen?

 
class CDispatcher {
   public:
      CTrade trade;
      CList strategies; 
      CList newOrders; 
      CList currentOrders;
      CList* strategiesResults;
      int repeats;
      int tickSeconds;
   private:
      ulong Magic;            
   public:
      void CDispatcher() {
          strategiesResults = new CList();
          repeats = 5;
          tickSeconds = 1;
      }
      void ~CDispatcher() {
        delete(strategiesResults);
      }
      
      void control();

      bool controlLimits();
      void controlOrders();
      bool controlOpen();
      bool controlClose();
      bool controlModify();      
      ulong ticketOpen(string smb, ENUM_ORDER_TYPE type,double lot,int SL,int TP);
      double countLotByRisk(CSymbolInfo *symbinfo, CStrategy *s, int dist, double risk, double lot, double maxlot);
       double NormalPrice(CSymbolInfo *symbinfo, double d);
      double NormalLot(CSymbolInfo *symbinfo, double lot);
      double BasePrice(CSymbolInfo *symbinfo, int dir);
      double ReversePrice(CSymbolInfo *symbinfo, int dir);
      double ReversType(ENUM_ORDER_TYPE type);
      double NormalTP(CSymbolInfo *symbinfo, int dir,double op,double pr,int TP,double stop);
      double NormalSL(CSymbolInfo *symbinfo, int dir,double op,double pr,int SL,double stop);
      void   checkDeals(CStrategy *s);
       ENUM_ORDER_TYPE getTypeByDirection(int dir);
       int getDirectionByType(ENUM_ORDER_TYPE type);
};
Ich werde die Umsetzung nicht veröffentlichen. Hier ist alles klar. Strategien sind alle Abkömmlinge von CObject. Aber sie werden vom Dispatcher verarbeitet. Wir müssen von einfach zu komplex übergehen. Eine einfache Schnittstelle von Objekten, für einen externen Beobachter, sollte alle Details der Implementierung verbergen. Ich möchte nur sagen, dass es überhaupt nichts Außergewöhnliches an Multis gibt. Mit OOP und Polymorphismus ist alles ganz einfach.
 
Vigor:
Ich werde die Umsetzung nicht veröffentlichen. Hier ist alles klar. Strategien sind alle Abkömmlinge von CObject. Aber sie werden vom Dispatcher verarbeitet. Wir müssen von einfach zu komplex übergehen. Eine einfache Schnittstelle von Objekten, für einen externen Beobachter, sollte alle Details der Implementierung verbergen. Ich möchte nur sagen, dass es in Multis überhaupt nichts Außergewöhnliches gibt. Mit OOP und Polymorphismus ist alles ganz einfach.
+1. Ich stimme vollkommen zu. Und im Allgemeinen möchte ich sagen, dass mein Ansatz wie zwei Wassertropfen ähnlich dem Ihren ist. Strategien sind alle Nachkommen der Basisstrategie CModel, die wiederum ein Nachkomme von CObject ist. Genau wie bei Ihnen wird alles dynamisch initialisiert und in einer Liste abgelegt. Genau wie Sie habe ich eine einfache Objektschnittstelle implementiert, die alle Implementierungsdetails verbirgt. Eine andere Sache ist, dass ich die gesamte Implementierung in dem Artikel beschreiben musste, und deshalb dachten viele Leute, es sei kompliziert. Aber um Objekte meines Typs zu verwenden, muss man nicht einmal wissen, wie das Ganze im Inneren funktioniert.
 

Vasily, vielen Dank für den Artikel! Ich habe ihn in einem Schwung gelesen! Es fiel mir sehr leicht, ich schätze, ich bin reif für diese Art von Material. Wie viele Händler habe ich über einige der in dem Artikel behandelten Themen nachgedacht. Einige davon habe ich gelöst, andere nicht. Und einige waren nur in Form einer vagen Idee vorhanden. Und es war sehr angenehm und unerwartet, alles in einer so systematischen Darstellung zu sehen.

Der Umfang der gelösten Probleme und darüber hinaus der Perspektiven ist enorm. Nicht jeder "Geist" ist auch nur reif genug, um sie aufzuwerfen, geschweige denn, sie zu lösen. Dies ist der Grund für Kommentare im Stil von Krylows Fabel "Der Fuchs und die Trauben", denn "das Auge sieht zwar das Auge, aber der Zahn kennt den Zahn nicht". Und der Wunsch nach Selbstbehauptung ist unbezähmbar, also kommentieren sie und hoffen, dass andere denken: "Ah, das Moos, ich weiß, sie ist stark genug, um den Elefanten anzubellen!" :) Es lohnt sich nicht einmal, ihm Aufmerksamkeit zu schenken.

Macht weiter so, wir freuen uns auf die Fortsetzung!

P.S. Auch wenn Sie noch nicht mit MetaTrader 5 im echten Leben arbeiten können, können Sie den Artikel "Kopieren des Handels von MetaTrader 5 nach MetaTrader 4" verwenden. Es ist eine sehr sinnvolle, bewährte Sache! Alles ist also sehr relevant und kann im heutigen Handel verwendet werden!

 

......
Warum lobt der Kuckuck den Hahn, ohne Angst vor Sünde,
?

 

Es ist besser, zu Recht gelobt zu werden als ungerechtfertigt abgestempelt.