В отличие от других технических индикаторов,
Простая волатильность EMV разработана в соответствии с принципом равного объема графика и сжатого графика. Его основная концепция заключается в том, что рыночная цена будет потреблять много энергии только тогда, когда тренд поворачивается или вот-вот поворачивается, а внешняя производительность заключается в том, что объем торговли становится больше. Когда цена растет, она не будет потреблять слишком много энергии из-за стимулирующего эффекта. Хотя эта идея противоречит мнению о том, что и количество, и рост цены, у нее есть свои уникальные особенности.
Шаг 1: Вычислить mov_mid
Среди них TH представляет собой самую высокую цену дня, TL представляет собой самую низкую цену дня, YH представляет собой самую высокую цену предыдущего дня, а YL представляет собой самую низкую цену предыдущего дня.
Шаг 2: Расчет соотношения
Среди них TVOL представляет собой объем торгов за день, TH представляет собой самую высокую цену за день, а TL представляет собой самую низкую цену за день.
Шаг 3: Вычислить EMV
Автор EMV считает, что огромный рост сопровождается быстрым истощением энергии, и рост часто не длится слишком долго; наоборот, умеренный объем, который может сэкономить определенное количество энергии, часто заставляет рост длиться дольше. Как только формируется тенденция к росту, меньший объем торговли может подтолкнуть цены вверх, и стоимость EMV увеличится. Как только формируется рынок нисходящего тренда, он часто сопровождается бесконечным или небольшим снижением, и стоимость EMV будет снижаться. Если цена находится на волатильном рынке или цены растут и падают в сопровождении большого объема, стоимость EMV также будет близка к нулю. Таким образом, вы обнаружите, что EMV находится ниже нулевой оси в большинстве рынков, что также является основной особенностью этого показателя. С другой точки зрения, EMV-мега-тенды могут генерировать достаточную прибыль и приносить прибыль.
Использование EMV довольно просто, просто посмотрите, пересекает ли EMV нулевую ось. Когда EMV ниже 0, это представляет собой слабый рынок; когда EMV выше 0, это представляет собой сильный рынок. Когда EMV меняется с отрицательного на положительный, его следует купить; когда EMV меняется с положительного на отрицательный, он должен быть продан. Его характеристикой является то, что он может не только избежать шокового рынка на рынке, но и войти на рынок вовремя, когда начинается рынок тренда. Однако, поскольку EMV отражает изменение объема при изменении цен, он влияет только на среднесрочные и долгосрочные тенденции. Для краткосрочных или относительно коротких торговых циклов эффект EMV
Шаг 1: Составление стратегии
# 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.COMДля этого нужно определить, что такое тренировка.main
Функция иonTick
Функция.main
функция является функцией ввода стратегии, и программа будет выполнять код строку за строкой отmain
Вmain
Функция, напишитеwhile
цикл и неоднократно выполнятьonTick
Весь основной код стратегии написан вonTick
function.
Шаг 2: Получить данные о положении
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
Потому что в этой стратегии используется только количество позиций в реальном времени, чтобы облегчить обслуживание,get_position
Если текущая позиция длинная, она возвращает положительное число, а если текущая позиция короткая, она возвращает отрицательное число.
Шаг 3: Получить данные 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
Прежде чем получить конкретные данные K-линии, вы должны сначала подписаться на конкретный торговый контракт, использоватьSetContractType
функция отFMZ.COMЕсли вы хотите узнать другую информацию о контракте, вы также можете использовать переменную для получения этих данных.GetRecords
функция для получения данных K-линии, потому что возвращенный массив, так что мы используем переменнуюbars_arr
чтобы принять это.
Шаг 4: Вычислить 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
Здесь мы не используем последнюю цену для расчета стоимости EMV, но используем относительно отстающую текущую линию K для вывода сигнала и размещения линии K для выпуска ордера. Цель этого заключается в том, чтобы сделать обратный тест ближе к реальной торговле.
Шаг 5: размещение заказов
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
Перед размещением заказа, мы должны определить два данных, один из которых цена заказа, а другой - текущее положение. цена размещения заказа очень проста, просто используйте текущую цену закрытия, чтобы добавить или вычесть минимальную цену изменения разновидности.get_position
Наконец, позиция открывается и закрывается в соответствии с позиционными отношениями между EMV и нулевой осью.
Конфигурация обратного теста
Журнал обратных испытаний
Кривая капитала
# 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
Полная стратегия была опубликована на площадке стратегииFMZ.COMСайт, и его можно использовать, нажав на Копировать.https://www.fmz.com/strategy/213636
Поскольку EMV вводит данные о объеме, он более эффективен, чем другие технические индикаторы, которые используют расчеты цен, чтобы выяснить, что стоит за ценой. Каждая стратегия имеет различные характеристики. Только полностью понимая преимущества и недостатки различных стратегий и удаляя отходы и извлекая его суть, мы можем продвинуться дальше от успеха.