質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.39%
MQL4

MQL4とは、MT4(MetaTrader4)で用いられるプログラム言語です。MT4は無料で使えるチャートソフトあり、MQL4を使うことで分析ツールのオリジナルスクリプトの作成ができます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

4110閲覧

ソケット通信でPythonとMT4を連携させたい

y_masa.teratail

総合スコア13

MQL4

MQL4とは、MT4(MetaTrader4)で用いられるプログラム言語です。MT4は無料で使えるチャートソフトあり、MQL4を使うことで分析ツールのオリジナルスクリプトの作成ができます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/05/01 03:26

編集2022/05/01 03:43

FXチャートに機械学習を適応させることを目的に、ソケット通信でPythonとMT4の連携を行いたいのですが、MT4でファイルを実行するとエラーコード5200(URLが無効)と出てしまいます。
参考WEBサイト→https://aifx.tech/mt4-python1/#toc1
イメージ説明

https://www.mql5.com/en/forum/233808
のサイトより、ポートナンバーを443に変更してみたのですが、うまくいきません。

環境構築はDockerを使用しており、フレームワークはFlaskを使用しています。
ポートナンバー443に接続可能なことは確認済です。
イメージ説明

となると、MT4のファイルになにか誤りがあるのではないかと考えているのですが、原因がつかめません。
下記にMQLのコードと.pyファイルのコードを提示致します。

MQL4

1void OnTick() 2 { 3//--- 4 static datetime prev_time = Time[0]; 5 6 // 新しい足ができていないときはなにもせずに抜ける 7 if(Time[0] == prev_time) { 8 return; 9 } 10 11 prev_time = Time[0]; 12 13 string cookie=NULL, headers; 14 char post[], result[]; 15 string format = "http://localhost:443"; 16 string request = StringFormat(format, Symbol(), TimeToStr(Time[0] , TIME_DATE | TIME_SECONDS), Open[0], High[0], Low[0], Close[0]); 17 18 int response = WebRequest("GET", request, cookie, NULL, 500, post, 0, result, headers); 19 if (response == -1) { 20 Print("Error in WebRequest. Error code =",GetLastError()); 21 } else { 22 if (response == 200) { 23 // サーバーから返ってきた値を表示する 24 Print("Return from python: " + CharArrayToString(result)); 25 } else { 26 PrintFormat("Request '%s' failed, error code %d", format, response); 27 } 28 } 29 30 }

Python

1import os 2 3from flask import Flask 4 5 6port = int(os.environ['PORT']) 7app = Flask(__name__) 8 9@app.route('/') 10def index(): 11 return 'Hello!!!' 12 13 14prev_close = -1 15 16@app.route("/reset") 17def reset(): 18 global prev_close 19 prev_close = -1 20 return "" 21 22@app.route("/ontick") 23def ontick(): 24 open = float(request.args.get('open')) 25 high = float(request.args.get('high')) 26 low = float(request.args.get('low')) 27 close = float(request.args.get('close')) 28 global prev_close 29 30 if prev_close == -1: 31 prev_close = close 32 33 print(open, high, low, close, prev_close) 34 prev_close = close 35 36 return 'OK' 37 38 39if __name__ == '__main__': 40 app.run(debug=True, host='0.0.0.0', port=port)

アドバイス、ヒント等頂けると幸いです。
また、質問の仕方等、至らない箇所があれば指摘頂けるとうれしいです。
よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Python側のソースはimportにrequestが必要ではないでしょうか。

Python

1from flask import Flask, request

MT4側ですが、リファレンスを見るとhttpかhttpsで自動的にポートが選択されるらしいです。
https://www.mql5.com/ja/docs/network/webrequest

サーバーをポート80で動作させて、StringFormatの書式文字列を修正したら動作しました。

C++

1string format = "http://localhost/ontick?open=%f&high=%f&low=%f&close=%f"; 2string request = StringFormat(format, Open[0], High[0], Low[0], Close[0]);

投稿2022/05/01 07:07

編集2022/05/01 07:09
mah

総合スコア591

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_masa.teratail

2022/05/01 16:46

ご回答頂き、ありがとうございます。 サーバーをポート80にし、StringFormatの書式文字列を string format = "http://localhost/ontick?open=%f&high=%f&low=%f&close=%f"; と修正したらMT4上では動作したのですが、 http://localhost/ontick?open=%f&high=%f&low=%f&close=%f のURLに接続すると、下記のエラーがでてしまいます。 ValueError: could not convert string to float: '%f' %fの文字列を浮動小数点型に変更できないエラーであるとのことなので、 小数点に変更できるようにするか、もしくは取り除けばいいと思われるのですが、 http://localhost/ontick?open=%f&high=%f&low=%f&close=%f ↑このURL(文字列)をどのように変更すればよいかわからず、、 mahさんの回答に、”StringFormatの書式文字列を修正”とありますが、 どのようにして(何を参考にして?)書式文字列を修正したのかご教授いただけないでしょうか。 お手数おかけしますがよろしくお願いします。
mah

2022/05/01 18:20

> ValueError: could not convert string to float: '%f' 書式文字列をブラウザのURLに入れたということでしょうか? それだと当然Python側では処理出来ないのでエラーになります。 StringFormatに書式文字列と引数を渡して http://localhost/ontick?open=121.641000&high=131.252000&low=121.636000&close=129.866000 のような文字列が作成されてrequest変数に入り、それがサーバーに送られます。 書式文字列については、MQLの元になっているC言語で使用するものとほぼ同じです。 C言語では普段から使うものなので、特に何を調べたかと言われると困りますね。 printf 書式 とかで検索して解説を読んで見るといいかもしれません。
y_masa.teratail

2022/05/04 13:03

返信遅くなり、申し訳ありません。 ご連絡頂き、ありがとうございます。 書式文字列(http://localhost/ontick?open=%f&high=%f&low=%f&close=%f) をそのままブラウザのURLに入れておりました。 StringFormatに文字列と引数を渡して、返り値のrequestがサーバーに送られるという ことを理解しておりませんでした。 JavaのString.formatメソッドと似たような構造で文字列を作成しているのですね。 ご連絡、ご指摘頂き、本当にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.39%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問