//+------------------------------------------------------------------+ //| テンプレート関数 | //+------------------------------------------------------------------+ template<typename T1,typename T2> string Assign(T1 &var1,T2 var2) { var1=(T1)var2; return(__FUNCSIG__); } //+------------------------------------------------------------------+ //| bool+stringのための特別のオーバーロード | //+------------------------------------------------------------------+ string Assign(bool &var1,string var2) { var1=(StringCompare(var2,"true",false) || StringToInteger(var2)!=0); return(__FUNCSIG__); } //+------------------------------------------------------------------+ //| スクリプトプログラム開始関数 | //+------------------------------------------------------------------+ void OnStart() { int i; bool b; Print(Assign(i,"test")); Print(Assign(b,"test")); }コード実行の結果、Assign()テンプレート関数はint+stringのペアで使用され、オーバーロードされたバージョンは2回目の呼び出しでbool+stringペアですでに使用されていることがわかります。
string Assign<int,string>(int&,string) string Assign(bool&,string)
template<typename T> T Func() { return (T)0; } void OnInit() { Func<double>(); // 明示的テンプレート関数の特殊化 }したがって、型定義は、呼び出しパラメータを使用するのではなく、型の明示的な指定によって実行されます。
ドキュメントを更新しました。
ドキュメントを更新しました。
#resource path_to_resource_file as type_of_resource_variable name_of_resource_variable
#resource "data.bin" as int ExtData[] // data.binファイルのデータを含む数値配列の宣言 #resource "data.bin" as MqlRates ExtData[] // data.binファイルのデータを含む単純構造配列の宣言 #resource "data.txt" as string ExtCode // data.txtファイルのデータを含む文字列の宣言 #resource "data.txt" as string ExtCode[] // data.txtファイルのデータを含む文字列の宣言 #resource "image.bmp" as bitmap ExtBitmap[] // BMPファイルからのビットマップを含む1次元配列の宣言、array size = width * height #resource "image.bmp" as bitmap ExtBitmap2[][] // BMPファイルからビットマップを含む2次元配列を宣言する、array size [hight][width]
ドキュメントを更新しました。
string str; ... if(str) // 「Cannot convert type 'string' to 'bool(string型はboolに変換できません)」コンパイルエラーが発生する(以前のバージョンではエラーは表示されない) Print("str is true");明示的な条件の使用が必要です。
string str; ... //--- 文字列が初期化されているかを確認する if(str!=NULL) Print("str is true"); または //--- 文字列の値が「true」かどうかを確認する if(StringCompare(str,"true",false)) Print("str is true"); または //--- 文字列が整数でゼロと等しいかどうかを確認する「true」かどうかを確認する if((int)str!=0) Print("str is true");
void ArrayPrint( const void& array[], // 出力配列 uint digits=_Digits, // 小数点以下の桁数 const string separator=NULL, // 構造体フィールド間の区切り文字の値 ulong start=0, // 初めに表示される要素のインデックス ulong count=WHOLE_ARRAY, // 表示される要素の数 ulong flags=ARRAYPRINT_HEADER|ARRAYPRINT_INDEX|ARRAYPRINT_LIMIT|ARRAYPRINT_ALIGN );ArrayPrintは構造体配列のすべてのフィールドをログに出力するものではありません。オブジェクトの配列フィールドとポインタフィールドは抜かされます。すべての構造体のフィールドを出力する必要がある場合は、希望の書式を使用して独自のマス出力関数を記述する必要があります。
//--- 最後の10バーの値を出力する MqlRates rates[]; if(CopyRates(_Symbol,_Period,1,10,rates)) { ArrayPrint(rates); Print("Проверка\n[time]\t[open]\t[high]\t[low]\t[close]\t[tick_volume]\t[spread]\t[real_volume]"); for(int i=0;i<10;i++) { PrintFormat("[%d]\t%s\t%G\t%G\t%G\t%G\t%G\t%G\t%I64d\t",i, TimeToString(rates[i].time,TIME_DATE|TIME_MINUTES|TIME_SECONDS), rates[i].open,rates[i].high,rates[i].low,rates[i].close, rates[i].tick_volume,rates[i].spread,rates[i].real_volume); } } else PrintFormat("CopyRates failed, error code=%d",GetLastError()); //--- ログの例 /* [time] [open] [high] [low] [close] [tick_volume] [spread] [real_volume] [0] 2016.11.09 04:00:00 1.11242 1.12314 1.11187 1.12295 18110 10 17300175000 [1] 2016.11.09 05:00:00 1.12296 1.12825 1.11930 1.12747 17829 9 15632176000 [2] 2016.11.09 06:00:00 1.12747 1.12991 1.12586 1.12744 13458 10 9593492000 [3] 2016.11.09 07:00:00 1.12743 1.12763 1.11988 1.12194 15362 9 12352245000 [4] 2016.11.09 08:00:00 1.12194 1.12262 1.11058 1.11172 16833 9 12961333000 [5] 2016.11.09 09:00:00 1.11173 1.11348 1.10803 1.11052 15933 8 10720384000 [6] 2016.11.09 10:00:00 1.11052 1.11065 1.10289 1.10528 11888 9 8084811000 [7] 2016.11.09 11:00:00 1.10512 1.11041 1.10472 1.10915 7284 10 5087113000 [8] 2016.11.09 12:00:00 1.10915 1.11079 1.10892 1.10904 8710 9 6769629000 [9] 2016.11.09 13:00:00 1.10904 1.10913 1.10223 1.10263 8956 7 7192138000 Check [time] [open] [high] [low] [close] [tick_volume] [spread] [real_volume] [0] 2016.11.09 04:00:00 1.11242 1.12314 1.11187 1.12295 18110 10 17300175000 [1] 2016.11.09 05:00:00 1.12296 1.12825 1.1193 1.12747 17829 9 15632176000 [2] 2016.11.09 06:00:00 1.12747 1.12991 1.12586 1.12744 13458 10 9593492000 [3] 2016.11.09 07:00:00 1.12743 1.12763 1.11988 1.12194 15362 9 12352245000 [4] 2016.11.09 08:00:00 1.12194 1.12262 1.11058 1.11172 16833 9 12961333000 [5] 2016.11.09 09:00:00 1.11173 1.11348 1.10803 1.11052 15933 8 10720384000 [6] 2016.11.09 10:00:00 1.11052 1.11065 1.10289 1.10528 11888 9 8084811000 [7] 2016.11.09 11:00:00 1.10512 1.11041 1.10472 1.10915 7284 10 5087113000 [8] 2016.11.09 12:00:00 1.10915 1.11079 1.10892 1.10904 8710 9 6769629000 [9] 2016.11.09 13:00:00 1.10904 1.10913 1.10223 1.10263 8956 7 7192138000 */
void OnStart() { int arr[]; //--- 最初に使用されるメモリの量 Print("Array size:",ArraySize(arr)," Memory used:",MQLInfoInteger(MQL_MEMORY_USED)," MB"); //--- サイズ1の配列に使用されたメモリ量(リサーブ(予備)あり) ArrayResize(arr,1,1024*1024); Print("Array size:",ArraySize(arr)," Memory used:",MQLInfoInteger(MQL_MEMORY_USED)," MB"); //--- 予備があるため、使用されたメモリの量は要素数の増加後には変更されない ArrayResize(arr,1024*512,1024*1024); Print("Array size:",ArraySize(arr)," Memory used:",MQLInfoInteger(MQL_MEMORY_USED)," MB"); //--- メモリサイズは配列を縮小した後にも変更されない ArrayResize(arr,1); Print("Array size:",ArraySize(arr)," Memory used:",MQLInfoInteger(MQL_MEMORY_USED)," MB"); //--- 未使用メモリは予備の削除後に解放される ArrayResize(arr,1,-1); Print("Array size:",ArraySize(arr)," Memory used:",MQLInfoInteger(MQL_MEMORY_USED)," MB"); }
#include <Graphics/Graphic.mqh> double Func1(double x) { return MathPow(x,2); } double Func2(double x) { return MathPow(x,3); } double Func3(double x) { return MathPow(x,4); } void OnStart() { GraphPlot(Func1,Func2,Func3,-2,2,0.05,CURVE_LINES); }結果:
#include <Math/Stat/Binomial.mqh> #include <Graphics/Graphic.mqh> void OnStart(void) { double vars[101]; double results[101]; const int N=2000; //--- MathSequence(0,N,20,vars); MathProbabilityDensityBinomial(vars,N,M_PI/10,true,results); ArrayPrint(results,4); GraphPlot(results); //--- }結果:
ドキュメントを更新しました。
トレードダイアログの買、売、及び決済ボタンにツールヒントが追加されました。ツールヒントには、初心者が取引プロセスを理解するために、操作中に売買される証券に関する情報が含まれています。
標準ライブラリにALGLIB数値解析ライブラリのMQL5 版が追加されました。
ライブラリ機能
使用法
ALGLIBファイルは \MQL5\Include\Math\Alglibに位置します。関数を使用するには、メインライブラリファイルをお使いのプログラムに追加なさってください。
標準ライブラリに数理統計機能が追加されました。R言語機能がMQL5で提供されるようになりました。これは、統計データ処理と解析のための最良なツールのうちの1つです。
ライブラリ機能
統計ライブラリには、データの統計的特性を計算するための関数や統計分布と操作のための関数が含まれています。
使用法
統計ライブラリファイルは \MQL5\Include\Math\Stat に位置します。関数を使用するには、下記の例が示すように、必要な関数を含むファイルをお使いのプログラムに追加します。
#include <Math\Stat\Binomal.mqh> #include <Math\Stat\Cauchy.mqh>
ライブラリ関数の詳細はStatistical Distributions in MQL5 - Taking the Best of R(MQL5での統計的分布 - Rの活用)稿で説明されています。
標準ライブラリにファジィライブラリのMQL5 版が追加されました。ファジィライブラリはマムダニ及び菅野ファジィ推論法を実装します。
ライブラリ機能
使用法
ファジィライブラリファイルは\MQL5\Include\Math\Fuzzyに位置します。関数を使用するには、下記の例が示すように、必要な関数を含むファイルをお使いのプログラムに追加します。
#include <Math\Fuzzy\mamdanifuzzysystem.mqh> #include <Math\Fuzzy\sugenofuzzysystem.mqh>
ライブラリの詳細はコードベースのファジィ - ファジィモデル開発のためのライブラリで参照できます。
long FileLoad( const string filename, // [in] ファイル名 void &buffer[], // [out] ファイルが読み込まれる配列 uint common_flag=0 // [in] 0 - 端末のFilesフォルダでファイルを探す、FILE_COMMON - 端末の共通ディレクトリでファイルを探す ); bool FileSave( const string filename, // [in] ファイル名 const void &buffer[], // [in] ファイルが保存される配列 uint common_flag=0 // [in] 端末のFilesフォルダでファイルを作成する、FILE_COMMON - 端末の共通ディレクトリでファイルを作成する );ファイルにティックを書き込んでから読み取るメソッドの例:
//--- 入力パラメータ input int ticks_to_save=1000; // ティック数 //+------------------------------------------------------------------+ //| スクリプトプログラム開始関数 | //+------------------------------------------------------------------+ void OnStart() { string filename=_Symbol+"_ticks.bin"; MqlTick ticks[]; //--- int copied=CopyTicks(_Symbol,ticks,COPY_TICKS_ALL,0,ticks_to_save); if(copied!=-1) { PrintFormat(" CopyTicks(%s) copied %d ticks",_Symbol,copied); //--- ティック履歴が同期されている場合はエラーコードは0に等しい if(!GetLastError()==0) PrintFormat("%s: Ticks are not synchronized. Error=",_Symbol,copied,_LastError); //--- ファイルにティックを書き込む if(!FileSave(filename,ticks,FILE_COMMON)) PrintFormat("FileSave() failed, error=%d",GetLastError()); } else PrintFormat("Failed CopyTicks(%s), Error=",_Symbol,GetLastError()); //--- ファイルにティックを読み返す ArrayFree(ticks); long count=FileLoad(filename,ticks,FILE_COMMON); if(count!=-1) { Print("Time\tBid\tAsk\tLast\tVolume\tms\tflags"); for(int i=0;i<count;i++) { PrintFormat("%s.%03I64u:\t%G\t%G\t%G\t%I64u\t0x%04x", TimeToString(ticks[i].time,TIME_DATE|TIME_SECONDS),ticks[i].time_msc%1000, ticks[i].bid,ticks[i].ask,ticks[i].last,ticks[i].volume,ticks[i].flags); } } }
//--- 同じ色で塗られたローソク足 #property indicator_label1 "One color candles" #property indicator_type1 DRAW_CANDLES //--- 1色のみが設定されたのでローソク足の色はすべて同じ #property indicator_color1 clrGreen2色が指定された場合は1番目の色がローソク足の輪郭、2番目が実体に適用されます。
//--- ローソク足の実体の色は髭の色と異なる #property indicator_label1 "Two color candles" #property indicator_type1 DRAW_CANDLES //--- ローソクの輪郭と髭は緑で実体は白 #property indicator_color1 clrGreen,clrWhite3色が指定された場合は1番目の色がローソク足の輪郭、2、3番目の色が強気/弱気ローソク足の実体に適用されます。
//--- ローソク足の実体の色は髭の色と異なる #property indicator_label1 "One color candles" #property indicator_type1 DRAW_CANDLES //--- ローソクの輪郭と髭は緑、強気ローソク足の実体は白、弱気ローソク足の実体は赤 #property indicator_color1 clrGreen,clrWhite,clrRedDRAW_CANDLESスタイルはカスタムキャンドル着色を可能にします。また、すべての色はPlotIndexSetInteger function (composition_index_DRAW_CANDLES, PLOT_LINE_COLOR, modifier_index, color)関数を使用してインディケータの動作中に動的に変更することができ、ここでmodifier_indexの持つ値は次のいずれかです。
//--- 輪郭と髭の色の設定 PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,clrBlue); //--- 強気ローソク足の実体の色の設定 PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,clrGreen); //--- 弱気ローソク足の実体の色の設定 PlotIndexSetInteger(0,PLOT_LINE_COLOR,2,clrRed);
ドキュメントを更新しました。
class CFoo final { //--- クラス本体 }; class CBar : public CFoo { //--- クラス本体 };final修飾子を使用したクラスからの継承を試行すると、上記の例で示したように、コンパイルはエラーを出します。
class CFoo { void virtual func(int x) const { } };次にメソッドを派生クラスでオーバーライドします:
class CBar : public CFoo { void func(short x) { } };しかしエラーによって引数の型がintからshortに変わります。実際には、このような場合、オーバーライドではなくメソッドのオーバーロードが起こります。オーバーロードされた関数定義のアルゴリズムに従い、特定のケースにおいてコンパイラがオーバーライドされたメソッドの代わりに基底クラスで定義されたメソッドを選択することがあります。
class CBar : public CFoo { void func(short x) override { } };オーバーライド時にメソッドシグネチャが変更された場合、コンパイラは親クラスで全く同じシグネチャを見つけることができず、コンパイルエラーを出します。
class CFoo { void virtual func(int x) final { } }; class CBar : public CFoo { void func(int) { } };final修飾子を使用したメソッドのオーバーライドを試行すると、上記の例で示したように、コンパイルはエラーを出します。
ドキュメントが更新されました。
class CFoo { }; class CBar { }; //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { void *vptr[2]; vptr[0]=new CFoo(); vptr[1]=new CBar(); //--- for(int i=0;i<ArraySize(vptr);i++) { if(dynamic_cast<CFoo *>(vptr[i])!=NULL) Print("CFoo * object at index ",i); if(dynamic_cast<CBar *>(vptr[i])!=NULL) Print("CBar * object at index ",i); } CFoo *fptr=vptr[1]; // ポインタを与えるエラー、vptr[1]はCFooオブジェクトではありません } //+------------------------------------------------------------------+
string text="Hello"; ushort symb=text[0]; // シンボル'H'のコードを返します
ドキュメントが更新されました。
テスト時の年率での手数料の計算が修正されました。
テストの過程で作成されるチャート上の残高の計算および表示が修正されました。
公開テストから2か月後、MetaTrader 5マルチマーケットプラットフォームのウェブバージョンが公式にリリースされました。これはあらゆるOSのあらゆるブラウザから、金融市場取引が行えるものです。また、コンピュータにプログラムをインストールする必要がなく、任意のウェブブラウザとインターネット接続があれば十分です。
アプリケーションは、ウェブソリューションのクロスプラットフォーム性と利便性を備え、デスクトップ版プラットフォームの主要な利点(スピー ド、マルチマーケット性、取引機能の拡張)を持つものです。リリースバージョンの重要な革新は、市場の深さを見ることができ、ワンクリックで成行/指値注 文を発注することができる板注文画面です。
ウェブプラットフォームによって、デスクトップ版と同様に取引操作を行ったり、テクニカル分析を行うことができます。アプリケーションで利用できるもの:
デスクトッププラットフォームからモバイルプラットフォームへのSSL証明書の移動は簡単です。iTunesはもう必要ありません。
MetaTrader 5では、証明書を使用しあなたの口座に特別な保護を追加することができます。証明書が無ければ口座への接続はできません。証明書がデスクトップ版で作成さ れている場合、モバイルプラットフォームの口座に接続するには、証明書を移動する必要があります。
証明書を移動するには、デスクトッププ ラットフォームを開き、ナビゲータウィンドウで必要な口座を右クリックし移動を選択するだけです。あなただけが知る証明書の保護の為のパスワードを設定 し、それからモバイルプラットフォームを開き、口座に接続します。すぐに証明書をインポートするよう提案するメッセージが表示されます。
また、MetaTrader 4から移動された口座には、移行ダイアログが表示されます。あなたの口座が第五世代プラットフォームに移動された場合、暖かいウェルカムメッセージと共に新機能についての情報が提供され、パスワードを変更するよう提案されます。