HYROLEAN

hyrQueue.mqh

Mar 17th, 2026 (edited)
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.39 KB | Money | 0 0
  1. // hyrQueue.mqh - ClaudeによるGitHub自作コードからの移植
  2. //   by Copyright 2026 hyrolean
  3. //---------------------------------------------------------------------------
  4. // Local:: <DataFolder>\MQLx\Include\User\hyrQueue.mqh
  5. // URL:: https://pastebin.com/X1N3nEB4
  6. //---------------------------------------------------------------------------
  7. //+------------------------------------------------------------------+
  8. //| 半自動移植ヘッダーファイル by Claude                             |
  9. //| MT4 / MT5 ハイブリッド対応版 fixed_queue テンプレートクラス      |
  10. //| 元コード: https://github.com/hyrolean/BonDriver_PTx-ST_mod/blob/master/Common/PoolBuffer.h |
  11. //|                                                                  |
  12. //| 対応環境:                                                        |
  13. //|   MT4 Build 900以降 (テンプレートクラス対応)                     |
  14. //|   MT5 全バージョン                                               |
  15. //+------------------------------------------------------------------+
  16. //#pragma once
  17. #ifndef HYR_QUEUE_MQH
  18. #define HYR_QUEUE_MQH
  19.  
  20. //+------------------------------------------------------------------+
  21. //| 移植時の主な変更点まとめ by Calude                               |
  22. //|  1. typedef を全廃 → T / int を直接使用 (MT4でtypedef不可)      |
  23. //|  2. size_t → int に変更 (MQL4/5共にsize_tなし)                  |
  24. //|  3. new[]/delete[] → ArrayResize() に変更 (MQLらしい記法)       |
  25. //|  4. 参照返し(T&) → 値返し(T) に変更 (MQL4/5共に参照返し不可)    |
  26. //|  5. set() メソッドを追加 (参照返し廃止の代替)                    |
  27. //|  6. throw → PrintMessage()+return に変更 (MQL4/5共にtry-catch不可) |
  28. //|  7. #ifdef _DEBUG → #ifdef HYRQUEUE_DEBUG に変更                |
  29. //+------------------------------------------------------------------+
  30.  
  31. #include <User/hyrGlobal.mqh>  // https://pastebin.com/2PdBW6NQ
  32. #define HYRQUEUE_DEBUG
  33.  
  34. template<typename T>
  35. class fixed_queue
  36. {
  37. protected:
  38.    T     buff_[];  // 循環バッファ本体
  39.    int   cue_;     // 先頭インデックス
  40.    int   size_;    // 現在の要素数
  41.    int   grew_;    // バッファの固定容量
  42.  
  43. public:
  44.    //--- コンストラクタ:固定サイズを指定
  45.    fixed_queue(int fixed_size)
  46.       : cue_(0), size_(0), grew_(fixed_size)
  47.    {
  48.       ArrayResize(buff_, grew_);
  49.    }
  50.  
  51.    //--- コンストラクタ:配列で初期化(追加メソッド by hyrolean)
  52.    fixed_queue(T &src_buff[], bool swapping=false, int init_size=-1)
  53.       : cue_(0), size_(init_size)
  54.    {
  55.      if(swapping) {
  56.        grew_=ArraySize(src_buff);
  57.        ArraySwap(buff_, src_buff);
  58.      }else {
  59.        grew_=ArrayCopy(buff_,src_buff);
  60.      }
  61.      if(size_<0)
  62.        size_=grew_;
  63.      else
  64.        size_=MathMin(grew_, size_);
  65.    }
  66.  
  67.    //--- デストラクタ(動的配列はMQL側で自動解放)
  68.    //~fixed_queue() {}
  69.  
  70.    //-------------------------------------------------------------------
  71.    // 基本プロパティ
  72.    //-------------------------------------------------------------------
  73.  
  74.    //--- バッファの最大容量
  75.    int  capacity() const { return grew_; }
  76.  
  77.    //--- 現在の要素数
  78.    int  size()     const { return size_; }
  79.  
  80.    //--- キューが空かどうか
  81.    bool empty()    const { return size_ == 0; }
  82.  
  83.    //--- キューが満杯かどうか
  84.    bool full()     const { return size_ >= grew_; }
  85.  
  86.    //-------------------------------------------------------------------
  87.    // 追加・削除
  88.    //-------------------------------------------------------------------
  89.  
  90.    //--- 末尾に要素を追加(満杯ならfalse)
  91.    bool push(const T &val)
  92.    {
  93.       if(full()) return false;
  94.       int idx = cue_ + size_;
  95.       if(idx >= grew_) idx -= grew_;
  96.       buff_[idx] = val;
  97.       size_++;
  98.       return true;
  99.    }
  100.  
  101.    //--- 先頭に要素を追加(満杯ならfalse)
  102.    bool push_front(const T &val)
  103.    {
  104.       if(full()) return false;
  105.       if(cue_ > 0)
  106.          cue_--;
  107.       else
  108.          cue_ = grew_ - 1;
  109.       buff_[cue_] = val;
  110.       size_++;
  111.       return true;
  112.    }
  113.  
  114.    //--- 先頭要素を削除
  115.    bool pop()
  116.    {
  117.       if(empty()) return false;
  118.       if(++cue_ >= grew_) cue_ = 0;
  119.       size_--;
  120.       return true;
  121.    }
  122.  
  123.    //--- 末尾要素を削除
  124.    bool pop_back()
  125.    {
  126.       if(empty()) return false;
  127.       size_--;
  128.       return true;
  129.    }
  130.  
  131.    //--- 全要素をクリア(バッファは解放しない)
  132.    void clear() { cue_ = 0; size_ = 0; }
  133.  
  134.    //--- 入れ替え(追加メソッド by hyrolean)
  135.    void swap(fixed_queue<T> &lhs)
  136.    {
  137.      int c = cue_, s = size_, g = grew_ ;
  138.      ArraySwap(buff_, lhs.buff_);
  139.      cue_ = lhs.cue_; size_ = lhs.size_; grew_ = lhs.grew_ ;
  140.      lhs.cue_ = c ; lhs.size_ = s ; lhs.grew_ = g ;
  141.    }
  142.  
  143.    //-------------------------------------------------------------------
  144.    // アクセサ(値返し)
  145.    //
  146.    // ※ MQL4/5ともに参照返し(T&)はクラスメンバーに使えないため値返し。
  147.    //   書き込みには set() を使用してください。
  148.    //-------------------------------------------------------------------
  149.  
  150.    //--- 先頭要素を返す
  151.    T front() const
  152.    {
  153. #ifdef HYRQUEUE_DEBUG
  154.       if(empty()) {
  155.          PrintMessage("range error: queue is empty.","fixed_queue::front()");
  156.          return buff_[0];
  157.       }
  158. #endif
  159.       return buff_[cue_];
  160.    }
  161.  
  162.    //--- 末尾要素を返す
  163.    T back() const
  164.    {
  165. #ifdef HYRQUEUE_DEBUG
  166.       if(empty()) {
  167.          PrintMessage("range error: queue is empty.","fixed_queue::back()");
  168.          return buff_[0];
  169.       }
  170. #endif
  171.       int idx = cue_ + size_ - 1;
  172.       if(idx >= grew_) idx -= grew_;
  173.       return buff_[idx];
  174.    }
  175.  
  176.    //--- index番目の要素を返す(0 = 先頭)
  177.    T operator[](int index) const
  178.    {
  179. #ifdef HYRQUEUE_DEBUG
  180.       if(index < 0 || index >= size_) {
  181.          PrintMessage("range error. index="
  182.            + IntegerToString(index) + " size=" + IntegerToString(size_)
  183.              ,"fixed_queue::operator[]");
  184.          return buff_[0];
  185.       }
  186. #endif
  187.       int idx = cue_ + index;
  188.       if(idx >= grew_) idx -= grew_;
  189.       return buff_[idx];
  190.    }
  191.  
  192.    //--- index番目の要素に値を書き込む(参照返し廃止の代替)
  193.    bool set(int index, const T &val)
  194.    {
  195. #ifdef HYRQUEUE_DEBUG
  196.       if(index < 0 || index >= size_) {
  197.          PrintMessage("range error. index="
  198.            + IntegerToString(index) + " size=" + IntegerToString(size_)
  199.              ,"fixed_queue::set()");
  200.          return false;
  201.       }
  202. #endif
  203.       int idx = cue_ + index;
  204.       if(idx >= grew_) idx -= grew_;
  205.       buff_[idx] = val;
  206.       return true;
  207.    }
  208. };
  209.  
  210. //+------------------------------------------------------------------+
  211. //| 使用例 by Claude                                                 |
  212. //+------------------------------------------------------------------+
  213. /*
  214.  
  215. // ① インクルード
  216. #include <User/hyrQueue.mqh>
  217.  
  218. // ② デバッグモードを有効にする場合(インクルードより前に記述)
  219. // #define HYRQUEUE_DEBUG
  220.  
  221. // ③ 宣言(double型、最大20要素)
  222. fixed_queue<double> q(20);
  223.  
  224. // ④ 末尾に追加
  225. q.push(1.1);
  226. q.push(2.2);
  227. q.push(3.3);
  228.  
  229. // ⑤ 先頭に追加
  230. q.push_front(0.0);
  231.  
  232. // ⑥ 要素を読む(値返し)
  233. double f = q.front();   // 先頭
  234. double b = q.back();    // 末尾
  235. double v = q[1];        // index指定
  236.  
  237. // ⑦ 要素を書き込む(set()を使用)
  238. q.set(0, 9.9);
  239.  
  240. // ⑧ 削除
  241. q.pop();       // 先頭を削除
  242. q.pop_back();  // 末尾を削除
  243.  
  244. // ⑨ プロパティ確認
  245. Print("capacity: ", q.capacity());
  246. Print("size:     ", q.size());
  247. Print("empty:    ", q.empty());
  248. Print("full:     ", q.full());
  249.  
  250. // ⑩ OnCalculate()での典型的な使い方
  251. //    直近N本分のCloseを常にキューで保持する例
  252. //
  253. //    fixed_queue<double> closeQ(20); // グローバルで宣言
  254. //
  255. //    int OnCalculate(...) {
  256. //       if(closeQ.full()) closeQ.pop();   // 古いデータを捨てる
  257. //       closeQ.push(close[0]);            // 最新値を追加
  258. //       double oldest = closeQ.front();   // 最も古い値
  259. //       double newest = closeQ.back();    // 最新値
  260. //    }
  261.  
  262. */
  263. //+------------------------------------------------------------------+
  264.  
  265. #endif // HYR_QUEUE_MQH
  266.  
Tags: Mt4 Mt5
Advertisement
Add Comment
Please, Sign In to add comment