Мой хороший друг Ваго долго наблюдал за этим показателем и рекомендовал мне до Нового года, чтобы обсудить возможность его количественного преобразования. К сожалению, прокрастинация совершила ошибку, и только сейчас она помогла ему выполнить это желание, хотя в последнее время понимание алгоритмов также резко возросло. Полагаю, что когда-нибудь напишу один переводчик для пина. Всё в python. Если говорить о том, что мы не хотим говорить больше глупостей, давайте расскажем о супер-тенденции в этой легенде.
CMC Markets новое поколение интеллектуальных торговых систем SupertrendНапример, в одном из статей, где рассказывается об этой системе.
В новом поколении интеллектуальных торговых систем CMC Markets можно использовать настройки сверхтенденционных линий в технических показателях. Как показано на рисунке, можно настроить цвет ореха и тонкость грубости в зависимости от своих предпочтений для сигналов повышения, снижения. Итак, что такое сверхтенденционный индикатор? Перед тем как понять формулу сверхтенденционного индикатора, необходимо понять ATR, поскольку сверхтенденция использует значение ATR для расчета значения индикатора.
Ниже приведен график, показывающий основные алгоритмы.
В общем, основным описанием является HL2 ((k-линейная средняя цена) умноженная на n-кратный ATR. Но статья написана довольно просто. Нет подробных алгоритмов. Затем я придумал самое крутое сообщество - Tradingview. Неудивительно.
Посмотрите на этот график, и вы увидите, что он соответствует тенденции.
Если код не слишком длинный, переведем и попробуем.Полный код pine приведен выше.
Здесь мы создали новую стратегию на FMZ, которую мы назвали SuperTrade.
А затем мы задаем два параметра, Factor, Pd.
Для лучшего упрощения работы кода, чтобы он был понятным, используйте 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=
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)
Я изменил структуру кода в целом. В частности, в стратегию будут включены инструкции по выполнению дополнительных рабочих мест. Вот полный код.
'''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, то доходы были бы намного выше.
SuperTrend - это очень хорошая система торговли.
Основной принцип системы SuperTrend заключается в использовании стратегии прорыва ATR-путей (аналогичной каналу Кента). Но главное, что изменилось, - это использование стратегии сжатия бандитов Блин, или наоборот, принципов Дончиана. В то же время, по мнению экспертов, в стране существуют и другие проблемы, связанные с торговлей. Для достижения канального прорыва переходная операция.
В TradingView я распределил up dn TrendUp TrendDn. Это помогает нам лучше понять эту стратегию.Взгляните.
Кроме того, есть версия 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 "
Кунфэн91Переводчики из Пайна, ожидая
времяНекоторые из них говорят: "О, это не так!"
Фрэнк131419Наверное, когда-нибудь я напишу переводчик для пина. Все работает на питоне.
ОзначаетЯ хочу реализовать воспроизведение и затем использовать svm, чтобы найти наилучшие параметры.
ДзаидасиЭта система выглядит так, как будто она была одной из десяти лучших стратегий фьючерсов.
Легкие облака.Здравствуйте, пожалуйста, PD - это длина ATR?
Изобретатели количественного измерения - мечтыПоздравления.
ОвалыОжидание ожидание, Пайн действительно не очень хорошо читает и не очень много учит.
проповедьЭто означает отсутствие пакета Pandas, ваша система может потребовать Pip Install Pandas
Ant_SkyКак это было сделано? Спасибо большое.
проповедьАх-ха-ха, спасибо, босс.
Изобретатели количественного измерения - мечтыПодождите, открыто.
Одинокий человекПрошу версию JS!
проповедьНапример, в 2010 году в Нью-Йорке был выпущен альбом "Слушай, что я говорю".
Легкие облака.Хорошо, спасибо! Также удалён провайдер mq4, спасибо.
проповедьДа, абсолютно верно.
проповедьХвала Аллаху!
Изобретатели количественного измерения - мечтыЯ также написал версию на JS.
проповедьСпасибо, учитель Дрем Дрем.