SuperTrend V.1 - система сверхтенденционных линий

Автор:проповедь, Создано: 2020-04-20 22:10:36, Обновлено: 2023-10-08 19:57:57

img

Первое: История

Мой хороший друг Ваго долго наблюдал за этим показателем и рекомендовал мне до Нового года, чтобы обсудить возможность его количественного преобразования. К сожалению, прокрастинация совершила ошибку, и только сейчас она помогла ему выполнить это желание, хотя в последнее время понимание алгоритмов также резко возросло. Полагаю, что когда-нибудь напишу один переводчик для пина. Всё в python. Если говорить о том, что мы не хотим говорить больше глупостей, давайте расскажем о супер-тенденции в этой легенде.

Второе - система

CMC Markets новое поколение интеллектуальных торговых систем SupertrendНапример, в одном из статей, где рассказывается об этой системе.img

В новом поколении интеллектуальных торговых систем CMC Markets можно использовать настройки сверхтенденционных линий в технических показателях. Как показано на рисунке, можно настроить цвет ореха и тонкость грубости в зависимости от своих предпочтений для сигналов повышения, снижения. Итак, что такое сверхтенденционный индикатор? Перед тем как понять формулу сверхтенденционного индикатора, необходимо понять ATR, поскольку сверхтенденция использует значение ATR для расчета значения индикатора.

Ниже приведен график, показывающий основные алгоритмы.img

В общем, основным описанием является HL2 ((k-линейная средняя цена) умноженная на n-кратный ATR. Но статья написана довольно просто. Нет подробных алгоритмов. Затем я придумал самое крутое сообщество - Tradingview. Неудивительно.img

Посмотрите на этот график, и вы увидите, что он соответствует тенденции.

Третье, изучение кода.

Если код не слишком длинный, переведем и попробуем.imgПолный код pine приведен выше.

Четвертое: кодовые преобразования.

Здесь мы создали новую стратегию на FMZ, которую мы назвали SuperTrade.img

А затем мы задаем два параметра, Factor, Pd.img

Для лучшего упрощения работы кода, чтобы он был понятным, используйте Advanced Data Extension Pack для Python.панды

Во время обеда я спросил у учителя, поддерживает ли FMZ эту библиотеку. Учитель мечты действительно крутой.

1.我们要导入pandas库time库 2.在main函数当中设置使用季度合约(主要跑okex) 3. Настроить цикл doTicker ((() 15 минут, чтобы проверить один раз.Запустить код в 15-минутные циклы. Затем мы записываем основные стратегии в doTicker.

import pandas as pd
import time

def main():
    exchange.SetContractType("quarter")
    preTime = 0
    Log(exchange.GetAccount())
    while True:
        records = exchange.GetRecords(PERIOD_M15)
        if records and records[-2].Time > preTime:
            preTime = records[-2].Time
            doTicker(records[:-1])
        Sleep(1000 *60)
        

4. Мы хотим получить OHCLV от k-строки, поэтому мы используем GetRecords (). 5. Мы будем импортировать полученные данные в panda M15 = pd.DataFrame ((records) 6. Мы хотим изменить заголовок таблицы. M15.columns = [заголовок времени, заголовокopen, заголовокhigh, заголовокlow, заголовокclose, заголовокvolume, заголовокOpenInterest]На самом деле, это означает, что первые буквы "open", "high", "low", "close" и "close" должны быть заменены на маленькие буквы.

def doTicker(records):
    M15 = pd.DataFrame(records)
    M15.columns = ['time','open','high','low','close','volume','OpenInterest']  

7. Добавить к набору данных строку hl2 hl2= ((high+low) /2)

#HL2
M15['hl2']=(M15['high']+M15['low'])/2

8.接着我们来计算ATRПоскольку ATR рассчитывает ввести длину переменной, его значение Pd.

Далее мы рассмотрим следующие алгоритмические шаги для определения средней величины истинных колебаний ATR, просмотрев руководство по материнскому языку: TR: MAX ((MAX (((HIGH-LOW), ABS ((REF ((CLOSE, 1) -HIGH)), ABS ((REF ((CLOSE, 1) -LOW)); ATR: RMA ((TR,N)

В этом случае значение TR принимает наибольшее из трех значений. 1, диапазон колебаний между максимальной и минимальной ценами на текущий день торговли HIGH-LOW 2, диапазон колебаний между ценой закрытия на предыдущий день торговли и максимальной ценой на данный день торговли REF ((CLOSE, 1) - HIGH) 3, диапазон колебаний между ценой закрытия на предыдущий день торговли и минимальной ценой на данный день REF ((CLOSE, 1) - LOW) Таким образом, TR: MAX ((MAX (((HIGH-LOW), ABS ((REF ((CLOSE, 1) -HIGH)), ABS ((REF ((CLOSE, 1) -LOW));

В Python вычисления

M15['prev_close']=M15['close'].shift(1)

Для получения данных в предыдущей строке мы устанавливаем prev_close, что означает, что мы перемещаем 1 к правому краю, чтобы создать новый параметр.

ranges= [M15['high'] - M15['low'],M15['high']-M15['prev_close'],M15['low']-M15['prev_close']]

Затем определяется промежуточная переменная, записывающая массив из трех параметров TR.

M15['tr'] = pd.DataFrame(ranges).T.abs().max(axis=1)

В данном наборе данных мы определили новое название строки TR, при котором значение TR является максимальным из абсолютных значений промежуточных переменных с использованием функций abs (()) и max (()).

    alpha = (1.0 / length) if length > 0 else 0.5
    M15['atr']=M15['tr'].ewm(alpha=alpha, min_periods=length).mean()

Наконец, мы должны вычислить значение ATR, ATR: RMA ((TR,N), поскольку алгоритм RMA является вариацией EMA с фиксированными значениями. N - переменная, которую мы импортируем, где параметр ATR по умолчанию 14; здесь мы импортируем дефиген alpha=length.

===

Затем используйте алгоритм ewm для вычисления эмы.Полный процесс вычисления ATR:

    #ATR(PD)
    length=Pd
    M15['prev_close']=M15['close'].shift(1)
    ranges= [M15['high'] - M15['low'],M15['high']-M15['prev_close'],M15['low']-M15['prev_close']]
    M15['tr'] = pd.DataFrame(ranges).T.abs().max(axis=1)
    alpha = (1.0 / length) if length > 0 else 0.5
    M15['atr']=M15['tr'].ewm(alpha=alpha, min_periods=length).mean()

9 Начало вычисления Up и Dn

    M15['Up']=M15['hl2']-(Factor*M15['atr'])
    M15['Dn']=M15['hl2']+(Factor*M15['atr'])

Up=hl2 - ((Фактор * atr) Dn=hl2 + ((Фактор * atr) Это не так просто.

Ниже приведены основные фрагменты кода из 15-21 строки.

TrendUp=close[1]>TrendUp[1]? max(Up,TrendUp[1]) : Up
TrendDown=close[1]<TrendDown[1]? min(Dn,TrendDown[1]) : Dn

Trend = close > TrendDown[1] ? 1: close< TrendUp[1]? -1: nz(Trend[1],1)
Tsl = Trend==1? TrendUp: TrendDown

linecolor = Trend == 1 ? green : red

В этом стихотворении главный смысл - выразить, что мы не хотим, чтобы люди были такими, какими мы являемся. Если находится в паутинной стадии, то (нижняя линия) TrendUp = max (Up, TrendUp[1]) Если находится в понижающей стадии, (верхняя линия) TrendDown=min (Dn, TrendDown[1])Это означает, что в одном из трендов стоимость ATR всегда использовала технологию, похожую на стратегию браузера. Все время сжимать другую сторону коридора.

Здесь TrendUp и TrendDown требуют самоизоляции каждый раз. На каждом шагу нужно брать на себя ответственность за предыдущий шаг. Таким образом, данные должны быть перемещены по кругу.

Здесь нужно создать новые поля TrendUp, TrendDown, Trend, linecolor и дать им начальное значение. Затем с помощью синтаксиса fillna ((0) данные с пустыми значениями в результате предыдущих вычислений заполняются 0.

    M15['TrendUp']=0.0
    M15['TrendDown']=0.0
    M15['Trend']=1
    M15['Tsl']=0.0
    M15['linecolor']='Homily'
    M15 = M15.fillna(0)

Включить цикл "for" Использование третьих операций Python в цикле

    for x in range(len(M15)):

Расчет TrendUpTrendUp = MAX ((Up,TrendUp[-1]) if close [-1]>TrendUp[-1] else Up Обычно это означает, что если последнее close> последнее TrendUp, наибольшее значение между последним TrendUp и последним TrendUp, не будет установлено и будет передано текущему TrendUp.

        M15['TrendUp'].values[x] = max(M15['Up'].values[x],M15['TrendUp'].values[x-1]) if (M15['close'].values[x-1]>M15['TrendUp'].values[x-1]) else M15['Up'].values[x]

Аналогичным образом, мы рассчитываем TrendDown.TrendDown=min ((Dn, TrendDown[-1]) if close[-1]

        M15['TrendDown'].values[x] = min(M15['Dn'].values[x],M15['TrendDown'].values[x-1]) if (M15['close'].values[x-1]<M15['TrendDown'].values[x-1]) else M15['Dn'].values[x]

Ниже флаг, который вычисляет направление управления, и я упростил его с помощью парового кода.Trend= 1 если (закрыть > TrendDown[-1]) иначе (x) x = -1 если (close< TrendUp[-1]) в противном случае Trend[-1]

Это означает, что если цена закрытия> последняя TrendDown, то 1 ((см. далее) не работает. Если цена закрытия < последняя TrendUp, то принимайте -1 ((пустое) не создает Принимайте Trend (что означает неизменный) Перевод на язык изображений - это прорыв вверх по рельсу, переход вниз по рельсу, переход вниз по рельсу, переход вниз по рельсу, переход вниз по рельсу, переход вниз по рельсу, переход вниз по рельсу, переход вниз по рельсу, переход вниз по рельсу, переход вниз по рельсу, переход вниз по рельсу, переход вниз по рельсу, переход вниз по рельсу, переход вниз по рельсу, переход вниз по рельсу, переход вниз по рельсу, переход вниз по рельсу, переход вниз по рельсу, переход вниз по рельсу, переход вниз по рельсу, переход вниз по рельсу, переход вниз по рельсу, переход вниз по рельсу, переход вниз по рельсу, переход вниз по рельсу.

        M15['Tsl'].values[x] = M15['TrendUp'].values[x] if  (M15['Trend'].values[x]==1) else M15['TrendDown'].values[x]

Вычислить Tsl и LinecolorTsl= rendUp if (Trend==1) else TrendDown Tsl используется для обозначения значения SuperTrend на изображении. linecolor= green if (Trend==1) else red Linecolor означает зеленую линию при просмотре большего количества изображений, и пустой цвет при просмотре меньшего количества изображений.

        M15['Tsl'].values[x] = M15['TrendUp'].values[x] if  (M15['Trend'].values[x]==1) else M15['TrendDown'].values[x]
        M15['linecolor'].values[x]= 'green' if ( M15['Trend'].values[x]==1) else  'red'

Затем строки 23-30 кода, в основном, являются графическими схемами.

Наконец, две строки кода для управления сигналом покупки и продажи.В TradingView он означает, что он дает сигнал после переворота флага. Преобразовать условные предложения в python. Если предыдущий флаг тренда превратился из -1 в 1, то это означает прорыв сверхпротивостояния. Если предыдущий флаг тренда превратился из 1 в -1, то это означает прорыв в поддержку.

    if(M15['Trend'].values[-1] == 1 and M15['Trend'].values[-2] == -1):
        Log('SuperTrend V.1 Alert Long',"Create Order Buy)
    if(M15['Trend'].values[-1] == -1 and M15['Trend'].values[-2] == 1):
        Log('SuperTrend V.1 Alert Long',"Create Order Sell)

Полный код этого параграфа:

    M15['TrendUp']=0.0
    M15['TrendDown']=0.0
    M15['Trend']=1
    M15['Tsl']=0.0
    M15['linecolor']='Homily'
    M15 = M15.fillna(0)
    
    for x in range(len(M15)):
        M15['TrendUp'].values[x] = max(M15['Up'].values[x],M15['TrendUp'].values[x-1]) if (M15['close'].values[x-1]>M15['TrendUp'].values[x-1]) else M15['Up'].values[x]
        M15['TrendDown'].values[x] = min(M15['Dn'].values[x],M15['TrendDown'].values[x-1]) if (M15['close'].values[x-1]<M15['TrendDown'].values[x-1]) else M15['Dn'].values[x]
        M15['Trend'].values[x] = 1 if (M15['close'].values[x] > M15['TrendDown'].values[x-1]) else ( -1 if (M15['close'].values[x]< M15['TrendUp'].values[x-1])else M15['Trend'].values[x-1] )
        M15['Tsl'].values[x] = M15['TrendUp'].values[x] if  (M15['Trend'].values[x]==1) else M15['TrendDown'].values[x]
        M15['linecolor'].values[x]= 'green' if ( M15['Trend'].values[x]==1) else  'red'
        
    if(M15['Trend'].values[-1] == 1 and M15['Trend'].values[-2] == -1):
        Log('SuperTrend V.1 Alert Long',"Create Order Buy)
        Log('Tsl=',Tsl)
    if(M15['Trend'].values[-1] == -1 and M15['Trend'].values[-2] == 1):
        Log('SuperTrend V.1 Alert Long',"Create Order Sell)
        Log('Tsl=',Tsl)

img img

Пятое, весь код

Я изменил структуру кода в целом. В частности, в стратегию будут включены инструкции по выполнению дополнительных рабочих мест. Вот полный код.

'''backtest
start: 2019-05-01 00:00:00
end: 2020-04-21 00:00:00
period: 15m
exchanges: [{"eid":"Futures_OKCoin","currency":"BTC_USD"}]
'''

import pandas as pd
import time

def main():
    exchange.SetContractType("quarter")
    preTime = 0
    Log(exchange.GetAccount())
    while True:
        records = exchange.GetRecords(PERIOD_M15)
        if records and records[-2].Time > preTime:
            preTime = records[-2].Time
            doTicker(records[:-1])
        Sleep(1000 *60)

       
def doTicker(records):
    #Log('onTick',exchange.GetTicker())
    M15 = pd.DataFrame(records)

    #Factor=3
    #Pd=7
    
    M15.columns = ['time','open','high','low','close','volume','OpenInterest']  
    
    #HL2
    M15['hl2']=(M15['high']+M15['low'])/2

    #ATR(PD)
    length=Pd
    M15['prev_close']=M15['close'].shift(1)
    ranges= [M15['high'] - M15['low'],M15['high']-M15['prev_close'],M15['low']-M15['prev_close']]
    M15['tr'] = pd.DataFrame(ranges).T.abs().max(axis=1)
    alpha = (1.0 / length) if length > 0 else 0.5
    M15['atr']=M15['tr'].ewm(alpha=alpha, min_periods=length).mean()


    M15['Up']=M15['hl2']-(Factor*M15['atr'])
    M15['Dn']=M15['hl2']+(Factor*M15['atr'])
    
    M15['TrendUp']=0.0
    M15['TrendDown']=0.0
    M15['Trend']=1
    M15['Tsl']=0.0
    M15['linecolor']='Homily'
    M15 = M15.fillna(0)

    for x in range(len(M15)):
        M15['TrendUp'].values[x] = max(M15['Up'].values[x],M15['TrendUp'].values[x-1]) if (M15['close'].values[x-1]>M15['TrendUp'].values[x-1]) else M15['Up'].values[x]
        M15['TrendDown'].values[x] = min(M15['Dn'].values[x],M15['TrendDown'].values[x-1]) if (M15['close'].values[x-1]<M15['TrendDown'].values[x-1]) else M15['Dn'].values[x]
        M15['Trend'].values[x] = 1 if (M15['close'].values[x] > M15['TrendDown'].values[x-1]) else ( -1 if (M15['close'].values[x]< M15['TrendUp'].values[x-1])else M15['Trend'].values[x-1] )
        M15['Tsl'].values[x] = M15['TrendUp'].values[x] if  (M15['Trend'].values[x]==1) else M15['TrendDown'].values[x]
        M15['linecolor'].values[x]= 'Long' if ( M15['Trend'].values[x]==1) else  'Short'
 

    linecolor=M15['linecolor'].values[-2]
    close=M15['close'].values[-2]
    Tsl=M15['Tsl'].values[-2] 


    if(M15['Trend'].values[-1] == 1 and M15['Trend'].values[-2] == -1):

        Log('SuperTrend V.1 Alert Long','Create Order Buy')
        Log('Tsl=',Tsl)
        position = exchange.GetPosition()
        if len(position) > 0:
            Amount=position[0]["Amount"]
            exchange.SetDirection("closesell")
            exchange.Buy(_C(exchange.GetTicker).Sell*1.01, Amount);
        
        exchange.SetDirection("buy")
        exchange.Buy(_C(exchange.GetTicker).Sell*1.01, vol);

    if(M15['Trend'].values[-1] == -1 and M15['Trend'].values[-2] == 1):
        Log('SuperTrend V.1 Alert Long','Create Order Sell')
        Log('Tsl=',Tsl)
        position = exchange.GetPosition()
        if len(position) > 0:
            Amount=position[0]["Amount"]
            exchange.SetDirection("closebuy")
            exchange.Sell(_C(exchange.GetTicker).Buy*0.99,Amount);
        exchange.SetDirection("sell")
        exchange.Sell(_C(exchange.GetTicker).Buy*0.99, vol*2);

Публичная стратегия ссылка https://www.fmz.com/strategy/200625

В-шестых, рецензирование и обобщение

Мы отобрали данные почти за год для анализа. Используйте 15-минутные циклы квартальных контрактов okx. Параметры, установленные, таковы: Фактор равен 3. Pd = 45. Vol = 100 (по 100 заказов в раз) По итогам этого года он получил около 33% годового дохода. В целом, отступление было небольшим. В частности, в результате падения 312 был нанесен существенный удар по системе. Если бы не 312, то доходы были бы намного выше.

img

В конце шестое.

SuperTrend - это очень хорошая система торговли.

Основной принцип системы SuperTrend заключается в использовании стратегии прорыва ATR-путей (аналогичной каналу Кента). Но главное, что изменилось, - это использование стратегии сжатия бандитов Блин, или наоборот, принципов Дончиана. В то же время, по мнению экспертов, в стране существуют и другие проблемы, связанные с торговлей. Для достижения канального прорыва переходная операция.

В TradingView я распределил up dn TrendUp TrendDn. Это помогает нам лучше понять эту стратегию.Взгляните.img

Кроме того, есть версия js на github. Адрес:https://github.com/Dodo33/gekko-supertrend-strategy/blob/master/Supertrend.js

В конце концов, я пошел искать оригинал. Он был опубликован 29 мая 2013. Автор: Раджандран Р. Код C++ опубликован на форуме Mt4https://www.mql5.com/en/code/viewcode/10851/128437/Non_Repainting_SuperTrend.mq4Я в основном понимаю, что означает C++, и у меня есть возможность переписать еще один.

Я надеюсь, что вы сможете извлечь из этого урок. Это не так просто!


Связанные

Больше

ЗДГ4484ИГДС!

Иглидз2010Если использовать эту стратегию напрямую в ОК биржевых сделок нужно как подключиться к бирже, маленький белый один не будет питон, выглядит непонятно

БэмсменыЗдесь параметры должны иметь большое пространство для корректировки, если 312-й волновой тренд не прошел, потому что супертрэнд в основном является хваткой списка трендов, 312-й не должен быть пропущен.

Чан НихиК сожалению, все эти циклы и параметры не очень хорошо работают, и я не знаю, как другие оптимизируют их.

Он толстый.Да, я сделал это, спасибо за помощь.

Он толстый.Если вы не можете использовать это, покажите следующее:Traceback (most recent call last): File "", line 1473, in Run File "", line 8, in ImportError: No module named pandas

Кунфэн91Переводчики из Пайна, ожидая

времяНекоторые из них говорят: "О, это не так!"

Фрэнк131419Наверное, когда-нибудь я напишу переводчик для пина. Все работает на питоне.

ОзначаетЯ хочу реализовать воспроизведение и затем использовать svm, чтобы найти наилучшие параметры.

ДзаидасиЭта система выглядит так, как будто она была одной из десяти лучших стратегий фьючерсов.

Легкие облака.Здравствуйте, пожалуйста, PD - это длина ATR?

Маленькие мечтыПоздравления.

ОвалыОжидание ожидание, Пайн действительно не очень хорошо читает и не очень много учит.

проповедьЭто означает отсутствие пакета Pandas, ваша система может потребовать Pip Install Pandas

Ant_SkyКак это было сделано? Спасибо большое.

проповедьАх-ха-ха, спасибо, босс.

Маленькие мечтыПодождите, открыто.

Одинокий человекПрошу версию JS!

проповедьНапример, в 2010 году в Нью-Йорке был выпущен альбом "Слушай, что я говорю".

Легкие облака.Хорошо, спасибо! Также удалён провайдер mq4, спасибо.

проповедьДа, абсолютно верно.

проповедьХвала Аллаху!

Маленькие мечтыЯ также написал версию на JS.

проповедьСпасибо, учитель Дрем Дрем.