La stratégie
Certaines personnes croient que l'ouverture du marché le matin est le moment où le marché a la plus grande divergence. Après environ 30 minutes, le marché a complètement digéré toutes sortes d'informations du jour au lendemain, et la tendance des prix aura tendance à être rationnelle et à revenir à la normale. En d'autres termes: la tendance du marché au cours des 30 premières minutes ou plus constitue fondamentalement le schéma de négociation global d'aujourd'hui.
Les hauts et les bas relatifs générés à ce moment-là forment les hauts et les bas effectifs de la théorie de Dow, et la stratégie HANS123 est la logique de négociation établie par cela.
Bien que la stratégie de percée puisse entrer sur le marché dès que la tendance se forme. Mais cet avantage est aussi une épée à double tranchant. En raison de l'entrée sensible, la percée du prix a échoué. Il est donc nécessaire de définir un stop loss. Dans le même temps, afin d'atteindre la logique de stratégie de gagner et de perdre, il faut définir un profit.
À tour de rôle:fmz.comSite Web > Connexion > Tableau de bord > Bibliothèque de stratégie > Nouvelle stratégie > Cliquez sur le menu déroulant dans le coin supérieur droit pour sélectionner le langage Python et commencer à écrire la stratégie.
# Strategy main function
def onTick():
pass
# Program entry
def main():
while True: # enter infinite loop mode
onTick() # execute strategy main function
Sleep(1000) # Sleep for 1 second
L'écriture d'un cadre stratégique, cela a été appris dans le chapitre précédent, l'un est leonTick
fonction, et l'autremain
Le rôle de laonTick
fonction est exécutée en boucle sans fin dans lemain
function.
up_line = 0 # upper rail
down_line = 0 # lower rail
trade_count = 0 # Number of transactions on the day
Parce que les rails supérieur et inférieur ne sont comptés qu'à l'heure de 09:30, et aucune statistique n'est faite dans le reste du temps, nous devons écrire ces deux variables en dehors de la boucle.trade_count
Avant d'utiliser ces deux variables globales dans la fonction principale de laonTick
stratégie, vous devez utiliser leglobal
mot clé à référencer.
exchange.SetContractType("rb888") # Subscribe to futures varieties
bar_arr = _C(exchange.GetRecords, PERIOD_M1) # Get 1-minute K line array
current_close = bar_arr[-1]['Close'] # Get the latest price
if len(bar_arr) <50: # If less than 50 k line bars
return # Return to continue waiting for data
Pour obtenir des données, utilisez d'abord leSetContractType
La fonction de souscription à des contrats à terme est utilisée dans l'API de la plateforme FMZ.GetRecords
Vous pouvez également passer dans la matrice de ligne K spécifiantPERIOD_M11
minutes lorsque l'on utilise leGetRecords
function.
L'étape suivante consiste à obtenir le dernier prix, qui est utilisé pour déterminer la relation de position entre le prix actuel et les rails supérieur et inférieur. En même temps, lors de la passation d'un ordre en utilisant la fonction Acheter ou Vendre, vous devez passer le prix spécifié. En outre, n'oubliez pas de filtrer le nombre de barres de ligne k, car si le nombre de barres de ligne k est trop petit, il y aura une erreur qui ne peut pas être calculée.
def current_time():
current_time = bar_arr[-1]['Time'] # Get current K-line timestamp
time_local = time.localtime(current_time / 1000) # Processing timestamp
hour = time.strftime("%H", time_local) # Format the timestamp and get the hour
minute = time.strftime("%M", time_local) # Format the timestamp and get the minute
if len(minute) == 1:
minute = "0" + minute
return int(hour + minute)
Lors du calcul des rails supérieurs et inférieurs et de la passation des ordres, il est nécessaire de juger si l'heure actuelle correspond à l'heure de négociation spécifiée par nous, de sorte que pour faciliter le jugement, nous devons nous occuper des heures et des minutes spécifiques de la ligne K actuelle.
global up_line, down_line, trade_count # Introduce global variables
current_time = current_time() # processing time
if current_time == 930: # If the latest K-line time is 09:30
up_line = TA.Highest(bar_arr, 30,'High') + count # The highest price of the first 30 k line bars
down_line = TA.Lowest(bar_arr, 30,'Low')-count # The lowest price of the first 30 ke line bars
trade_count = 0 # Reset the number of transactions to 0
position_arr = _C(exchange.GetPosition) # Get position array
if len(position_arr) > 0: # If the position array length is greater than 0
position_arr = position_arr[0] # Get position dictionary data
if position_arr['ContractType'] =='rb888': # If the position symbol is equal to the subscription symbol
if position_arr['Type']% 2 == 0: # If it is a long position
position = position_arr['Amount'] # The number of assigned positions is a positive number
else:
position = -position_arr['Amount'] # Assign a negative number of positions
profit = position_arr['Profit'] # Get position profit and loss
else:
position = 0 # The number of assigned positions is 0
profit = 0 # Assign position profit and loss to 0
Le statut de position implique une logique de stratégie. Nos dix premières leçons ont toujours utilisé des positions de détention virtuelles, mais dans un environnement de trading réel, il est préférable d'utiliser leGetPosition
fonction permettant d'obtenir des informations sur les positions réelles, notamment: direction de la position, bénéfices et pertes de position, nombre de positions, etc.
# If it is close to market closing or reach taking profit and stopping loss
if current_time > 1450 or profit > stop * 3 or profit < -stop:
if position > 0: # If holding a long position
exchange.SetDirection("closebuy") # Set transaction direction and type
exchange.Sell(current_close-1, 1) # Close long order
elif position <0: # If holding an empty order
exchange.SetDirection("closesell") # Set transaction direction and type
exchange.Buy(current_close + 1, 1) # Close short order
# If there is no current position, and it is less than the specified number of transactions, and within the specified trading time
if position == 0 and trade_count < 2 and 930 < current_time < 1450:
if current_close > up_line: # If the price is greater than the upper line
exchange.SetDirection("buy") # Set transaction direction and type
exchange.Buy(current_close + 1, 1) # Open long order
trade_count = trade_count + 1 # Increase the number of transactions
elif current_close < down_line: # If the price is less than the lower line
exchange.SetDirection("sell") # Set transaction direction and type
exchange.Sell(current_close-1, 1) # Open a short order
trade_count = trade_count + 1 # Increase the number of transactions
Pour éviter les erreurs de logique dans la stratégie, il est préférable d'écrire la logique de position de clôture avant la logique de position d'ouverture. Dans cette stratégie, lors de l'ouverture d'une position, déterminez d'abord l'état de la position actuelle, si elle se trouve dans le temps de négociation spécifié, puis déterminez la relation entre le prix actuel et les rails supérieur et inférieur. Pour fermer une position, il faut d'abord déterminer si elle est proche de la clôture du marché ou si elle a atteint les conditions de prise de profit et d'arrêt de perte.
HANS123 est une stratégie de trading automatisée très typique et très efficace. Son principe de base est de percer le prix le plus élevé ou le plus bas du marché précédent dans un certain laps de temps. Le système peut être appliqué à presque tous les produits de change avec une rentabilité stable. C'est également un mode de trading d'entrée précoce, avec une technologie de filtrage appropriée, ou peut améliorer ses chances de gagner.
Cliquez pour copier le code source complet de la stratégiehttps://www.fmz.com/strategy/179805Backtest sans configuration
Ce qui précède est le principe et l'analyse du code de la stratégie HANS123. En fait, la stratégie HANS123 fournit un meilleur moment pour entrer sur le marché. Vous pouvez également améliorer le temps de sortie en fonction de votre compréhension du marché et de la compréhension de la transaction, ou en fonction de la volatilité de la variété.