記事"MetaTraderプログラムを簡単かつ迅速に開発するためのライブラリ(第1部)概念、データ管理および最初の結果"についてのディスカッション - ページ 4

 
fxsaber:

ありがとうございます。しかし、まだ疑問があります - MT4でより高速であることは明らかですが、5について話している場合、1つのCopyRatesを呼び出すよりも、すべてのメソッドを別々に実行する方が高速なのでしょうか?もしそうであれば、MQLRatesの 代わりにバー構造/クラスを作成し、すべてのフィールドを書き込むのではなく、例えばマスクによって、私たちのケースで必要なものだけを書き込むことは理にかなっています。

 
alex_all:

ありがとうございます。しかし、まだ疑問があります。MT4でより高速であることは明らかですが、5について話している場合、1つのCopyRatesを呼び出すよりも、すべてのメソッドを別々に実行する方が高速なのでしょうか?もしそうなら、MQLRatesの 代わりに独自のバー構造/クラスを作成することは理にかなっています。

試してみてください。

 
アップデートはないのか?
 
soldadoraso21:
更新しないの?

Не понял вопроса.

質問の意味がわかりません。

 

開発中のライブラリなので、グローバルな発言をする前に、さらなる記事を待つつもりだ。

しかし、この最初の部分で2つの潜在的な問題があることに気づいた:

第一に

Sometimes, you may want to get the number of decimal places in a symbol lot. Let's enter this function to our file of service functions:

//+------------------------------------------------------------------+
//| 記号ロットの小数点以下の桁数を返す。
//+------------------------------------------------------------------+
uint DigitsLots(conststring symbol_name) 
  { 
   return (int)ceil(fabs(log(SymbolInfoDouble(symbol_name,SYMBOL_VOLUME_STEP))/log(10)));
  }

1.a 提案されているlogを使った 解決策は万能ではありません。あるシンボルでは、例えば0.25のボリュームのステップを完璧に持つことができ、DigitsLots()はそのような場合に間違った答えを返します。

1.b なぜ「シンボル・ロットの小数点以下の桁数」が必要なのですか?そのような実際の使用例は見当たりません。

1.c もし本当にlog関数を使いたいのであれば、自然対数の代わりにlog10を使うべきです。

return (int)ceil(fabs(log10(SymbolInfoDouble(symbol_name,SYMBOL_VOLUME_STEP))));

1.d このような関数をパブリック・インターフェイスで提供することは、非効率的な結果につながる可能性があります。


次に

intOnInit()
  {
//---
   list_all_orders.Sort();
   list_all_orders.Clear();
   if(!HistorySelect(0,TimeCurrent()))
     {
      Print(DFUN,TextByLanguage(":Не удалось получить историю сделок и ордеров".,": Failed to get history of deals and orders"));
      returnINIT_FAILED;
     }
   ...

2.aこれはHistorySelect()を呼び出す正しい方法ではなく、TimeCurrent()がブローカー・サーバーから最後に知ったティック日付を返すため、履歴情報を見逃す可能性があります。ここと経験からの根拠

2.b OnInit()関数で TimeCurrent()を使用するのは悪い例です。一般的に、OnInit() 内でデータ要求を行うのは悪い考えです。

 

コメントありがとう。

  1. 関数を別のものに変更する可能性を検討します。
  2. 個々のシンボルのロットの小数点以下の桁数は、取引注文の 紛れもない送信のために必要です。
  3. log10を持つあなたの関数は、0.25のロットステップであなたが声を上げた問題はありませんか?
  4. 小数点以下の桁数に関するデータは、シンボルクラスのオブジェクトに一度だけ書き込まれます。これについては、この後の記事で詳しく説明します。

OnInit()でのテスト・チェックは、チェックのためだけに必要である。そしてそこでだけ、この方法で注文の履歴を取得する。注文、取引、ポジションのコレクションでは、そうでない。

これら全ては次回以降に。

-------------

Спасибо за комментарии, но это всего лишь тест.

  1. рассмотрю возможность изменения функции на иную - полностью универсальную
  2. количество знаков после запятой для лота каждого отдельного символа нужно для безошибочной отправки торговых приказов
  3. ваша функция с log10 не имеет озвученной вами проблемы с шагом лота 0.25 ?
  4. данные о количестве знаков после запятой записываются единожды в объект класса-символ.この記事は、"邦訳 "です。

OnInit()を実行する前に、このメソッドを実行する必要があります。このような場合、"is "メソッドを呼び出す必要があります。В коллекциях ордеров, сделок и позиций - иначе.

Всё это в последующих статьях.
 
Artyom Trishkin:

コメントありがとう。

  1. 関数を別のものに変更する可能性を検討します。
  2. 各シンボルのロットの小数点以下の桁数は、紛れもなく取引注文を 送信するために必要です。
  3. log10を持つあなたの関数は、0.25のロットステップであなたが声を上げた問題はありませんか?
  4. 小数点以下の桁数に関するデータは、シンボルクラスのオブジェクトに一度だけ書き込まれます。これは、さらに - 以降の記事で行われます。

OnInit()でのテスト・チェックは、チェックのためだけに必要である。そしてそこでだけ、この方法で注文の履歴を取得する。注文、取引、ポジションのコレクションでは、そうでない。

これら全ては次回以降に。


1.良い。

2.ロットを正しく正規化すれば必要ない:

 double lotStep=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);
 lots=MathRound(lots/lotStep)*lotStep;

ロットの数字を使うことは問題を引き起こすだけです。

3.log10にも同じ問題があり、万能ではない。log(10)の無駄な呼び出しを避けるためだ。

4.良い。

チェックするためだけのものであることは承知していますが、たとえテストコードが公開 されているとしても、私たちには良いプラクティスを示し、使用する責任があると思います。

他の記事も読んでみます。

 
Alain Verleyen:

1.良かった。

2.ロットを正しく正規化すれば必要ない:

ロットの桁数を使用すると、問題が発生する可能性があります。

3.log10にも同じ問題がある。log(10)の無駄な呼び出しを避けるためだ。

4.良かった。

チェックするためだけのものだとわかっていますが、たとえテストコードが公開 されているとしても、私たちには良い習慣を示し、使う責任があると思います。

他の記事も読んでみます。

わかった。ありがとう。
 

こんにちは

私は、いわばあなたの入門者、あるいは学生だと思ってください。

MQLの知識はあるのですが、最初のステップでつまずきました。

私は、与えられたプロパティによって2つの注文を互いに比較する方法の実装 点に来ました:

//+------------------------------------------------------------------+
//|| COrderオブジェクト同士を可能なすべてのプロパティで比較する。
//+------------------------------------------------------------------+
int COrder::Compare(const CObject *node,const int mode=0) const
  {
   const COrder *order_compared=node;
//--- 2つのオーダーの整数特性の比較
   if(mode<ORDER_PROP_INTEGER_TOTAL)
     {
      long value_compared=order_compared.GetProperty((ENUM_ORDER_PROP_INTEGER)mode);
      long value_current=this.GetProperty((ENUM_ORDER_PROP_INTEGER)mode);
      return(value_current>value_compared ? 1 : value_current<value_compared ? -1 : 0);
     }
//--- 2つのオーダーの実特性の比較
   else if(mode<ORDER_PROP_DOUBLE_TOTAL+ORDER_PROP_INTEGER_TOTAL)
     {
      double value_compared=order_compared.GetProperty((ENUM_ORDER_PROP_DOUBLE)mode);
      double value_current=this.GetProperty((ENUM_ORDER_PROP_DOUBLE)mode);
      return(value_current>value_compared ? 1 : value_current<value_compared ? -1 : 0);
     }
//--- 2つのオーダーの文字列プロパティの比較
   else if(mode<ORDER_PROP_DOUBLE_TOTAL+ORDER_PROP_INTEGER_TOTAL+ORDER_PROP_STRING_TOTAL)
     {
      string value_compared=order_compared.GetProperty((ENUM_ORDER_PROP_STRING)mode);
      string value_current=this.GetProperty((ENUM_ORDER_PROP_STRING)mode);
      return(value_current>value_compared ? 1 : value_current<value_compared ? -1 : 0);
     }
   return 0;
  }
//+------------------------------------------------------------------+

これはライブラリの中のコードで、どこに書けばいいのか

の後

   //--- COrderオブジェクトを、可能なすべてのプロパティについて互いに比較する。
   virtual int       Compare(const CObject *node,const int mode=0) const;

の後に書くか、抽象オーダーのプロテクトクラスの中に書くかです。

protected:
   //--- プロテクトされたパラメトリックコンストラクタ
                     COrder(ENUM_ORDER_STATUS order_status,const ulong ticket);
                     
   //--- パラメータから、選択されたオーダーの整数プロパティを取得し、返す。
   long              OrderMagicNumber(void)        const;
   long              OrderTicket(void)             const;
   long              OrderTicketFrom(void)         const;
   long              OrderTicketTo(void)           const;
   long              OrderPositionID(void)         const;
   long              OrderPositionByID(void)       const;
   long              OrderOpenTimeMSC(void)        const;
   long              OrderCloseTimeMSC(void)       const;
   long              OrderType(void)               const;
   long              OrderTypeByDirection(void)    const;
   long              OrderTypeFilling(void)        const;
   long              OrderTypeTime(void)           const;
   long              OrderReason(void)             const;
   long              DealOrder(void)               const;
   long              DealEntry(void)               const;
   bool              OrderCloseByStopLoss(void)    const;
   bool              OrderCloseByTakeProfit(void)  const;
   datetime          OrderOpenTime(void)           const;
   datetime          OrderCloseTime(void)          const;
   datetime          OrderExpiration(void)         const;
   datetime          PositionTimeUpdate(void)      const;
   datetime          PositionTimeUpdateMSC(void)   const;
   
   //--- (1)始値、(2)終値、(3)利益、
   //--- (4) 手数料、(5) スワップ、(6) 出来高、(7) 発行済み出来高 (8) 損切り価格、(9) 利益確定価格 (10) ストップリミット注文設定価格
   double            OrderOpenPrice(void)          const;
   double            OrderClosePrice(void)         const;
   double            OrderProfit(void)             const;
   double            OrderCommission(void)         const;
   double            OrderSwap(void)               const;
   double            OrderVolume(void)             const;
   double            OrderVolumeCurrent(void)      const;
   double            OrderStopLoss(void)           const;
   double            OrderTakeProfit(void)         const;
   double            OrderPriceStopLimit(void)     const;
   
   //--- (1)シンボル、(2)コメント、(3)取引所識別子。
   string            OrderSymbol(void)             const;
   string            OrderComment(void)            const;
   string            OrderExternalID(void)         const;
   
public:
   //--- オーダーの (1) 整数、(2) 実数、および (3) 文字列プロパティを、プロパティ配列から返します。
   long              GetProperty(ENUM_ORDER_PROP_INTEGER property)      const { return m_long_prop[property];                    }
   double            GetProperty(ENUM_ORDER_PROP_DOUBLE property)       const { return m_double_prop[this.IndexProp(property)];  }
   string            GetProperty(ENUM_ORDER_PROP_STRING property)       const { return m_string_prop[this.IndexProp(property)];  }
   
   //--- オーダーが指定されたプロパティを保持していることを示すフラグを返す。
   virtual bool      SupportProperty(ENUM_ORDER_PROP_INTEGER property)        { return true; }
   virtual bool      SupportProperty(ENUM_ORDER_PROP_DOUBLE property)         { return true; }
   virtual bool      SupportProperty(ENUM_ORDER_PROP_STRING property)         { return true; }

私はもう若くないので、若い人ならすぐに理解できると思います。

また、私は自動売買(12560)に関する記事とテクニカルライブラリの フォーラムでトピックを開いている 私は そこの学生です私は構造についての詳細であなたからの答えをしたいと思い、このトピックを複製します、

記事に従ってステップバイステップで作業 。あなたが間違っていると理解していないことができます。

Форум трейдеров - MQL5.community: Статьи и техническая библиотека по автоматическому трейдингу
Форум трейдеров - MQL5.community: Статьи и техническая библиотека по автоматическому трейдингу
  • www.mql5.com
Обсуждение статей по трейдингу и примеров на языках MQL4/MQL5
 
Vladimir Andreev:

こんにちは

私は、いわばあなたの応募者、あるいは生徒だと思ってください。

MQLの知識はありますが、最初の一歩でつまずきました。

2つのオーダーをある特性で比較する方法を実現する ところまでたどり着きました

これがライブラリのコードです。

その後

または抽象的な命令のプロテクト・クラス

私はもう若くないが、若い人はその場で把握できることをご理解いただきたい。

また、私は自動売買に関する記事とテクニカルライブラリ(12560)のフォーラムにトピックを開いた 私は そこの学生です私は構造についてのあなたからの詳細な回答を希望し、このトピックを複製します、

記事に従ってステップバイステップで作業する。あなたが間違っていると理解していないことができます。

クラスメソッドを作成するには、2つの方法があります - それは、クラス本体に直接です:

class CMyClass
  {
   bool Flag(void) { return false; }
  }

そして、クラスボディの外側です:

class CMyClass
  {
   bool Flag(void);
  }
//--- クラス本体の外で実装されたメソッド
bool CMyClass::Flag(void) { return false; }

最初のケースでは、メソッドはクラスボディの中で直接定義され実装されます。しかし、メソッドのサイズが大きい場合は、2番目の例のように、メソッドをクラス本体で宣言し、実装をクラス本体の外に置く方が便利です。

メソッドをクラス本体の中に書いた方が便利なのは明らかです。しかし、あなたが質問しているメソッドは、クラス本体とは別に書いた方が便利です。

しかし、この記事に添付されているすべてのファイルをダウンロードすることができます - それらはすでにすべてを含んでおり、使用する準備ができています - 記事で説明されていることを勉強するためにそれらを使用します。