Вопросы по ООП (Объектно Ориентированному Программированию )

 

Привет всем!

Я думаю настало время создать данную тему, потому что толкового обучения ООП нигде нет, а учиться надо и хочется.

Засорять ветку "вопросы от новичков" более сложными и не понятными новичкам примерами кодов, наверно не стоит.

Прочитав две статьи Основы объектно-ориентированного программирования и ООП в MQL5 на примерах: обработка кодов ошибок и предупреждений

Я написал пример кода и хочу детально с ним разобраться а так же и Вам предлагаю публиковать свои коды и разбирать их вместе.

Интересует следующее:

  • Правильно ли написан код ?
  • Как улучшить код ?
  • Как ускорить код ?
Мой код по открытию ордеров:

#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;
  }
//+------------------------------------------------------------------+
 
Т.е. ООП это просто функции в класс попихать? Продуктивненько, скоро будет весело на форуме наверное.
 
VOLDEMAR:


  • Правильно ли написан код ?
  • Как улучшить код ?
  • Как ускорить код ?


Что значит правильно или неправильно? Работает без ошибок, значит правильно. А не рабтает, значит неправильно.

Улучшить. Улучшать надо когда что-то не удовлетворяет потребностям. Каким потребностям не удовлетворяет, в этом направлении и улучшать.

Зачем ускорять? Ордер не так часто открываются, даже редко по сравнению с общим количеством тиков в тестере.

Но это была философия.

Практика. Зачем нужен этот класс, если есть отличный стандартный? Правда он для МТ5, а есть ли для МТ4 - незнаю. Нету?

Один недостаток в вашем коде есть - отсутствие стоплоссов и тейкпрофитов.

 
TheXpert:
Т.е. ООП это просто функции в класс попихать? Продуктивненько, скоро будет весело на форуме наверное.

Если Вы такой умный то напишите как правильно, тема не для сарказма создавалась ....
 
VOLDEMAR:

Если Вы такой умный то напишите как правильно, тема не для сарказма создавалась ....


Зависит от ваших желания, потребностей, от вашего стиля программирования.

Можно сделать класс как набор функций с параметрами, примерно как у вас сделано.

Можно сделать методы для установки параметров, а непосредственно открытие ордера выполнять вызовом метода без параметиров.

Лучше когда пороще, тогда будет более применимо в разных случах. Пытаться сделать что-то сверх идеально универсальное - это мечта идиота, пустая трата времени у умственных усилий.

Еще. Пока раз 20 одну и туже задачу не пришлось решать, то лучше и не браться за создание универсального подхода.

 
Integer:


Что значит правильно или неправильно? Работает без ошибок, значит правильно. А не рабтает, значит неправильно.

Улучшить. Улучшать надо когда что-то не удовлетворяет потребностям. Каким потребностям не удовлетворяет, в этом направлении и улучшать.

Зачем ускорять? Ордер не так часто открываются, даже редко по сравнению с общим количеством тиков в тестере.

Но это была философия.

Практика. Зачем нужен этот класс, если есть отличный стандартный? Правда он для МТ5, а есть ли для МТ4 - незнаю. Нету?

Один недостаток в вашем коде есть - отсутствие стоплоссов и тейкпрофитов.


Стоп лоссы и тейки для ордеров устанавливаются отдельно, так как вполне возможно мы не знаем на каком типе счетов будем работать ....
 
Integer:

Можно сделать методы для установки параметров, а непосредственно открытие ордера выполнять вызовом метода без параметиров.

Вы можете это продемонстрировать на моем примере ?

 

Неохота кодить. Вобщем... В приватной секции объявить переменные для значений стоплосса, тейкпрофита, лота. В методах открытия ордеров используются эти переменные, естественно лот так, как есть, а ценовые уровни рассчитываются с использованием этих переменных. Но этим переменным надо устанавливать значения. Значит нужны методы типа: SetTakeProfit(int Value), SetStopLoss(int Value), SetLots(double Value).

В большенстве советников методы SetTakeProfit(int Value), SetStopLoss(int Value), SetLots(double Value) будет достаточно вызывать в ините (один раз). Вызов методов открытия ордеров без параметров значительно ускоряет время исполнения.

 
VOLDEMAR:
Если Вы такой умный то напишите как правильно, тема не для сарказма создавалась ....
Не надо притягивать ООП там где он не нужен. Одно только наличие объектов не делает код быстрее, эффективнее и т.д.
 

Как всегда, хотел научится, но обязательно найдутся те, кому кроме как поумничать и сказать больше нечего ...

Я написал простой пример что бы его разобрать, я не знаю как более грамотно написать с ООП ... Это просто пример, если знаете как написать подобный код правильно и ООП тогда пожалуйста напишите, что бы я и другие могли научиться...

 
VOLDEMAR:

Как всегда, хотел научится, но обязательно найдутся те, кому кроме как поумничать и сказать больше нечего ...

Я написал простой пример что бы его разобрать, я не знаю как более грамотно написать с ООП ... Это просто пример, если знаете как написать подобный код правильно и ООП тогда пожалуйста напишите, что бы я и другие могли научиться...


Да не обращайте внимания.

* * *

Надо стремиться к тому, чтобы основные и наиболее часто испоьзуемые методы вызывались без передачи параметров. Это повысит быстродействие. Однако снизит удобство.

Причина обращения: