Preguntas de POO (Programación Orientada a Objetos)

 

Hola a todos.

Creo que es el momento de crear este hilo, porque no hay una buena formación en POO en ningún sitio, pero necesitamos y queremos aprender.

Para ensuciar la rama "preguntas de los novatos" con ejemplos de código más complicados y no comprensibles para los novatos, probablemente no sea necesario.

Después de haber leído los dos artículos "Los fundamentos de la programación orientada a objetos yla POO en MQL5 por ejemplo: manejo de códigos de error y advertencia", he escrito un código de ejemplo que me gustaría explicar en detalle.

He escrito un código de ejemplo y quiero estudiarlo en detalle. También te sugiero que publiques tus propios códigos y los discutamos juntos.

Estoy interesado en lo siguiente:

  • ¿Es correcto este código?
  • ¿Cómo mejorar el código?
  • ¿Cómo acelerar el código?
Mi código para abrir pedidos:

#property strict
input int Slip=30;
input int Magic=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
class vr_trade
  {
private:
   int               openorders(string sy,int typ,double lot,double price);
   string            tip(int typ);
public:
   int               Buy(string sy,double lot);
   int               Sel(string sy,double lot);
   int               BuyLimit(string sy,double lot, double price);
   int               SelLimit(string sy,double lot, double price);
   int               BuyStop(string sy,double lot, double price);
   int               SelStop(string sy,double lot, double price);
                     vr_trade(){}
                    ~vr_trade(){}
  };
MqlTick st;
vr_trade trade;
//+------------------------------------------------------------------+
void OnTick()
  {
trade.Buy("EURUSD",0.01); // Пример открытия позиции возвращающей тиккет ордера.
  }
//+------------------------------------------------------------------+  
int vr_trade :: Buy(string sy,double lot)
{
return openorders(sy,0,lot);
}
//+------------------------------------------------------------------+  
int vr_trade :: Sel(string sy,double lot)
{
return openorders(sy,1,lot);
}
//+------------------------------------------------------------------+  
int vr_trade :: BuyLimit(string sy,double lot, double price)
{
return openorders(sy,2,lot,price);
}
//+------------------------------------------------------------------+  
int vr_trade :: SelLimit(string sy,double lot, double price)
{
return openorders(sy,3,lot,price);
}
//+------------------------------------------------------------------+  
int vr_trade :: BuyStop(string sy,double lot, double price)
{
return openorders(sy,4,lot,price);
}
//+------------------------------------------------------------------+  
int vr_trade :: SelStop(string sy,double lot, double price)
{
return openorders(sy,5,lot,price);
}
//+------------------------------------------------------------------+
int vr_trade :: openorders(string sy="",int typ=0,double lot=0,double price=0)
  {
   int tik=-2;
   double di=NormalizeDouble(500*_Point,_Digits);
   if(sy==""){sy=_Symbol;Print("Установлен символ текущего графика ",sy);}
   if(lot<MarketInfo(sy,MODE_MINLOT)){lot=MarketInfo(sy,MODE_MINLOT); Print("Советник скорректировал лот ",lot);}
   if(!SymbolInfoTick(sy,st))Print("Не удалось прогрузить цены для символа ",sy);
   if(price==0)
     {
      if(typ==0)price=st.ask;
      if(typ==1)price=st.bid;
      if(typ==2)price=st.ask-di;
      if(typ==3)price=st.bid+di;
      if(typ==4)price=st.ask+di;
      if(typ==5)price=st.bid-di;
     }
   if(IsTradeAllowed()==true)
     {
      RefreshRates();
      tik=OrderSend(sy,typ,lot,price,Slip,0,0,"",Magic,0,clrRed);
      if(tik>0)Print("Успешно открыт ордер Ticket ",tik," Typ ",tip(typ)," Symbol ",sy," Lot ",lot," Price ",price);
      else Print("Ошибка открытия ордера N",GetLastError());
     }
   else
      Print("Торговый поток занят");
   return tik;
  }
//+------------------------------------------------------------------+
string vr_trade :: tip(int typ)
  {
   string txt="";
   switch(typ)
     {
      case 0: txt="BUY";        break;
      case 1: txt="SELL";       break;
      case 2: txt="BUY LIMIT";  break;
      case 3: txt="SELL LIMIT"; break;
      case 4: txt="BUY STOP";   break;
      case 5: txt="SELL STOP";  break;
      default : txt="Ошибка типа ордера";
     }
   return txt;
  }
//+------------------------------------------------------------------+
 
¿Así que la POO es sólo una función para meter en una clase? Productivo, probablemente será divertido en el foro pronto.
 
VOLDEMAR:


  • ¿Es correcto el código?
  • ¿Cómo mejorar el código?
  • ¿Cómo acelerar el código?


¿Qué quiere decir con correcto o incorrecto? Si funciona correctamente, está bien. Si no funciona, está mal.

Mejorar. Mejorar cuando algo no satisface una necesidad. Las necesidades que no satisface, entonces hay que mejorarlas en este sentido.

¿Por qué acelerar? Las órdenes no se abren tan a menudo, incluso raramente en comparación con el número total de ticks en el probador.

Pero eso era filosofía.

La práctica. ¿Por qué necesitamos esta clase si existe una gran clase estándar? Es cierto, es para MT5 y no sé si está disponible para MT4. ¿No tienes uno?

Hay una desventaja en su código - ausencia de Stop Loss y Take Profit.

 
TheXpert:
¿Así que la POO es sólo una función para meter en una clase? Productivo, va a ser divertido en el foro pronto.

Si eres tan inteligente, entonces escribe de la manera correcta, el tema no fue creado para el sarcasmo ....
 
VOLDEMAR:

Si eres tan inteligente entonces escribe de la manera correcta, el tema no es para el sarcasmo ....


Depende de lo que quieras, de lo que necesites y de tu estilo de programación.

Puedes hacer una clase como un conjunto de funciones con parámetros, como en tu caso.

Se pueden hacer métodos para establecer parámetros, y abrir directamente la orden llamando al método sin parámetros.

Sería mejor cuando es más simple - en este caso, será más aplicable en diferentes casos. Intentar hacer algo superperfectamente universal es el sueño de un idiota, una pérdida de tiempo y esfuerzo mental.

Más. Hasta que no hayas tenido que resolver el mismo problema 20 veces, mejor no intentes crear un enfoque universal.

 
Integer:


¿Qué significa correcto o incorrecto? Si funciona correctamente, está bien. Si no funciona, está mal.

Mejorar. Hay que mejorar cuando algo no satisface una necesidad. Qué necesidades no están cubiertas, en esa dirección para mejorar.

¿Por qué acelerar? Las órdenes no se abren tan a menudo, incluso raramente en comparación con el número total de ticks en el probador.

Pero eso era filosofía.

La práctica. ¿Por qué necesitamos esta clase si existe una gran clase estándar? Es cierto, es para MT5 y no sé si está disponible para MT4. ¿No tienes uno?

Hay una desventaja en su código - ausencia de Stop Loss y Take Profit.


Los Stop Loss y las retiradas de las órdenes se establecen por separado, ya que podemos no saber con qué tipo de cuenta vamos a trabajar ....
 
Integer:

Puede hacer métodos para establecer parámetros, y abrir directamente una orden llamando a un método sin parámetros.

¿Puede demostrarlo con mi ejemplo?

 

No tengo ganas de codificar. En fin... En la sección privada declare las variables para los valores de Stop Loss, Take Profit y el lote. Estas variables se utilizan en los métodos de apertura de pedidos, por supuesto, el lote es como es y los niveles de precios se calculan utilizando estas variables. Pero hay que establecer valores para estas variables. Esto significa que necesitamos métodos como: SetTakeProfit(int Value), SetStopLoss(int Value), SetLots(double Value).

En la mayoría de los EAs, los métodos SetTakeProfit(int Value), SetStopLoss(int Value), SetLots(double Value) sólo necesitarán ser llamados una vez en el inite. La llamada de métodos para abrir órdenes sin parámetros acelera enormemente el tiempo de ejecución.

 
VOLDEMAR:
Si eres tan inteligente, escríbelo correctamente, el tema no fue creado para el sarcasmo ....
No arrastre OOP en lugares donde no es necesario. La mera presencia de objetos no hace que el código sea más rápido, más eficiente, etc.
 

Como siempre, quería aprender, pero seguro que hay quien no tiene nada más que decir que ser inteligente...

Escribí un simple ejemplo para desmontarlo, no sé cómo escribir más competentemente con OOP ... Es sólo un ejemplo, si usted sabe cómo escribir un código similar correctamente y OOP entonces por favor escriba, para que yo y otros puedan aprender ...

 
VOLDEMAR:

Como siempre, quería aprender, pero seguro que hay quien no tiene nada más que decir que ser inteligente...

Escribí un simple ejemplo para desmontarlo, no sé cómo escribir más competentemente con OOP ... Es sólo un ejemplo, si usted sabe cómo escribir un código correctamente y OOP entonces por favor escriba, para que yo y otros puedan aprender ...


No me hagas caso.

* * *

Hay que procurar que los métodos principales y los más utilizados se llamen sin pasar ningún parámetro. Esto aumentaría el rendimiento. Pero reducirá la usabilidad.