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から移動された口座には、移行ダイアログが表示されます。あなたの口座が第五世代プラットフォームに移動された場合、暖かいウェルカムメッセージと共に新機能についての情報が提供され、パスワードを変更するよう提案されます。
以前 |
現在 |
|
---|---|---|
作動 | Bid/Askによる全てのタイプの指値注文とストップロス/テイクプロフィット |
Bid/Askによるリミットオーダー Lastによるストップ、ストップリミット、ストップロス/テイクプロフィット注文 |
実行 | 注文で指定された価格による全てのタイプの指値注文とストップロス/テイクプロフィット |
作動時のBid/Ask価格による全てのタイプの指値注文とストップロス/テイクプロフィット |
Si-6.16での例を見てみましょう。現在価格が、Bid=72570、Ask=72572、Last=72552で、バイストップオーダーが72580で発注されました。価格変動で新しい現在価格は、以下のようになりました。
株式商品では、ストップオーダー作動のトリガーはLast価格です。従って、Last価格が72580になったことで、バイストップオーダーが有効になり
ました。以前では、この72580という価格は、この注文の実行に使用されました。買い操作の実行の為のAsk=72580という価格は市場にはないの
で、このような動作は正しくないものでした。
クラッシュログで報告された不具合を修正しました。
トレーダーからの多数の要望により、MetaTrader 5取引プラットフォームのウェブ バージョンが開発されました。新製品はスピード、マルチマーケット性、取引機能の拡張といったデスクトップ版『5』の利点を持つ、ウェブプラットフォーム の利便性とクロスプラットフォーム性を兼ね備えたものとなっています。
MetaTrader 5ウェブプラットフォームがMQL5.communityのサイトで利用可能になり、あらゆるOS(Windows、Mac、Linux)のあらゆるブラウザから金融市場取引を行うことができるようになりました。プログラムをインストールする必要はなく、インターネット接続があれば十分です。
β版でトレーダーがすぐに利用できるもの:
ネッティングシステム
この計算システムは、アカウント上では一度に1つのシンボルにつき1つのポジションのみ開くことができるということを念頭に置いています。
この時、どのようなアクションの結果、反対方向に取引が行われるかや、市場の注文や指値注文の実行の結果は重要ではありません。
以下に、0.5ロットのボリュームでのEURUSDの二つの買い取引の実行例を引用しました。
これらの取引の実行結果は、1ロットのボリュームの1つの共通ポジションになりました。
ヘッジングシステム
この計算システムはアカウントに、同じシンボルに対し反対方向のものを含む、複数の取引ポジションを持つことを可能にします。
取引シンボルに開いているポジションがあり、トレーダーが新しい取引を実行する(または指値注文が作動する)場合、新しいポジションが開かれます。既存のポジションは変化しません。
以下に、0.5ロットのボリュームでのEURUSDの二つの買い取引の実行例を引用しました。
これらの取引が実行された結果、2つの別個のポジションが開かれました。
新しい取引操作タイプ Close By
ヘッ
ジングポジション計算のアカウントの為に、反対のポジションを閉じる新しいタイプの取引操作が追加されました。この操作によって、同じシンボルでの反対方
向の2つのポジションを同時に閉じることができます。もし相対するポジションが様々なロット数を持っている場合、2つのうちの1つの注文のみが開いたまま
残ります。このボリュームは、2つのクローズポジションのロット差と等しくなり、ポジションの方向とオープン価格は、クローズポジションのうちの(ボ
リューム的に)大きい方と等しくなります。
2つのポジションの単一のクローズと比較すると、相対クローズでは、トレーダーは1つのスプレッドを節約することができます。
相対ポジションのクローズ時に、『close by』のタイプの注文が設定されます。閉じられるポジションのチケットが、コメントで指定されます。相対ポジションのペアのクローズは、『out by』タイプの2つの取引によって行われます。両方のポジションのクローズの結果によって得られる取引の利益/損失のサイズは、1つの取引でのみ指定され ます。
class CAnimal { public: CAnimal(); // 構造 virtual void Sound() = 0; // 純粋仮想関数 private: double m_legs_count; // 足数 };ここでのSound()関数は、純粋仮想関数PURE(=0)の指定子で宣言されている為、純粋仮想となります。
class CAnimal { public: virtual void Sound()=NULL; // PUREメソッドは派生クラスでオーバーライドする必要があり、CAnimalクラス自体は抽象クラスになり、作成されません }; //--- 抽象クラスからの子孫 class CCat : public CAnimal { public: virtual void Sound() { Print("Myau"); } // PUREは再定義され、CCatクラスは抽象ではなく作成されません }; //--- 誤用例 new CAnimal; // エラー『CAnimal』-コンパイラはエラー"cannot instantiate abstract class"を出します CAnimal some_animal; // エラー『CAnimal』- コンパイラはエラー『cannot instantiate abstract class』を出します //--- 正しい使用例 new CCat; // エラーはありません。CCatクラスは抽象ではありません CCat cat; // エラーはありません。CCatクラスは抽象ではありません抽象クラス使用の制限
//+------------------------------------------------------------------+ //| 抽象基底クラス | //+------------------------------------------------------------------+ class CAnimal { public: //--- 純粋仮想関数 virtual void Sound(void)=NULL; //--- 関数 void CallSound(void) { Sound(); } //--- コンストラクタ CAnimal() { //--- 仮想メソッドの明示的呼び出し Sound(); //--- 暗黙的呼び出し(第三関数を介して) CallSound(); //--- コンストラクタまたはデストラクタでは、常に自分の関数が呼び出されます //--- 仮想性や子孫を呼び出す関数に関わりません //--- もし呼び出される関数が純粋仮想である場合、 //--- 呼び出しは重大な実行エラー"pure virtual function call"をもたらします } };しかしながら、抽象クラスのコンストラクタとデストラクタは、他のメンバー関数を呼び出すことができます。
typedef int (*TFunc)(int,int);これで、TFuncがタイプとなり、変数の関数ポインターを宣言することができます。
TFunc func_ptr;func_ptr変数に、以後の呼び出しの為に、関数のアドレスを保存することができます。
int sub(int x,int y) { return(x-y); } int add(int x,int y) { return(x+y); } int neg(int x) { return(~x); } func_ptr=sub; Print(func_ptr(10,5)); func_ptr=add; Print(func_ptr(10,5)); func_ptr=neg; // エラー: negはint (int,int)型を持っていません Print(func_ptr(10)); // エラー: 二つのパラメータが存在する必要があります関数のポインターを保存し、パラメータとして引き渡すことができます。クラスの非静的メソッドにポインターを取得することはできません。
ulong PositionGetTicket( int index // ポジションリスト内の番号 );
bool PositionSelectByTicket(
ulong ticket // ポジションのチケット
);
ネッティングシステム
この計算システムは、アカウント上では一度に1つのシンボルにつき1つのポジションのみ開くことができるということを念頭に置いています。
この時、どのようなアクションの結果、反対方向に取引が行われるかや、市場の注文や指値注文の実行の結果は重要ではありません。
以下に、0.5ロットのボリュームでのEURUSDの二つの買い取引の実行例を引用しました。
これらの取引の実行結果は、1ロットのボリュームの1つの共通ポジションになりました。
ヘッジングシステム
この計算システムはアカウントに、同じシンボルに対し反対方向のものを含む、複数の取引ポジションを持つことを可能にします。
取引シンボルに開いているポジションがあり、トレーダーが新しい取引を実行する(または指値注文が作動する)場合、新しいポジションが開かれます。既存のポジションは変化しません。
以下に、0.5ロットのボリュームでのEURUSDの二つの買い取引の実行例を引用しました。
これらの取引が実行された結果、2つの別個のポジションが開かれました。
新しい取引操作タイプ Close By
ヘッ ジングポジション計算のアカウントの為に、反対のポジションを閉じる新しいタイプの取引操作が追加されました。この操作によって、同じシンボルでの反対方
向の2つのポジションを同時に閉じることができます。もし相対するポジションが様々なロット数を持っている場合、2つのうちの1つの注文のみが開いたまま
残ります。このボリュームは、2つのクローズポジションのロット差と等しくなり、ポジションの方向とオープン価格は、クローズポジションのうちの(ボ
リューム的に)大きい方と等しくなります。
2つのポジションの単一のクローズと比較すると、相対クローズでは、トレーダーは1つのスプレッドを節約することができます。
相対ポジションのクローズ時に、『close by』のタイプの注文が設定されます。閉じられるポジションのチケットが、コメントで指定されます。相対ポジションのペアのクローズは、『out by』タイプの2つの取引によって行われます。両方のポジションのクローズの結果によって得られる取引の利益/損失のサイズは、1つの取引でのみ指定され ます。
class CAnimal { public: CAnimal(); // コンストラクタ virtual void Sound() = 0; // 純粋仮想関数 private: double m_legs_count; // 足の数 };<t0>ここでのSound()関数は、純粋仮想関数PURE(=0)の指定子で宣言されている為、純粋仮想となります。
class CAnimal { public: virtual void Sound()=NULL; // PUREメソッドは派生クラスでオーバーライドする必要があり、CAnimalクラス自体は抽象クラスになり、作成されません }; //--- 抽象クラスからの派生 class CCat : public CAnimal { public: virtual void Sound() { Print("Myau"); } // PUREはオーバーライドする必要があり、CCatクラスは抽象クラスではなく、作成することができます }; //--- 間違った使用例 new CAnimal; //『CAnimal』エラーは、コンパイラは「抽象クラスをインスタンス化できません」というエラーを出します CAnimal some_animal; // CAnimal』エラーは、コンパイラは「抽象クラスをインスタンス化できません」というエラーを出します //--- 正しい使用例 new CCat; // エラーはなく、CCatクラスは抽象クラスではありません CCat cat; // エラーはなく、CCatクラスは抽象クラスではありません抽象クラスの使用の制限
//+------------------------------------------------------------------+ //| 抽象基底クラス | //+------------------------------------------------------------------+ class CAnimal { public: //--- 純粋仮想関数 virtual void Sound(void)=NULL; //--- 関数 void CallSound(void) { Sound(); } //--- コンストラクタ CAnimal() { //--- 仮想メソッドの明示的な呼び出し Sound(); //--- 明示的ではない呼び出し(第三の関数を介した) CallSound(); //--- コンストラクタまたはデストラクタは常に自分の関数を呼び出す //--- 派生クラスでの呼び出された関数によるオーバーライドや仮想性に関わらず //--- もし、呼び出される関数が純粋仮想の場合、 //--- 呼び出しは重大なランタイムエラーをもたらします:『純粋仮想関数呼び出し』 } };しかしながら、抽象クラスのコンストラクタとデストラクタは、他のメンバー関数を呼び出すことができます。
typedef int (*TFunc)(int,int);これで、TFuncがタイプとなり、変数の関数ポインターを宣言することができます。
TFunc func_ptr;func_ptr変数に、以後の呼び出しの為に、関数のアドレスを保存することができます。
int sub(int x,int y) { return(x-y); } int add(int x,int y) { return(x+y); } int neg(int x) { return(~x); } func_ptr=sub; Print(func_ptr(10,5)); func_ptr=add; Print(func_ptr(10,5)); func_ptr=neg; // エラー: negはint (int,int)タイプを持っていません。 Print(func_ptr(10)); // エラー:二つのパラメータがある必要があります関数のポインターを保存し、パラメータとして引き渡すことができます。クラスの非静的メソッドにポインターを取得することはできません。
ulong PositionGetTicket( int index // ポジションリストの番号 );
bool PositionSelectByTicket(
ulong ticket // ポジションのチケット
);
新しい計算システムは、MetaTrader 4と同様です。トレーダーは、複数の取引の実行(部分的なものを含む)や、ストップリミット注文など、第五世代プラットフォームの全ての長所を使用することができます。
更新後すぐにヘッジングを使った取引を試すことができます。デモアカウントの開設時に、\"ヘッジングを使用する\"というオプションを有効にしてください。これは、ブローカーの取引サーバーが既に更新および設定されている場合、利用可能になります。