ターミナル
MQL5
MetaTrader 5 Webターミナル
ターミナル
MetaTrader 5 Webターミナル
ターミナル
MQL5
//+------------------------------------------------------------------+ //| スクリプトプログラム開始関数 | //+------------------------------------------------------------------+ void OnStart() { complex a=1+1i; complex b=a.Conjugate(); Print(a, " ", b); /* (1,1) (1,-1) */ vectorc va= {0.1+0.1i, 0.2+0.2i, 0.3+0.3i}; vectorc vb=va.Conjugate(); Print(va, " ", vb); /* [(0.1,0.1),(0.2,0.2),(0.3,0.3)] [(0.1,-0.1),(0.2,-0.2),(0.3,-0.3)] */ matrixc ma(2, 3); ma.Row(va, 0); ma.Row(vb, 1); matrixc mb=ma.Conjugate(); Print(ma); Print(mb); /* [[(0.1,0.1),(0.2,0.2),(0.3,0.3)] [(0.1,-0.1),(0.2,-0.2),(0.3,-0.3)]] [[(0.1,-0.1),(0.2,-0.2),(0.3,-0.3)] [(0.1,0.1),(0.2,0.2),(0.3,0.3)]] */ ma=mb.Transpose().Conjugate(); Print(ma); /* [[(0.1,0.1),(0.1,-0.1)] [(0.2,0.2),(0.2,-0.2)] [(0.3,0.3),(0.3,-0.3)]] */ }
from sys import argv data_path=argv[0] last_index=data_path.rfind("\\")+1 data_path=data_path[0:last_index] from sklearn.datasets import load_iris iris_dataset = load_iris() from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(iris_dataset['data'], iris_dataset['target'], random_state=0) from sklearn.neighbors import KNeighborsClassifier knn = KNeighborsClassifier(n_neighbors=1) knn.fit(X_train, y_train) # ONNXフォーマットに変換 from skl2onnx import convert_sklearn from skl2onnx.common.data_types import FloatTensorType initial_type = [('float_input', FloatTensorType([None, 4]))] onx = convert_sklearn(knn, initial_types=initial_type) path = data_path+"iris.onnx" with open(path, "wb") as f: f.write(onx.SerializeToString())作成したonnxファイルをMetaEditorで開きます。
struct MyMap { long key[]; float value[]; };ここでは、適切な型の動的配列を使用しました。この場合、このモデルのMapは常に3つのキーと値のペアを含むので、固定配列を使用することができます。
//--- 出力層output_probabilityからデータを受け取る配列を宣言する MyMap output_probability[]; ... //--- 実行中のモデル OnnxRun(model,ONNX_DEBUG_LOGS,float_input,output_label,output_probability);
MetaEditor
MetaTrader 5 Webターミナル ビルド3980
ターミナル
レポートは4つのタブに分かれており、それぞれに集約された情報が掲載されています。
Terminal MetaTrader 5 x64 build 3914 started for MetaQuotes Software Corp.
Terminal Windows 10 build 19045, 20 x Intel Xeon E5-2630 v4 @ 2.20GHz, AVX, 41 / 63 Gb memory, 58 / 280 Gb disk, UAC, GMT+2
VPSホスティング
MQL5
#define MACRO1 /* #define MACRO2 */ void OnStart() { #ifdef MACRO2 Print( 2 ); #else Print( 1 ); #endif }
void OnStart() { Print("CPU name: ",TerminalInfoString(TERMINAL_CPU_NAME)); Print("CPU cores: ",TerminalInfoInteger(TERMINAL_CPU_CORES)); Print("CPU architecture: ",TerminalInfoString(TERMINAL_CPU_ARCHITECTURE)); Print(""); Print("EX5 architecture: ",__CPU_ARCHITECTURE__); } CPU name: 12th Gen Intel Core i9-12900K CPU cores: 24 CPU architecture: AVX2 + FMA3 EX5 architecture: AVX
extern int X=0; void OnStart() { }
extern int X; void OnStart() { }
extern int X; int Y=X; void OnStart(void) { Print("Y=",Y," X=",X); } int X=_Digits;
ALGLIBライブラリを3.19に更新しました。ALGLIBは、数値計算手法やデータ解析アルゴリズムを扱うために設計された高性能数値解析ライブラリです。
行列とベクトルを使用するように既存のライブラリクラスを修正し、ALGLIB 3.19からの新機能も追加しました。すべてのソースコードが改訂され、単一のデザインスタイルになりました。ALGLIBライブラリのソースコードは<ターミナルデータディレクトリ>\MQL5\Include\Math\Alglibにあります。テストスクリプトはMQL5\Scripts\UnitTests\Alglibにあります。
ライブラリ自体に加え、テストスクリプトも更新されました。テストの数は、クラスが62から91に、インターフェイスが143から152に増加しました。このように、MetaTrader 5プラットフォームの開発者は、トレーダーに最も効率的なソリューションを提供しています。
MetaEditor
テスター
MetaTrader 5 Webターミナル ビルド3950
ターミナル
MQL5
double vector::RegressionMetric( const vector& vector_true, // true values const ENUM_REGRESSION_METRIC metric // metric ); double matrix::RegressionMetric( const matrix& matrix_true, // true values const ENUM_REGRESSION_METRIC metric // metric ); vector matrix::RegressionMetric( const matrix& matrix_true, // true values const ENUM_REGRESSION_METRIC metric, // metric const int axis // axis );
vector vector::LinearRegression(); matrix matrix::LinearRegression( ENUM_MATRIX_AXIS axis=AXIS_NONE // 回帰が計算される軸 );例:
vector vector_a; //--- ベクトルを価格で埋める vector_a.CopyRates(_Symbol,_Period,COPY_RATES_CLOSE,1,100); //--- 線形回帰を得る vector vector_r=vector_a.LinearRegression();その結果をグラフで可視化しました。
ulong vector::HasNan(); ulong matrix::HasNan();NaN値を持つ要素の適切なペアを比較する場合、CompareおよびCompareByDigitsメソッドはこれらの要素を等しいとみなしますが、通常の浮動小数点数の比較の場合はNaN != NaNです。
ONNXモデルの操作に使用するOnnxTypeInfo構造体を変更しました。
struct OnnxTypeInfo { ENUM_ONNX_TYPE type; // parameter type OnnxTensorTypeInfo tensor; // tensor description OnnxMapTypeInfo map; // map description OnnxSequenceTypeInfo sequence; // sequence description };
データ型は、新しいサブ構造を用いて構造体内で指定されます。
struct OnnxTensorTypeInfo { ENUM_ONNX_DATATYPE data_type; // data type in the tensor long dimensions[]; // number of elements }; struct OnnxMapTypeInfo { ENUM_ONNX_DATA_TYPE key_type; // key type OnnxTypeInfo type_info; // value type }; struct OnnxSequenceTypeInfo { OnnxTypeInfo type_info; // data type in the sequence };OnnxTypeInfo::type (ONNX_TYPE_TENSOR, ONNX_TYPE_MAP or ONNX_TYPE_SEQUENCE)に応じて、関連する部分構造体が満たされます。
bool vector::CopyIndicatorBuffer(long indicator_handle,ulong buffer_index,ulong start_pos,ulong count); bool vector::CopyIndicatorBuffer(long indicator_handle,ulong buffer_index,datetime start_time,ulong count); bool vector::CopyIndicatorBuffer(long indicator_handle,ulong buffer_index,datetime start_time,datetime stop_time);
MetaEditor
テスター
Webターミナル ビルド
MQL5.community
ターミナル
MQL5
Webターミナル ビルド
Webターミナル
MQL5
MQL5:CopyTicks、CopyTicksRange、CopyRates各メソッドにCOPY_TICKS_VERTICALフラグとCOPY_RATES_VERTICALフラグを追加しました。
デフォルトでは、ティックと系列は横軸に沿って行列にコピーされます。つまり、データは行末の右側に追加されます。トレーニング済みのONNXモデル実行タスクでは、入力データを供給するために、このような行列を転置する必要があります。
const long ExtOutputShape[] = {1,1}; // model's output shape const long ExtInputShape [] = {1,10,4}; // model's input shape #resource "Python/model.onnx" as uchar ExtModel[]// model as a resource //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ int OnStart(void) { matrix rates; //--- get 10 bars if(!rates.CopyRates("EURUSD",PERIOD_H1,COPY_RATES_OHLC,2,10)) return(-1); //--- input a set of OHLC vectors matrix x_norm=rates.Transpose(); vector m=x_norm.Mean(0); vector s=x_norm.Std(0); matrix mm(10,4); matrix ms(10,4);
メソッドを呼び出すときに追加のCOPY_RATES_VERTICALフラグ(ティックの場合はCOPY_TICKS_VERTICAL) を指定することで、余分なデータ転置操作を避けることができます。
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
int OnStart(void)
{
matrix rates;
//--- get 10 bars
if(!rates.CopyRates("EURUSD",PERIOD_H1,COPY_RATES_OHLC|COPY_RATES_VERTICAL,2,10))
return(-1);
//--- input a set of OHLC vectors
MetaEditor
ターミナル
ターミナル
MQL5
プロジェクトをコンパイルし、EURUSDH1で実行し、結果を確認することができます。
モデルとそれを実行するMQL5コードに加え、プロジェクトにはPricePredictionTraining.pyというPythonスクリプトも含まれています。これは、ONNXモデルを自分で作成する方法を紹介するものです。スクリプトを実行するには、Pythonをコンピュータにインストールして、次のようにコマンドプロンプトから必要なモジュールをインストールしてください。
#import "mmlib.dll"
bool sgemm(uint flags,matrix<float> &C,const matrix<float> &A,const matrix<float> &B,ulong M,ulong N,ulong K,float alpha,float beta);
#import
C++extern "C" __declspec(dllexport) bool sgemm(UINT flags,float *C,const float *A,const float *B,UINT64 M,UINT64 N,UINT64 K,float alpha,float beta)
バッファに加えて、正しく処理されるために行列とベクトルのサイズを渡す必要があります。同期された時系列をMqlRatesから別の配列にコピーするための新しいCopySeries関数を追加しました。
CopySeries関数を使用すると、1回の呼び出しで必要な時系列のみを別の指定された配列に取得できますが、時系列データはすべて同期されます。これは、特定のインデックスNで結果として得られる配列のすべての値が、指定された銘柄/時間枠のペアの同じバーに属することを意味します。したがって、プログラマーはバーの開始時間までに受信したすべての時系列の同期を確保する必要はありません。
時系列の完全なセットをMqlRates配列として返すCopyRatesとは異なり、CopySeries関数を使用すると、特定の必要な時系列を個別の配列に取得できます。これは、時系列の種類を選択するためのフラグの組み合わせを指定することで実現できます。関数に渡される配列の順序は、MqlRates構造体のフィールドの順序と一致する必要があります。
struct MqlRates
{
datetime time; // period beginning time
double open; // open price
double high; // high price for the period
double low; // low price for the period
double close; // close price
long tick_volume; // tick volume
int spread; // spread
long real_volume; // exchange volume
}
したがって、現在の銘柄/時間枠の最後の100バーの「time」、「close」、「real_volume」時系列の値を取得する必要がある場合は、次の呼び出しを使用します。
datetime time[];
double close[];
long volume[];
CopySeries(NULL,0,0,100,COPY_RATES_TIME|COPY_RATES_CLOSE|COPY_RATES_VOLUME_REAL,time,close,volume);
time、close、volume配列の順序は、MqlRates構造体内のフィールドの順序と一致する必要があります。rates_maskの値の順序は無視されます。マスクは次のようになります。
COPY_RATES_VOLUME_REAL|COPY_RATES_TIME|COPY_RATES_CLOSE
例
//--- input parameters
input datetime InpDateFrom=D'2022.01.01 00:00:00';
input datetime InpDateTo =D'2023.01.01 00:00:00';
input uint InpCount =20;
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart(void)
{
//--- arrays to get timeseries from the Rates structure
double open[];
double close[];
float closef[];
datetime time1[], time2[];
//---request close prices to a double array
ResetLastError();
int res1=CopySeries(NULL, PERIOD_CURRENT, 0, InpCount,
COPY_RATES_TIME|COPY_RATES_CLOSE, time1, close);
PrintFormat("1. CopySeries returns %d values. Error code=%d", res1, GetLastError());
ArrayPrint(close);
//--- now also request open prices; use float array for close prices
ResetLastError();
int res2=CopySeries(NULL, PERIOD_CURRENT, 0, InpCount,
COPY_RATES_TIME|COPY_RATES_CLOSE|COPY_RATES_OPEN, time2, open, closef);
PrintFormat("2. CopySeries returns %d values. Error code=%d", res2, GetLastError());
ArrayPrint(closef);
//--- compare the received data
if((res1==res2) && (time1[0]==time2[0]))
{
Print(" | Time | Open | Close double | Close float |");
for(int i=0; i<10; i++)
{
PrintFormat("%d | %s | %.5f | %.5f | %.5f |",
i, TimeToString(time1[i]), open[i], close[i], closef[i]);
}
}
/* Result
1. CopySeries returns 0 values. Error code=0
[ 0] 1.06722 1.06733 1.06653 1.06520 1.06573 1.06649 1.06694 1.06675 1.06684 1.06604
[10] 1.06514 1.06557 1.06456 1.06481 1.06414 1.06394 1.06364 1.06386 1.06239 1.06247
2. CopySeries returns 0 values. Error code=0
[ 0] 1.06722 1.06733 1.06653 1.06520 1.06573 1.06649 1.06694 1.06675 1.06684 1.06604
[10] 1.06514 1.06557 1.06456 1.06481 1.06414 1.06394 1.06364 1.06386 1.06239 1.06247
| Time | Open | Close double | Close float |
0 | 2023.03.01 17:00 | 1.06660 | 1.06722 | 1.06722 |
1 | 2023.03.01 18:00 | 1.06722 | 1.06733 | 1.06733 |
2 | 2023.03.01 19:00 | 1.06734 | 1.06653 | 1.06653 |
3 | 2023.03.01 20:00 | 1.06654 | 1.06520 | 1.06520 |
4 | 2023.03.01 21:00 | 1.06520 | 1.06573 | 1.06573 |
5 | 2023.03.01 22:00 | 1.06572 | 1.06649 | 1.06649 |
6 | 2023.03.01 23:00 | 1.06649 | 1.06694 | 1.06694 |
7 | 2023.03.02 00:00 | 1.06683 | 1.06675 | 1.06675 |
8 | 2023.03.02 01:00 | 1.06675 | 1.06684 | 1.06684 |
9 | 2023.03.02 02:00 | 1.06687 | 1.06604 | 1.06604 |
*/
}
MetaEditor
テスター
MetaTrader 5 Webターミナルビルド3620
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
テスター
ターミナル