//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//---
matrix a= {{1, 2, 3}, {4, 5, 6}};
Print("a before Swap: \n", a);
matrix b= {{5, 10, 15, 20}, {25, 30, 35, 40}, {45, 50, 55, 60}};
Print("b before Swap: \n", b);
//--- swap matrix pointers
a.Swap(b);
Print("a after Swap: \n", a);
Print("b after Swap: \n", b);
/*
a before Swap:
[[1,2,3]
[4,5,6]]
b before Swap:
[[5,10,15,20]
[25,30,35,40]
[45,50,55,60]]
a after Swap:
[[5,10,15,20]
[25,30,35,40]
[45,50,55,60]]
b after Swap:
[[1,2,3]
[4,5,6]]
*/
vector v=vector::Full(10, 7);
Print("v before Swap: \n", v);
Print("b before Swap: \n", b);
v.Swap(b);
Print("v after Swap: \n", v);
Print("b after Swap: \n", b);
/*
v before Swap:
[7,7,7,7,7,7,7,7,7,7]
b before Swap:
[[1,2,3]
[4,5,6]]
v after Swap:
[1,2,3,4,5,6]
b after Swap:
[[7,7,7,7,7,7,7,7,7,7]]
*/
}
2022年11月4日(金)にMetaTrader 5プラットフォームのアップデートがリリースされます。
このアップデートでは、モバイルデバイスを完全にサポートする新しいWebターミナルが導入されています。そのインターフェイスがユーザーの画面サイズに自動的に適応するようになりました。
さらに、消費されたリソースをより正確に監視するためにタスクマネージャーを改善し、利用可能なデバイスを管理するためのOpenCLタブを追加しました。新しいOpenCLマネージャーを使用すると、デバイスを明示的に指定して計算を高速化できます。
行列とベクトルを扱うプラットフォーム機能は拡張し続けられています。MQL5は、価格ティックを伴う操作と、行列とベクトル間のデータ交換のための新しい関数および拡張された割り当てメソッドを備えています。
さらに、すべてのプラットフォームコンポーネントに複数の修正と改善を実装しました。すべての新機能、修正、性能向上は以下で説明されています。
Webプラットフォームのモバイル版
新しいWebターミナルは、モバイルデバイスをフル機能でサポートします。インターフェイスは画面サイズに自動的に適応し、iOSおよびAndroidのスマートフォンおよびタブレットからの効率的な操作を可能にします。
また、Webターミナルには多くの修正と改良が加えられています。
新しいMetaTrader 5 Webターミナルは、取引機能の完全なセットをサポートします。ユーザーは次のことができるようになります。
MetaTrader 5クライアントターミナルビルド3490
FIFOルールによると、各商品のポジションは、開かれた順序でのみ決済できます。ストップレベルによるポジション決済を確実にFIFOに準拠させるために、次のロジックがクライアントターミナル側に実装されています。
同じ商品に複数のポジションが存在する場合、いずれかのポジションにストップレベルを配置すると、他のすべてのポジションにも同じレベルが配置されます。したがって、レベルがトリガーされると、すべてのポジションがFIFO準拠の順序で決済されます。
ユーザーが既にポジションを持っている商品の板情報を開くと、既存のポジションのレベル(存在する場合)がストップロスおよびテイクプロフィットフィールドで自動的に指定されるようになりました。
bool matrix::CopyTicks(string symbol,uint flags,ulong from_msc,uint count); bool vector::CopyTicks(string symbol,uint flags,ulong from_msc,uint count); bool matrix::CopyTicksRange(string symbol,uint flags,ulong from_msc,ulong to_msc); bool matrix::CopyTicksRange(string symbol,uint flags,ulong from_msc,ulong to_msc);
コピーされたデータ型は、ENUM_COPY_TICKS列挙を使用して「flags」パラメーターで指定されます。以下の値が使用可能です。COPY_TICKS_INFO = 1, // ticks resulting from Bid and/or Ask changes COPY_TICKS_TRADE = 2, // ticks resulting from Last and Volume changes COPY_TICKS_ALL = 3, // all ticks having changes COPY_TICKS_TIME_MS = 1<<8, // time in milliseconds COPY_TICKS_BID = 1<<9, // Bid price COPY_TICKS_ASK = 1<<10, // Ask price COPY_TICKS_LAST = 1<<11, // Last price COPY_TICKS_VOLUME = 1<<12, // volume COPY_TICKS_FLAGS = 1<<13, // tick flags
複数のデータ型が選択されている場合(行列でのみ使用可能)、行列内の行の順序は、列挙内の値の順序に対応します。行列に1次元の配列またはベクトルを割り当てることができるようになりました。
bool matrix::Assign(const vector &vec);
結果は1行の行列になります。また、行列をベクトルに割り当てることができるようになりました(行列の平滑化が実行されます)。
bool vector::Assign(const matrix &mat);
bool vector::Swap(vector &vec); bool vector::Swap(matrix &vec); bool vector::Swap(double &arr[]); bool matrix::Swap(vector &vec); bool matrix::Swap(matrix &vec); bool matrix::Swap(double &arr[]);
各配列、ベクトル、または行列は、そのオブジェクトの要素を含むメモリバッファを参照します。Swapメソッドは、要素をメモリに書き込むことなく、これらのバッファへのポインタを実際に交換します。したがって、行列は行列のままであり、ベクトルはベクトルのままになります。行列とベクトルを交換すると、ベクトル要素を持つ1行の行列と、フラット表現の行列要素を持つベクトルになります(Flatメソッドを参照してください)。//+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- matrix a= {{1, 2, 3}, {4, 5, 6}}; Print("a before Swap: \n", a); matrix b= {{5, 10, 15, 20}, {25, 30, 35, 40}, {45, 50, 55, 60}}; Print("b before Swap: \n", b); //--- swap matrix pointers a.Swap(b); Print("a after Swap: \n", a); Print("b after Swap: \n", b); /* a before Swap: [[1,2,3] [4,5,6]] b before Swap: [[5,10,15,20] [25,30,35,40] [45,50,55,60]] a after Swap: [[5,10,15,20] [25,30,35,40] [45,50,55,60]] b after Swap: [[1,2,3] [4,5,6]] */ vector v=vector::Full(10, 7); Print("v before Swap: \n", v); Print("b before Swap: \n", b); v.Swap(b); Print("v after Swap: \n", v); Print("b after Swap: \n", b); /* v before Swap: [7,7,7,7,7,7,7,7,7,7] b before Swap: [[1,2,3] [4,5,6]] v after Swap: [1,2,3,4,5,6] b after Swap: [[7,7,7,7,7,7,7,7,7,7]] */ }
Swap()メソッドは、動的配列を使用した操作も可能にします(固定サイズの配列をパラメーターとして渡すことはできません)。配列は任意の次元にすることができますが、サイズは合意されています。つまり、行列またはベクトルの合計サイズは、配列のゼロ次元の倍数でなければなりません。配列のゼロ次元は、最初のインデックスに含まれる要素の数です。たとえば、動的な3次元配列「doublearray[][2][3]」の場合、ゼロ次元は2番目と3番目の次元のサイズの積です(2x3=6)。そのため、このような配列は、合計サイズが6の倍数である行列とベクトルを使用するSwapメソッドでのみ使用できます(6、12、18、24など)。次の例を考えてください。
//+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- fill the 1x10 matrix with the value 7.0 matrix m= matrix::Full(1, 10, 7.0); Print("matrix before Swap:\n", m); //--- try to swap the matrix and the array double array_small[2][5]= {{1, 2, 3, 4, 5}, {6, 7, 8, 9, 10}}; Print("array_small before Swap:"); ArrayPrint(array_small); if(m.Swap(array_small)) { Print("array_small after Swap:"); ArrayPrint(array_small); Print("matrix after Swap: \n", m); } else // the matrix size is not a multiple of the first array dimension { Print("m.Swap(array_small) failed. Error ", GetLastError()); } /* matrix before Swap: [[7,7,7,7,7,7,7,7,7,7]] array_small before Swap: [,0] [,1] [,2] [,3] [,4] [0,] 1.00000 2.00000 3.00000 4.00000 5.00000 [1,] 6.00000 7.00000 8.00000 9.00000 10.00000 m.Swap(array_small) failed. Error 4006 */ //--- use a larger matrix and retry the swap operation double array_static[3][10]= {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, {2, 4, 6, 8, 10, 12, 14, 16, 18, 20}, {3, 6, 9, 12, 15, 18, 21, 24, 27, 30} }; Print("array_static before Swap:"); ArrayPrint(array_static); if(m.Swap(array_static)) { Print("array_static after Swap:"); ArrayPrint(array_static); Print("matrix after Swap: \n", m); } else // a static array cannot be used to swap with a matrix { Print("m.Swap(array_static) failed. Error ", GetLastError()); } /* array_static before Swap: [,0] [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [0,] 1.00000 2.00000 3.00000 4.00000 5.00000 6.00000 7.00000 8.00000 9.00000 10.00000 [1,] 2.00000 4.00000 6.00000 8.00000 10.00000 12.00000 14.00000 16.00000 18.00000 20.00000 [2,] 3.00000 6.00000 9.00000 12.00000 15.00000 18.00000 21.00000 24.00000 27.00000 30.00000 m.Swap(array_static) failed. Error 4006 */ //--- another attempt to swap an array and a matrix double array_dynamic[][10]; // dynamic array ArrayResize(array_dynamic, 3); // set the first dimension size ArrayCopy(array_dynamic, array_static); //--- now use a dynamic array for swap if(m.Swap(array_dynamic)) { Print("array_dynamic after Swap:"); ArrayPrint(array_dynamic); Print("matrix after Swap: \n", m); } else // no error { Print("m.Swap(array_dynamic) failed. Error ", GetLastError()); } /* array_dynamic after Swap: [,0] [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [0,] 7.00000 7.00000 7.00000 7.00000 7.00000 7.00000 7.00000 7.00000 7.00000 7.00000 matrix after Swap: [[1,2,3,4,5,6,7,8,9,10,2,4,6,8,10,12,14,16,18,20,3,6,9,12,15,18,21,24,27,30]] */ }
vector vector::LossGradient(const vector &expected,ENUM_LOSS_FUNCTION loss) const; matrix matrix::LossGradient(const matrix &expected,ENUM_LOSS_FUNCTION loss) const;
CREATE TABLE artist( artistid INTEGER PRIMARY KEY, artistname TEXT ); CREATE TABLE track( trackid INTEGER, trackname TEXT, trackartist INTEGER, FOREIGN KEY(trackartist) REFERENCES artist(artistid) );
このアップデートは、LiveUpdateシステムを通じて提供される予定です。