Jestem nowy w Pythonie i próbuję zebrać projekt, w którym pobieram dane z MT4, obliczam prognozę za pomocą tensorflow i odsyła wynik. Jeśli nie chcesz, mogę załączyć link do plików serwera gniazda, aby uruchomić stronę metatradera. Wysyłanie danych z MT4 jest w porządku, informacja tam jest. Podstawowe obliczenia w tensorflow są prawidłowe. Problem w tym, że nie wiem jak odesłać dane i zamknąć gniazdo. Dziękuję Ci.

from __future__ import absolute_import, division, print_function, unicode_literals


import tensorflow as tf

import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
import os
import pandas as pd

import socket
import ast
import json


mpl.rcParams['figure.figsize'] = (8, 6)
mpl.rcParams['axes.grid'] = False

TRAIN_SPLIT = 500
tf.random.set_seed(13)

def univariate_data(dataset, start_index, end_index, history_size, target_size):
  data = []
  labels = []

  start_index = start_index + history_size
  if end_index is None:
    end_index = len(dataset) - target_size

  for i in range(start_index, end_index):
    indices = range(i-history_size, i)
    # Reshape data from (history_size,) to (history_size, 1)
    data.append(np.reshape(dataset[indices], (history_size, 1)))
    labels.append(dataset[i+target_size])
  return np.array(data), np.array(labels)

def train_test_model(msg=''):
    msg = msg.replace('true', 'True')
    msg = ast.literal_eval(msg)

    print(type(msg))

    if (type(msg) == dict):
        input_data = msg
    else:
        return "BAD JSON!!"

    uni_data = pd.DataFrame(input_data['Data'])# make pandas dataframe
    uni_data.index = input_data['Time']
    uni_data = uni_data.astype('float64')# convert string to float

    uni_data = uni_data.values

    uni_train_mean = uni_data[:TRAIN_SPLIT].mean()
    uni_train_std = uni_data[:TRAIN_SPLIT].std()

    uni_data = (uni_data - uni_train_mean) / uni_train_std

    univariate_past_history = 20 #int(input_data['TestingPart'] / 100 * len(data)) #
    univariate_future_target = 0 #len(data) - testSize

    x_train_uni, y_train_uni = univariate_data(uni_data, 0, TRAIN_SPLIT,
                                           univariate_past_history,
                                           univariate_future_target)


    responseJSON = {}
    responseJSON['Pred'] = str(y_train_uni[0])

    return json.dumps(responseJSON)

class socketserver:
    def __init__(self, address='', port=9090):
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.address = address
        self.port = port
        self.sock.bind((self.address, self.port))
        self.cummdata = ''

    def recvmsg(self):
        self.sock.listen(1)
        self.conn, self.addr = self.sock.accept()
        print('connected to', self.addr)
        self.cummdata = ''

        while True:
            data = self.conn.recv(10000000)
            self.cummdata += data.decode("utf-8")

            if not data:
                break
           self.conn.send(bytes(train_test_model(self.cummdata), "utf-8"))

            return self.cummdata

    def __del__(self):
        self.sock.close()


serv = socketserver('127.0.0.1', 9090)

print('Socket Created at {}. Waiting for client..'.format(serv.sock.getsockname()))

while True:
   msg = serv.recvmsg()
0
Beertje 19 listopad 2019, 16:52

1 odpowiedź

Czy działa dobrze, czy serv.recvmsg() generuje błąd w czasie wykonywania? Widzę kilka błędów dotyczących wcięć w recvmsg. Czy zamierzałeś tak wyglądać?

    def recvmsg(self):
        self.sock.listen(1)
        self.conn, self.addr = self.sock.accept()
        print('connected to', self.addr)
        self.cummdata = ''

        while True:
            data = self.conn.recv(10000000)
            self.cummdata += data.decode("utf-8")

            if not data:
                break

        self.conn.send(bytes(train_test_model(self.cummdata), "utf-8"))

        return self.cummdata

0
MCH 19 listopad 2019, 17:29
Kod nie jest mój, pochodzi z github. Nie otrzymuję żadnego komunikatu o błędzie, działa, ale metetrader nie otrzymuje żadnych wyników.
 – 
Beertje
19 listopad 2019, 17:35