Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // hyrQueue.mqh - ClaudeによるGitHub自作コードからの移植
- // by Copyright 2026 hyrolean
- //---------------------------------------------------------------------------
- // Local:: <DataFolder>\MQLx\Include\User\hyrQueue.mqh
- // URL:: https://pastebin.com/X1N3nEB4
- //---------------------------------------------------------------------------
- //+------------------------------------------------------------------+
- //| 半自動移植ヘッダーファイル by Claude |
- //| MT4 / MT5 ハイブリッド対応版 fixed_queue テンプレートクラス |
- //| 元コード: https://github.com/hyrolean/BonDriver_PTx-ST_mod/blob/master/Common/PoolBuffer.h |
- //| |
- //| 対応環境: |
- //| MT4 Build 900以降 (テンプレートクラス対応) |
- //| MT5 全バージョン |
- //+------------------------------------------------------------------+
- //#pragma once
- #ifndef HYR_QUEUE_MQH
- #define HYR_QUEUE_MQH
- //+------------------------------------------------------------------+
- //| 移植時の主な変更点まとめ by Calude |
- //| 1. typedef を全廃 → T / int を直接使用 (MT4でtypedef不可) |
- //| 2. size_t → int に変更 (MQL4/5共にsize_tなし) |
- //| 3. new[]/delete[] → ArrayResize() に変更 (MQLらしい記法) |
- //| 4. 参照返し(T&) → 値返し(T) に変更 (MQL4/5共に参照返し不可) |
- //| 5. set() メソッドを追加 (参照返し廃止の代替) |
- //| 6. throw → PrintMessage()+return に変更 (MQL4/5共にtry-catch不可) |
- //| 7. #ifdef _DEBUG → #ifdef HYRQUEUE_DEBUG に変更 |
- //+------------------------------------------------------------------+
- #include <User/hyrGlobal.mqh> // https://pastebin.com/2PdBW6NQ
- #define HYRQUEUE_DEBUG
- template<typename T>
- class fixed_queue
- {
- protected:
- T buff_[]; // 循環バッファ本体
- int cue_; // 先頭インデックス
- int size_; // 現在の要素数
- int grew_; // バッファの固定容量
- public:
- //--- コンストラクタ:固定サイズを指定
- fixed_queue(int fixed_size)
- : cue_(0), size_(0), grew_(fixed_size)
- {
- ArrayResize(buff_, grew_);
- }
- //--- コンストラクタ:配列で初期化(追加メソッド by hyrolean)
- fixed_queue(T &src_buff[], bool swapping=false, int init_size=-1)
- : cue_(0), size_(init_size)
- {
- if(swapping) {
- grew_=ArraySize(src_buff);
- ArraySwap(buff_, src_buff);
- }else {
- grew_=ArrayCopy(buff_,src_buff);
- }
- if(size_<0)
- size_=grew_;
- else
- size_=MathMin(grew_, size_);
- }
- //--- デストラクタ(動的配列はMQL側で自動解放)
- //~fixed_queue() {}
- //-------------------------------------------------------------------
- // 基本プロパティ
- //-------------------------------------------------------------------
- //--- バッファの最大容量
- int capacity() const { return grew_; }
- //--- 現在の要素数
- int size() const { return size_; }
- //--- キューが空かどうか
- bool empty() const { return size_ == 0; }
- //--- キューが満杯かどうか
- bool full() const { return size_ >= grew_; }
- //-------------------------------------------------------------------
- // 追加・削除
- //-------------------------------------------------------------------
- //--- 末尾に要素を追加(満杯ならfalse)
- bool push(const T &val)
- {
- if(full()) return false;
- int idx = cue_ + size_;
- if(idx >= grew_) idx -= grew_;
- buff_[idx] = val;
- size_++;
- return true;
- }
- //--- 先頭に要素を追加(満杯ならfalse)
- bool push_front(const T &val)
- {
- if(full()) return false;
- if(cue_ > 0)
- cue_--;
- else
- cue_ = grew_ - 1;
- buff_[cue_] = val;
- size_++;
- return true;
- }
- //--- 先頭要素を削除
- bool pop()
- {
- if(empty()) return false;
- if(++cue_ >= grew_) cue_ = 0;
- size_--;
- return true;
- }
- //--- 末尾要素を削除
- bool pop_back()
- {
- if(empty()) return false;
- size_--;
- return true;
- }
- //--- 全要素をクリア(バッファは解放しない)
- void clear() { cue_ = 0; size_ = 0; }
- //--- 入れ替え(追加メソッド by hyrolean)
- void swap(fixed_queue<T> &lhs)
- {
- int c = cue_, s = size_, g = grew_ ;
- ArraySwap(buff_, lhs.buff_);
- cue_ = lhs.cue_; size_ = lhs.size_; grew_ = lhs.grew_ ;
- lhs.cue_ = c ; lhs.size_ = s ; lhs.grew_ = g ;
- }
- //-------------------------------------------------------------------
- // アクセサ(値返し)
- //
- // ※ MQL4/5ともに参照返し(T&)はクラスメンバーに使えないため値返し。
- // 書き込みには set() を使用してください。
- //-------------------------------------------------------------------
- //--- 先頭要素を返す
- T front() const
- {
- #ifdef HYRQUEUE_DEBUG
- if(empty()) {
- PrintMessage("range error: queue is empty.","fixed_queue::front()");
- return buff_[0];
- }
- #endif
- return buff_[cue_];
- }
- //--- 末尾要素を返す
- T back() const
- {
- #ifdef HYRQUEUE_DEBUG
- if(empty()) {
- PrintMessage("range error: queue is empty.","fixed_queue::back()");
- return buff_[0];
- }
- #endif
- int idx = cue_ + size_ - 1;
- if(idx >= grew_) idx -= grew_;
- return buff_[idx];
- }
- //--- index番目の要素を返す(0 = 先頭)
- T operator[](int index) const
- {
- #ifdef HYRQUEUE_DEBUG
- if(index < 0 || index >= size_) {
- PrintMessage("range error. index="
- + IntegerToString(index) + " size=" + IntegerToString(size_)
- ,"fixed_queue::operator[]");
- return buff_[0];
- }
- #endif
- int idx = cue_ + index;
- if(idx >= grew_) idx -= grew_;
- return buff_[idx];
- }
- //--- index番目の要素に値を書き込む(参照返し廃止の代替)
- bool set(int index, const T &val)
- {
- #ifdef HYRQUEUE_DEBUG
- if(index < 0 || index >= size_) {
- PrintMessage("range error. index="
- + IntegerToString(index) + " size=" + IntegerToString(size_)
- ,"fixed_queue::set()");
- return false;
- }
- #endif
- int idx = cue_ + index;
- if(idx >= grew_) idx -= grew_;
- buff_[idx] = val;
- return true;
- }
- };
- //+------------------------------------------------------------------+
- //| 使用例 by Claude |
- //+------------------------------------------------------------------+
- /*
- // ① インクルード
- #include <User/hyrQueue.mqh>
- // ② デバッグモードを有効にする場合(インクルードより前に記述)
- // #define HYRQUEUE_DEBUG
- // ③ 宣言(double型、最大20要素)
- fixed_queue<double> q(20);
- // ④ 末尾に追加
- q.push(1.1);
- q.push(2.2);
- q.push(3.3);
- // ⑤ 先頭に追加
- q.push_front(0.0);
- // ⑥ 要素を読む(値返し)
- double f = q.front(); // 先頭
- double b = q.back(); // 末尾
- double v = q[1]; // index指定
- // ⑦ 要素を書き込む(set()を使用)
- q.set(0, 9.9);
- // ⑧ 削除
- q.pop(); // 先頭を削除
- q.pop_back(); // 末尾を削除
- // ⑨ プロパティ確認
- Print("capacity: ", q.capacity());
- Print("size: ", q.size());
- Print("empty: ", q.empty());
- Print("full: ", q.full());
- // ⑩ OnCalculate()での典型的な使い方
- // 直近N本分のCloseを常にキューで保持する例
- //
- // fixed_queue<double> closeQ(20); // グローバルで宣言
- //
- // int OnCalculate(...) {
- // if(closeQ.full()) closeQ.pop(); // 古いデータを捨てる
- // closeQ.push(close[0]); // 最新値を追加
- // double oldest = closeQ.front(); // 最も古い値
- // double newest = closeQ.back(); // 最新値
- // }
- */
- //+------------------------------------------------------------------+
- #endif // HYR_QUEUE_MQH
Advertisement
Add Comment
Please, Sign In to add comment