Contrairement à d'autres indicateurs techniques,
L'EMV de volatilité simple est conçu selon le principe du graphique de volume égal et du graphique comprimé. Son concept de base est le suivant: le prix du marché ne consommera beaucoup d'énergie que lorsque la tendance tourne ou est sur le point de tourner, et la performance externe est que le volume de négociation devient plus grand. Lorsque le prix augmente, il ne consommera pas trop d'énergie en raison de l'effet de boost. Bien que cette idée soit contraire à l'idée que la quantité et la hausse des prix, elle a ses propres caractéristiques uniques.
Étape 1: Calculer le mouvement moyen
Parmi eux, TH représente le prix le plus élevé de la journée, TL représente le prix le plus bas de la journée, YH représente le prix le plus élevé de la journée précédente et YL représente le prix le plus bas de la journée précédente.
Étape 2: Calcul du ratio
Parmi eux, TVOL représente le volume de négociation de la journée, TH représente le prix le plus élevé de la journée et TL représente le prix le plus bas de la journée.
Étape 3: Calcul de l'EMV
L'auteur de l'EMV estime que l'énorme augmentation est accompagnée d'une épuisement rapide de l'énergie, et l'augmentation ne dure souvent pas trop longtemps; au contraire, le volume modéré, qui peut économiser une certaine quantité d'énergie, rend souvent l'augmentation plus longue. Une fois qu'une tendance haussière se forme, moins de volume de trading peut pousser les prix à la hausse, et la valeur de l'EMV augmentera. Une fois que le marché à tendance baissière se forme, il est souvent accompagné d'un déclin infini ou petit, et la valeur de l'EMV diminuera. Si le prix est dans un marché volatil ou si les hausses et baisses de prix sont accompagnées d'un grand volume, la valeur de l'EMV sera également proche de zéro.
L'utilisation de l'EMV est assez simple, il suffit de voir si l'EMV traverse l'axe zéro. Lorsque l'EMV est inférieur à 0, il représente un marché faible; lorsque l'EMV est supérieur à 0, il représente un marché fort. Lorsque l'EMV passe de négatif à positif, il doit être acheté; lorsque l'EMV passe de positif à négatif, il doit être vendu. Sa caractéristique est qu'il peut non seulement éviter le marché de choc sur le marché, mais aussi entrer sur le marché à temps lorsque le marché de tendance commence. Cependant, comme l'EMV reflète le changement de volume lorsque les prix changent, il n'a d'effet que sur les tendances à moyen et long terme. Pour les cycles de négociation à court terme ou relativement courts, l'effet de l'EMV
Étape 1: Écrire un cadre stratégique
# Strategy main function
def onTick():
pass
# Program entry
def main():
while True: # Enter infinite loop mode
onTick() # execution strategy main function
Sleep(1000) # sleep for 1 second
FMZ.COMIl faut d'abord définir unemain
fonction et uneonTick
La fonctionmain
fonction est la fonction d'entrée de la stratégie, et le programme exécutera le code ligne par ligne à partir dumain
Dans le domaine de lamain
fonction, écrire unwhile
la boucle et exécuter à plusieurs reprises leonTick
Tout le code de base de la stratégie est écrit dans leonTick
function.
Étape 2: obtenir les données de position
def get_position():
position = 0 # The number of assigned positions is 0
position_arr = _C(exchange.GetPosition) # Get array of positions
if len(position_arr)> 0: # If the position array length is greater than 0
for i in position_arr: # Traverse the array of positions
if i['ContractType'] =='IH000': # If the position symbol is equal to the subscription symbol
if i['Type']% 2 == 0: # if it is long position
position = i['Amount'] # Assign a positive number of positions
else:
position = -i['Amount'] # Assign the number of positions to be negative
return position # return position quantity
Parce que dans cette stratégie, seul le nombre de positions en temps réel est utilisé, afin de faciliter la maintenance,get_position
est utilisé ici pour encapsuler la quantité de positions. si la position actuelle est longue, elle renvoie un nombre positif, et si la position actuelle est courte, elle renvoie un nombre négatif.
Étape 3: obtenir les données de la ligne K
exchange.SetContractType('IH000') # Subscribe to futures variety
bars_arr = exchange.GetRecords() # Get K-line array
if len(bars_arr) <10: # If the number of K lines is less than 10
return
Avant d'obtenir des données spécifiques de la ligne K, vous devez d'abord souscrire à un contrat de négociation spécifique,SetContractType
fonction deFMZ.COMSi vous voulez connaître d'autres informations sur le contrat, vous pouvez également utiliser une variable pour recevoir ces données.GetRecords
fonction pour obtenir des données de ligne K, parce que le retour est un tableau, donc nous utilisons la variablebars_arr
Pour l'accepter.
Étape 4: Calcul de l'EMV
bar1 = bars_arr[-2] # Get the previous K-line data
bar2 = bars_arr[-3] # get the previous K-line data
# Calculate the value of mov_mid
mov_mid = (bar1['High'] + bar1['Low']) / 2-(bar2['High'] + bar2['Low']) / 2
if bar1['High'] != bar1['Low']: # If the dividend is not 0
# Calculate the value of ratio
ratio = (bar1['Volume'] / 10000) / (bar1['High']-bar1['Low'])
else:
ratio = 0
# If the value of ratio is greater than 0
if ratio> 0:
emv = mov_mid / ratio
else:
emv = 0
Ici, nous n'utilisons pas le dernier prix pour calculer la valeur de l'EMV, mais utilisons la ligne K actuelle relativement en retard pour produire le signal et placer une ligne K pour émettre un ordre. Le but de cela est de rapprocher le backtest du trading réel. Nous savons que bien que le logiciel de trading quantitatif soit maintenant très avancé, il est toujours difficile de simuler complètement l'environnement de tick de prix réel, en particulier face au backtesting de données longues de niveau barre, donc cette méthode de compromis est utilisée.
Étape 5: Placement des commandes
current_price = bars_arr[-1]['Close'] # latest price
position = get_position() # Get the latest position
if position> 0: # If you are holding long positions
if emv <0: # If the current price is less than teeth
exchange.SetDirection("closebuy") # Set the trading direction and type
exchange.Sell(round(current_price-0.2, 2), 1) # close long position
if position <0: # If you are holding short positions
if emv> 0: # If the current price is greater than the teeth
exchange.SetDirection("closesell") # Set the trading direction and type
exchange.Buy(round(current_price + 0.2, 2), 1) # close short position
if position == 0: # If there is no holding position
if emv> 0: # If the current price is greater than the upper lip
exchange.SetDirection("buy") # Set the trading direction and type
exchange.Buy(round(current_price + 0.2, 2), 1) # open long position
if emv <0: # if the current price is smaller than the chin
exchange.SetDirection("sell") # Set the trading direction and type
exchange.Sell(round(current_price-0.2, 2), 1) # open short position
Avant de passer l'ordre, nous devons déterminer deux données, l'une est le prix de l'ordre et l'autre est l'état de la position actuelle. Le prix de passer un ordre est très simple, il suffit d'utiliser le prix de clôture actuel pour ajouter ou soustraire le prix de changement minimum de la variété.get_position
Enfin, la position est ouverte et fermée selon la relation de position entre l'EMV et l'axe zéro.
Configuration des tests antérieurs
Le journal des tests antérieurs
Curve du capital
# Backtest configuration
'''backtest
start: 2019-01-01 00:00:00
end: 2020-01-01 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_CTP","currency":"FUTURES"}]
'''
def get_position():
position = 0 # The number of assigned positions is 0
position_arr = _C(exchange.GetPosition) # Get array of positions
if len(position_arr)> 0: # If the position array length is greater than 0
for i in position_arr: # Traverse the array of positions
if i['ContractType'] =='IH000': # If the position symbol is equal to the subscription symbol
if i['Type']% 2 == 0: # if it is long position
position = i['Amount'] # Assign a positive number of positions
else:
position = -i['Amount'] # Assign the number of positions to be negative
return position # return position quantity
# Strategy main function
def onTick():
# retrieve data
exchange.SetContractType('IH000') # Subscribe to futures
bars_arr = exchange.GetRecords() # Get K-line array
if len(bars_arr) <10: # If the number of K lines is less than 10
return
# Calculate emv
bar1 = bars_arr[-2] # Get the previous K-line data
bar2 = bars_arr[-3] # get the previous K-line data
# Calculate the value of mov_mid
mov_mid = (bar1['High'] + bar1['Low']) / 2-(bar2['High'] + bar2['Low']) / 2
if bar1['High'] != bar1['Low']: # If the dividend is not 0
# Calculate the value of ratio
ratio = (bar1['Volume'] / 10000) / (bar1['High']-bar1['Low'])
else:
ratio = 0
# If the value of ratio is greater than 0
if ratio> 0:
emv = mov_mid / ratio
else:
emv = 0
# Placing orders
current_price = bars_arr[-1]['Close'] # latest price
position = get_position() # Get the latest position
if position> 0: # If you are holding long positions
if emv <0: # If the current price is less than teeth
exchange.SetDirection("closebuy") # Set the trading direction and type
exchange.Sell(round(current_price-0.2, 2), 1) # close long position
if position <0: # If you are holding short positions
if emv> 0: # If the current price is greater than the teeth
exchange.SetDirection("closesell") # Set the trading direction and type
exchange.Buy(round(current_price + 0.2, 2), 1) # close short position
if position == 0: # If there is no holding position
if emv> 0: # If the current price is greater than the upper lip
exchange.SetDirection("buy") # Set the trading direction and type
exchange.Buy(round(current_price + 0.2, 2), 1) # open long position
if emv <0: # if the current price is smaller than the chin
exchange.SetDirection("sell") # Set the trading direction and type
exchange.Sell(round(current_price-0.2, 2), 1) # open short position
# Program entry
def main():
while True: # Enter infinite loop mode
onTick() # execution strategy main function
Sleep(1000) # sleep for 1 second
La stratégie complète a été publiée sur la place de la stratégie de l'Union européenne.FMZ.COMle site Web, et il peut être utilisé en cliquant sur Copie.https://www.fmz.com/strategy/213636
Grâce à ce cours d'étude, nous pouvons voir que l'EMV est contraire aux traders ordinaires, mais ce n'est pas déraisonnable. Parce que l'EMV introduit des données de volume, il est plus efficace que d'autres indicateurs techniques qui utilisent des calculs de prix pour savoir ce qui se cache derrière le prix. Chaque stratégie a des caractéristiques différentes. Ce n'est qu'en comprenant pleinement les avantages et les inconvénients des différentes stratégies et en éliminant les débris et en extraisant son essence que nous pouvons aller plus loin du succès.