1. ShortArrayToString関数の概要と実務での活用法
MQL5におけるShortArrayToStringは、ushort型の配列(符号なし短整数型)を文字列(string型)に変換するための関数です。
MQL5のstring型は内部的にUnicode(UTF-16)で処理されており、1文字を2バイトで表現します。これに対応するのが2バイトのデータを持つushort型です。実務レベルの開発において、この関数は主に以下の場面で重宝されます。
- 外部DLLとの連携: C++などで作成されたDLLからUnicode文字列をushort配列として受け取った際の変換。
- バイナリデータのパース: ファイルやネットワークから読み込んだバイナリデータの中に埋め込まれたUnicode文字列の抽出。
- 動的な文字列操作: 処理速度を優先し、一度配列として文字コード単位で加工した後に、最終的な出力として文字列に戻す場合。
初心者が特につまずきやすいのは、「CharArrayToString(1バイト系)」との混同です。日本語のようなマルチバイト文字を含むUnicodeデータを扱う場合は、short系の関数を使うのがMQL5の鉄則です。
2. 構文と戻り値
関数の仕様は以下の通りです。
string ShortArrayToString(
ushort array[], // 変換元の配列
int start=0, // 変換を開始する位置
int count=-1 // 変換する要素数(-1は配列の最後まで)
);
パラメーター解説
- array[]: 変換したい
ushort型の配列です。 - start: 配列の何番目の要素から変換を開始するかを指定します(デフォルトは0)。
- count: 配列から取り出す要素数です。
-1を指定すると、配列の末尾まで、あるいは「終端文字(0)」が現れるまでを対象とします。
戻り値
変換された文字列(string型)を返します。
3. 具体的な使い方・実践サンプルコード
以下は、ushort配列に格納された文字コードを文字列に変換し、エキスパートログに出力するシンプルなサンプルです。
//+------------------------------------------------------------------+
//| SampleShortArrayToString.mq5 |
//+------------------------------------------------------------------+
void OnStart()
{
// Unicode文字コード(UTF-16)を配列で定義
// 0x004D='M', 0x0051='Q', 0x004C='L', 0x0035='5'
// 0x3042='あ', 0x3044='い'
ushort charCodes[] = {0x004D, 0x0051, 0x004C, 0x0035, 0x3042, 0x3044, 0x0000};
// 1. 配列全体を文字列に変換(終端文字まで)
string fullText = ShortArrayToString(charCodes);
Print("変換結果1: ", fullText); // 出力: MQL5あい
// 2. 開始位置を指定して変換(3番目の'L'から)
string partialText = ShortArrayToString(charCodes, 2);
Print("変換結果2: ", partialText); // 出力: L5あい
// 3. 文字数を指定して変換('MQL5'の4文字だけ)
string limitedText = ShortArrayToString(charCodes, 0, 4);
Print("変換結果3: ", limitedText); // 出力: MQL5
}
4. 使用上の注意点とよくあるエラー
① 終端文字(NULL)の意識
countを指定せずに変換する場合、配列内に0(NULL文字)が含まれている必要があります。もし0が含まれず、かつcountも指定されていない場合、メモリ上の意図しない領域まで読み取ろうとして、文字化けや予期せぬクラッシュの原因になることがあります。
② CharArrayToStringとの使い分け
- CharArrayToString: ASCII文字や、Shift-JIS/UTF-8などの1バイト単位のエンコード用。
- ShortArrayToString: MQL5標準のUnicode(UTF-16)用。
日本語を扱う現代的なMQL5開発では、基本的にushort配列とShortArrayToStringの組み合わせが推奨されます。
③ 配列範囲外のアクセス
startやcountに、実際の配列サイズを超える数値を指定するとエラーになります。必ずArraySize()関数などで配列の長さを確認する癖をつけましょう。
5. 【重要】自動売買における約定スピードと環境の罠
どれほど完璧なアルゴリズムを組み、ShortArrayToStringを駆使して高速なデータ処理を実現したとしても、プログラムを実行する「場所」が適切でなければ、その努力はすべて水泡に帰します。
日本の自宅PCから海外にある証券会社のサーバーへ注文を送る場合、物理的な距離によるネットワーク遅延(レイテンシ)は避けられません。FXの自動売買において、この数ミリ秒の遅延は致命的です。相場急変時にはスリッページを増大させ、バックテストの結果とは乖離した「負けトレード」を量産する原因となります。プロのクオンツエンジニアが個人開発者と最も差をつけているのは、実はロジック以上に「実行環境」です。24時間安定して稼働し、かつ証券会社サーバーとの物理的距離が近い専用のVPS(仮想専用サーバー)を利用することは、自動売買で利益を残すための絶対条件と言えます。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント