В процессе загрузки ресурсов... загрузка...

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

Автор:Доброта, Создано: 2020-07-01 10:39:17, Обновлено: 2025-01-16 21:42:55

Simple Volatility EMV Strategy

Резюме

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

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

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

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

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

Simple Volatility EMV Strategy

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

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

Simple Volatility EMV Strategy

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

Simple Volatility EMV Strategy

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

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

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

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

Simple Volatility EMV Strategy

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

Simple Volatility EMV Strategy Simple Volatility EMV Strategy

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

Simple Volatility EMV Strategy

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

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


Содержание

Больше информации