MQL4 WebRequest POST Json к Django API с использованием Django rest framework, получение \x00 в конце тела

Я использую Django всего несколько недель, поэтому могут быть некоторые ошибки.

У меня есть API, использующий Django rest framework, который, кажется, работает хорошо. При использовании postman все в порядке

Я отправляю данные с помощью WebRequest в Mql4 на api

char data[];
data = {...}
int r = WebRequest("POST", "http://127.0.0.1/api/symbol/","Content-Type: application/json",5000, data,res_data, res_headers);

Данные, переданные WebRequest, в порядке, но функция добавляет \x00 в конце body.

Вот данные моего поста, когда он поступает в Django rest framework

{'Content-Length': '982', 'Content-Type': 'application/json', 'Accept': 'image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*', 'Host': '127.0.0.1', 'Accept-Language': 'fr,en', 'Accept-Charset': '*,utf-8', 'Connection': 'Keep-Alive', 'Proxy-Connection': 'Keep-Alive', 'Pragma': 'no-cache', 'Cache-Control': 'no-cache', 'User-Agent': 'MetaTrader 4 Terminal/4.1353 (Windows NT 6.1; x86)'}
b'{"name": "GOLDs","date_market": "2022-02-01T00:00:00.000000Z","period": "M1","open_price": 1797.64,"close_price": 1870.91,"low_price": 1788.33,"high_price": 1879.12,"bollinger_band":[{"period":"M1","moving_average_period":20,"standard_deviation":1.5,"high":1936.06829,"low":1717.61271,"moving_average":1826.8405},{"period":"M1","moving_average_period":20,"standard_deviation":2,"high":1972.47755,"low":1681.20345,"moving_average":1826.8405},{"period":"M1","moving_average_period":20,"standard_deviation":2.5,"high":2008.88681,"low":1644.79419,"moving_average":1826.8405}],"moving_average":[{"period":"M1","moving_average_period":50,"type": "0","value":1569.6854},{"period":"M1","moving_average_period":100,"type": "0","value":1399.8002},{"period":"M1","moving_average_period":200,"type": "0","value":1245.38985}],"MACD_zerolag":[{"period":"M1","fast_EMA_period":12,"slow_EMA_period":26,"signal_EMA_period":9,"histogram_value":-0.01794,"signal_value":0.09465,"MACD_value":0.07671}]}\x00'

поэтому я получаю следующую ошибку :

POST /api/symbol/ - 400
{'Content-Type': 'application/json', 'Vary': 'Accept', 'Allow': 'GET, POST, HEAD, OPTIONS'}
b'{"detail":"JSON parse error - Extra data: line 1 column 982 (char 981)"}'

если отправить те же данные, удалив \x00 с помощью Postman, все идет хорошо.

Существует ли неправильная конфигурация на стороне клиента при использовании mql4?

Или я могу удалить полученные данные, чтобы удалить это \x00 ?

Вот мой models.py

    from django.db import models, transaction

M1 = 'M1'
M5 = 'M5'
M15 = 'M15'
M30 = 'M30'
H1 = 'H1'
H4 = 'H4'
DAILY = 'DAILY'
WEEKLY = 'WEEKLY'
MONTHLY = 'MONTHLY'

PERIOD_CHOICES = (
    (M1, 'Une minute'),
    (M5, 'Cinq minutes'),
    (M15, 'Quinze minutes'),
    (M30, 'Trente minutes'),
    (H1, 'Une heure'),
    (H4, 'Quatre heures'),
    (DAILY, 'Journalier'),
    (WEEKLY, 'Hebdomadaire'),
    (MONTHLY, 'Mensuel'),
)


class BollingerBand(models.Model):

    period = models.CharField(max_length=30, choices=PERIOD_CHOICES, verbose_name='Période')
    moving_average_period = models.CharField(max_length=8)
    standard_deviation = models.DecimalField(max_digits=6, decimal_places=2)

    symbol = models.ForeignKey('API.Symbol', on_delete=models.CASCADE, related_name='bollinger_band', default=1)

    high = models.DecimalField(max_digits=12, decimal_places=6)
    low = models.DecimalField(max_digits=12, decimal_places=6)
    moving_average = models.DecimalField(max_digits=12, decimal_places=6)



class MovingAverage(models.Model):

    period = models.CharField(max_length=30, choices=PERIOD_CHOICES, verbose_name='Période')
    moving_average_period = models.CharField(max_length=8)
    type = models.TextField(max_length=30)

    symbol = models.ForeignKey('API.Symbol', on_delete=models.CASCADE, related_name='moving_average', default=1)

    value = models.DecimalField(max_digits=12, decimal_places=6)




class MACDZR(models.Model):

    period = models.CharField(max_length=30, choices=PERIOD_CHOICES, verbose_name='Période')
    fast_EMA_period = models.CharField(max_length=4)
    slow_EMA_period = models.CharField(max_length=4)
    signal_EMA_period = models.CharField(max_length=4)

    symbol = models.ForeignKey('API.Symbol', on_delete=models.CASCADE, related_name='MACD_zerolag', default=1)

    histogram_value = models.DecimalField(max_digits=12, decimal_places=6)
    signal_value = models.DecimalField(max_digits=12, decimal_places=6)
    MACD_value = models.DecimalField(max_digits=12, decimal_places=6)





class Symbol(models.Model):


    name = models.CharField(max_length=30, default='undefined')
    date_created = models.DateTimeField(auto_now_add=True)
    date_updated = models.DateTimeField(auto_now=True)

    date_market = models.DateTimeField()

    period = models.CharField(max_length=30, choices=PERIOD_CHOICES, verbose_name='Période')

    open_price = models.DecimalField(max_digits=12, decimal_places=6)
    close_price = models.DecimalField(max_digits=12, decimal_places=6)
    high_price = models.DecimalField(max_digits=12, decimal_places=6)
    low_price = models.DecimalField(max_digits=12, decimal_places=6)

    class Meta:
        constraints = [
            models.UniqueConstraint(
                fields=['name', 'date_market', 'period'],
                name='unique_symbol'
            )
        ]

    def __str__(self):
        return self.name

Serializers.py

from rest_framework import serializers

from API.models import Symbol, BollingerBand, MACDZR, MovingAverage


class BollingerBandSerializer(serializers.ModelSerializer):

    class Meta:
        model = BollingerBand
        fields = ['period',
                  'moving_average_period',
                  'standard_deviation',
                  'symbol',
                  'high',
                  'low',
                  'moving_average']



class MovingAverageSerializer(serializers.ModelSerializer):

    class Meta:
        model = MovingAverage
        fields = ['period',
                  'moving_average_period',
                  'type',
                  'symbol',
                  'value']



class MACDZRSerializer(serializers.ModelSerializer):

    class Meta:
        model = MACDZR
        fields = ['period',
                  'fast_EMA_period',
                  'slow_EMA_period',
                  'signal_EMA_period',
                  'symbol',
                  'histogram_value',
                  'signal_value',
                  'MACD_value']



class SymbolSerializer(serializers.ModelSerializer):

    bollinger_band = BollingerBandSerializer(many=True)
    moving_average = MovingAverageSerializer(many=True)
    MACD_zerolag = MACDZRSerializer(many=True)

    class Meta:
        model = Symbol
        fields = ['id',
                  'name',
                  'date_created',
                  'date_updated',
                  'date_market',
                  'period',
                  'open_price',
                  'close_price',
                  'high_price',
                  'low_price',
                  'bollinger_band',
                  'moving_average',
                  'MACD_zerolag'
                  ]


    def create(self, validated_data):

        bollinger_bands_data = validated_data.pop('bollinger_band')
        moving_averages_data = validated_data.pop('moving_average')
        MACDs_zerolag_data = validated_data.pop('MACD_zerolag')

        symbol = Symbol.objects.create(**validated_data)

        for bollinger_band_data in bollinger_bands_data:
            BollingerBand.objects.create(symbol=symbol, **bollinger_band_data)

        for MACD_zerolag_data in MACDs_zerolag_data:
            MACDZR.objects.create(symbol=symbol, **MACD_zerolag_data)

        for moving_average_data in moving_averages_data:
            MovingAverage.objects.create(symbol=symbol, **moving_average_data)

        return symbol

и settings.py

если у кого-нибудь есть простое решение для этого Спасибо

Я нашел решение, когда я преобразовал строку данных в объект post_Data, длина была не WHOLE_ARRAY, а StringLen.

StringToCharArray(data, post_data,0, StringLen(data));
Вернуться на верх