Open2

MQL5からリクエストでデータを送信するコード

ホソノPホソノP

#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.");
    }
}
ホソノPホソノP
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)