Im Gegensatz zu anderen technischen Indikatoren spiegelt
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.
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.
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.
Schritt 3: Berechnung der EMV
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
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 einemain
Funktion undonTick
Diemain
Funktion ist die Eingabefunktion der Strategie, und das Programm wird den Code Zeile für Zeile ausführenmain
In dermain
Funktion, schreiben Sie einewhile
Schleife und wiederholt ausführenonTick
Der 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_position
Wenn 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, dieSetContractType
Funktion vonFMZ.COMWenn Sie weitere Informationen über den Vertrag wissen möchten, können Sie auch eine Variable verwenden, um diese Daten zu erhalten.GetRecords
Funktion, um K-Linie Daten zu erhalten, weil die zurückgegebene ist ein Array, so verwenden wir die Variablebars_arr
Es 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_position
Die Position wird schließlich nach der positionalen Beziehung zwischen dem EMV und der Null-Achse geöffnet und geschlossen.
Backtestkonfiguration
Backtestprotokoll
Kapitalkurve
# 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
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.