Interessante Sicht auf die PLO - Seite 3

 
Alexandr Andreev:

) kann auch in Assembler durchgeführt werden. Die Frage ist, wo es einfacher ist.

Und stellen Sie mich nicht auf die eine oder andere Seite.... Ich bin kein Verfechter der einen oder anderen Sache.

Keiner ist es. Ich will damit nur sagen, dass heutzutage OP-Funktionen in modernen OOP-Sprachen verfügbar sind, ebenso wie OOP-Funktionen in Multi-Paradigmen-Sprachen. Darüber hinaus sind viele Merkmale von FP, die als etwas Besonderes und Erstaunliches dargestellt werden, in Wirklichkeit die gleichen Eier im Profil. Es gibt sie schon lange - wie Closures in Pascal oder die verzögerte Ausführung einer Funktion in C, bei der ein Zeiger anstelle des Ergebnisses übergeben wird. Was in dem Beispiel in dem Artikel in einer beliebigen Sprache angegeben ist, funktioniert fast nirgendwo außer in js (außer vielleicht noch in Python).

 
fxsaber:

Ich bin nicht gut in OOP. Aber ich verwende primitive Dinge daraus. In der jüngsten Vergangenheit habe ich einen sehr einfachen Code veröffentlicht.


Ich begann mit dem Schreiben in FP, als ich noch nicht wusste, was ich am Ende sehen würde.

Abgeschlossen durch die primitiven Elemente der OOP. Wahrscheinlich verloren FP Fähigkeiten, aber hier OOP schien viel einfacher und lesbarer.


Der Code ist sehr einfach und kurz(Beschreibung). Wenn Sie es in FP schreiben, wäre es interessant zu vergleichen.

Der Code ist viel kleiner als der, der hier oft gepostet wird, Sie sollten ihn besser hier anzeigen, er ist gut für Lehrzwecke

Ich möchte, dass Dmitry Fedoseyev seine Version schreibt, und dann wird Expert ihn mit seiner trollen)
 
fxsaber:

Ich bin nicht gut in OOP. Aber ich verwende primitive Dinge daraus. In der jüngsten Vergangenheit habe ich einige sehr einfache Codes veröffentlicht.


Ich begann mit dem Schreiben in FP, als ich noch nicht wusste, was ich am Ende sehen würde.

Abgeschlossen durch die primitiven Elemente der OOP. Wahrscheinlich verloren FP Fähigkeiten, aber hier OOP schien viel einfacher und lesbarer.


Der Code ist sehr einfach und kurz(Beschreibung). Wenn Sie es in FP schreiben, wäre es interessant zu vergleichen.

Ich werde mir den Rechner ansehen, sobald ich Zeit habe. Und Sie sind ein Telepath, ich war im Begriff, in einem anderen Thread zu fragen, aber ich werde hier fragen, durch Ihre Erfahrung der Fehlersuche in "Real-Modus" - gibt es mögliche "Löcher" in T_OHLC_V Daten in MT4 und in MT5?

D.h. ist es möglich, dass nach einem Durchhänger (Verbindungsfehler, das Terminal hängt sich auf, das System hängt sich auf), die neuen Daten anfänglich mit einem Skip versehen werden, und dann wird der Skip/das "Loch" in das Array geschrieben? Natürlich werde ich meinen eigenen Detektor für Indikatoren und EAs schreiben, aber vielleicht haben Sie bereits Erfahrung mit solchen Tests und ich muss mich nicht darum kümmern.

Und ich habe keine Erfahrung mit FP (oder haben, aber nicht wissen, über den Namen), die automatische wo zu beziehen? ), denke ich, dass ich mit dem verfahrenstechnischen Paradigma zurechtkomme.

zy. Anfrage Anfrage)

 
Aleksey Mavrin:

Seltsamer Artikel. OOP unterscheidet sich nicht zum Schlechteren vom prozeduralen Stil, weil man damit standardmäßig alles im prozeduralen Stil machen kann und umgekehrt, ohne dass der Code furchtbar aufgebläht wird, d.h. OOP ist ein "Überbau", kein grundlegend anderer Stil.

Wenn es in dem Artikel wirklich um funktionale und nicht um verfahrenstechnische Aspekte geht (was nicht so offensichtlich ist, wenn man darauf herumhackt), warum sollte man dann Dinge vergleichen, die völlig unterschiedliche Verwendungszwecke haben.

Topeka starter, schreiben Sie selbst und reden jetzt über welches? funktional oder prozessual?

Mit dem Aufkommen von OOP haben mich Kapselungen, Vererbung und andere Morphismen, mit denen man gerne eine Einführung in OOP beginnt, wirklich abgeschreckt. Sie würden einfach diese Daten zusammen mit Funktionen in einen Block - eine Klasse - schreiben. Aber dann habe ich mich daran gewöhnt, jedes Mal eine neue Terminologie zu erfinden. Wenn ich OOP brauche - kein Problem, aber da es meiner bescheidenen Meinung nach doppelt so gefräßig und langsamer ist als die prozedurale Variante, begnüge ich mich mit der prozeduralen Variante.

Und die Frage kam auf, weil ich Meinungen über FP und andere Varianten, neben OOP und prozedural, hören wollte, vielleicht hat jemand eine super positive Erfahrung. Und ich denke, es ist ratsam, eine stabile Mischung zu verwenden und nicht zu fanatisch zu sein.

 
Peter, verlinken Sie Ihren Namen erneut.
 
Fast235:

Der Code ist viel kleiner als die, die hier oft gepostet werden, Sie sollten ihn besser hier einsetzen, zu Lehrzwecken.

Ein Kinderspiel.

#property strict
#property script_show_inputs

input double inPerformance = 100; // Сколько процентов дает система за период
input double inGift = 50;         // Награда управляющего в процентах (< 100)
input int inN = 12;               // Сколько расчетных периодов

struct BASE
{
  double Investor;
  double Manager;
  double Summary;

  // Если управляющий снимает деньги в конце каждого расчетного периода.
  void Set1( const double Performance, const double Gift, const int N )
  {
    this.Investor = ::MathPow(1 + (Performance - 1)* (1 - Gift), N);
    this.Manager = (this.Investor - 1) * Gift / (1 - Gift);
    this.Summary = this.Investor + this.Manager;

    return;
  }

  // Если ничего не делалось в расчетные периоды.
  void Set2( const double Performance, const double Gift, const int N )
  {
    this.Summary = ::MathPow(Performance, N);
    this.Manager = (this.Summary - 1) * Gift;
    this.Investor = this.Summary - this.Manager;

    return;
  }

  // Если управляющий снимает деньги в конце каждого расчетного периода и реинвестирует их.
  void Set3( const double Performance, const double Gift, const int N )
  {
    this.Summary = ::MathPow(Performance, N);
    this.Investor = ::MathPow(1 + (Performance - 1)* (1 - Gift), N);
    this.Manager = this.Summary - this.Investor;

    return;
  }

  void operator *=( const double Deposit = 1 )
  {
    this.Investor *= Deposit;
    this.Manager *= Deposit;
    this.Summary *= Deposit;

    return;
  }
#define  TOSTRING(A) #A + " = " + ::DoubleToString(A, 4) + " "
  string ToString( const bool FlagName = true ) const
  {
    return(FlagName ? TOSTRING(Investor) + TOSTRING(Manager) + TOSTRING(Summary)
                    : ::StringFormat("||%-12.4f||%-12.4f||%-12.4f||", this.Investor, this.Manager, this.Summary));
  }
#undef  TOSTRING

};

struct PAMM
{
  double Performance; // Доходность за расчетный период
  double Gift;        // Вознагражение управляющего.
  int N;              // Сколько расчетных периодов.

  BASE Base1; // Если управляющий снимает деньги в конце каждого расчетного периода.
  BASE Base2; // Если ничего не делалось в расчетные периоды.
  BASE Base3; // Если управляющий снимает деньги в конце каждого расчетного периода и реинвестирует их.

  void Set( const double dPerformance, const double dGift, const int iN )
  {
    this.Performance = dPerformance;
    this.Gift = dGift;
    this.N = iN;

    this.Base1.Set1(1 + this.Performance / 100, this.Gift / 100, this.N);
    this.Base2.Set2(1 + this.Performance / 100, this.Gift / 100, this.N);
    this.Base3.Set3(1 + this.Performance / 100, this.Gift / 100, this.N);
  }

  void operator *=( const double Deposit = 1 )
  {
    this.Base1 *= Deposit;
    this.Base2 *= Deposit;
    this.Base3 *= Deposit;

    return;
  }

  string GetDescription( void ) const
  {
    return("Доходность за расчетный период " + ::DoubleToString(this.Performance, 1) + "%\n" +
           "Вознагражение управляющего " + ::DoubleToString(this.Gift, 1) + "%\n" +
           "Количество расчетных периодов. " + (string)this.N);
  }

  string ToString( const bool FlagName = true, const bool FlagDescription = true ) const
  {
    return(FlagDescription ? "Данные для инвестиционного счета со следующими характеристиками:\n\n" + this.GetDescription() +
                             "\n\nКонечный результат для Инвестора, Управляющего и Суммарно:"
                             "\n\nЕсли управляющий снимает деньги в конце каждого расчетного периода (1).\n" + this.Base1.ToString(FlagName) +
                             "\n\nЕсли ничего не делалось в расчетные периоды (2).\n" + this.Base2.ToString(FlagName) +
                             "\n\nЕсли управляющий снимает деньги в конце каждого расчетного периода и реинвестирует их (3).\n" + this.Base3.ToString(FlagName)
                           : this.Base1.ToString(FlagName) + this.Base2.ToString(FlagName) + this.Base3.ToString(FlagName));
  }
};

void OnStart()
{
  PAMM Pamm;

  Pamm.Set(inPerformance, inGift, inN);

  Print(Pamm.ToString());

  string Str = Pamm.GetDescription() + "\n   ";

  for (int i = 1; i <= 3; i++ )
    Str += ::StringFormat("||%-12s||%-12s||%-12s||", "Investor" + (string)i, "Manager" + (string)i, "Summary" + (string)i);

  for (int i = 1; i <= inN; i++ )
  {
    Pamm.Set(inPerformance, inGift, i);

    Str += StringFormat("\n%-2d:", i) + Pamm.ToString(false, false);
  }

  Print(Str);
}

Technisch gesehen ist es wahrscheinlich ein OOP. Aber es ist sein primitivster Teil. Aber ich könnte es nicht ohne sie tun. Wahrscheinlich, dumme Gehirnumstellung und Nieten und dergleichen.

 

Peter ahahahah hör auf.

Mein Ansatz, der Eimer ist ein Topf

Мой подход. Ядро - Движок.
Мой подход. Ядро - Движок.
  • 2018.12.05
  • www.mql5.com
В этой ветке, я хочу рассказать о своем подходе в программировании. Заранее предупреждаю, - здесь не будет обсуждений GUI...
 
Maxim Dmitrievsky:

Peter ahahahah hör auf.

Mein Ansatz, der Eimer ist ein Topf

Es ist eine Weile her, dass ich ihn gesehen habe...

Hat er wirklich einen anderen Benutzernamen verwendet?

 
Maxim Kuznetsov:

Ich habe ihn schon lange nicht mehr gesehen...

Hat er wirklich einen anderen Benutzernamen angenommen?

Man munkelt, dass er eine starke KI aufbauen will.

 
Maxim Dmitrievsky:

Gerüchten zufolge hat er sich auf den Weg gemacht, um eine starke KI zu schaffen.

Es darf nur nichts passieren, sonst schläft COVID nicht...