無料でロボットをダウンロードする方法を見る
Twitter上で私たちを見つけてください。
私たちのファンページに参加してください
興味深いスクリプト?
それではリンクにそれを投稿してください。-
他の人にそれを評価してもらいます
記事を気に入りましたか?MetaTrader 5ターミナルの中でそれを試してみてください。
ライブラリ

CDouble & CDoubleVector - MetaTrader 5のためのライブラリ

ビュー:
936
評価:
(25)
パブリッシュ済み:
2018.09.17 10:39
\MQL5\Scripts\CDoubleDebug\
Double.mqh (28.61 KB) ビュー
このコードに基づいたロボットまたはインジケーターが必要なら、フリーランスでご注文ください フリーランスに移動

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 型のオブジェクトには、次の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 を比較し、整数を返します。
  • 等しい場合は0。
  • number1 > number2 の場合は1。
  • number1 < number2の場合は-1
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

(double &arr[], double step = NULL)

step = = NULL の場合、配列全体を指定されたステップまたは現在のシンボルのティックサイズに丸めます。
static void
RoundArrayToStep

(CArrayDouble &arr, double step = NULL)

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

(double number, int digits)

数字に丸められた浮動小数点数の文字列を返し、トレーリングのゼロを切り捨てます (例 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:

  • PRECISION_DEFAULT-Step() またはDigits() を呼び出すことによってオーバーライドすることができる1と8桁のステップにデフォルトの精度を設定します。
  • PRECISION_TICK_SIZE-すべてのラウンディングメソッドを指定されたシンボルのティックサイズにロックします。
  • PRECISION_LOT_STEP-指定されたシンボルのロットステップにすべてのラウンディングメソッドをロックします。
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:

  • PRECISION_DEFAULT-Step() またはDigits() を呼び出すことによってオーバーライドすることができる1桁と8桁のステップにデフォルトの精度を設定します。
  • PRECISION_TICK_SIZE-すべてのラウンディングメソッドを指定されたシンボルのティックサイズにロックします。
  • PRECISION_LOT_STEP-指定されたシンボルのロットステップにすべてのラウンディングメソッドをロックします。
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 レンコン2.0

芯を持つ完全なレンコンチャートインジケータ。 ティックサイズ、Pip サイズ、またはポイントを使用して構成します。

EES Hedger EES Hedger

このユーティリティは、現在のシンボルに対して裁量または別の EA によって開かれたポジションを追跡し、反対のポジションを開きます。 ポジションを開くと、OnTradeTransaction で追跡されます。

AbsolutelyNoLagLWMA AbsolutelyNoLagLWMA

ダブル LWMA を使用した移動平均とカラーでの実装。

インターセプター インターセプター

チャート M5、M15、H1 の移動平均を分析します。 iMA (移動平均、MA) "ファン " の存在は、すべての3つのチャート (M5、M15、および H1) で同時にチェックされます。