ご無沙汰しております、たかはしです。
8月は暑すぎて何もする気力がなくバテておりました。
とてもブログを書く元気が無いというか、アマゾンプライムの動画にはまっていて更新していませんでした(´∀`*)
でも、気が向いた時に開発はコツコツとしていますので、安心してくださいw
とりあえず、シグナルとかのロジックを作り出すと色々とハマってしまう傾向にあるので、関数をライブラリ化してフレームワークにしておこうかなと思っている次第であります(`・ω・´)
で、今回は僕がSEだった頃に全盛期だったオブジェクト指向でMQL言語を記述できる事が分かったので、そのサンプルを公開しておこうと思います。
いや、昔からオブジェクト指向で記述出来るようなことは知っていたんですけど、どうにも気分が乗らなくて・・・
下記がコードになります。
このクラスはバーで、4本値を持つローソクとして考えてください。
そして、4本値をゴニョゴニョして希望する値を返却するメソッドを何個か持っているクラスです。
使い方としては、OHLC(始値、高値、安値、終値)を与えてインスタンスを生成します。
で、ローソク足として何がしたいかというと、特にこれといって無いんですが、ざっと思いつく限りでこんなものが思い当たります。
高値〜安値感の値幅や始値〜終値の値幅、値幅率、陽線か陰線かどうかを示すフラグ。
と、こんな感じになるわけですが、FXの世界でデータをモデル化する用途ってあまりないなぁ・・・と作りながらに実感。
処理の抽象化とかは使い勝手が良さそうですが、バーをオブジェクト化しても、あまりメリットが無いというか何というかw
他にオブジェクト化して有効になるかもしれないデータモデルって主要インジケーターをデータ化して隙な時に取り出せるようにするくらいなんでしょうが、コレを実装してしまうとかなり重たくなってしまいそうだし、使いたい時にiMAとかで取り出せばいいだけなので、やっぱりオブジェクト思考化ってこの世界では流行りそうにないねw
//+------------------------------------------------------------------+ //| Bar.mqh | //| Copyright 2016, FX取引に関するあれこれ | //| http://fxtrading.greeds.net | //+------------------------------------------------------------------+ #property copyright "Copyright 2016, FX取引に関するあれこれ" #property link "http://fxtrading.greeds.net" #property version "1.00" #property strict //+------------------------------------------------------------------+ //| クラス情報 //+------------------------------------------------------------------+ class Bar { //メンバ変数 private: double open; double high; double low; double close; //メソッド宣言 public: ~Bar(); Bar(double o,double h,double l,double c); double PriceRangeOC(); double PriceRangeHL(); double Bar::PriceRangePercent(); bool isBull(); bool isBear(); }; Bar::~Bar() { } /* 【メソッド名】 Bar:コンストラクタ 【引数】 double o:始値 double h:高値 double l:安値 double c:終値 【戻り値】 なし 【概要】 引数のOHLCでインスタンスを初期化する */ Bar::Bar(double o,double h,double l,double c) { this.open=o; this.high=h; this.low=l; this.close=c; } /* 【メソッド名】 PriceRangeOC:値幅 【引数】 なし 【戻り値】 double:値幅 【概要】 始値から終値を減算した値を返却 */ double Bar::PriceRangeOC() { return open-close; } /* 【メソッド名】 PriceRangeHL:値幅 【引数】 なし 【戻り値】 double:値幅 【概要】 高値から安値を減算した値を返却 */ double Bar::PriceRangeHL() { return high-low; } /* 【メソッド名】 PriceRangePercent:値幅率 【引数】 なし 【戻り値】 double:値幅率 【概要】 終値と始まり値から変動した値幅の比率を返却 */ double Bar::PriceRangePercent() { return (close/open)*100-100; } /* 【メソッド名】 isBull:陽線チェック 【引数】 なし 【戻り値】 bool:陽線のときtrue陰線の時false 【概要】 Barが陽線かどうかを判断 */ bool Bar::isBull() { if(open>close) return false; else return true; } /* 【メソッド名】 isBear:陰線チェック 【引数】 なし 【戻り値】 bool:陽線のときfalse陰線の時true 【概要】 Barが陰線かどうかを判断 */ bool Bar::isBear() { if(open>close) return true; else return false; }