L'idée principale de cette stratégie est de simuler le trading en temps réel, de collecter des données de trading hebdomadaires et de présenter les statistiques dans un tableau pour un examen plus intuitif de la performance de la stratégie.
Définir les heures de début et de fin de la période de calcul.
Définissez la précision des statistiques et le nombre de semaines dans chaque groupe.
Simuler la stratégie RSI pour les entrées et les sorties.
Définir des variables pour le tableau des statistiques.
Calculer le résultat pour la période en cours.
Si la période change et que le trading est activé, enregistrer l'heure et le résultat pour cette période.
Si c'est la dernière barre et que le trading est activé, enregistrer l'heure et le résultat de la période en cours.
Si la période change et que la négociation est désactivée, enregistrer l'heure et le résultat de la période précédente.
Trouvez les résultats les plus élevés et les plus bas.
Rendez le tableau des statistiques.
Calculer d'abord le nombre total de périodes statistiques
Iterer à travers chaque période, rendre les en-têtes, le temps et les résultats
Calculer le résultat cumulé pour chaque groupe
Résultats positifs et négatifs en code couleur
Peut observer les résultats hebdomadaires en temps réel pour une évaluation rapide de la stratégie
Présentation intuitive des résultats pour des informations claires
Aide à identifier les périodes de mauvaise performance pour l'ajustement de la stratégie
Convient pour suivre les gains cumulés pour les stratégies à long terme
Peut comparer les styles de négociation à travers différentes périodes
Précision et groupes personnalisables pour répondre à différents besoins
Code simple et clair, facile à comprendre et à étendre
La stratégie est basée sur le RSI, qui présente une tendance inhérente à la suite de
Les coûts de négociation peuvent avoir une incidence significative sur les résultats réels
Les données des tests antérieurs peuvent ne pas refléter les conditions réelles du marché
Le capital en défaut dans le backtest peut ne pas correspondre à la taille du compte réel
Évitez le surajustement en réglant aveuglément les paramètres basés sur des statistiques
Peut incorporer plus d'indicateurs pour la tendance et optimiser les entrées et les sorties pour améliorer la stratégie de base du RSI. Utiliser les coûts de négociation réels dans le trading en direct. Ajouter du hasard à la taille du capital dans le backtest. Maintenir le scepticisme au lieu d'un sur-ajustement basé sur les statistiques.
Envisager d'ajouter un stop loss pour limiter la baisse
Optimiser les paramètres RSI tels que les niveaux de surachat et de survente
Essayez différentes fréquences de négociation comme intraday vs détention mensuelle
Incorporer plus d'indicateurs pour la tendance et le calendrier
Ajouter la logique de prise de profit
Optimiser les paramètres statistiques
Élargir pour suivre plusieurs actifs
Les stops peuvent mieux gérer le risque/récompense. Le réglage RSI améliore le taux de gain. Plus d'indicateurs et de fréquences rendent la stratégie robuste. Le réglage statistique met en évidence des données importantes. L'expansion à plusieurs actifs donne une vue complète.
L'objectif est de recueillir des résultats périodiques pour une visualisation statistique intuitive afin de juger rapidement des performances dans le temps. Cela fournit des données pour optimiser les stratégies. Les points forts incluent les résultats hebdomadaires en temps réel, la clarté et l'extensibilité. Méfiez-vous de la dépendance excessive et de l'ajustement des courbes aux sorties statistiques. Utilisez rationnellement la logique de la stratégie de base pour les idées, et non comme base pour les changements.
/*backtest start: 2023-09-12 00:00:00 end: 2023-10-12 00:00:00 period: 3h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 // strategy('Strategy weekly results as numbers v1', overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=25, commission_type=strategy.commission.percent, commission_value=0.04) after = input(title='Trade after', defval=timestamp('01 Jan 2019 00:00 UTC'), tooltip="Strategy will be executed after this timestamp. The statistic table will include only periods after this date.") before = input(title='Trade before', defval=timestamp('31 Dec 2024 23:59 UTC'), tooltip="Strategy will be executes before this timestamp. The statistic table will include only periods before this date.") statisticPrecision = input.int(title='Statistic precision', group='Statistic visualisation', defval=1, tooltip="Defines how many digits should be rendered in every statistic cell.") statisticGroupSize = input.int(title='Statistic group size', group='Statistic visualisation', defval=12, tooltip="Defines how many cells should be in one group inside the statistic table.") // determinet whether the starategy should be traded between the period isTradeEnabled = true // ******************************************************************************************* // Core strategy simulation logic // ******************************************************************************************* // calculate rsi strategy emulation data rsiEmulationData = ta.rsi(close, 7) rsiEmulationCrossover = ta.crossover(rsiEmulationData, 70) rsiEmulationCrossunder = ta.crossunder(rsiEmulationData, 30) // entry loogic based on the rsi calculations if (isTradeEnabled and rsiEmulationCrossover) strategy.entry('Long', strategy.long) if (isTradeEnabled and rsiEmulationCrossunder) strategy.entry('Short', strategy.short) // ******************************************************************************************* // Weekly statistics table // ******************************************************************************************* // define statistic variables var statisticTable = table(na) var statisticPeriodTime = array.new_int(0) var statisticPeriodResult = array.new_float(0) var statisticIsLatestCalculated = bool(na) var statisticResultHighest = float(na) var statisticResultLowest = float(na) var statisticColorGray = color.new(color.gray, transp = 60) var statisticColorGreen = color.new(color.green, transp = 60) var statisticColorRed = color.new(color.red, transp = 60) // claculate current period result barResult = not na(strategy.equity[1]) ? (strategy.equity / strategy.equity[1] - 1) : 0 isPeriodChanged = not na(time[1]) and weekofyear(time) != weekofyear(time[1]) currentPeriodResult = 0.0 currentPeriodResult := not na(currentPeriodResult[1]) and not isPeriodChanged ? ((1 + currentPeriodResult[1]) * (1 + barResult) - 1) : 0.0 // initialise highest and lowest results variables statisticResultHighest := na(statisticResultHighest) ? currentPeriodResult : statisticResultHighest statisticResultLowest := na(statisticResultLowest) ? currentPeriodResult : statisticResultLowest // search for highest and lowest results statisticResultHighest := currentPeriodResult > statisticResultHighest ? currentPeriodResult : statisticResultHighest statisticResultLowest := currentPeriodResult < statisticResultLowest ? currentPeriodResult : statisticResultLowest // new week while trade is active if isPeriodChanged and isTradeEnabled timeCalculated = time - 1000 * 60 * 60 * 24 * 7 resultCalculated = currentPeriodResult[1] statisticIsLatestCalculated := false array.push(statisticPeriodTime, timeCalculated) array.push(statisticPeriodResult, resultCalculated) // latest bar while trade is active if barstate.islast and isTradeEnabled timeCalculated = time - 1000 * 60 * 60 * 24 * (dayofweek(time) - 2) resultCalculated = currentPeriodResult array.push(statisticPeriodTime, timeCalculated) array.push(statisticPeriodResult, resultCalculated) // new week after trade disabled if isPeriodChanged and not isTradeEnabled and not na(statisticIsLatestCalculated) and not statisticIsLatestCalculated timeCalculated = time - 1000 * 60 * 60 * 24 * (dayofweek(time) + 5) resultCalculated = currentPeriodResult[1] statisticIsLatestCalculated := true array.push(statisticPeriodTime, timeCalculated) array.push(statisticPeriodResult, resultCalculated) // render statistics table if barstate.islast statisticLength = array.size(statisticPeriodResult) statisticTableSteps = math.floor(statisticLength / statisticGroupSize) + (statisticLength % statisticGroupSize != 0 ? 1 : 0) statisticTable := table.new(position.bottom_right, columns = statisticGroupSize + 2, rows = statisticTableSteps + 1, border_width = 1) // render headers for i = 0 to (statisticGroupSize - 1) statisticHeaderContent = str.tostring(i + 1) table.cell(statisticTable, 1 + i, 0, statisticHeaderContent, bgcolor = statisticColorGray) // render time points for i = 0 to (statisticTableSteps - 1) statisticPointContent = str.format("{0,date,medium}", array.get(statisticPeriodTime, i * statisticGroupSize)) table.cell(statisticTable, 0, 1 + i, statisticPointContent, bgcolor = statisticColorGray) // render the result statisticResultCummulative = 0.0 for i = 0 to (array.size(statisticPeriodTime) - 1) statisticColumn = 1 + i % statisticGroupSize statisticRow = 1 + math.floor(i / statisticGroupSize) statisticResult = array.get(statisticPeriodResult, i) statisticResultCummulative := (i % statisticGroupSize == 0) ? 0.0 : statisticResultCummulative statisticResultCummulative := (1 + statisticResultCummulative) * (1 + statisticResult) - 1 statisticResultColor = statisticResult > 0 ? statisticColorGreen : statisticColorRed table.cell(statisticTable, statisticColumn, statisticRow, str.tostring(math.round(statisticResult * 100, statisticPrecision)), bgcolor = statisticResultColor) // if it is the last item of the row or data array isStatisticLastOfTheRow = ((i + 1) % statisticGroupSize) == 0 isStatisticLastOfTheData = i == (statisticLength - 1) if (isStatisticLastOfTheRow or isStatisticLastOfTheData) resultsTableCummulativeCellColor = statisticResultCummulative > 0 ? statisticColorGreen : statisticColorRed resultsTableCummulativeCellContent = str.tostring(math.round(statisticResultCummulative * 100, statisticPrecision)) table.cell(statisticTable, 1 + statisticGroupSize, statisticRow, resultsTableCummulativeCellContent, bgcolor = resultsTableCummulativeCellColor)