Système de trading automatique FX réalisé avec python et algorithme génétique Partie 1
Dans Partie 1 de la dernière fois, j'ai écrit l'IA de base et tout le mécanisme, donc cette fois j'ai défini une IA d'achat et de vente compliquée et en fait un algorithme génétique Je vais évoluer avec.
■ Spécifications Le prix du marché actuel est divisé en modèles en fonction du taux actuel, du taux moyen sur 4 heures, du taux moyen sur 24 heures, des prix les plus élevés et les plus bas des 25 derniers jours ouvrés et du nombre de jours depuis les prix les plus élevés et les plus bas des 25 derniers jours ouvrés. Passez une commande appropriée à partir de 10 ans de données de négociation (la valeur appropriée est calculée par un algorithme génétique et obtenue à partir de données passées).
■ Exemple d'opération Monnaie: Dollar Yen Heure actuelle: 1 octobre 2015 10:00:00 Taux actuel: 120,00 yens Tarif moyen sur 4 heures: 119,80 yens Tarif moyen sur 24 heures: 119,40 yens Prix le plus élevé des 25 derniers jours ouvrés: 121,75 yens Prix le plus bas au cours des 25 derniers jours ouvrés: 117,25 yens Jours écoulés depuis le prix le plus élevé des 25 derniers jours ouvrés: 2 jours Jours écoulés à partir du prix le plus bas des 25 derniers jours ouvrés: 8 jours Détails de la commande: 120 yens pour 100 unités ACHETER, prise de bénéfices 120,60 yens, réduction des pertes 119,75 yens
genetic.py
# -*- coding: utf-8 -*-
import random
import datetime
from enum import Enum
def order(ai_order):
_base = "OrderDone:{}, Limit:{}, Stop-Limit:{}"
print _base.format(ai_order.order_type,
ai_order.limit,
ai_order.stop_limit)
class OrderType(Enum):
Buy = 1
Wait = 0
Sell = -1
class Rate(object):
start_at = datetime.datetime(2015, 10, 1, 10, 0, 0)
bid = float(120.00) #Taux actuel
h4 = float(119.80) #Tarif moyen des 4 dernières heures
h24 = float(119.40) #Tarif moyen des dernières 24 heures
low_25d = float(117.25) #Prix le plus bas des 25 derniers jours ouvrés
high_25d = float(121.75) #Prix le plus élevé des 25 derniers jours ouvrés
low_25d_passed_day = 8 #Combien de jours se sont écoulés depuis le prix le plus bas des 25 derniers jours ouvrés
high_25d_passed_day = 2 #Combien de jours se sont écoulés depuis le prix le plus élevé des 25 derniers jours ouvrés
base_tick = float(0.01) #Unité de trading minimum par tick
@classmethod
def get(cls, currency=None, start_at=None):
return Rate()
def get_rate(self, tick, is_add):
if is_add:
return self.bid + float(tick * self.base_tick)
else:
return self.bid - float(tick * self.base_tick)
class AIOrder(object):
def __init__(self, order_type, limit, stop_limit):
self.order_type = order_type
self.limit = limit
self.stop_limit = stop_limit
class MarketKeyMixin(object):
def get_key_h24(self):
"""
Renvoie une clé qui représente la différence entre le taux actuel et la moyenne des dernières 24 heures
Exemple) H24:5
:rtype: str
"""
point = (self.rate.bid - self.rate.h24) / self.rate.base_tick
return 'H24:{}'.format(int(point / self.standard_tick))
def get_key_h4(self):
"""
Renvoie la clé qui représente la différence entre le taux actuel et la moyenne des 4 dernières heures
Exemple) H4:0
:rtype: str
"""
point = (self.rate.bid - self.rate.h4) / self.rate.base_tick
return 'H4:{}'.format(int(point / self.standard_tick))
def get_key_low_25d(self):
"""
Renvoie la clé qui représente l'écart entre le tarif actuel et le prix le plus bas au cours des 25 derniers jours ouvrés
Exemple) LOW:3
:rtype: str
"""
point = (self.rate.bid - self.rate.low_25d) / self.rate.base_tick
return 'LOW:{}'.format(int(point / self.standard_tick))
def get_key_high_25d(self):
"""
Renvoie la clé qui représente l'écart entre le taux actuel et le prix le plus élevé au cours des 25 derniers jours ouvrables
Exemple) HIGH:2
:rtype: str
"""
point = (self.rate.bid - self.rate.high_25d) / self.rate.base_tick
return 'HIGH:{}'.format(int(point / self.standard_tick))
def get_key_low_passed_day(self):
"""
Combien de jours se sont écoulés depuis le prix le plus bas des 25 derniers jours ouvrés
Exemple) LOW_PASSED_DAY:10
:rtype: str
"""
return 'LOW_PASSED_DAY:{}'.format(self.rate.low_25d_passed_day)
def get_key_high_passed_day(self):
"""
Combien de jours se sont écoulés depuis le prix le plus élevé des 25 derniers jours ouvrés
Exemple) HIGH_PASSED_DAY:1
:rtype: str
"""
return 'HIGH_PASSED_DAY:{}'.format(self.rate.high_25d_passed_day)
class AIParamValue(object):
"""
Classe qui définit les données d'opération AI
"""
def __init__(self, value, _min, _max):
self.value = value
self._min = _min
self._max = _max
def __repr__(self):
return "VALUE:{},MIN:{},MAX:{}".format(self.value,
self._min,
self._max)
def mutation(self):
"""
mutation
"""
self.value = random.randint(self._min, self._max)
return self
class AIParamOrder(object):
"""
Classe qui définit l'opération au moment de la commande dans les données d'opération de AI
"""
def __init__(self, order_type, limit, stop_limit, _min, _max):
self.order_type = order_type
self.limit = limit
self.stop_limit = stop_limit
self._min = _min
self._max = _max
def __repr__(self):
_base = "ORDER-TYPE:{},LIMIT:{},STOP-LIMIT:{},MIN:{},MAX:{}"
return _base.format(self.order_type,
self.limit,
self.stop_limit,
self._min,
self._max)
def mutation(self):
"""
mutation
"""
self.order_type = random.choice(list(OrderType))
self.limit = random.randint(self._min, self._max)
self.stop_limit = random.randint(self._min, self._max)
return self
class AI(MarketKeyMixin):
DEFAULT_STANDARD_TICK = 30
DEFAULT_MIN = 15
DEFAULT_MAX = 120
#Enregistrer les données de fonctionnement de l'IA
param = {
'DEFAULT_STANDARD_TICK': AIParamValue(DEFAULT_STANDARD_TICK, DEFAULT_MIN, DEFAULT_MAX)
}
def __init__(self, rate):
self.rate = rate
def order(self):
"""
Commande.
"""
order(self._get_order())
def get_key(self):
"""
Analyser et classer le taux et générer la clé appropriée
# sample
'H24:5,H4:0,LOW:4,LOW_PASSED_DAY:3,HIGH:3,HIGH_PASSED_DAY:6'
"""
_base = [self.get_key_h24(),
self.get_key_h4(),
self.get_key_low_25d(),
self.get_key_high_25d(),
self.get_key_low_passed_day(),
self.get_key_high_passed_day()]
return ",".join(_base)
def _get_order(self):
"""
Classe d'ordre de retour
rtype: AIOrder
"""
#Analyser le taux
key = self.get_key()
_o = self.param.get(key, None)
if _o is None:
#Générer et enregistrer aléatoirement lorsque les données de commande AI n'existent pas
_o = self._get_random_order()
self.param[key] = _o
#Génération des données de commande
limit_rate = self.rate.get_rate(_o.limit, True)
stop_limit_rate = self.rate.get_rate(_o.stop_limit, False)
return AIOrder(_o.order_type, limit_rate, stop_limit_rate)
def _get_random_order(self):
"""
Générer de manière aléatoire les données initiales lorsque les données de commande AI n'existent pas
"""
return AIParamOrder(random.choice(list(OrderType)),
0,
0,
self.DEFAULT_MIN,
self.DEFAULT_MAX).mutation()
def _get_order_type(self):
if self.rate.bid > self.rate.h24:
return OrderType.Buy
if self.rate.h24 > self.rate.bid:
return OrderType.Sell
return OrderType.Wait
@property
def standard_tick(self):
return self.param.get('DEFAULT_STANDARD_TICK').value
#Obtenir le taux
rate = Rate.get(currency='USDJPY', start_at=datetime.datetime.now())
#Génération IA
ai = AI(rate)
#Commande
ai.order()
print ai.param
>>python genetic.py
>>OrderDone:OrderType.Sell, Limit:122.37, Stop-Limit:117.22
>>{'DEFAULT_STANDARD_TICK': VALUE:30,MIN:10,MAX:400, 'H24:1,H4:0,LOW:9,HIGH:-5,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Sell,LIMIT:237,STOP-LIMIT:278,MIN:10,MAX:400}
Il y a deux points dans ce programme.
Si vous supprimez ces deux points, vous serez en mesure d'écrire facilement et magnifiquement la logique auto-évolutive par l'algorithme génétique dans la section suivante.
Étant donné que l'achat et la vente d'IA sont terminés, nous effectuerons un back-test avec les données des 10 dernières années. Puisque l'IA de première génération est une recherche aléatoire, une triste IA qui cause une perte de 1 million de yens par an principalement pour les commissions est née dans des transactions en unités de 10000 dollars.
genetic.py
print ai.param
{
'H24:0,H4:3,LOW:2,HIGH:-12,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Wait,LIMIT:66,STOP-LIMIT:71,MIN:15,MAX:120,
'H24:0,H4:0,LOW:2,HIGH:-12,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Sell,LIMIT:29,STOP-LIMIT:23,MIN:15,MAX:120,
'H24:-3,H4:3,LOW:-7,HIGH:-22,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Sell,LIMIT:86,STOP-LIMIT:35,MIN:15,MAX:120,
'H24:3,H4:3,LOW:-4,HIGH:-19,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Buy,LIMIT:98,STOP-LIMIT:76,MIN:15,MAX:120,
'H24:-3,H4:0,LOW:12,HIGH:-2,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Buy,LIMIT:78,STOP-LIMIT:64,MIN:15,MAX:120,
'H24:0,H4:0,LOW:9,HIGH:-5,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Sell,LIMIT:92,STOP-LIMIT:62,MIN:15,MAX:120,
'H24:-3,H4:0,LOW:5,HIGH:-9,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Sell,LIMIT:82,STOP-LIMIT:115,MIN:15,MAX:120,
'H24:0,H4:-3,LOW:0,HIGH:-15,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Sell,LIMIT:108,STOP-LIMIT:109,MIN:15,MAX:120,
'H24:3,H4:-3,LOW:-4,HIGH:-19,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Buy,LIMIT:100,STOP-LIMIT:42,MIN:15,MAX:120,
'H24:-3,H4:0,LOW:-7,HIGH:-22,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Buy,LIMIT:63,STOP-LIMIT:72,MIN:15,MAX:120,
'H24:3,H4:0,LOW:9,HIGH:-5,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Wait,LIMIT:64,STOP-LIMIT:89,MIN:15,MAX:120,
'H24:0,H4:0,LOW:5,HIGH:-9,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Sell,LIMIT:94,STOP-LIMIT:16,MIN:15,MAX:120,
'H24:3,H4:-3,LOW:5,HIGH:-9,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Wait,LIMIT:50,STOP-LIMIT:117,MIN:15,MAX:120,
'H24:0,H4:3,LOW:9,HIGH:-5,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Sell,LIMIT:112,STOP-LIMIT:24,MIN:15,MAX:120,
'H24:3,H4:0,LOW:-10,HIGH:-25,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Sell,LIMIT:74,STOP-LIMIT:50,MIN:15,MAX:120,
'H24:3,H4:3,LOW:-10,HIGH:-25,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Sell,LIMIT:20,STOP-LIMIT:111,MIN:15,MAX:120,
...
}
Le contenu de l'IA est composé de métadonnées difficiles à gérer pour les humains. Nous allons faire évoluer cette IA avec un algorithme génétique.
■ Qu'est-ce qu'un algorithme génétique? L'algorithme génétique transite approximativement dans le flux suivant. Dans cette section, nous allons générer la prochaine génération en croisant 3.
■ Génération de la prochaine génération en croisant Différentes méthodes ont été proposées pour le crossover, mais j'ai choisi la méthode qui est relativement connue et qui présente une bonne efficacité de calcul.
■ Spécifications pour les croisements et la nouvelle génération
■ À propos de la méthode de sélection de la roulette Exemple) AI-1 réalise un bénéfice de 1 million de yens AI-2 réalise un bénéfice de 500000 yens AI-3 réalise un bénéfice de 100 000 yens Quand
La probabilité que AI-1 soit sélectionné comme parent est de 100 / (100 + 50 + 10) = 62,5% La probabilité que AI-2 soit sélectionné comme parent est de 50 / (100 + 50 + 10) = 31,25% La probabilité que AI-3 soit sélectionné comme parent est de 10 / (100 + 50 + 10) = 6,55%
■ À propos de l'algorithme de croisement à deux points Je l'ai implémenté en me référant à Introduction aux algorithmes génétiques.
■ Soyez prudent! Les méthodes de sélection des parents, de croisement et de mutation ont un impact significatif sur les performances des algorithmes génétiques. Veuillez choisir la méthode avec le plus grand soin.
genetic_mixin.py
# -*- coding: utf-8 -*-
import random
import datetime
from enum import Enum
def mutation(_min, _max):
"""
mutation
:param _min: int
:param _max: int
"""
return random.randint(_min, _max)
def cross_2point(a, b, _min, _max):
"""
Traversée en deux points
:param a: int
:param b: int
"""
a = format(a, 'b')
b = format(b, 'b')
max_length = max([len(a), len(b)])
if len(a) < max_length:
a = '0' * (max_length - len(a)) + a
if len(b) < max_length:
b = '0' * (max_length - len(b)) + b
point1 = random.randint(1, max_length)
point2 = random.randint(1, max_length)
point_max = max(point1, point2)
point_min = min(point1, point2)
_a = a[:point_min] + b[point_min:point_max] + a[point_max:]
_b = b[:point_min] + a[point_min:point_max] + b[point_max:]
_a_point = int(_a, 2)
_b_point = int(_b, 2)
#Si elle est inférieure à la valeur minimale ou supérieure à la valeur maximale, elle est arrondie à chaque valeur.
def adjust(value, _min, _max):
if value > _max:
return _max
if value < _min:
return _min
return value
_a_point = adjust(_a_point, _min, _max)
_b_point = adjust(_b_point, _min, _max)
return _a_point, _b_point
def roulette_selection(ai_group):
"""
Algorithme génétique
Méthode de sélection de la roulette Sélectionnez le score comme poids
:param ai_group: list of AI
:rtype : AI
"""
#Utilisez la valeur de correction lorsque le score est négatif
correct_value = min([ai.score(0) for ai in ai_group])
if correct_value > 0:
correct_value = 0
#Calculer par la méthode de sélection de la roulette
total = sum([ai.score(correct_value) for ai in ai_group])
r = random.randint(0, total)
_total = 0
for ai in ai_group:
_total += ai.score(correct_value)
if r <= _total:
return ai
raise ValueError
class OrderType(Enum):
Buy = 1
Wait = 0
Sell = -1
@classmethod
def cross_2point(cls, a, b):
"""
Traverser
:param a: OrderType
:param b: OrderType
"""
value_a, value_b = cross_2point(a.value + 1, b.value + 1, 0, 2)
a_value = cls(value_a - 1)
b_value = cls(value_b - 1)
return a_value, b_value
class AIParamValue(object):
"""
Classe qui définit les données d'opération AI
"""
def __init__(self, value, _min, _max):
self.value = value
self._min = _min
self._max = _max
def __repr__(self):
return "VALUE:{},MIN:{},MAX:{}".format(self.value,
self._min,
self._max)
def cross_2point(self, b):
"""
Traversée en deux points
"""
a = self
value_a, value_b = cross_2point(a.value, b.value, a._min, a._max)
a.value = value_a
b.value = value_b
return a, b
def mutation(self):
"""
mutation
"""
self.value = random.randint(self._min, self._max)
return self
class AIParamOrder(object):
"""
Classe qui définit l'opération au moment de la commande dans les données d'opération de AI
"""
def __init__(self, order_type, limit, stop_limit, _min, _max):
self.order_type = order_type
self.limit = limit
self.stop_limit = stop_limit
self._min = _min
self._max = _max
def __repr__(self):
_base = "ORDER-TYPE:{},LIMIT:{},STOP-LIMIT:{},MIN:{},MAX:{}"
return _base.format(self.order_type,
self.limit,
self.stop_limit,
self._min,
self._max)
def cross_2point(self, b):
"""
Traversée en deux points
"""
a = self
# order_Type croisé
order_type_a, order_type_b = OrderType.cross_2point(a.order_type, b.order_type)
a.order_type = order_type_a
b.order_type = order_type_b
#Limite croisée
limit_a, limit_b = cross_2point(a.limit, b.limit, a._min, a._max)
a.limit = limit_a
b.limit = limit_b
# stop_Limite croisée
stop_limit_a, stop_limit_b = cross_2point(a.stop_limit, b.stop_limit, a._min, a._max)
a.stop_limit = stop_limit_a
b.stop_limit = stop_limit_b
return a, b
def mutation(self):
"""
mutation
"""
self.order_type = random.choice(list(OrderType))
self.limit = random.randint(self._min, self._max)
self.stop_limit = random.randint(self._min, self._max)
return self
class GeneticMixin(object):
@classmethod
def cross_over(cls, size, ai_group):
"""
Algorithme génétique
Mélange croisé
"""
#la taille doit être uniforme
if size % 2 != 0:
raise AssertionError
#Élitisme(Quitter le top 3)
# elite_group = sorted(ai_group, key=lambda x: x.score(0), reverse=True)[:3]
# elite_group = copy.deepcopy(elite_group)
# elite_group = [ai.incr_generation() for ai in elite_group]
#Sélectionnez les parents par la méthode de sélection de la roulette et croisez
next_ai_group = []
while len(next_ai_group) != size:
next_ai_group += cls._cross(roulette_selection(ai_group),
roulette_selection(ai_group))
return next_ai_group
@classmethod
def _cross(cls, ai_a, ai_b):
"""
Croiser deux parents et engendrer deux enfants
:param ai_a: AI
:param ai_b: AI
:return: list of AI
"""
#Génération incrémentale
generation = ai_a.generation + 1
child_a_param = {}
child_b_param = {}
for key in ai_a.param:
_value_a = ai_a.param.get(key)
_value_b = ai_b.param.get(key)
#Croisement par gène
_a, _b = cls._cross_value(_value_a, _value_b)
child_a_param[key] = _a
child_b_param[key] = _b
#Générer un enfant
child_a = cls.create_child(child_a_param, generation)
child_b = cls.create_child(child_b_param, generation)
return [child_a, child_b]
@classmethod
def create_child(cls, param, generation):
"""
Générez la prochaine génération
:param param: dict
:param generation: int
:rtype: cls
"""
ai = cls()
ai.param = param
ai.generation = generation
return ai
@classmethod
def _cross_value(cls, value_a, value_b):
"""
Gènes croisés
:param value_a: AIParamValue or AIParamOrder
:param value_b: AIParamValue or AIParamOrder
:return: int or list
"""
if random.randint(1, 100) == 1:
#mutation
return value_a.mutation(), value_a.mutation()
elif random.randint(1, 100) <= 85:
#Traversée en deux points
return value_a.cross_2point(value_b)
else:
#ne fais rien
return value_a, value_b
class AI(GeneticMixin):
DEFAULT_STANDARD_TICK = 30
DEFAULT_MIN = 15
DEFAULT_MAX = 120
param = {}
generation = 0 #génération
def __repr__(self):
return "Non.{}Génération AI PARAM:{}".format(self.generation, str(self.param))
def score(self, correct_value):
"""
Renvoie le score du résultat du test arrière
Avantages tout au long de la période
:param correct_value: float
:rtype : int
"""
return self.profit - correct_value
def get_random_order(self):
"""
Générer de manière aléatoire les données initiales lorsque les données de commande AI n'existent pas
"""
return AIParamOrder(random.choice(list(OrderType)),
0,
0,
self.DEFAULT_MIN,
self.DEFAULT_MAX).mutation()
def gen_random_ai_parame():
param = {
'DEFAULT_STANDARD_TICK': AIParamValue(AI.DEFAULT_STANDARD_TICK, AI.DEFAULT_MIN, AI.DEFAULT_MAX),
'H24:0,H4:3,LOW:2,HIGH:-12,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': AI().get_random_order(),
'H24:0,H4:0,LOW:2,HIGH:-12,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': AI().get_random_order(),
'H24:-3,H4:3,LOW:-7,HIGH:-22,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': AI().get_random_order(),
'H24:3,H4:3,LOW:-4,HIGH:-19,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': AI().get_random_order(),
}
return param
#Tester les données initiales
print '~~~~~~~~~~~~~TEST DATA~~~~~~~~~~~~~'
ai1 = AI.create_child(gen_random_ai_parame(), 1)
ai1.profit = 100 * 10000
print ai1
ai2 = AI.create_child(gen_random_ai_parame(), 1)
ai2.profit = 50 * 10000
print ai2
ai3 = AI.create_child(gen_random_ai_parame(), 1)
ai3.profit = -100 * 10000
print ai3
ai4 = AI.create_child(gen_random_ai_parame(), 1)
ai4.profit = -500 * 10000
print ai4
ai_group = [ai1, ai2, ai3, ai4]
#Génération d'IA de nouvelle génération
print '~~~~~~~~~~~~~RESULT~~~~~~~~~~~~~'
ai_group_next_generation = AI.cross_over(20, ai_group)
for ai in ai_group_next_generation:
print ai
>>python genetic_mixin.py
~~~~~~~~~~~~~TEST DATA~~~~~~~~~~~~~
AI PARAM 1ère génération:{'H24:-3,H4:3,LOW:-7,HIGH:-22,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Sell,LIMIT:28,STOP-LIMIT:83,MIN:15,MAX:120, 'H24:3,H4:3,LOW:-4,HIGH:-19,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Buy,LIMIT:32,STOP-LIMIT:120,MIN:15,MAX:120, 'DEFAULT_STANDARD_TICK': VALUE:30,MIN:15,MAX:120, 'H24:0,H4:3,LOW:2,HIGH:-12,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Buy,LIMIT:99,STOP-LIMIT:25,MIN:15,MAX:120, 'H24:0,H4:0,LOW:2,HIGH:-12,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Wait,LIMIT:30,STOP-LIMIT:20,MIN:15,MAX:120}
AI PARAM 1ère génération:{'H24:-3,H4:3,LOW:-7,HIGH:-22,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Buy,LIMIT:94,STOP-LIMIT:112,MIN:15,MAX:120, 'H24:3,H4:3,LOW:-4,HIGH:-19,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Wait,LIMIT:24,STOP-LIMIT:101,MIN:15,MAX:120, 'DEFAULT_STANDARD_TICK': VALUE:30,MIN:15,MAX:120, 'H24:0,H4:3,LOW:2,HIGH:-12,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Sell,LIMIT:66,STOP-LIMIT:79,MIN:15,MAX:120, 'H24:0,H4:0,LOW:2,HIGH:-12,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Buy,LIMIT:78,STOP-LIMIT:81,MIN:15,MAX:120}
AI PARAM 1ère génération:{'H24:-3,H4:3,LOW:-7,HIGH:-22,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Wait,LIMIT:94,STOP-LIMIT:35,MIN:15,MAX:120, 'H24:3,H4:3,LOW:-4,HIGH:-19,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Sell,LIMIT:103,STOP-LIMIT:112,MIN:15,MAX:120, 'DEFAULT_STANDARD_TICK': VALUE:30,MIN:15,MAX:120, 'H24:0,H4:3,LOW:2,HIGH:-12,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Buy,LIMIT:18,STOP-LIMIT:38,MIN:15,MAX:120, 'H24:0,H4:0,LOW:2,HIGH:-12,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Sell,LIMIT:20,STOP-LIMIT:89,MIN:15,MAX:120}
AI PARAM 1ère génération:{'H24:-3,H4:3,LOW:-7,HIGH:-22,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Wait,LIMIT:42,STOP-LIMIT:20,MIN:15,MAX:120, 'H24:3,H4:3,LOW:-4,HIGH:-19,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Buy,LIMIT:46,STOP-LIMIT:76,MIN:15,MAX:120, 'DEFAULT_STANDARD_TICK': VALUE:30,MIN:15,MAX:120, 'H24:0,H4:3,LOW:2,HIGH:-12,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Sell,LIMIT:104,STOP-LIMIT:43,MIN:15,MAX:120, 'H24:0,H4:0,LOW:2,HIGH:-12,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Buy,LIMIT:40,STOP-LIMIT:109,MIN:15,MAX:120}
~~~~~~~~~~~~~RESULT~~~~~~~~~~~~~
AI PARAM de 2e génération:{'H24:-3,H4:3,LOW:-7,HIGH:-22,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Sell,LIMIT:30,STOP-LIMIT:83,MIN:15,MAX:120, 'H24:3,H4:3,LOW:-4,HIGH:-19,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Buy,LIMIT:55,STOP-LIMIT:96,MIN:15,MAX:120, 'DEFAULT_STANDARD_TICK': VALUE:30,MIN:15,MAX:120, 'H24:0,H4:3,LOW:2,HIGH:-12,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Buy,LIMIT:83,STOP-LIMIT:31,MIN:15,MAX:120, 'H24:0,H4:0,LOW:2,HIGH:-12,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Sell,LIMIT:28,STOP-LIMIT:20,MIN:15,MAX:120}
AI PARAM de 2e génération:{'H24:-3,H4:3,LOW:-7,HIGH:-22,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Sell,LIMIT:30,STOP-LIMIT:83,MIN:15,MAX:120, 'H24:3,H4:3,LOW:-4,HIGH:-19,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Buy,LIMIT:55,STOP-LIMIT:96,MIN:15,MAX:120, 'DEFAULT_STANDARD_TICK': VALUE:30,MIN:15,MAX:120, 'H24:0,H4:3,LOW:2,HIGH:-12,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Buy,LIMIT:83,STOP-LIMIT:31,MIN:15,MAX:120, 'H24:0,H4:0,LOW:2,HIGH:-12,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Sell,LIMIT:28,STOP-LIMIT:20,MIN:15,MAX:120}
AI PARAM de 2e génération:{'H24:-3,H4:3,LOW:-7,HIGH:-22,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Wait,LIMIT:92,STOP-LIMIT:48,MIN:15,MAX:120, 'H24:3,H4:3,LOW:-4,HIGH:-19,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Sell,LIMIT:111,STOP-LIMIT:113,MIN:15,MAX:120, 'DEFAULT_STANDARD_TICK': VALUE:30,MIN:15,MAX:120, 'H24:0,H4:3,LOW:2,HIGH:-12,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Buy,LIMIT:15,STOP-LIMIT:38,MIN:15,MAX:120, 'H24:0,H4:0,LOW:2,HIGH:-12,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Sell,LIMIT:15,STOP-LIMIT:89,MIN:15,MAX:120}
AI PARAM de 2e génération:{'H24:-3,H4:3,LOW:-7,HIGH:-22,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Buy,LIMIT:94,STOP-LIMIT:99,MIN:15,MAX:120, 'H24:3,H4:3,LOW:-4,HIGH:-19,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Sell,LIMIT:15,STOP-LIMIT:120,MIN:15,MAX:120, 'DEFAULT_STANDARD_TICK': VALUE:30,MIN:15,MAX:120, 'H24:0,H4:3,LOW:2,HIGH:-12,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Sell,LIMIT:98,STOP-LIMIT:79,MIN:15,MAX:120, 'H24:0,H4:0,LOW:2,HIGH:-12,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Buy,LIMIT:86,STOP-LIMIT:81,MIN:15,MAX:120}
AI PARAM de 2e génération:{'H24:-3,H4:3,LOW:-7,HIGH:-22,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Sell,LIMIT:30,STOP-LIMIT:83,MIN:15,MAX:120, 'H24:3,H4:3,LOW:-4,HIGH:-19,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Buy,LIMIT:55,STOP-LIMIT:96,MIN:15,MAX:120, 'DEFAULT_STANDARD_TICK': VALUE:30,MIN:15,MAX:120, 'H24:0,H4:3,LOW:2,HIGH:-12,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Buy,LIMIT:83,STOP-LIMIT:31,MIN:15,MAX:120, 'H24:0,H4:0,LOW:2,HIGH:-12,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Sell,LIMIT:28,STOP-LIMIT:20,MIN:15,MAX:120}
AI PARAM de 2e génération:{'H24:-3,H4:3,LOW:-7,HIGH:-22,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Buy,LIMIT:94,STOP-LIMIT:99,MIN:15,MAX:120, 'H24:3,H4:3,LOW:-4,HIGH:-19,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Sell,LIMIT:15,STOP-LIMIT:120,MIN:15,MAX:120, 'DEFAULT_STANDARD_TICK': VALUE:30,MIN:15,MAX:120, 'H24:0,H4:3,LOW:2,HIGH:-12,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Sell,LIMIT:98,STOP-LIMIT:79,MIN:15,MAX:120, 'H24:0,H4:0,LOW:2,HIGH:-12,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Buy,LIMIT:86,STOP-LIMIT:81,MIN:15,MAX:120}
AI PARAM de 2e génération:{'H24:-3,H4:3,LOW:-7,HIGH:-22,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Buy,LIMIT:94,STOP-LIMIT:99,MIN:15,MAX:120, 'H24:3,H4:3,LOW:-4,HIGH:-19,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Sell,LIMIT:15,STOP-LIMIT:120,MIN:15,MAX:120, 'DEFAULT_STANDARD_TICK': VALUE:30,MIN:15,MAX:120, 'H24:0,H4:3,LOW:2,HIGH:-12,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Sell,LIMIT:98,STOP-LIMIT:79,MIN:15,MAX:120, 'H24:0,H4:0,LOW:2,HIGH:-12,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Buy,LIMIT:86,STOP-LIMIT:81,MIN:15,MAX:120}
AI PARAM de 2e génération:{'H24:-3,H4:3,LOW:-7,HIGH:-22,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Sell,LIMIT:30,STOP-LIMIT:83,MIN:15,MAX:120, 'H24:3,H4:3,LOW:-4,HIGH:-19,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Buy,LIMIT:55,STOP-LIMIT:96,MIN:15,MAX:120, 'DEFAULT_STANDARD_TICK': VALUE:30,MIN:15,MAX:120, 'H24:0,H4:3,LOW:2,HIGH:-12,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Buy,LIMIT:83,STOP-LIMIT:31,MIN:15,MAX:120, 'H24:0,H4:0,LOW:2,HIGH:-12,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Sell,LIMIT:28,STOP-LIMIT:20,MIN:15,MAX:120}
AI PARAM de 2e génération:{'H24:-3,H4:3,LOW:-7,HIGH:-22,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Sell,LIMIT:30,STOP-LIMIT:83,MIN:15,MAX:120, 'H24:3,H4:3,LOW:-4,HIGH:-19,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Buy,LIMIT:55,STOP-LIMIT:96,MIN:15,MAX:120, 'DEFAULT_STANDARD_TICK': VALUE:30,MIN:15,MAX:120, 'H24:0,H4:3,LOW:2,HIGH:-12,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Buy,LIMIT:83,STOP-LIMIT:31,MIN:15,MAX:120, 'H24:0,H4:0,LOW:2,HIGH:-12,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Sell,LIMIT:28,STOP-LIMIT:20,MIN:15,MAX:120}
AI PARAM de 2e génération:{'H24:-3,H4:3,LOW:-7,HIGH:-22,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Buy,LIMIT:94,STOP-LIMIT:99,MIN:15,MAX:120, 'H24:3,H4:3,LOW:-4,HIGH:-19,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Sell,LIMIT:15,STOP-LIMIT:120,MIN:15,MAX:120, 'DEFAULT_STANDARD_TICK': VALUE:30,MIN:15,MAX:120, 'H24:0,H4:3,LOW:2,HIGH:-12,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Sell,LIMIT:98,STOP-LIMIT:79,MIN:15,MAX:120, 'H24:0,H4:0,LOW:2,HIGH:-12,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Buy,LIMIT:86,STOP-LIMIT:81,MIN:15,MAX:120}
AI PARAM de 2e génération:{'H24:-3,H4:3,LOW:-7,HIGH:-22,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Buy,LIMIT:94,STOP-LIMIT:99,MIN:15,MAX:120, 'H24:3,H4:3,LOW:-4,HIGH:-19,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Sell,LIMIT:15,STOP-LIMIT:120,MIN:15,MAX:120, 'DEFAULT_STANDARD_TICK': VALUE:30,MIN:15,MAX:120, 'H24:0,H4:3,LOW:2,HIGH:-12,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Sell,LIMIT:98,STOP-LIMIT:79,MIN:15,MAX:120, 'H24:0,H4:0,LOW:2,HIGH:-12,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Buy,LIMIT:86,STOP-LIMIT:81,MIN:15,MAX:120}
AI PARAM de 2e génération:{'H24:-3,H4:3,LOW:-7,HIGH:-22,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Sell,LIMIT:30,STOP-LIMIT:83,MIN:15,MAX:120, 'H24:3,H4:3,LOW:-4,HIGH:-19,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Buy,LIMIT:55,STOP-LIMIT:96,MIN:15,MAX:120, 'DEFAULT_STANDARD_TICK': VALUE:30,MIN:15,MAX:120, 'H24:0,H4:3,LOW:2,HIGH:-12,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Buy,LIMIT:83,STOP-LIMIT:31,MIN:15,MAX:120, 'H24:0,H4:0,LOW:2,HIGH:-12,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Sell,LIMIT:28,STOP-LIMIT:20,MIN:15,MAX:120}
AI PARAM de 2e génération:{'H24:-3,H4:3,LOW:-7,HIGH:-22,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Sell,LIMIT:30,STOP-LIMIT:83,MIN:15,MAX:120, 'H24:3,H4:3,LOW:-4,HIGH:-19,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Buy,LIMIT:55,STOP-LIMIT:96,MIN:15,MAX:120, 'DEFAULT_STANDARD_TICK': VALUE:30,MIN:15,MAX:120, 'H24:0,H4:3,LOW:2,HIGH:-12,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Buy,LIMIT:83,STOP-LIMIT:31,MIN:15,MAX:120, 'H24:0,H4:0,LOW:2,HIGH:-12,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Sell,LIMIT:28,STOP-LIMIT:20,MIN:15,MAX:120}
AI PARAM de 2e génération:{'H24:-3,H4:3,LOW:-7,HIGH:-22,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Sell,LIMIT:30,STOP-LIMIT:83,MIN:15,MAX:120, 'H24:3,H4:3,LOW:-4,HIGH:-19,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Buy,LIMIT:55,STOP-LIMIT:96,MIN:15,MAX:120, 'DEFAULT_STANDARD_TICK': VALUE:30,MIN:15,MAX:120, 'H24:0,H4:3,LOW:2,HIGH:-12,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Buy,LIMIT:83,STOP-LIMIT:31,MIN:15,MAX:120, 'H24:0,H4:0,LOW:2,HIGH:-12,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Sell,LIMIT:28,STOP-LIMIT:20,MIN:15,MAX:120}
AI PARAM de 2e génération:{'H24:-3,H4:3,LOW:-7,HIGH:-22,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Buy,LIMIT:94,STOP-LIMIT:99,MIN:15,MAX:120, 'H24:3,H4:3,LOW:-4,HIGH:-19,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Sell,LIMIT:15,STOP-LIMIT:120,MIN:15,MAX:120, 'DEFAULT_STANDARD_TICK': VALUE:30,MIN:15,MAX:120, 'H24:0,H4:3,LOW:2,HIGH:-12,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Sell,LIMIT:98,STOP-LIMIT:79,MIN:15,MAX:120, 'H24:0,H4:0,LOW:2,HIGH:-12,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Buy,LIMIT:86,STOP-LIMIT:81,MIN:15,MAX:120}
AI PARAM de 2e génération:{'H24:-3,H4:3,LOW:-7,HIGH:-22,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Sell,LIMIT:30,STOP-LIMIT:83,MIN:15,MAX:120, 'H24:3,H4:3,LOW:-4,HIGH:-19,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Buy,LIMIT:55,STOP-LIMIT:96,MIN:15,MAX:120, 'DEFAULT_STANDARD_TICK': VALUE:30,MIN:15,MAX:120, 'H24:0,H4:3,LOW:2,HIGH:-12,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Buy,LIMIT:83,STOP-LIMIT:31,MIN:15,MAX:120, 'H24:0,H4:0,LOW:2,HIGH:-12,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Sell,LIMIT:28,STOP-LIMIT:20,MIN:15,MAX:120}
AI PARAM de 2e génération:{'H24:-3,H4:3,LOW:-7,HIGH:-22,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Sell,LIMIT:30,STOP-LIMIT:83,MIN:15,MAX:120, 'H24:3,H4:3,LOW:-4,HIGH:-19,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Buy,LIMIT:55,STOP-LIMIT:96,MIN:15,MAX:120, 'DEFAULT_STANDARD_TICK': VALUE:30,MIN:15,MAX:120, 'H24:0,H4:3,LOW:2,HIGH:-12,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Buy,LIMIT:83,STOP-LIMIT:31,MIN:15,MAX:120, 'H24:0,H4:0,LOW:2,HIGH:-12,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Sell,LIMIT:28,STOP-LIMIT:20,MIN:15,MAX:120}
AI PARAM de 2e génération:{'H24:-3,H4:3,LOW:-7,HIGH:-22,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Wait,LIMIT:92,STOP-LIMIT:48,MIN:15,MAX:120, 'H24:3,H4:3,LOW:-4,HIGH:-19,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Sell,LIMIT:111,STOP-LIMIT:113,MIN:15,MAX:120, 'DEFAULT_STANDARD_TICK': VALUE:30,MIN:15,MAX:120, 'H24:0,H4:3,LOW:2,HIGH:-12,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Buy,LIMIT:15,STOP-LIMIT:38,MIN:15,MAX:120, 'H24:0,H4:0,LOW:2,HIGH:-12,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Sell,LIMIT:15,STOP-LIMIT:89,MIN:15,MAX:120}
AI PARAM de 2e génération:{'H24:-3,H4:3,LOW:-7,HIGH:-22,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Buy,LIMIT:94,STOP-LIMIT:99,MIN:15,MAX:120, 'H24:3,H4:3,LOW:-4,HIGH:-19,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Sell,LIMIT:15,STOP-LIMIT:120,MIN:15,MAX:120, 'DEFAULT_STANDARD_TICK': VALUE:30,MIN:15,MAX:120, 'H24:0,H4:3,LOW:2,HIGH:-12,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Sell,LIMIT:98,STOP-LIMIT:79,MIN:15,MAX:120, 'H24:0,H4:0,LOW:2,HIGH:-12,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Buy,LIMIT:86,STOP-LIMIT:81,MIN:15,MAX:120}
AI PARAM de 2e génération:{'H24:-3,H4:3,LOW:-7,HIGH:-22,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Sell,LIMIT:30,STOP-LIMIT:83,MIN:15,MAX:120, 'H24:3,H4:3,LOW:-4,HIGH:-19,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Buy,LIMIT:55,STOP-LIMIT:96,MIN:15,MAX:120, 'DEFAULT_STANDARD_TICK': VALUE:30,MIN:15,MAX:120, 'H24:0,H4:3,LOW:2,HIGH:-12,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Buy,LIMIT:83,STOP-LIMIT:31,MIN:15,MAX:120, 'H24:0,H4:0,LOW:2,HIGH:-12,LOW_PASSED_DAY:8,HIGH_PASSED_DAY:2': ORDER-TYPE:OrderType.Sell,LIMIT:28,STOP-LIMIT:20,MIN:15,MAX:120}
Les résultats se compliquent. Le test sera plus difficile avec vos yeux, alors écrivons correctement le code de test.
Et s'il y a un bug dans l'implémentation de la partie achat et vente? Si vous définissez le score de l'algorithme génétique sur les revenus commerciaux, les paramètres seront optimisés afin que vous puissiez acheter et vendre avec des bogues et gagner des bénéfices avec des bogues. En fait, une IA qui fait des bénéfices même s'il y a un bug. Au début, je n'étais pas tout à fait convaincu. Et quand j'ai corrigé le bogue, le résultat du trading a changé, donc je ne pouvais pas arrêter le système de production et j'étais en difficulté.
Dans cet article, nous avons mis en œuvre la définition de l'IA d'achat et de vente complexe et l'évolution des algorithmes génétiques. Mise en place du trading automatique, implémentation des appels API Oanda, stockage de l'IA, enregistrement des résultats de calcul pour chaque génération, etc. Je ne l'ai pas encore écrit, je voudrais donc l'introduire dans la Partie 3.
Trading automatique de devises avec l'algorithme génétique Partie 3 Commerce réel avec l'API Oanda
Système de trading automatique FX réalisé avec python et algorithme génétique Partie 1 Trading automatique FX avec algorithme génétique Partie 2 Mise en œuvre d'une IA de trading en évolution Trading automatique de devises avec l'algorithme génétique Partie 3 Commerce réel avec l'API Oanda
Recommended Posts