#python #algorithmic-trading
Вопрос:
Ищу предложения по программе Python для торговли на рынке Форекс. В принципе, я хочу использовать короткие и длинные кроссы sma для запуска покупки длинных или коротких позиций, но только сразу после их пересечения, а не тогда, когда они уже выше, чтобы идти долго, или ниже, чтобы идти коротко. Вторая часть состоит в том, чтобы использовать короткий sma, пересекающий средний sma, для выхода из позиции. Проблема, с которой я сталкиваюсь, заключается в том, что короткие и средние sma продолжают вызывать покупки и продажи, когда они находятся выше или ниже длинного sma. Я не хочу заключать сделки с использованием коротких и средних кроссов sma только для выхода из позиций, которые я ранее открывал на коротком/длинном кроссе sma.
Этот сценарий, похоже, приближается к тому, что я ищу. У него есть короткий/длинный сигнал, когда они пересекаются в точное время. У него нет короткого и среднего пересечения sma для выхода из позиции и нет отказоустойчивости, поэтому он не запускает никаких покупок или продаж для входа в сделку, когда они пересекаются в противном случае. Я хочу, чтобы короткий/средний крест выходил из сделок только после того, как я войду в длинный/короткий крест sma.
df['position'] = df['SMA_15'] > df['SMA_45']
df['pre_position'] = df['position'].shift(1)
df.dropna(inplace=True) # dropping the NaN values
df['crossover'] = np.where(df['position'] == df['pre_position'], False, True)
Ответ №1:
Я мог бы показать вам решение, которое улавливает только первый сигнал на покупку из каждой небольшой цепочки повторяющихся покупок и продаж, но я думаю, что вам может понравиться библиотека под названием tulipy. Это позволяет вам легко создавать технические индикаторы (для получения дополнительных функций, вот документы https://tulipindicators.org/). Если вам нужно другое решение, не стесняйтесь комментировать это, и я добавлю его сюда.
pip install tulipy
Для установки библиотеки
Используйте функцию кроссовера. Мы также должны сохранить списки одинаковой длины здесь.
import pandas as pd
import numpy as np
import tulipy
def makeListsSameLength(someList, matchThisLengthList):
#make someList the same length as matchThisLengthList by adding None's to the front
for i in range(abs(len(matchThisLengthList) - len(someList))):
someList = np.insert(someList, 0, None, axis=0) #Push a None to the front of the list
return someList
df['SMA_15'] = makeListsSameLength(tulipy.sma(df['close'].values, 15), df)
df['SMA_45'] = makeListsSameLength(tulipy.sma(df['close'].values, 45), df)
df['crossover'] = makeListsSameLength(tulipy.crossover(df['SMA_15'].values, df['SMA_45'].values), df)