Stratégie EMV de volatilité simple

Auteur:La bonté, Créé: 2020-07-01 10:39:17, Mis à jour: 2023-10-28 15:26:49

img

Résumé

Contrairement à d'autres indicateurs techniques, Ease of Movement Value reflète les changements de prix, de volume et de popularité. C'est une technologie qui combine les prix et les changements de volume. Elle mesure la variation de prix du volume unitaire, formant un indicateur de volatilité des prix. Lorsque le marché gagne en popularité et que la transaction est active, elle déclenche un signal d'achat; lorsque le volume de négociation est faible et que l'énergie du marché est sur le point de s'épuiser, elle déclenche un signal de vente.

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.

Formule de calcul de la VEM

É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.

img

É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.

img

Étape 3: Calcul de l'EMV

img

Utilisation des VEM

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 est très faible.

Réalisation de la stratégie

É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 unemainfonction et uneonTickLa fonctionmainfonction est la fonction d'entrée de la stratégie, et le programme exécutera le code ligne par ligne à partir dumainDans le domaine de lamainfonction, écrire unwhilela boucle et exécuter à plusieurs reprises leonTickTout 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_positionest 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,SetContractTypefonction deFMZ.COMSi vous voulez connaître d'autres informations sur le contrat, vous pouvez également utiliser une variable pour recevoir ces données.GetRecordsfonction pour obtenir des données de ligne K, parce que le retour est un tableau, donc nous utilisons la variablebars_arrPour 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_positionEnfin, la position est ouverte et fermée selon la relation de position entre l'EMV et l'axe zéro.

Test de retour de la stratégie

Configuration des tests antérieurs

img

Le journal des tests antérieurs

img img

Curve du capital

img

Stratégie complète

# 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

Pour résumer

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.


Relationnée

Plus de