【MQL5】StringToShortArray関数の使い方と自動売買実装コード

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は終端まで)
   );

パラメーター解説

  1. text_string: 変換したい元の文字列です。
  2. array[]: 変換後の数値を格納するushort型の配列です。参照渡し(&)のため、関数内で配列の内容が直接書き換えられます。
  3. start: 配列のどのインデックスから書き込みを始めるかを指定します。デフォルトは「0」です。
  4. 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を使わないと、このロジックは再現できません。

コメント

タイトルとURLをコピーしました