OOP(オブジェクト指向プログラミング)に関する質問

 

みなさん、こんにちは。

どこにも良いOOPトレーニングがないため、このスレッドを作成する時期だと思いますが、私たちは学ぶ必要がありますし、学びたいと思っています。

初心者からの質問」ブランチに、より複雑で初心者には理解できないコード例を散在させることは、おそらく価値がないでしょう。

オブジェクト指向プログラミングの基本 」と「例で見るMQL5のOOP:エラーと警告コードの処理」の2つの記事を読んで、サンプルコードを書きましたので、詳しく紹介したいと思います。

サンプルコードを書いてみたので、詳しく勉強したい。 また、自分のコードを公開して、みんなで議論するのもいいと思う。

に興味があります。

  • このコードは正しいですか?
  • コードを改善するには?
  • コードを高速化するには?
注文を開始するための私のコード。

#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;
  }
//+------------------------------------------------------------------+
 
では、OOPはクラスに詰め込むだけの機能なのでしょうか?生産性、もうすぐフォーラムで楽しくなりそうです。
 
VOLDEMAR:


  • コードは正しいですか?
  • コードの改善方法は?
  • コードを高速化するには?


正しいとか間違っているとかいうのはどういう意味ですか?正しく動作すれば、それが正しいのです。うまくいかなければ、それは間違っているのです。

改善する。ニーズを満たさないものを改善する。その上で、どのようなニーズがあるのか、その方向で改善すべきです。

なぜスピードアップするのか?注文はそれほど頻繁に開くわけではなく、テスターの総ティック数に比べれば稀なことでさえあります。

しかし、それは哲学だった。

実践しています。素晴らしい標準的なものがあるのに、なぜこのクラスが必要なのでしょうか?たしかにMT5用で、MT4で使えるかどうかはわかりません。持ってないんですか?

あなたのコードには、ストップロスとテイクプロフィットがないという欠点があります。

 
TheXpert:
では、OOPはクラスに詰め込むだけの機能なのでしょうか?生産的なのは、きっとすぐにフォーラムで楽しくなりますよ。

そんなに賢いなら、正しい書き方をしてください、この話題は皮肉のために作られたのではないのですから・・・。
 
VOLDEMAR:

そんなに頭がいいなら、正しい書き方をしてください、この話題は皮肉で言っているのではありません.


何が欲しいのか、何が必要なのか、そしてあなたのプログラミングスタイルによります。

あなたのケースのように、パラメータを持つ関数の集合としてクラスを作ることができます。

パラメータを設定するメソッドを作成し、パラメータなしでメソッドを呼び出すことで、直接オーダーを 開くことができます。

もっとシンプルな方がいい--この場合、さまざまなケースに応用が利くでしょう。超完璧に普遍的なことをやろうとするのは、バカの夢であり、時間と精神的労力の浪費である。

もっと見る20回同じ問題を解決するまでは、普遍的な方法を作ろうとしないほうがいい。

 
Integer:


正しいとか間違っているとか、どういう意味ですか?正しく動作すれば、それが正しいのです。うまくいかなければ、それは間違っているのです。

改善する。ニーズを満たさないものは改善したほうがいい。どのようなニーズが満たされていないのか、その方向で改善する。

なぜスピードアップするのか?注文はそれほど頻繁に開くわけではなく、テスターの総ティック数に比べれば稀なことでさえあります。

しかし、それは哲学だった。

実践しています。素晴らしい標準的なものがあるのに、なぜこのクラスが必要なのでしょうか?たしかにMT5用で、MT4で使えるかどうかはわかりません。持ってないんですか?

あなたのコードには、ストップロスとテイクプロフィットがないという欠点があります。


注文のストップロスや テイクアウェイは、どのような口座で作業するか分からないので、別に設定します.
 
Integer:

パラメータを設定するメソッドを作り、パラメータなしでメソッドを呼び出すことで、直接オーダーを開くことができます。

私の例で実演していただけますか?

 

コーディングする気が起きない。とにかく...privateセクションで、ストップロス、テイクプロフィット、ロット値の変数を宣言します。これらの変数は、注文開始方法はもちろん、ロットはそのまま、価格水準はこれらの変数を用いて計算されます。しかし、これらの変数に値を設定する必要があります。つまり、SetTakeProfit(int Value), SetStopLoss(int Value), SetLots(double Value)のようなメソッドが必要なのです。

ほとんどのEAでは、SetTakeProfit(int Value), SetStopLoss(int Value), SetLots(double Value)メソッドは、インサイト内で一度だけ呼び出される必要があります。パラメータなしで注文を開くメソッドを呼び出すと、実行時間が 大幅に短縮されます。

 
VOLDEMAR:
そんなに頭がいいならちゃんと書けよ、この話題は皮肉のために作られたんじゃないんだぞ.
必要のないところでOOPを引きずらないこと。オブジェクトが存在するだけでは、コードの高速化、効率化などにはつながりません。
 

いつもながら、勉強になるなあと思いつつも、もう利口としか言いようがない人もいるはず...。

私はそれを分解するために簡単な例を書きました、私はOOPでより有能な書き方を知りません......これは単なる例であり、あなたが正しく、OOPで同様のコードを記述する方法を知っている場合は、私や他の人が学ぶことができるように、書いてください...

 
VOLDEMAR:

いつもながら、勉強になるなあと思いつつも、もう利口としか言いようがない人もいるはず...。

私はそれを分解するために簡単な例を書きました、私はOOPでより有能な書き方を知りません......これは単なる例で、もしあなたがこのようなコードを正しく、かつOOPに書く方法を知っているなら、私や他の人が学ぶことができるように、書いてください...。


気にしないでください。

* * *

メインメソッドや使用頻度の高いメソッドは、パラメータを渡さずに 呼び出されるように努力する必要があります。そうすれば、性能も上がるでしょう。でも、使い勝手は悪くなります。