Interessante presa di posizione sull'OLP - pagina 3

 
Alexandr Andreev:

) può essere fatto anche in linguaggio assembly. La questione è dove è più facile.

E non mettetemi da una parte o dall'altra.... Non sono un fanatico di una cosa o dell'altra.

Nessuno lo è. Sto solo dicendo che al giorno d'oggi le caratteristiche OP sono disponibili nei moderni linguaggi OOP, così come le caratteristiche OOP nei linguaggi multi-paradigma. Inoltre, molte caratteristiche della FP presentate come qualcosa di speciale e sorprendente, in realtà, sono le stesse uova di profilo. Sono stati in giro per molto tempo - come le chiusure in Pascal o l'esecuzione ritardata di una funzione in C dove viene passato un puntatore al posto del risultato. Ciò che nell'esempio dell'articolo è dato in qualsiasi lingua non funziona quasi ovunque tranne che in js (tranne forse in Python ancora).

 
fxsaber:

Non sono bravo in OOP. Ma uso cose primitive da esso. Nel recente passato, ho pubblicato del codice molto semplice.


Ho iniziato a scriverlo in FP, quando non capivo cosa avrei finito per guardare.

Finito attraverso gli elementi primitivi di OOP. Probabilmente ho perso le capacità di FP, ma qui OOP sembrava molto più semplice e più leggibile.


Il codice è molto semplice e breve(descrizione). Se lo scrivi in FP, sarebbe interessante confrontarlo.

Il codice è molto più piccolo di quello spesso postato qui, è meglio mostrarlo qui, è buono per scopi educativi

Vorrei che Dmitry Fedoseyev scrivesse la sua versione, e poi Expert lo trollerà con la sua)
 
fxsaber:

Non sono bravo in OOP. Ma uso cose primitive da esso. Nel recente passato, ho pubblicato del codice molto semplice.


Ho iniziato a scriverlo in FP, quando non capivo cosa avrei finito per guardare.

Finito attraverso gli elementi primitivi di OOP. Probabilmente ho perso le capacità di FP, ma qui OOP sembrava molto più semplice e più leggibile.


Il codice è molto semplice e breve(descrizione). Se lo scrivi in FP, sarebbe interessante confrontarlo.

Darò un'occhiata alla calcolatrice appena mi libero. E tu sei un telepate, stavo per chiedere in un altro thread, ma chiederò qui, dalla tua esperienza di debug in "modalità reale" - ci sono possibili "buchi" nei dati T_OHLC_V in MT4 e in MT5?

Cioè è possibile che dopo un qualsiasi rallentamento (errore di connessione, il terminale si blocca, il sistema si blocca), i nuovi dati saranno inizialmente con qualche salto, e poi il salto/"buco" sarà scritto all'interno dell'array? Naturalmente, scriverò il mio rivelatore per gli indicatori e gli EA, ma forse tu hai già esperienza di tali test e non devo preoccuparmi.

E non ho esperienza di FP (o hanno, ma non sapeva circa il nome), l'automatico dove fare riferimento? ), penso di accontentarmi del paradigma procedurale.

zy. richiesta richiesta)

 
Aleksey Mavrin:

Strano articolo. OOP non differisce dallo stile procedurale in peggio, perché in esso si può fare tutto in stile procedurale di default, e viceversa senza un terribile bloat di codice, cioè OOP è una "sovrastruttura sopra", non uno stile fondamentalmente diverso.

Se l'articolo riguarda davvero il funzionale piuttosto che il procedurale (il che non è così ovvio se ci si sofferma), allora perché confrontare cose che hanno usi completamente diversi.

Topeka starter, tu stesso stai scrivendo e ora parli di quale? funzionale o procedurale?

Con l'avvento dell'OOP mi ha davvero spaventato con le incapsulazioni e l'ereditarietà e altri morfismi che sono popolari per iniziare un'introduzione all'OOP. Scriverebbero semplicemente quei dati insieme alle funzioni in un blocco - una classe. Ma poi mi sono abituato a questa moda: inventare ogni volta una nuova terminologia. Quando ho bisogno di OOP - nessun problema, ma dato che, a mio modesto parere, è due volte più vorace e più lento della variante procedurale, faccio al massimo con quella procedurale.

E la domanda è sorta, perché volevo sentire opinioni su FP e altre varianti, diverse da OOP e procedurali, forse qualcuno ha un'esperienza super positiva. E credo che sia saggio usare un mix stabile nel funzionamento e non essere un fanatico.

 
Peter, ricollega il tuo nome.
 
Fast235:

Il codice è molto più piccolo di quelli spesso postati qui, è meglio distribuirlo qui, per scopi educativi.

Un gioco da ragazzi.

#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);
}

Tecnicamente, è probabilmente un OOP. Ma è la sua parte più primitiva. Tuttavia, non potrei farlo senza. Probabilmente, il mio cervello si è riorganizzato in qualcos'altro e lo sto rivangando.

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

Peter ahahahah smettila.

Il mio approccio, il secchio è una pentola

è da un po' che non lo vedo...

È davvero andato sotto un altro nome di schermo?

 
Maxim Kuznetsov:

Non lo vedo da un po'...

è davvero andato sotto un altro nome di schermo?

si dice che sia andato a costruire una forte IA

 
Maxim Dmitrievsky:

si dice che sia andato a creare una forte IA

Basta che non succeda niente, o COVID non dormirà...