Простая волатильность EMV стратегия

Автор:Доброта, Создано: 2020-07-01 10:39:17, Обновлено: 2023-10-28 15:26:49

img

Резюме

В отличие от других технических индикаторов, Ease of Movement Value отражает изменения в цене, объеме и популярности. Это технология, которая сочетает в себе изменения цен и объема. Она измеряет изменение цены единицы объема, формируя индикатор волатильности цен. Когда рынок набирает популярность и транзакция активна, она вызывает сигнал покупки; когда объем торговли низкий, и рыночная энергия вот-вот закончится, она вызывает сигнал продажи.

Простая волатильность EMV разработана в соответствии с принципом равного объема графика и сжатого графика. Его основная концепция заключается в том, что рыночная цена будет потреблять много энергии только тогда, когда тренд поворачивается или вот-вот поворачивается, а внешняя производительность заключается в том, что объем торговли становится больше. Когда цена растет, она не будет потреблять слишком много энергии из-за стимулирующего эффекта. Хотя эта идея противоречит мнению о том, что и количество, и рост цены, у нее есть свои уникальные особенности.

Формула расчета ЭМВ

Шаг 1: Вычислить mov_mid

Среди них TH представляет собой самую высокую цену дня, TL представляет собой самую низкую цену дня, YH представляет собой самую высокую цену предыдущего дня, а YL представляет собой самую низкую цену предыдущего дня.

img

Шаг 2: Расчет соотношения

Среди них TVOL представляет собой объем торгов за день, TH представляет собой самую высокую цену за день, а TL представляет собой самую низкую цену за день.

img

Шаг 3: Вычислить EMV

img

Использование ЭМВ

Автор 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 и нулевой осью.

Обратная проверка стратегии

Конфигурация обратного теста

img

Журнал обратных испытаний

img img

Кривая капитала

img

Полная стратегия

# 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 вводит данные о объеме, он более эффективен, чем другие технические индикаторы, которые используют расчеты цен, чтобы выяснить, что стоит за ценой. Каждая стратегия имеет различные характеристики. Только полностью понимая преимущества и недостатки различных стратегий и удаляя отходы и извлекая его суть, мы можем продвинуться дальше от успеха.


Связанные

Больше