Open2
MQL5からリクエストでデータを送信するコード
#property copyright "Copyright 2024, Your Name"
#property link "https://www.example.com"
#property version "1.00"
#property strict
#import "wininet.dll"
#define INTERNET_OPEN_TYPE_PRECONFIG 0
#define INTERNET_SERVICE_HTTP 3
int InternetOpenW(string sAgent, int lAccessType, string sProxyName, string sProxyBypass, int lFlags);
int InternetConnectW(int hInternet, string lpszServerName, int nServerPort, string lpszUsername, string lpszPassword, int dwService, int dwFlags, int dwContext);
int HttpOpenRequestW(int hConnect, string lpszVerb, string lpszObjectName, string lpszVersion, string lpszReferer, string lpszAcceptTypes, int dwFlags, int dwContext);
bool HttpSendRequestW(int hRequest, string lpszHeaders, int dwHeadersLength, const uchar &lpOptional[], int dwOptionalLength);
bool InternetReadFile(int hFile, uchar &lpBuffer[], int dwNumberOfBytesToRead, int &lpdwNumberOfBytesRead);
bool InternetCloseHandle(int hInet);
#import
// グローバル変数
string URI = "localhost"; // サーバー名を適切に設定してください
int PORT = 5000; // HTTPのポート
// Function to send HTTP request
bool SendHttpRequest(string postData, string &response)
{
string serverName = URI;
string path = "/";
uchar body[];
StringToCharArray(postData, body);
string headers = "Content-Type: application/x-www-form-urlencoded\r\n";
headers += "Content-Length: " + IntegerToString(StringLen(postData)) + "\r\n";
int HttpOpen = InternetOpenW("MetaTrader 5", INTERNET_OPEN_TYPE_PRECONFIG, "", "", 0);
if(HttpOpen <= 0) {
Print("Failed to open internet connection. Error: ", GetLastError());
return false;
}
int HttpConnect = InternetConnectW(HttpOpen, serverName, PORT, "", "", INTERNET_SERVICE_HTTP, 0, 0);
if(HttpConnect <= 0) {
Print("Failed to connect to server. Error: ", GetLastError());
InternetCloseHandle(HttpOpen);
return false;
}
int HttpRequest = HttpOpenRequestW(HttpConnect, "POST", path, "", "", NULL, 0, 0);
if(HttpRequest <= 0) {
Print("Failed to open HTTP request. Error: ", GetLastError());
InternetCloseHandle(HttpConnect);
InternetCloseHandle(HttpOpen);
return false;
}
bool result = HttpSendRequestW(HttpRequest, headers, StringLen(headers), body, ArraySize(body)-1);
if(!result) {
Print("Failed to send HTTP request. Error: ", GetLastError());
InternetCloseHandle(HttpRequest);
InternetCloseHandle(HttpConnect);
InternetCloseHandle(HttpOpen);
return false;
}
// Read the response
uchar buffer[];
ArrayResize(buffer, 1024);
int bytesRead;
response = "";
while(InternetReadFile(HttpRequest, buffer, 1024, bytesRead) && bytesRead > 0) {
response += CharArrayToString(buffer, 0, bytesRead);
}
// Close handles
InternetCloseHandle(HttpRequest);
InternetCloseHandle(HttpConnect);
InternetCloseHandle(HttpOpen);
return true;
}
// データを送信する関数
bool SendData(string data)
{
string postData = "data=" + data;
string response;
bool result = SendHttpRequest(postData, response);
if(result) {
Print("Data sent successfully. Server response: ", response);
} else {
Print("Failed to send data.");
}
return result;
}
// EA初期化関数
int OnInit()
{
Print("EA initialized. Ready to send data to server.");
return(INIT_SUCCEEDED);
}
// EA終了関数
void OnDeinit(const int reason)
{
Print("EA deinitialized. Reason: ", reason);
}
// ティック関数
void OnTick()
{
// 毎分の最初のティックでデータを送信
static datetime lastMinute = 0;
datetime currentMinute = (datetime)(TimeCurrent() / 60) * 60;
if(currentMinute > lastMinute)
{
string data = "EURUSD," + DoubleToString(SymbolInfoDouble(_Symbol, SYMBOL_BID), 5) + "," + TimeToString(TimeCurrent());
if(SendData(data))
{
Print("Data sent successfully at ", TimeToString(TimeCurrent()));
}
else
{
Print("Failed to send data at ", TimeToString(TimeCurrent()));
}
lastMinute = currentMinute;
}
}
// カスタム関数:手動でデータを送信
void SendDataManually()
{
datetime time = TimeCurrent();
string data = "EURUSD," + DoubleToString(SymbolInfoDouble(_Symbol, SYMBOL_BID), 5) + "," + TimeToString(time);
if(SendData(data))
{
Print("Data sent manually with success.");
}
else
{
Print("Failed to send data manually.");
}
}
from flask import Flask, request
import logging
import binascii
app = Flask(__name__)
# ロギングの設定
logging.basicConfig(level=logging.INFO)
def decode_data(data):
try:
# バイナリデータの場合、16進数文字列に変換
if isinstance(data, bytes):
return binascii.hexlify(data).decode('utf-8')
# 文字列の場合、UTF-16LEでデコードを試みる
return data.encode('utf-16le').decode('utf-16le')
except UnicodeDecodeError:
# デコードに失敗した場合、元のデータを文字列として返す
return str(data)
@app.route('/', methods=['POST'])
def receive_data():
if request.method == 'POST':
# リクエストデータを取得
raw_data = request.get_data()
# デコード処理
decoded_data = decode_data(raw_data)
app.logger.info(f"Received and decoded request data: {decoded_data}")
# フォームデータの処理(バイナリデータの場合は空になる可能性がある)
form_data = request.form
app.logger.info(f"Parsed form data: {form_data}")
# 'data' フィールドを取得(バイナリデータの場合は存在しない可能性がある)
data = form_data.get('data')
if data:
decoded_data = decode_data(data)
app.logger.info(f"Received and decoded data field: {decoded_data}")
return "Data received successfully", 200
elif raw_data:
return "Raw data received successfully", 200
else:
app.logger.warning("No data received in the request")
return "No data received", 400
else:
return "Method not allowed", 405
if __name__ == '__main__':
# HTTPサーバーを起動(開発用)
app.run(host='0.0.0.0', port=5000, debug=True)