私たちのファンページに参加してください
- ビュー:
- 994
- 評価:
- パブリッシュ済み:
- 2018.09.17 10:39
-
このコードに基づいたロボットまたはインジケーターが必要なら、フリーランスでご注文ください フリーランスに移動
MQL開発、型 (double) のプリミティブラッパークラス、および CDouble オブジェクトのベクターで使用される一般的なラウンディングメソッドライブラリ。 MQL5 と MQL4 の互換性!
バージョン 1.02: (2018.02.18)
- 丸めた結果が予想される結果からドリフトするバグを修正しました。 AMRALIに感謝!
バージョン 1.01:
- 算術演算子が丸められた値を返さないバグを修正しました。
- コンストラクタが呼び出された後にシンボルを設定するためのシンボル setter メソッドを追加しました。
CDouble
CDouble クラスは、オブジェクトのプリミティブ型 double の値をラップします。 さらに、このクラスには、double 型の浮動小数の四捨五入のメソッドと静的メソッドが用意されています。
宣言
class CDouble : public CObject
Title
#include <Double.mqh>
継承階層
- CObject
- CDouble
CObject クラスから実装またはオーバーライドされた仮想メソッド:型、読み込み、保存、比較。
CDouble 型のオブジェクトには、次の5つのデータフィールドがあります。
string |
m_symbol |
四捨五入にロットステップとティックサイズを取得するために使用されるクラスインスタンスに割り当てられたシンボル。 |
double |
m_value |
インスタンスに割り当てられた生の double 値。 |
uchar |
m_step |
メモリフットプリントを減らすために char として表される四捨五入のステップ。 例えば、0.0025 は25になる。 |
uchar |
m_digits |
10進数を超える桁数。 |
ENUM_PRECISION |
m_mode |
特定の "step " に四捨五入メソッドをロックするための動作モード。 |
ドキュメントにさらに入る前に、ここでは、ラッパークラスの簡単な実用例を示します。
MqlTick tick; SymbolInfoTick(_Symbol,tick); CDouble price = tick.ask - 0.0087263487676283476, sl = price - 500*_Point, tp = price + 500*_Point, lots = 5.25 / 3.78789; MqlTradeRequest r={0}; r.symbol= _Symbol; r.price = price.AsRoundedTick(); r.sl = sl.AsRoundedTick(); r.tp = tp.AsRoundedTick(); r.volume= lots.AsRoundedLots();...
静的ライブラリメソッドを使用する別の例:
MqlTick tick; SymbolInfoTick(_Symbol,tick); MqlTradeRequest r={0}; r.symbol= _Symbol; r.price = tick.ask - 0.0087263487676283476, r.sl = price - 500*_Point, r.tp = price + 500*_Point, r.volume= 5.25 / 3.78789; ... CDouble::RoundTradeRequest(r); //価格フィールドをティックサイズに自動的に丸める //そしてロットステップへのボリューム
静的メソッドの概要
注意: このライブラリを使用するには、OOP を知る必要も、ラッパークラスのインスタンスを使用する必要もありません。 CDouble スコープの解決で静的関数を呼び出すだけです。 構文は次のとおりです。
type variable_name = CDouble::Method(args);
修飾子と型 | メソッド | 詳細 |
---|---|---|
static bool |
IsEqual (double number1, double number2, double step); |
2つの double を比較し、最初から2番目の数値を減算し、合計を "step " に丸め、0と比較してブール値を返します。 |
static bool |
IsEqual (double number1, double number2, int digits); |
2つの double を比較し、最初から2番目の数値を減算して、合計を "桁 " に丸め、0と比較します。 |
static int |
Compare (double number1, double number2, double step) |
2つの double を比較し、整数を返します。
|
static double |
RoundToStep (const double number, double step) |
丸められた値を最も近いステップ精度 (例: 0.0025) に戻します。 |
static double |
RoundToDigit (const double number, int digits) |
丸められた値を最も近い桁 ( NormalizeDoubleと同じ) に返します。 |
static double |
RoundToStepUp (const double number, double step) |
ステップ精度に丸められた値を返します。 |
static double |
RoundToStepDown (const double number, double step) |
丸められた値をステップ精度に返します。 |
static double |
RoundToTick (const double number, string symbol=NULL) |
現在のシンボル (シンボル = NULL) またはシンボルパラメータの指定されたシンボルの最も近いティックサイズに丸められた値を返します。 |
static double |
RoundToLots (const double number, string symbol=NULL, bool always_return_valid=true) |
現在のシンボルの最も近いロットステップ(シンボル = NULL)、またはシンボルパラメータ内の指定されたシンボルに丸められた値を返します。 always_return_valid = = true: 常に有効なロットボリュームを返します (min_lots <= return_value <= max_lots)。 |
static void (MQL5) |
RoundTradeRequest (MqlTradeRequest &request) |
リクエストで指定されたシンボルによって価格、sl、tp、およびボリュームの各フィールドを変更します。 価格、sl、および tp を最も近いティックサイズに丸めます。 ボリュームを最も近いロットステップに丸めます。 |
static void |
RoundArrayToStep |
step = = NULL の場合、配列全体を指定されたステップまたは現在のシンボルのティックサイズに丸めます。 |
static void |
RoundArrayToStep |
step = = NULL の場合、CArrayDouble コレクション全体を、指定されたステップまたは現在のシンボルのティックサイズに丸めます。 |
static int |
GetDigits (double floating_point) |
double のゼロまでの桁数を返します。 (例: 0.0002500 は5桁を返します)。 |
static double |
GetPoint (int digits) |
指定した桁数の double 値を返します。 (例: 3 は0.001 を返します)。 |
static string |
ToString |
数字に丸められた浮動小数点数の文字列を返し、トレーリングのゼロを切り捨てます (例 CDouble:: ToString (1.23400001, 6) は "1.234 " を返します)。 |
例:
MqlTick tick; SymbolInfoTick(_Symbol,tick); double rnd_by_step = CDouble::RoundToStep(tick.bid*1.052565465,_Point); double rnd_by_digits = CDouble::RoundToDigit(tick.bid*1.052565465,_Digits); double by_lot_step = CDouble::RoundToLots(0.123423,_Symbol); double by_tick_size = CDouble::RoundToTick(tick.ask-100*_Point,_Symbol); double roundup = CDouble::RoundToStepUp(3.999999999,_Point); double rounddn = CDouble::RoundToStepDown(3.999999999,_Point); int digits = CDouble::GetDigits(0.0000025); double point = CDouble::GetPoint(10); bool equal = CDouble::IsEqual(tick.bid,tick.bid+0.00000009,_Point); string tostr = CDouble::ToString(3.1399999999999999); int compare = CDouble::Compare(tick.ask,tick.bid); #ifdef __MQL5__ MqlTradeRequest r={0}; r.symbol= _Symbol; r.price = tick.ask+0.000089849847658759198199999; r.sl = r.price - 503 * _Point; r.tp = r.price + 503 * _Point; r.volume= 1.127984984; CDouble::RoundTradeRequest(r); #endif
コンストラクタの概要
コンストラクタ | 詳細 |
---|---|
CDouble (const ENUM_PRECISION mode = PRECISION_DEFAULT, const string symbol = NULL) |
注意: args は呼び出し元で初期化されるため、明示的にコンストラクタを呼び出す必要はありません。 メソッド呼び出しに基づいて丸められた値を返すメソッドがあるため、精度メソッドを指定する必要もありません。 ENUM_PRECISION:
|
CDouble (const CDouble &other) |
コピーコンストラクタ: 他のオブジェクトのすべてのプライベートフィールドをこのオブジェクトにコピーします。 |
例:
CDouble num; CDouble bid(PRECISION_TICK_SIZE, _Symbol); CDouble ask(bid) CDouble ask2 = bid; CDouble lots(PRECISION_LOT_STEP, _Symbol);
割り当ての概要-オーバーロードされた代入演算子
修飾子と型 | メソッド | 詳細 |
---|---|---|
void |
Set(const double value) |
m_value に生の double 値を割り当てます。 |
void |
Set(const CDouble &other) |
CDouble オブジェクトの生の double 値を m_value に代入します。 |
void |
Overloaded operators =, +=, -=, *=, /= (double OR CDouble&) | 生の double 値を m_value に代入または変更します。 |
注: = 代入演算子は、宣言と同じ行で呼び出すことができます。
例:
CDouble bid; bid.Set(tick.bid); CDouble ask = tick.ask; CDouble pi = 3.14; CDouble factor = 2; pi*=factor; Print(pi.ToString()); //6.28
オーバーロードされた算術演算子の概要
修飾子と型 | メソッド | 詳細 |
---|---|---|
double |
オーバーロードされた演算子+, -, *, / (doubleまたはCDouble &) | 引数として、型 double または CDouble オブジェクトのいずれかを受け入れることができます。 オーバーロードされた演算子に関連付けられた算術演算のアプリケーションの後に double 値を返します。 |
注: 1 つのステートメントにつき使用できる算術演算子は一つだけです。
オーバーロードされた演算子算術の構文:
type_double_result <-- CDouble_object <-- operator <-- double //CDouble オブジェクトは、常に演算子の左側に移動します。 type_double_result <-- CDouble_object1 <-- operator <-- CDouble_object2 //2つの CDouble オブジェクトを使用する場合、順序は重要ではありません。
例:
CDouble foo = 3.14; CDouble bar = 10; CDouble foobar = bar + foo; //13.14 CDouble err = bar + foo + foobar; //エラー-不正な操作の使用 double var = bar / foo;
オーバーロードされた比較演算子の概要
修飾子と型 | メソッド | 詳細 |
---|---|---|
bool |
Overloaded operators ==, !=, >, <, >=, <= (double OR CDouble&) |
引数として、型 double または CDouble オブジェクトのいずれかを受け入れることができます。 値の比較の boolean を返します。 注意: 比較に Compare メソッド<static int>を使用しています。 |
例:
CDouble foo = 3.14, bar = 3.139999999999999999999; Print(foo == bar); //true Print(foo <= bar); //true Print(foo > bar); //false
インスタンスメソッドの概要
精密制御 (デフォルト): 数字 = 8;ステップ = 1e-08
- 精度を制御するには、ステップ、数字、または PrecisionMode (ENUM_PRECISION) の3つのメソッドがあります。 setter メソッドのいずれかを呼び出すと、前の設定が上書きされます。
- ステップは、_Point または LOT_STEP または TickSize のいずれかです。浮動小数点 (0.00001、0.025 など) として表されます。
- RoundToTick と RoundToLot は丸めリターンに対して適切なステップ値を自動的に使用するため、ステップを設定する必要はありません。
修飾子と型 | メソッド | 詳細 |
---|---|---|
void |
PrecisionMode (const ENUM_PRECISION mode) |
四捨五入計算と ToString のデフォルトのモードを設定します。 既存のステップと数字の設定を上書きします。 注意: コンストラクタで設定することもできます。 ENUM_PRECISION:
|
ENUM_PRECISION |
PrecisionMode() |
現在のタスク精度モードを返します。 |
void |
Step (const double step_or_point) |
ステップを指定した精度に設定します。 精度モードをオーバーライドします。 |
double |
Step() |
ステップの現在の値を返します。 |
void |
Digits (const int digits) |
指定した桁数に精度を設定します。 精度モードをオーバーライドし、ステップを 1e-(桁) に設定します。 |
int |
Digits() |
現在の有効桁数を返します。 |
double |
AsRawDouble() |
格納された double の生の値を返します。 |
double |
AsRounded() |
最も近い指定されたステップに丸められた値を返します。 default = 1e-08. PRECISION_TICK_SIZE すると、ステップはティックサイズにロックされます。 ステップは PRECISION_LOT_STEP 時にロットステップにロックされます。 |
double |
AsRoundedUp() |
指定されたステップに丸められた値を返します。 |
double |
AsRoundedDown() |
指定されたステップに丸められた値を返します。 |
double |
AsRoundedTick() |
シンボルのティックのサイズによって指定された最も近いティックに丸められた値を返します。 |
double |
AsRoundedLots (bool always_return_valid = true) |
シンボルのロットステップで指定された最も近いロットに丸められた値を返します。 |
int |
ToInt() |
int 値を返します。 |
long |
ToLong() |
long 値を返します。 |
string |
ToStringPrecision() |
0を持つ文字列を返します。 |
string |
ToString() |
切り捨てられたゼロを持つ文字列を返します。 |
string |
Symbol() |
現在のタスクシンボルを返します。 |
string |
シンボル(const 文字列シンボル) |
コンストラクタが呼び出された後、タスクシンボルをチャートシンボル以外のシンボルに設定します。 複数のシンボルを操作するときに使用します。 |
例:
CDouble pi2 = 3.14159265359; //値を取得... double raw_double = pi2.AsRawDouble(); double round_double_to_step = pi2.AsRounded(); double tick_size_double = pi2.AsRoundedTick(); double lot_step_double = pi2.AsRoundedLots(); double rounded_up = pi2.AsRoundedUp(); double rounded_down = pi2.AsRoundedDown(); int double_to_int = pi2.ToInt(); long double_to_long = pi2.ToLong(); string precision_str = pi2.ToStringPrecision(); pi2 = 3.140000000009; pi2.Digits(8); string truncated_str = pi2.ToString();
仮想メソッドの概要
CObject からオーバーライドされたメソッド:
修飾子と型 | メソッド | 詳細 |
---|---|---|
仮想 int |
Compare (const CObject *node, const int mode=0) |
並べ替えと検索に使用される Compare メソッドは、このオブジェクトの AsRounded 値を受信ノードの AsRounded 値と比較します。 |
仮想 int |
Type() |
TYPE_DOUBLE の int を返します。 |
virtual bool |
Save(const int file_handle) |
シリアル化し、受信ハンドルのファイルにメンバ変数を保存します。 |
virtual bool |
Load(const int file_handle) |
メンバ変数を、受信ハンドルのファイルに保存されている値に設定します。 |
例は以下の CDoubleVector を参照してください。
CDoubleVector
CDoubleVector クラスは、CDouble 動的インスタンスに特化したオブジェクトポインターコレクションです。
宣言
class CDoubleVector : public CArrayObj
Title
#include <Double.mqh>
継承階層
クラス CArrayObj から実装またはオーバーライドされた仮想メソッド: CreateElement。
インスタンスメソッドの概要
* * 継承されたパブリックメソッドのCArrayObjを参照してください。
修飾子と型 | メソッド | 詳細 |
---|---|---|
CDouble* |
operator[] (const int index) |
オーバーロードされたインデックス演算子です。 ベクター内の n 個のインデックスにあるオブジェクトへのポインターを返します。 |
bool |
Add(const double value) |
プリミティブ double を引数として受け取り、これを CDouble オブジェクトに変換して、ベクターのトレーリングストップに追加します。 |
bool |
AssignDoubleArray (const double &array[]) |
double の配列を受け取り、を CDouble オブジェクトに変換し、ベクターに割り当てます。 |
bool |
CopyOut(double &arr[]) |
ベクター内の CDouble 値をプリミティブ double 配列にコピーします。 |
bool |
CopyOut(CArrayDouble &arr) |
ベクター内の CDouble 値を CDoubleArray コレクションにコピーします。 |
virtual bool |
Save(const int file_handle) |
受信ファイルハンドルで指定されたファイルにベクタを保存します。 |
virtual bool |
Load(const int file_handle) |
受信ファイルハンドルで指定されたファイルから、保存されたベクタ状態を読み込みます。 |
例:
CDoubleVector *vect = new CDoubleVector; double dubs[]={3.14,1.21,55.555}; vect.AssignDoubleArray(dubs); vect.Add(tick.bid); //インデックスによる CDouble オブジェクトの呼び出し Print(vect[vect.Total()-1].ToString()); //新しい CDouble オブジェクトを追加する CDouble *lot = new CDouble(PRECISION_LOT_STEP); lot = 1.22; vect.Add(lot); //並べ替えベクトル昇順 vect.Sort(); int total = vect.Total(); //CDouble オブジェクトの状態と値を含むファイルへのベクタの保存 string f = "testdub.bin"; int h = FileOpen(f,FILE_WRITE|FILE_BIN); if(vect.Save(h)) Print("save successful"); FileClose(h); delete vect; //ファイルからベクトルをロード CDoubleVector vect_reborn; h=FileOpen(f,FILE_READ|FILE_BIN); if(vect_reborn.Load(h)) Print("load successful"); FileClose(h); total = vect_reborn.Total(); Print("Total vector size = ",sizeof(vect_reborn)," bytes"); for(int i=0;i<vect_reborn.Total();i++) Print(vect_reborn[i].ToString()); //double arr にコピーします。 double arr2[]; vect_reborn.CopyOut(arr2); Print(ArraySize(arr2));
MetaQuotes Ltdによって英語から翻訳されました。
元のコード: https://www.mql5.com/en/code/19727
![レンコン2.0](https://c.mql5.com/i/code/indicator.png)
芯を持つ完全なレンコンチャートインジケータ。 ティックサイズ、Pip サイズ、またはポイントを使用して構成します。
![EES Hedger](https://c.mql5.com/i/code/expert.png)
このユーティリティは、現在のシンボルに対して裁量または別の EA によって開かれたポジションを追跡し、反対のポジションを開きます。 ポジションを開くと、OnTradeTransaction で追跡されます。
![AbsolutelyNoLagLWMA](https://c.mql5.com/i/code/indicator.png)
ダブル LWMA を使用した移動平均とカラーでの実装。
![インターセプター](https://c.mql5.com/i/code/expert.png)
チャート M5、M15、H1 の移動平均を分析します。 iMA (移動平均、MA) "ファン " の存在は、すべての3つのチャート (M5、M15、および H1) で同時にチェックされます。