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));