Webターミナル
ターミナル
MQL5
longpreferred_workgroup_size_multiple=OpenCL.GetDeviceInfo(0x1067);
voidOnStart() { 文字列cpu、os; //--- cpu=TerminalInfoString(TERMINAL_CPU_NAME); os=TerminalInfoString(TERMINAL_OS_VERSION); PrintFormat("CPU:%s、OS:%s",cpu,os); }結果
MetaEditor
ターミナル
MQL5
//--- the first handle parameter is ignored when obtaining the last error code
int code = (int)CLGetInfoInteger(0,CL_LAST_ERROR);
//--- get the code of the last OpenCL error
int code = (int)CLGetInfoInteger(0,CL_LAST_ERROR);
string desc; // to get the text description of the error
//--- use the error code to get the text description of the error
if(!CLGetInfoString(code,CL_ERROR_DESCRIPTION,desc))
desc = "cannot get OpenCL error description, " + (string)GetLastError();
Print(desc);
//--- to get the description of the last OpenCL error without receiving the code, pass CL_LAST_ERROR
if(!CLGetInfoString(CL_LAST_ERROR,CL_ERROR_DESCRIPTION, desc))
desc = "cannot get OpenCL error description, " + (string)GetLastError();
Print(desc);
エラーの説明として、内部列挙名が渡されます。説明はhttps://registry.khronos.org/OpenCL/specs/3.0-unified/html/OpenCL_API.html#CL_SUCCESSにあります。例えば、CL_INVALID_KERNEL_ARGSの値は、「いくつかのカーネル引数が設定されていないか、無効である場合にカーネルをエンキューする際に返される」ことを意味します。 MetaTrader 5 WebTerminal
ターミナル
MQL5
class A { }; void OnStart(void) { const A *const arr[][2][3]={}; Print(typename(arr)); }結果
"class A const * const [][2][3]"
ターミナル
MQL5
クラッシュログに報告されるエラーを修正しました。
MetaTrader 5 Webターミナルビルド3500
Webプラットフォームのモバイル版
新しいWebターミナルは、モバイルデバイスをフル機能でサポートします。インターフェイスは画面サイズに自動的に適応し、iOSおよびAndroidのスマートフォンおよびタブレットからの効率的な操作を可能にします。
また、Webターミナルには多くの修正と改良が加えられています。
新しいMetaTrader 5 Webターミナルは、取引機能の完全なセットをサポートします。ユーザーは次のことができるようになります。
ターミナル
MQL5
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
複数のデータ型が選択されている場合(行列でのみ使用可能)、行列内の行の順序は、列挙内の値の順序に対応します。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)
);
MetaEditor
MetaTester
クラッシュログに報告されるエラーを修正しました。
ターミナル
MQL5
bool vector<TDst>::Assign(const vector<TSrc> &assign); bool matrix<TDst>::Assign(const matrix<TSrc> &assign);例:
//--- copying matrices matrix b={}; matrix a=b; a.Assign(b); //--- copying an array to a matrix double arr[5][5]={{1,2},{3,4},{5,6}}; Print("array arr"); ArrayPrint(arr); b.Assign(arr); Print("matrix b \n",b); /* array arr [,0] [,1] [,2] [,3] [,4] [0,] 1.00000 2.00000 0.00000 0.00000 0.00000 [1,] 3.00000 4.00000 0.00000 0.00000 0.00000 [2,] 5.00000 6.00000 0.00000 0.00000 0.00000 [3,] 0.00000 0.00000 0.00000 0.00000 0.00000 [4,] 0.00000 0.00000 0.00000 0.00000 0.00000 matrix b [[1,2,0,0,0] [3,4,0,0,0] [5,6,0,0,0] [0,0,0,0,0] [0,0,0,0,0]] */
bool matrix::CopyRates(string symbol,ENUM_TIMEFRAMES period,ulong rates_mask,ulong from,ulong count); bool vector::CopyRates(string symbol,ENUM_TIMEFRAMES period,ulong rates_mask,ulong from,ulong count);コピーされたデータ型は、ENUM_COPY_RATES列挙を使用してrates_maskパラメータで指定されます。以下の値が使用可能です。
オブジェクトポインタの参照として関数に渡された定数パラメータを変更する際のエラーを修正しました。
const指定子は、プログラム実行中に変数が変更されないように定数として宣言するものです。宣言時に一度だけ変数の初期化をおこなうことができます。次は、OnCalculate関数におけるconst変数の例です。
int OnCalculate (const int rates_total, // price[] array size const int prev_calculated, // bars processed on previous call const int begin, // meaningful data starts at const double& price[] // array for calculation );
以下の例には、参照パラメータに対する暗黙のポインタキャストを許可するコンパイラエラーが含まれています。
class A {}; const A *a = new A; void foo( const A*& b ) { b = a; } void OnStart() { A *b; foo(b); // not allowed Print( a,":",b ); }コンパイラはこのような不正な操作を検出し、関連するエラーを返します。
MetaEditor
新しい MetaTrader 5 Webターミナル
インターフェイスの更新とコアの再設計を特徴とする、新しいMetaTrader 5 Webターミナルをリリースしました。新しいインターフェイスは、iPadのターミナルバージョンに似ています。
また、次のように多くの新機能も備えています。
ターミナル
MQL5
//--- matrix a= {{1, 4}, {9, 16}}; Print("matrix a=\n",a); a=MathSqrt(a); Print("MatrSqrt(a)=\n",a); /* matrix a= [[1,4] [9,16]] MatrSqrt(a)= [[1,2] [3,4]] */MathModおよびMathPowの場合、2番目の要素には、適切なサイズのスカラーまたは行列/ベクトルを指定することができます。
//+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- Use the initializing function to populate the vector vector r(10, ArrayRandom); // Array of random numbers from 0 to 1 //--- Calculate the average value double avr=r.Mean(); // Array mean value vector d=r-avr; // Calculate an array of deviations from the mean Print("avr(r)=", avr); Print("r=", r); Print("d=", d); vector s2=MathPow(d, 2); // Array of squared deviations double sum=s2.Sum(); // Sum of squared deviations //--- Calculate standard deviation in two ways double std=MathSqrt(sum/r.Size()); Print(" std(r)=", std); Print("r.Std()=", r.Std()); } /* avr(r)=0.5300302133243813 r=[0.8346201971495713,0.8031556138798182,0.6696676534318063,0.05386516922513505,0.5491195410016175,0.8224433118686484,... d=[0.30458998382519,0.2731254005554369,0.1396374401074251,-0.4761650440992462,0.01908932767723626,0.2924130985442671, ... std(r)=0.2838269732183663 r.Std()=0.2838269732183663 */ //+------------------------------------------------------------------+ //| Fills the vector with random values | //+------------------------------------------------------------------+ void ArrayRandom(vector& v) { for(ulong i=0; i<v.Size(); i++) v[i]=double(MathRand())/32767.; }
float型を用いた演算のための数学関数を改善しました。Float型の行列とベクトルに数学関数を適用できるようになったことで、float型のスカラーに適用する数学関数が改善されました。以前は、これらの関数パラメータは無条件にdouble型にキャストされ、その後、対応する数学関数の実装が呼び出されてその結果がfloat型にキャストバックされていました。余分な型キャストをすることなく、演算が実装されるようになりました。
次の例では、数学的な正弦の計算の違いを示しています。
//+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- Array of random numbers from 0 to 1 vector d(10, ArrayRandom); for(ulong i=0; i<d.Size(); i++) { double delta=MathSin(d[i])-MathSin((float)d[i]); Print(i,". delta=",delta); } } /* 0. delta=5.198186103783087e-09 1. delta=8.927621308885136e-09 2. delta=2.131878673594656e-09 3. delta=1.0228555918923021e-09 4. delta=2.0585739779477308e-09 5. delta=-4.199390279957527e-09 6. delta=-1.3221741035351897e-08 7. delta=-1.742922250969059e-09 8. delta=-8.770715820283215e-10 9. delta=-1.2543186267421902e-08 */ //+------------------------------------------------------------------+ //| Fills the vector with random values | //+------------------------------------------------------------------+ void ArrayRandom(vector& v) { for(ulong i=0; i<v.Size(); i++) v[i]=double(MathRand())/32767.; }
AF_ELU | ELU(指数線形ユニット) |
AF_EXP | 指数 |
AF_GELU | ガウシアンエラー線形ユニット |
AF_HARD_SIGMOID | ハードシグモイド |
AF_LINEAR | 線形 |
AF_LRELU | Leaky REctified線形ユニット |
AF_RELU | 正規化線形ユニット |
AF_SELU | SELU (Scaled Exponentia線形ユニット) |
AF_SIGMOID | シグモイド |
AF_SOFTMAX | ソフトマックス |
AF_SOFTPLUS | ソフトプラス |
AF_SOFTSIGN | ソフトサイン |
AF_SWISH | スウィッシュ |
AF_TANH | ハイパーボリックタンジェント |
AF_TRELU | しきい値化されたREctified線形ユニット |
LOSS_MSE | 平均二乗誤差 |
LOSS_MAE | 平均絶対誤差 |
LOSS_CCE | カテゴリー別 交差エントロピー |
LOSS_BCE | バイナリ交差エントロピー |
LOSS_MAPE | MAPE (平均絶対誤差率) |
LOSS_MSLE | 平均二乗対数誤差 |
LOSS_KLD | カルバック・ライブラー ダイバージェンス |
LOSS_COSINE | コサイン類似度/近接度 |
LOSS_POISSON | ポワッソン |
LOSS_HINGE | ヒンジ |
LOSS_SQ_HINGE | 2乗 ヒンジ |
LOSS_CAT_HINGE | カテゴリカル・ヒンジ |
LOSS_LOG_COSH | ハイパーボリックコサインの 対数 |
LOSS_HUBER | フーバー |
int cl_ctx; //--- Initializing the OpenCL context if((cl_ctx=CLContextCreate(CL_USE_GPU_DOUBLE_ONLY))==INVALID_HANDLE) { Print("OpenCL not found"); return; }
CalendarValueLast(change, result, "", "EUR")
MetaEditor
'levels.bmp' as 'uint levels[18990]'
ターミナル
MQL5
MetaTester
MetaEditor
クラッシュログで報告されたエラーを修正しました。
ターミナル
MQL5
double vector.RegressionError(const enum lr_error); double matrix.RegressionError(const enum lr_error); vector matrix.RegressionError(const enum lr_error,const int axis);次の変数を指標として使用できます。
enum REGRESSION_ERROR { REGRESSION_MAE, // Mean absolute error REGRESSION_MSE, // Mean square error REGRESSION_RMSE, // Root mean square error REGRESSION_R2, // R squared REGRESSION_MAPE, // Mean absolute percentage error REGRESSION_MSPE, // Mean square percentage error REGRESSION_RMSLE // Root mean square logarithmic error };
MetaEditor
テスター
ターミナル
ターミナル:
MQL5
void OnStart() { int arr[4][5]= { {22, 34, 11, 20, 1}, {10, 36, 2, 12, 5}, {33, 37, 25, 13, 4}, {14, 9, 26, 21, 59} }; ulong indexes[4][5]; //--- Sort the array arr.ArgSort(indexes,-1,0); Print("indexes"); ArrayPrint(indexes); } // Result log: // indexes // [,0][,1][,2][,3][,4] // [0,] 4 2 3 0 1 // [1,] 2 4 0 3 1 // [2,] 4 3 2 0 1 // [3,] 1 0 3 2 4
void OnStart() { string test="some string"; PrintFormat("String length is %d",test.Length()); } // Result log: // String length is 11
MQL5
double matrix::Flat(ulong index) const; // getter void matrix::Flat(ulong index,double value); // setter
行列要素のアドレスを計算するための擬似コード:
ulong row=index / mat.Cols(); ulong col=index % mat.Cols(); mat[row,col]
たとえば「matrix mat(3,3)」の場合、要素へのアクセスは次のように記述できます。
テスター
ターミナル
ターミナル
MQL5
VPS
MetaEditor
テスター
>
ドキュメントを更新しました。
struct POINT { int x,y; }; int GetYFunc(y) { return(y * y); } void SomeFunction(int x1,int x2,int y) { POINT pt={ x1+x2, GetYFunc(y) }; ProcessPoint(pt); };
struct complex { double real; // 実数部分 double imag; // 虚数部分 };「complex」型は、MQL5関数のパラメータとして値で渡すことができます(通常の構造体が参照によってのみ渡されるのとは対照的です)。DLLからインポートされた関数の場合、「complex」型は参照によってのみ渡されます。
complex square(complex c) { return(c*c); } void OnStart() { Print(square(1+2i)); // 定数がパラメータとして渡される } // 複素数の文字列表現である「(-3,4)」が出力される現在、複素数には単純な演算(=, +, -, *, /, +=, -=, *=, /=, ==,!=)のみが使用できます。