Interesante visión de la OLP - página 3

 
Alexandr Andreev:

) también puede hacerse en lenguaje ensamblador. La cuestión es dónde es más fácil.

Y no me pongas a un lado o al otro.... No soy partidario de una u otra cosa.

Nadie lo es. Sólo digo que hoy en día las características OP están disponibles en los lenguajes OOP modernos, así como las características OOP en los lenguajes multiparadigma. Además, muchas características de la FP, presentadas como algo especial y sorprendente, en realidad, son los mismos huevos de perfil. Existen desde hace mucho tiempo, como los cierres en Pascal o la ejecución retardada de una función en C, a la que se pasa un puntero en lugar del resultado. Lo que en el ejemplo del artículo se da en cualquier lenguaje no funciona en casi ningún sitio excepto en js (excepto quizás en Python todavía).

 
fxsaber:

No soy bueno en OOP. Pero sí uso cosas primitivas de ella. En el pasado reciente, publiqué un código muy simple.


Empezó a escribirlo en FP, cuando no entendía lo que acabaría viendo.

Acabado a través de los elementos primitivos de la OOP. Probablemente perdí las habilidades de FP, pero aquí OOP parecía mucho más simple y más legible.


El código es muy simple y corto(descripción). Si lo escribes en FP, sería interesante comparar.

El código es mucho más pequeño que el que se suele publicar aquí, es mejor que lo muestre aquí, es bueno para fines educativos

Me gustaría que Dmitry Fedoseyev escribiera su versión, y luego Expert lo trolleará con la suya)
 
fxsaber:

No soy bueno en OOP. Pero sí uso cosas primitivas de ella. En el pasado reciente, publiqué un código muy simple.


Empezó a escribirlo en FP, cuando no entendía lo que acabaría viendo.

Acabado a través de los elementos primitivos de la OOP. Probablemente perdí las habilidades de FP, pero aquí OOP parecía mucho más simple y más legible.


El código es muy simple y corto(descripción). Si lo escribes en FP, sería interesante comparar.

Echaré un vistazo a la calculadora en cuanto esté libre. Y tú eres un telépata, lo iba a preguntar en otro hilo, pero lo preguntaré aquí, por tu experiencia de depuración en "modo real" - ¿hay posibles "agujeros" en los datos T_OHLC_V en MT4 y en MT5?

Es decir, ¿es posible que después de cualquier retraso (interrupción de la conexión, el terminal se cuelga, el sistema se cuelga), los nuevos datos se reciban con un hueco al principio, y luego el hueco/"agujero" se inserte en una matriz? Por supuesto, voy a escribir mi propio detector para los indicadores y EAs, pero tal vez usted ya tiene esa experiencia de las pruebas y no tengo que preocuparse por ello.

Y no tengo experiencia de FP (o tienen, pero no sabía sobre el nombre), el automático donde se refieren? ), creo que me conformo con el paradigma procedimental.

zy. solicitud solicitud)

 
Aleksey Mavrin:

Artículo extraño. La POO no se diferencia del estilo procedimental para mal, porque en ella se puede hacer todo en estilo procedimental por defecto, y viceversa sin que se produzca un terrible hinchamiento de código, es decir, la POO es una "superestructura por encima", no un estilo fundamentalmente diferente.

Si el artículo trata realmente de lo funcional y no de lo procedimental (lo cual no es tan obvio si lo eliges), entonces por qué comparar cosas que tienen usos completamente diferentes.

Topeka starter, ¿escribe usted mismo y ahora habla de cuál? ¿funcional o procesal?

Con la llegada de la POO me asustó mucho con las encapsulaciones y la herencia y otros morfismos que son populares para empezar una introducción a la POO. Simplemente escribirían esos datos junto con las funciones en un bloque: una clase. Pero luego me acostumbré a esta moda: inventar una nueva terminología cada vez. Cuando necesito OOP - no hay problema, pero como, en mi humilde opinión, es el doble de voraz y más lento que la variante procedimental, como mucho me apaño con la procedimental.

Y la pregunta surgió, porque quería escuchar opiniones sobre FP y otras variantes, además de OOP y procedimental, tal vez alguien tenga una experiencia súper positiva. Y supongo que es prudente utilizar alguna mezcla estable en funcionamiento y no ser un fanático.

 
Peter, vuelve a enlazar tu nombre.
 
Fast235:

El código es mucho más pequeño que los que se suelen publicar aquí, es mejor que lo despliegues aquí, con fines educativos.

Es un juego de niños.

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

Técnicamente, es probable que sea un OOP. Pero es su parte más primitiva. Sin embargo, no podría hacerlo sin él. Probablemente, mi cerebro se ha reorganizado en otra cosa y lo estoy remachando.

 

Peter ahahahah para.

Mi enfoque, el cubo es una olla

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

Peter ahahahah para.

Mi enfoque, el cubo es una olla

Hace tiempo que no lo veo...

¿Realmente se puso otro nombre de usuario?

 
Maxim Kuznetsov:

Hace tiempo que no lo veo...

¿realmente se puso otro nombre de usuario?

se rumorea que ha ido a construir una fuerte IA

 
Maxim Dmitrievsky:

se rumorea que ha ido a crear una fuerte IA

No dejes que pase nada, o COVID no dormirá...