Einfache Volatilitäts-EMV-Strategie

Schriftsteller:Gutes, Erstellt: 2020-07-01 10:39:17, Aktualisiert: 2023-10-28 15:26:49

img

Zusammenfassung

Im Gegensatz zu anderen technischen Indikatoren spiegelt Ease of Movement Value Veränderungen in Preis, Volumen und Beliebtheit wider. Es ist eine Technologie, die Preise und Volumenänderungen kombiniert. Es misst die Preisänderung des Einheitsvolumens und bildet einen Indikator für die Preisvolatilität. Wenn der Markt an Beliebtheit gewinnt und die Transaktion aktiv ist, wird ein Kaufsignal ausgelöst; wenn das Handelsvolumen niedrig ist und die Marktenergie kurz davor steht, zu enden, wird ein Verkaufssignal ausgelöst.

Einfache Volatilität EMV ist nach dem Prinzip des gleichen Volumen-Charts und komprimierten Chart konzipiert. Sein Kernkonzept ist: Marktpreis wird nur dann viel Energie verbrauchen, wenn der Trend sich dreht oder umzukehren ist, und die externe Leistung ist, dass das Handelsvolumen größer wird. Wenn der Preis steigt, wird er aufgrund des Boosting-Effekts nicht zu viel Energie verbrauchen.

Berechnungsformel für EMV

Schritt 1: Berechnung von mov_mid

Unter ihnen stellt TH den höchsten Preis des Tages, TL den niedrigsten Preis des Tages, YH den höchsten Preis des Vortages und YL den niedrigsten Preis des Vortages dar.

img

Schritt 2: Berechnung des Verhältnisses

Unter ihnen stellt TVOL das Handelsvolumen des Tages, TH den höchsten Preis des Tages und TL den niedrigsten Preis des Tages dar.

img

Schritt 3: Berechnung der EMV

img

EMV-Nutzung

Der Autor von EMV ist der Ansicht, dass der enorme Anstieg von der schnellen Erschöpfung der Energie begleitet wird, und der Anstieg oft nicht zu lange dauert; im Gegenteil, das moderate Volumen, das eine gewisse Menge an Energie sparen kann, macht den Anstieg oft länger dauern. Sobald ein Aufwärtstrend gebildet wird, kann weniger Handelsvolumen die Preise nach oben drücken, und der Wert von EMV wird steigen. Sobald der Abwärtstrendmarkt gebildet ist, wird er oft von einem unendlichen oder kleinen Rückgang begleitet, und der Wert von EMV wird sinken. Wenn der Preis in einem volatilen Markt ist oder die Preissteigerungen und -rückgänge von einem großen Volumen begleitet werden, wird der Wert von EMV auch nahe Null sein. Sie werden also feststellen, dass EMV in den meisten Märkten unter der Null-Achse liegt, was auch ein Hauptmerkmal dieses Indikators ist. Aus einer anderen Perspektive können EMV-Mega-Trends genügendwerte generi

Die Verwendung von EMV ist recht einfach, schauen Sie nur, ob EMV die Null-Achse überschreitet. Wenn EMV unter 0 liegt, stellt es einen schwachen Markt dar; wenn EMV über 0 liegt, stellt es einen starken Markt dar. Wenn EMV von negativ auf positiv ändert, sollte es gekauft werden; wenn EMV von positiv auf negativ ändert, sollte es verkauft werden. Sein Merkmal ist, dass es nicht nur den Schockmarkt auf dem Markt vermeiden kann, sondern auch rechtzeitig in den Markt eintritt, wenn der Trendmarkt beginnt. Da EMV jedoch die Veränderung des Volumens widerspiegelt, wenn sich die Preise ändern, hat es nur Auswirkungen auf mittlere bis langfristige Trends. Für kurzfristige oder relativ kurze Handelszyklen ist der EMV-Effekt sehr schlecht.

Umsetzung der Strategie

Schritt 1: Erstellen eines Strategierahmens

# 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.COMSie müssen zunächst einemainFunktion undonTickDiemainFunktion ist die Eingabefunktion der Strategie, und das Programm wird den Code Zeile für Zeile ausführenmainIn dermainFunktion, schreiben Sie einewhileSchleife und wiederholt ausführenonTickDer gesamte Kerncode der Strategie ist in deronTick function.

Schritt 2: Positionsdaten erhalten

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

Denn in dieser Strategie wird nur die Anzahl der Echtzeitpositionen verwendet, um die Wartung zu erleichtern,get_positionWenn die aktuelle Position lang ist, gibt es eine positive Zahl, und wenn die aktuelle Position kurz ist, gibt es eine negative Zahl.

Schritt 3: Holen Sie sich K-Liniendaten

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

Bevor Sie spezifische K-Liniendaten erhalten, müssen Sie zunächst einen spezifischen Handelskontrakt abschließen, dieSetContractTypeFunktion vonFMZ.COMWenn Sie weitere Informationen über den Vertrag wissen möchten, können Sie auch eine Variable verwenden, um diese Daten zu erhalten.GetRecordsFunktion, um K-Linie Daten zu erhalten, weil die zurückgegebene ist ein Array, so verwenden wir die Variablebars_arrEs zu akzeptieren.

Schritt 4: Berechnung der 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

Hier verwenden wir nicht den neuesten Preis, um den Wert von EMV zu berechnen, sondern verwenden die relativ zurückgebliebene aktuelle K-Linie, um das Signal auszugeben und eine K-Linie zu platzieren, um einen Auftrag zu erteilen. Der Zweck ist es, den Backtest näher an den realen Handel zu bringen. Wir wissen, dass, obwohl die quantitative Handelssoftware jetzt sehr fortgeschritten ist, es immer noch schwierig ist, die reale Preis-Tick-Umgebung vollständig zu simulieren, insbesondere wenn man mit dem Backtesting von langen Daten auf Bar-Ebene konfrontiert ist, so dass diese Kompromissmethode verwendet wird.

Schritt 5: Auftragserteilung

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

Vor der Bestellung müssen wir zwei Daten bestimmen, einer ist der Preis der Bestellung und der andere ist der aktuelle Stand der Position. Der Preis der Bestellung ist sehr einfach, verwenden Sie einfach den aktuellen Schlusskurs, um den Mindestwechselpreis der Vielfalt hinzuzufügen oder abzuziehen.get_positionDie Position wird schließlich nach der positionalen Beziehung zwischen dem EMV und der Null-Achse geöffnet und geschlossen.

Strategie-Backtest

Backtestkonfiguration

img

Backtestprotokoll

img img

Kapitalkurve

img

Vollständige Strategie

# 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

Die vollständige Strategie wurde auf dem Strategieplatz der Europäischen Kommission veröffentlicht.FMZ.COMWebseite, und sie kann benutzt werden, indem man auf Kopieren klickt.https://www.fmz.com/strategy/213636

Zusammenfassend

Durch diesen Studienkurs können wir sehen, dass EMV den gewöhnlichen Händlern widerspricht, aber es ist nicht unvernünftig. Weil EMV Volumendaten einführt, ist es effektiver als andere technische Indikatoren, die Preisberechnungen verwenden, um herauszufinden, was hinter dem Preis steckt. Jede Strategie hat unterschiedliche Eigenschaften. Nur indem wir die Vor- und Nachteile verschiedener Strategien vollständig verstehen und den Schrott entfernen und seine Essenz extrahieren, können wir weiter vom Erfolg gehen.


Verwandt

Mehr