All files / models Strategy.js

0% Statements 0/12
0% Branches 0/4
0% Functions 0/2
0% Lines 0/10

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123                                                                                                                                                                                                                                                     
const { DataTypes } = require('sequelize');
const sequelize = require('../config/database');
 
const Strategy = sequelize.define('Strategy', {
  id: {
    type: DataTypes.UUID,
    defaultValue: DataTypes.UUIDV4,
    primaryKey: true
  },
  name: {
    type: DataTypes.STRING,
    allowNull: false,
    unique: true
  },
  slug: {
    type: DataTypes.STRING,
    allowNull: false,
    unique: true
  },
  description: {
    type: DataTypes.TEXT,
    allowNull: true
  },
  type: {
    type: DataTypes.ENUM('arbitrage', 'flashloan', 'mev', 'autotrading', 'grid', 'dca', 'copytrading', 'sniper'),
    allowNull: false
  },
  riskLevel: {
    type: DataTypes.ENUM('low', 'medium', 'high'),
    defaultValue: 'medium'
  },
  minInvestment: {
    type: DataTypes.DECIMAL(20, 8),
    defaultValue: 100
  },
  expectedReturn: {
    type: DataTypes.JSONB,
    defaultValue: {
      min: 5,
      max: 30,
      average: 15
    }
  },
  fees: {
    type: DataTypes.JSONB,
    defaultValue: {
      management: 0.02,
      performance: 0.20
    }
  },
  parameters: {
    type: DataTypes.JSONB,
    defaultValue: {}
  },
  supportedChains: {
    type: DataTypes.ARRAY(DataTypes.STRING),
    defaultValue: ['ethereum']
  },
  supportedTokens: {
    type: DataTypes.ARRAY(DataTypes.STRING),
    defaultValue: []
  },
  isActive: {
    type: DataTypes.BOOLEAN,
    defaultValue: true
  },
  isPremium: {
    type: DataTypes.BOOLEAN,
    defaultValue: false
  },
  totalTrades: {
    type: DataTypes.INTEGER,
    defaultValue: 0
  },
  successfulTrades: {
    type: DataTypes.INTEGER,
    defaultValue: 0
  },
  failedTrades: {
    type: DataTypes.INTEGER,
    defaultValue: 0
  },
  totalProfit: {
    type: DataTypes.DECIMAL(20, 8),
    defaultValue: 0
  },
  totalVolume: {
    type: DataTypes.DECIMAL(20, 8),
    defaultValue: 0
  },
  lastExecutedAt: {
    type: DataTypes.DATE,
    allowNull: true
  },
  metadata: {
    type: DataTypes.JSONB,
    defaultValue: {}
  }
}, {
  tableName: 'strategies',
  timestamps: true,
  indexes: [
    { fields: ['slug'] },
    { fields: ['type'] },
    { fields: ['isActive'] },
    { fields: ['isPremium'] }
  ]
});
 
// Instance methods
Strategy.prototype.calculateSuccessRate = function() {
  if (this.totalTrades === 0) return 0;
  return (this.successfulTrades / this.totalTrades) * 100;
};
 
Strategy.prototype.calculateAverageProfit = function() {
  if (this.successfulTrades === 0) return 0;
  return parseFloat(this.totalProfit) / this.successfulTrades;
};
 
module.exports = Strategy;