Perguntas OOP (Object Oriented Programming)

 

Olá a todos!

Acho que é hora de criar esta linha, porque não há um bom treinamento OOP em nenhum lugar, mas nós precisamos e queremos aprender.

Para eliminar o ramo "perguntas de novatos" com exemplos de códigos mais complicados e não compreensíveis para os novatos, provavelmente não é necessário.

Tendo lido os dois artigos "The Basics of Object Oriented Programming andOOP in MQL5 by Example: Error and Warning Code Handling", escrevi um exemplo de código que gostaria de explicar em detalhes.

Escrevi um código de amostra e quero estudá-lo em detalhes. Também sugiro que você publique seus próprios códigos e os discuta juntos.

Estou interessado no seguinte:

  • Este código está correto?
  • Como melhorar o código?
  • Como acelerar o código?
Meu 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;
  }
//+------------------------------------------------------------------+
 
Então o OOP é apenas uma função para se encaixar em uma classe? Produtivo, vai ser divertido no fórum em breve.
 
VOLDEMAR:


  • O código está correto?
  • Como melhorar o código ?
  • Como acelerar o código?


O que você quer dizer com certo ou errado? Se funcionar corretamente, está certo. Se não funciona, é errado.

Melhorar. Melhorar quando algo não satisfaz uma necessidade. O que não atende às suas necessidades, então você deve melhorá-lo nesta direção.

Por que acelerar? As ordens não abrem com tanta freqüência, mesmo raramente comparado ao número total de carrapatos no testador.

Mas isso era filosofia.

Prática. Por que precisamos desta classe se existe uma grande classe padrão? É verdade, é para o MT5 e não sei se ele está disponível para o MT4. Você não tem um?

Há uma desvantagem em seu código - ausência de Stop Loss e Take Profit.

 
TheXpert:
Então o OOP é apenas uma função para se encaixar em uma classe? Produtivo, vai ser divertido no fórum em breve.

Se você é tão inteligente, então escreva da maneira correta, o tópico não foi criado para sarcasmo ....
 
VOLDEMAR:

Se você é tão inteligente, então escreva da maneira correta, o tópico não é para sarcasmo ....


Depende do que você quer, do que precisa e de qual é seu estilo de programação.

Você pode fazer uma classe como um conjunto de funções com parâmetros, como no seu caso.

Você pode fazer métodos para definir parâmetros, e abrir diretamente a ordem, chamando o método sem parâmetros.

Seria melhor quando fosse mais simples - neste caso, será mais aplicável em casos diferentes. Tentar fazer algo super-perfeitamente universal é o sonho de um idiota, uma perda de tempo e de esforço mental.

Mais. Até que você tenha tido que resolver o mesmo problema 20 vezes, é melhor não tentar criar uma abordagem universal.

 
Integer:


O que isso significa certo ou errado? Se funcionar corretamente, está certo. Se não funciona, é errado.

Melhorar. Você deve melhorar quando algo não atende a uma necessidade. As necessidades não são atendidas, nessa direção, para melhorar.

Por que acelerar? As ordens não abrem com tanta freqüência, mesmo raramente comparado ao número total de carrapatos no testador.

Mas isso era filosofia.

Prática. Por que precisamos desta classe se existe uma grande classe padrão? É verdade, é para o MT5 e não sei se ele está disponível para o MT4. Você não tem um?

Há uma desvantagem em seu código - ausência de Stop Loss e Take Profit.


Parar as perdas e as tomadas para pedidos são definidas separadamente, pois podemos não saber em que tipo de conta estaremos trabalhando ....
 
Integer:

Você pode fazer métodos para definir parâmetros, e abrir diretamente uma ordem chamando um método sem parâmetros.

Você pode demonstrar isso com meu exemplo?

 

Não me apetece codificar. De qualquer forma... Na seção privada declarar variáveis para Stop Loss, Take Profit e valores de lote. Estas variáveis são usadas nos métodos de abertura de ordem, é claro, o lote é como é e os níveis de preços são calculados usando estas variáveis. Mas devemos definir valores para estas variáveis. Isto significa que precisamos de métodos como: SetTakeProfit(int Value), SetStopLoss(int Value), SetLots(double Value).

Na maioria dos EAs, os métodos SetTakeProfit(int Value), SetStopLoss(int Value), SetLots(double Value) só precisarão ser chamados uma vez no inite. A chamada de métodos para abrir ordens sem parâmetros acelera muito o tempo de execução.

 
VOLDEMAR:
Se você é tão inteligente, escreva corretamente, o tópico não foi criado para sarcasmo ....
Não arraste o OOP para lugares onde não é necessário. A mera presença de objetos não torna o código mais rápido, mais eficiente, etc.
 

Como sempre, eu queria aprender, mas é certo que há quem não tem mais nada a dizer a não ser ser ser esperto...

Escrevi um exemplo simples para desmontá-lo, não sei como escrever de forma mais competente com o OOP ... É apenas um exemplo, se você souber escrever um código similar corretamente e OOP então, por favor, escreva, para que eu e outros possam aprender ...

 
VOLDEMAR:

Como sempre, eu queria aprender, mas é certo que há quem não tem mais nada a dizer a não ser para ser esperto...

Escrevi um exemplo simples para desmontá-lo, não sei como escrever de forma mais competente com o OOP ... É apenas um exemplo, se você souber escrever tal código corretamente e OOP então, por favor, escreva, para que eu e outros possam aprender ...


Não importa.

* * *

Você deve se esforçar para garantir que os métodos principais e mais freqüentemente utilizados sejam chamados sem passar por nenhum parâmetro. Isto aumentaria o desempenho. Mas isso reduzirá a usabilidade.