MQL WebRequestのレスポンス表示の罠

サーバー(PHP,SQL)と連携したEAを作りたいということでいろいろ検証しましたが、その中で特にはまった点がありました。

MQLでサーバー(PHP,SQL)と連携したEAを作りたい

phpでechoした文字列がMQLのComment関数ですべて表示されない・・・

ということでした。これだと、デバッグができないTTや、データをEAに渡したいときに欠損してしまいます。

そんな2日間の奮闘の備忘録です。

サーバーのプログラムの検証

・POSTのリクエストで正常にサーバープログラムが動作しているか?

簡単なフォームを作って、POSTリクエストをすることで、サーバー側のプログラムが正常かどうかを調査しました。

<form action="送信先URL" method="post">
  <div>
    <label for="value1">value1値</label>
    <input name="value1" id="value1" value="1">
  </div>
  <div>
    <label for="value2">value2値</label>
    <input name="value2" id="value2" value="10">
  </div>
  <div>
    <button>Send my greetings</button>
  </div>
</form>

formtest.html

慣れていないMQLから直接POSTしてもわからないので、普通にhtmlのフォームからPOSTすることで、ちゃんと動作しているか確認です。

FTPでアップロードして、URL/formtest.htmlで値を入れて出力すると、正常にブラウザ上にechoされました。

ということは、PHPプログラムは正常に動作していそうです。このようなフォームから値も投げられるので、実際にEAを作成するときには、不正アクセスできないような仕組みも必要になってきます。開発段階ではデバッグに使いますが^^;

MQL側の検証

・MQLのComment関数の最大文字数がオーバーしていないか?

ここは全然問題ないと思っているのですが、一応・・・検索しても大丈夫そうなので、問題なさそう。Print、MessageBox関数でも同じように全部の文字列が返ってきてない(同じ文字列)のでとりあえずいったん保留として次に。

・そもそもデータがちゃんと受け取れているか?

WebRequest関数で取得できるレスポンス文字列を調べる。

結局、ここが罠でした。

WebRequestで戻ってくるデータは、char型の配列。これをCharArrayToStringで変換して文字列として出力するのです。

しかし、Char型の配列の中身に実際データが到達しているか?は見れていなかったので^^;

一文字づつ確認しました。

Print(ReceivedData[0]);

配列の[0]には、68、[1]には66ちゃんと「DB」と入ってきています。(68、66はASCIIコード)

順番に[1]、[2]と調べていくと、文字列が切れる前には、0の値が入っていました。そして、そのあとは、本来表示してほしい文字のASCIIコードが入ってきていました。

結論

CharArrayToString関数は、0を渡すとそこで変換が終了?するので、char配列のどこかに0が来たら、空白(32)などに変換して最後まで文字列を出力できるようにする。

検証の方法など模索したりしているうちに2日ほど経過していました^^;