-
Notifications
You must be signed in to change notification settings - Fork 1.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #1220 from SpiderMan670/main
docs: enhance dydx perpetual
- Loading branch information
Showing
3 changed files
with
397 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,107 @@ | ||
以下是关于 **DYDX 永续合约的资金费率 (Funding Rate)** 部分的 JS 实现分析,它是永续合约的重要机制,用于保持合约价格与现货市场价格一致。 | ||
|
||
### 资金费率 (Funding Rate) 简介 | ||
|
||
资金费率是多头和空头之间周期性交换的费用。 | ||
它的计算基于以下公式: | ||
|
||
\[ | ||
\text{Funding Rate} = \text{Index Price} - \text{Mark Price} | ||
\] | ||
|
||
- **Mark Price**:交易所计算的当前合约价格。 | ||
- **Index Price**:现货市场的参考价格。 | ||
|
||
资金费率正值时,多头支付空头;负值时,空头支付多头。 | ||
|
||
--- | ||
|
||
### 实现步骤 | ||
以下是用 JavaScript 模拟资金费率的简单计算过程: | ||
|
||
#### 1. 数据初始化 | ||
|
||
```javascript | ||
// 示例数据初始化 | ||
const indexPrice = 1000; // 现货参考价格(美元) | ||
const markPrice = 1005; // 永续合约标记价格(美元) | ||
const positionSize = 10; // 持仓量(单位合约数) | ||
const fundingInterval = 8; // 资金费率结算周期(每 8 小时一次) | ||
``` | ||
|
||
#### 2. 计算资金费率 | ||
|
||
```javascript | ||
function calculateFundingRate(indexPrice, markPrice) { | ||
// 资金费率计算 | ||
const fundingRate = (markPrice - indexPrice) / indexPrice; | ||
return fundingRate; | ||
} | ||
|
||
const fundingRate = calculateFundingRate(indexPrice, markPrice); | ||
console.log(`Funding Rate: ${(fundingRate * 100).toFixed(2)}%`); | ||
``` | ||
|
||
#### 3. 计算资金费用 | ||
|
||
```javascript | ||
function calculateFundingPayment(fundingRate, positionSize, markPrice) { | ||
// 资金费用 = 资金费率 * 持仓量 * 标记价格 | ||
const fundingPayment = fundingRate * positionSize * markPrice; | ||
return fundingPayment; | ||
} | ||
|
||
const fundingPayment = calculateFundingPayment(fundingRate, positionSize, markPrice); | ||
console.log(`Funding Payment: $${fundingPayment.toFixed(2)}`); | ||
``` | ||
|
||
--- | ||
|
||
### **完整代码** | ||
|
||
```javascript | ||
// 数据初始化 | ||
const indexPrice = 1000; // 现货参考价格 | ||
const markPrice = 1005; // 永续合约标记价格 | ||
const positionSize = 10; // 持仓量 | ||
const fundingInterval = 8; // 每8小时资金费率结算 | ||
|
||
// 计算资金费率 | ||
function calculateFundingRate(indexPrice, markPrice) { | ||
return (markPrice - indexPrice) / indexPrice; | ||
} | ||
|
||
// 计算资金费用 | ||
function calculateFundingPayment(fundingRate, positionSize, markPrice) { | ||
return fundingRate * positionSize * markPrice; | ||
} | ||
|
||
// 执行计算 | ||
const fundingRate = calculateFundingRate(indexPrice, markPrice); | ||
console.log(`Funding Rate: ${(fundingRate * 100).toFixed(2)}%`); | ||
|
||
const fundingPayment = calculateFundingPayment(fundingRate, positionSize, markPrice); | ||
console.log(`Funding Payment: $${fundingPayment.toFixed(2)}`); | ||
``` | ||
|
||
--- | ||
|
||
### **示例输出** | ||
|
||
假设: | ||
- **Index Price** = $1000 | ||
- **Mark Price** = $1005 | ||
- **Position Size** = 10 | ||
|
||
运行结果: | ||
``` | ||
Funding Rate: 0.50% | ||
Funding Payment: $50.25 | ||
``` | ||
|
||
### **分析** | ||
- 资金费率为 **0.5%**,意味着多头需要每 8 小时支付持仓价值的 0.5%。 | ||
- 持仓者需支付 **$50.25** 的资金费用。 | ||
|
||
### **实际使用场景** | ||
在 DYDX 平台上,类似计算通过链上合约自动执行,并根据市场条件动态调整。该机制能有效平衡多空双方的资金成本,确保合约价格与现货价格的紧密锚定。 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,162 @@ | ||
在 DYDX 永续合约中,价格计算是基于 **标记价格(Mark Price)** 和 **指数价格(Index Price)**,它们是维护合约公平性的核心组件。 | ||
|
||
以下是如何通过 JavaScript 模拟 **DYDX 永续合约价格机制** 的分析和实现。 | ||
|
||
### 1. **核心概念** | ||
|
||
- **指数价格 (Index Price)**:从现货市场获取的加权平均价格,反映某资产的市场公平价格。 | ||
- **标记价格 (Mark Price)**:合约的实际交易价格,用于计算未实现盈亏(PnL)和强制平仓。 | ||
- **基差 (Basis)**:标记价格和指数价格之间的差异,通常受供需影响。 | ||
|
||
公式: | ||
\[ | ||
\text{Mark Price} = \text{Index Price} + \text{Basis} | ||
\] | ||
|
||
### 2. **代码实现** | ||
|
||
以下是 JavaScript 模拟 DYDX 永续合约价格计算的代码示例。 | ||
|
||
#### **Step 1: 初始化数据** | ||
|
||
```javascript | ||
// 初始化价格数据 | ||
const indexPrice = 2000; // 指数价格,现货市场价格(USD) | ||
let basis = 10; // 初始基差(USD) | ||
|
||
// 模拟标记价格计算 | ||
function calculateMarkPrice(indexPrice, basis) { | ||
return indexPrice + basis; | ||
} | ||
|
||
const markPrice = calculateMarkPrice(indexPrice, basis); | ||
console.log(`Mark Price: $${markPrice}`); | ||
``` | ||
|
||
#### **Step 2: 模拟动态基差调整** | ||
|
||
基差会根据市场供需动态调整,以下代码演示如何实时计算新的标记价格。 | ||
|
||
```javascript | ||
// 模拟基差动态调整 | ||
function updateBasis(marketCondition) { | ||
// 市场条件影响基差:市场多头占优,基差上升;空头占优,基差下降 | ||
if (marketCondition === "bullish") { | ||
basis += 5; // 多头主导,基差增加 | ||
} else if (marketCondition === "bearish") { | ||
basis -= 5; // 空头主导,基差减少 | ||
} | ||
return basis; | ||
} | ||
|
||
// 模拟不同市场条件下的标记价格 | ||
const marketConditions = ["bullish", "bearish", "neutral"]; | ||
marketConditions.forEach((condition) => { | ||
const updatedBasis = updateBasis(condition); | ||
const updatedMarkPrice = calculateMarkPrice(indexPrice, updatedBasis); | ||
console.log(`Market Condition: ${condition}`); | ||
console.log(`Updated Mark Price: $${updatedMarkPrice}`); | ||
}); | ||
``` | ||
|
||
#### **Step 3: 实现未实现盈亏(PnL)计算** | ||
|
||
根据标记价格计算未实现盈亏,用于评估持仓的当前盈亏情况。 | ||
|
||
```javascript | ||
// 计算未实现盈亏(PnL) | ||
function calculatePnL(entryPrice, markPrice, positionSize) { | ||
// PnL = (标记价格 - 入场价格) * 持仓量 | ||
const pnl = (markPrice - entryPrice) * positionSize; | ||
return pnl; | ||
} | ||
|
||
// 示例数据 | ||
const entryPrice = 1980; // 持仓的入场价格 | ||
const positionSize = 2; // 持仓量(单位:合约) | ||
|
||
const pnl = calculatePnL(entryPrice, markPrice, positionSize); | ||
console.log(`Unrealized PnL: $${pnl.toFixed(2)}`); | ||
``` | ||
|
||
--- | ||
|
||
### **完整代码** | ||
|
||
```javascript | ||
// 初始化 | ||
const indexPrice = 2000; | ||
let basis = 10; | ||
|
||
// 计算标记价格 | ||
function calculateMarkPrice(indexPrice, basis) { | ||
return indexPrice + basis; | ||
} | ||
|
||
// 更新基差 | ||
function updateBasis(marketCondition) { | ||
if (marketCondition === "bullish") { | ||
basis += 5; | ||
} else if (marketCondition === "bearish") { | ||
basis -= 5; | ||
} | ||
return basis; | ||
} | ||
|
||
// 计算未实现盈亏 | ||
function calculatePnL(entryPrice, markPrice, positionSize) { | ||
return (markPrice - entryPrice) * positionSize; | ||
} | ||
|
||
// 模拟 | ||
const markPrice = calculateMarkPrice(indexPrice, basis); | ||
console.log(`Initial Mark Price: $${markPrice}`); | ||
|
||
const marketConditions = ["bullish", "bearish", "neutral"]; | ||
marketConditions.forEach((condition) => { | ||
const updatedBasis = updateBasis(condition); | ||
const updatedMarkPrice = calculateMarkPrice(indexPrice, updatedBasis); | ||
console.log(`Market Condition: ${condition}`); | ||
console.log(`Updated Mark Price: $${updatedMarkPrice}`); | ||
|
||
const pnl = calculatePnL(1980, updatedMarkPrice, 2); | ||
console.log(`Unrealized PnL: $${pnl.toFixed(2)}\n`); | ||
}); | ||
``` | ||
|
||
--- | ||
|
||
### **示例输出** | ||
|
||
假设以下市场条件: | ||
- **初始指数价格**:$2000 | ||
- **初始基差**:$10 | ||
- **入场价格**:$1980 | ||
- **持仓量**:2 合约 | ||
|
||
运行结果: | ||
|
||
``` | ||
Initial Mark Price: $2010 | ||
Market Condition: bullish | ||
Updated Mark Price: $2020 | ||
Unrealized PnL: $80.00 | ||
Market Condition: bearish | ||
Updated Mark Price: $2010 | ||
Unrealized PnL: $60.00 | ||
Market Condition: neutral | ||
Updated Mark Price: $2010 | ||
Unrealized PnL: $60.00 | ||
``` | ||
|
||
--- | ||
|
||
### **分析总结** | ||
|
||
1. **动态基差**:市场条件直接影响基差,从而影响标记价格。 | ||
2. **未实现盈亏 (PnL)**:通过标记价格计算持仓的浮动盈亏,帮助用户实时评估风险。 | ||
3. **链上计算**:在 DYDX 平台,这些计算由智能合约实时进行,确保透明性和公平性。 | ||
|
||
如果需要更复杂的分析(如多资产组合、自动强制平仓逻辑),可以扩展代码! |
Oops, something went wrong.