1. StringToShortArray関数の概要と実務での活用法
MQL5におけるStringToShortArray関数は、文字列(string型)を、Unicode(UTF-16)形式のコードに対応した「ushort(符号なし短整数)型の配列」へ変換するための関数です。
MQL5の文字列は内部的にUnicodeで処理されていますが、外部のDLL(C++など)とのデータのやり取りや、特定の暗号化処理、あるいはバイナリデータとしての通信を行う際、文字列のままでは扱いにくい場面が多々あります。
実務レベルでは、以下のようなシーンで重宝されます:
– Windows APIやDLLへの文字列渡し: C++などで作成された外部ライブラリに文字列を渡す際、バッファとして配列を確保する場合。
– ファイルI/Oの最適化: 文字列をそのまま保存するのではなく、バイナリデータとして効率的に書き出したい場合。
– メモリ管理の厳格化: 動的なstring型の操作はオーバーヘッドが大きいため、あらかじめ固定長の配列に展開して高速に処理したい場合。
初心者が特につまずきやすいのは「配列のサイズ管理」と「終端文字(null文字)」の扱いです。この関数を正しく理解することで、一段上のテクニカルな開発が可能になります。
2. 構文と戻り値
StringToShortArrayの基本的な構文は以下の通りです。
int StringToShortArray(
string text_string, // 変換元の文字列
ushort& array[], // 変換した値を格納する配列
int start=0, // 配列内での書き込み開始位置
int count=-1 // 変換する文字数(-1は終端まで)
);
パラメーター解説
- text_string: 変換したい元の文字列です。
- array[]: 変換後の数値を格納する
ushort型の配列です。参照渡し(&)のため、関数内で配列の内容が直接書き換えられます。 - start: 配列のどのインデックスから書き込みを始めるかを指定します。デフォルトは「0」です。
- count: 変換する文字数を指定します。デフォルトの「-1」を指定すると、文字列の最後にある終端文字(null文字)まで含めてすべてコピーされます。
戻り値
- 正常に変換された場合は、配列へコピーされた要素数(文字数+終端文字1つ)を返します。
- 失敗した場合は「0」またはエラー値を返します。
3. 具体的な使い方・実践サンプルコード
以下のサンプルは、文字列「Gold」をushort配列に変換し、それぞれの文字のUnicode(UTF-16)コードと、配列のサイズを確認するコードです。
void OnStart()
{
// 1. 変換元の文字列を定義
string myText = "Gold";
// 2. 格納用のushort配列を用意(動的配列)
ushort shortArray[];
// 3. StringToShortArrayを実行
// 文字列全体(終端文字含む)を配列にコピーします
int copiedElements = StringToShortArray(myText, shortArray);
if(copiedElements > 0)
{
PrintFormat("変換成功!コピーされた要素数: %d", copiedElements);
// 4. 配列の中身を確認
for(int i = 0; i < ArraySize(shortArray); i++)
{
// 終端文字は数値の「0」として格納される
if(shortArray[i] == 0)
{
PrintFormat("インデックス[%d] : 終端文字 (NULL)", i);
}
else
{
PrintFormat("インデックス[%d] : 文字 = %s, 文字コード = %d",
i, ShortToString(shortArray[i]), shortArray[i]);
}
}
}
else
{
Print("変換に失敗しました。エラーコード: ", GetLastError());
}
}
4. 使用上の注意点とよくあるエラー
配列サイズの自動調整に注意
StringToShortArrayは、ターゲットとなる配列が動的配列(サイズ未指定)の場合、関数内で自動的にリサイズが行われます。しかし、あらかじめサイズが決まっている静的配列を渡す場合、コピーする要素数(文字数+終端文字1つ)が配列のサイズを超えるとエラーになります。
終端文字「0」の存在
MQL5(およびC言語系)の文字列は、目に見える文字の最後に必ず「0」という終端文字が隠れています。count=-1でコピーした場合、配列の最後の要素には必ず「0」が入ります。
– 文字列が “ABC” の場合、配列サイズは「4」必要です。
– この終端文字を無視してループを回すと、不要なデータ処理が発生したり、外部APIで不具合を起こす原因になります。
処理速度の過信
文字列操作の中では高速な部類ですが、オンチャートで毎チック数千回の変換を行うような設計は避けるべきです。初期化時(OnInitなど)に一度配列化しておくのがクオンツエンジニアとしての定石です。
5. 【重要】自動売買における約定スピードと環境の罠
アルゴリズムの細部にこだわり、StringToShortArrayのような関数を使いこなしてロジックを最適化したとしても、実行環境が貧弱であればその努力は水の泡となります。自動売買(EA)において最も致命的なリスクは、ロジックのミス以上に「ネットワーク遅延(レイテンシ)」です。
自宅のPC環境でMT5を稼働させている場合、プロバイダー経由の不安定な通信やPC自体の負荷によって、発注からブローカーのサーバーに注文が届くまでに数十から数百ミリ秒の遅延が発生します。急激なボラティリティの発生時には、このわずかな遅延が「スリッページ」を引き起こし、期待した利益を削り取るどころか、本来回避できたはずの損失を拡大させます。プロレベルのトレード環境を構築するには、取引サーバーに物理的に近い場所に位置する専用のVPS(仮想専用サーバー)を利用することが絶対条件です。極限まで約定スピードを高めることは、もはやテクニックではなく、マーケットで生き残るためのインフラとしての「義務」と言っても過言ではありません。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント