|
|
@ -4,14 +4,14 @@ |
|
|
<view class="w-max" style="height: var(--status-bar-height)"></view> |
|
|
<view class="w-max" style="height: var(--status-bar-height)"></view> |
|
|
<view @click="$emit('symbol')" class="d-flex align-center"> |
|
|
<view @click="$emit('symbol')" class="d-flex align-center"> |
|
|
<i class="iconfont color-light fn-bold fn-18"></i> |
|
|
<i class="iconfont color-light fn-bold fn-18"></i> |
|
|
<text class="fn-bold">{{ symbol }}</text> |
|
|
<text class="fn-bold">{{ activeCoin.coin_name }}</text> |
|
|
<text class="fn-10 m-l-xs p-y-2" :class="increase.increase < 0 ? 'color-sell bg-sell-transparent' : 'color-buy bg-buy-transparent'">{{increase.increaseStr}}</text> |
|
|
<text class="fn-10 m-l-xs p-y-2" :class="increase.increase < 0 ? 'color-sell bg-sell-transparent' : 'color-buy bg-buy-transparent'">{{increase.increaseStr}}</text> |
|
|
</view> |
|
|
</view> |
|
|
<view class="d-flex fn-20 color-theme-1"> |
|
|
<view class="d-flex fn-20 color-theme-1"> |
|
|
<view class="m-r-xs" @click="$emit('option')"> |
|
|
<!-- <view class="m-r-xs" @click="$emit('option')"> |
|
|
<van-icon v-if="isCoolect" name="star" /> |
|
|
<van-icon v-if="isCoolect" name="star" /> |
|
|
<van-icon v-else class="color-default" name="star-o" /> |
|
|
<van-icon v-else class="color-default" name="star-o" /> |
|
|
</view> |
|
|
</view> --> |
|
|
<v-link |
|
|
<v-link |
|
|
tag="div" |
|
|
tag="div" |
|
|
v-if="symbol" |
|
|
v-if="symbol" |
|
|
@ -165,11 +165,19 @@ |
|
|
block |
|
|
block |
|
|
@click="storeEntrust" |
|
|
@click="storeEntrust" |
|
|
ref="btn" |
|
|
ref="btn" |
|
|
>{{ |
|
|
v-if="tradingOpenshow==true"> |
|
|
form.direction == "buy" |
|
|
{{form.direction == "buy" ? this.$t("exchange.c3") : this.$t("exchange.c4")}} |
|
|
? this.$t("exchange.c3") |
|
|
{{ activeCoin.coin_name }}</v-button |
|
|
: this.$t("exchange.c4") |
|
|
> |
|
|
}} |
|
|
<v-button |
|
|
|
|
|
size="small" |
|
|
|
|
|
type="colorless" |
|
|
|
|
|
class="w-max rounded-md" |
|
|
|
|
|
block |
|
|
|
|
|
@click="storeEntrust" |
|
|
|
|
|
ref="btn" |
|
|
|
|
|
v-if="tradingOpenshow==false"> |
|
|
|
|
|
{{form.direction == "buy" ? this.$t("exchange.c3") : this.$t("exchange.c4")}} |
|
|
{{ activeCoin.coin_name }}</v-button |
|
|
{{ activeCoin.coin_name }}</v-button |
|
|
> |
|
|
> |
|
|
</template> |
|
|
</template> |
|
|
@ -330,41 +338,41 @@ |
|
|
<view class="p-x-md p-y-xs" style="line-height: 60rpx;"> |
|
|
<view class="p-x-md p-y-xs" style="line-height: 60rpx;"> |
|
|
<view class="row d-flex m-y-xs"> |
|
|
<view class="row d-flex m-y-xs"> |
|
|
<view class="d-flex w-50 align-end"> |
|
|
<view class="d-flex w-50 align-end"> |
|
|
{{$t("exchange.g8")}}:<span class="color-light"></span>{{item.pair_name}} |
|
|
{{$t("exchange.g9")}}:<span class="color-light"></span>{{item.coin_name}} |
|
|
</view> |
|
|
</view> |
|
|
<view class="d-flex w-50 justify-between"> |
|
|
<view class="d-flex w-50 justify-between"> |
|
|
<view> |
|
|
<view> |
|
|
{{$t("exchange.g9")}}:<span class="color-light"></span>{{item.market}} |
|
|
{{$t("exchange.g10")}}:<span class="color-light"></span>{{item.market}} |
|
|
</view> |
|
|
</view> |
|
|
</view> |
|
|
</view> |
|
|
</view> |
|
|
</view> |
|
|
<view class="row d-flex m-y-xs"> |
|
|
<view class="row d-flex m-y-xs"> |
|
|
<view class="d-flex w-50 align-end"> |
|
|
<view class="d-flex w-50 align-end"> |
|
|
{{$t("exchange.g10")}}:<span class="color-light"></span>{{item.usable_balance}} |
|
|
{{$t("exchange.g11")}}:<span class="color-light"></span>{{item.usable_balance}} |
|
|
</view> |
|
|
</view> |
|
|
<view class="d-flex w-50 justify-between"> |
|
|
<view class="d-flex w-50 justify-between"> |
|
|
<view> |
|
|
<view> |
|
|
{{$t("exchange.g11")}}:<span class="color-light"></span>{{item.realtimePrice}} |
|
|
{{$t("exchange.g12")}}:<span class="color-light"></span>{{item.realtimePrice}} |
|
|
</view> |
|
|
</view> |
|
|
</view> |
|
|
</view> |
|
|
</view> |
|
|
</view> |
|
|
<view class="row d-flex m-y-xs"> |
|
|
<view class="row d-flex m-y-xs"> |
|
|
<view class="d-flex w-50 align-end"> |
|
|
<view class="d-flex w-50 align-end"> |
|
|
{{$t("exchange.g12")}}:<span class="color-light"></span>{{item.cost_price}} |
|
|
{{$t("exchange.g13")}}:<span class="color-light"></span>{{item.cost_price}} |
|
|
</view> |
|
|
</view> |
|
|
<view class="d-flex w-50 justify-between"> |
|
|
<view class="d-flex w-50 justify-between"> |
|
|
<view> |
|
|
<view> |
|
|
{{$t("exchange.g13")}}:<span class="color-light"></span>{{item.dayProfit}} |
|
|
{{$t("exchange.g14")}}:<span :class="item.dayProfit>0?'color-buy':item.dayProfit<0?'color-sell':''">{{item.dayProfit}}</span> |
|
|
</view> |
|
|
</view> |
|
|
</view> |
|
|
</view> |
|
|
</view> |
|
|
</view> |
|
|
<view class="row d-flex m-y-xs"> |
|
|
<view class="row d-flex m-y-xs"> |
|
|
<view class="d-flex w-50 align-end"> |
|
|
<view class="d-flex w-50 align-end"> |
|
|
{{$t("exchange.g14")}}:<span class="color-light"></span>{{item.unRealProfit}} |
|
|
{{$t("exchange.g15")}}:<span class="color-light" :class="item.unRealProfit>0?'color-buy':item.unRealProfit<0?'color-sell':''">{{item.unRealProfit}}</span> |
|
|
</view> |
|
|
</view> |
|
|
<view class="d-flex w-50 justify-between"> |
|
|
<view class="d-flex w-50 justify-between"> |
|
|
<view> |
|
|
<view> |
|
|
{{$t("exchange.g15")}}:<span class="color-light"></span>{{item.profitRate}} |
|
|
{{$t("exchange.g16")}}:<span class="color-light" :class="item.profitRate>0?'color-buy':item.profitRate<0?'color-sell':''">{{item.profitRate}}</span> |
|
|
</view> |
|
|
</view> |
|
|
</view> |
|
|
</view> |
|
|
</view> |
|
|
</view> |
|
|
@ -461,7 +469,10 @@ export default { |
|
|
refreshing:false, |
|
|
refreshing:false, |
|
|
active:0, |
|
|
active:0, |
|
|
stockholdPositionlist:[], |
|
|
stockholdPositionlist:[], |
|
|
holdPositiondtime: null |
|
|
holdPositiondtime: null, |
|
|
|
|
|
|
|
|
|
|
|
tradingOpenshow:false, |
|
|
|
|
|
timer: null, |
|
|
}; |
|
|
}; |
|
|
}, |
|
|
}, |
|
|
computed: { |
|
|
computed: { |
|
|
@ -526,14 +537,27 @@ export default { |
|
|
// 计算交易额 |
|
|
// 计算交易额 |
|
|
totalMoney() { |
|
|
totalMoney() { |
|
|
// todo |
|
|
// todo |
|
|
|
|
|
// let totalMoney = 0; |
|
|
|
|
|
// if (this.form.type == 0) { |
|
|
|
|
|
// totalMoney = math.multiple(this.form.amount, this.form.entrust_price); |
|
|
|
|
|
// } else { |
|
|
|
|
|
// // totalMoney = this.form.amount; |
|
|
|
|
|
// totalMoney = math.multiple(this.form.amount, this.form.entrust_price); |
|
|
|
|
|
// } |
|
|
|
|
|
// return totalMoney; |
|
|
let totalMoney = 0; |
|
|
let totalMoney = 0; |
|
|
|
|
|
// 确保拿到的 amount 和 price 是有效数字,如果是空字符串或 -Infinity 则当做 0 处理 |
|
|
|
|
|
let amount = Number(this.form.amount) || 0; |
|
|
|
|
|
let price = Number(this.form.entrust_price) || 0; |
|
|
|
|
|
|
|
|
if (this.form.type == 0) { |
|
|
if (this.form.type == 0) { |
|
|
totalMoney = math.multiple(this.form.amount, this.form.entrust_price); |
|
|
totalMoney = math.multiple(amount, price); |
|
|
} else { |
|
|
} else { |
|
|
// totalMoney = this.form.amount; |
|
|
totalMoney = math.multiple(amount, price); |
|
|
totalMoney = math.multiple(this.form.amount, this.form.entrust_price); |
|
|
|
|
|
} |
|
|
} |
|
|
return totalMoney; |
|
|
|
|
|
|
|
|
// 防止计算库返回异常值 |
|
|
|
|
|
return isNaN(totalMoney) ? 0 : totalMoney; |
|
|
}, |
|
|
}, |
|
|
// 显示百分比 |
|
|
// 显示百分比 |
|
|
activeStep() { |
|
|
activeStep() { |
|
|
@ -554,18 +578,22 @@ export default { |
|
|
usable() { |
|
|
usable() { |
|
|
if (this.form.direction == "buy") { |
|
|
if (this.form.direction == "buy") { |
|
|
if (!this.targetBalance.usable_balance) return 0; |
|
|
if (!this.targetBalance.usable_balance) return 0; |
|
|
return this.omitTo( |
|
|
// return this.omitTo( |
|
|
// this.targetBalance.usable_balance, |
|
|
// // this.targetBalance.usable_balance, |
|
|
// this.activeCoin.price_decimals |
|
|
// // this.activeCoin.price_decimals |
|
|
this.currentBalance.usable_balance, |
|
|
// this.currentBalance.usable_balance, |
|
|
this.activeCoin.qty_decimals |
|
|
// this.activeCoin.qty_decimals |
|
|
); |
|
|
// ); |
|
|
|
|
|
return this.currentBalance.usable_balance |
|
|
} else { |
|
|
} else { |
|
|
|
|
|
// console.log(this.currentBalance); |
|
|
if (!this.currentBalance.usable_balance) return 0; |
|
|
if (!this.currentBalance.usable_balance) return 0; |
|
|
return this.omitTo( |
|
|
// return this.omitTo( |
|
|
this.currentBalance.usable_balance, |
|
|
// this.currentBalance.usable_balance, |
|
|
this.activeCoin.qty_decimals |
|
|
// // this.targetBalance.usable_balance, |
|
|
); |
|
|
// this.activeCoin.qty_decimals |
|
|
|
|
|
// ); |
|
|
|
|
|
return this.currentBalance.usable_balance |
|
|
} |
|
|
} |
|
|
}, |
|
|
}, |
|
|
usable1() { |
|
|
usable1() { |
|
|
@ -618,10 +646,13 @@ export default { |
|
|
},3000) |
|
|
},3000) |
|
|
this.getUserBalance(); |
|
|
this.getUserBalance(); |
|
|
this.linkSocket(this.activeCoin.symbol); |
|
|
this.linkSocket(this.activeCoin.symbol); |
|
|
|
|
|
|
|
|
|
|
|
this.startSchedule(); |
|
|
} else if(!n&&this.isLogin){ |
|
|
} else if(!n&&this.isLogin){ |
|
|
this.unLink(this.activeCoin.symbol); |
|
|
this.unLink(this.activeCoin.symbol); |
|
|
clearInterval(this.dtime); |
|
|
clearInterval(this.dtime); |
|
|
clearInterval(this.holdPositiondtime); |
|
|
clearInterval(this.holdPositiondtime); |
|
|
|
|
|
clearInterval(this.timer); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
}, |
|
|
}, |
|
|
@ -633,9 +664,11 @@ export default { |
|
|
this.holdPositiondtime = setInterval(()=>{ |
|
|
this.holdPositiondtime = setInterval(()=>{ |
|
|
this.stockholdPosition(); |
|
|
this.stockholdPosition(); |
|
|
},3000) |
|
|
},3000) |
|
|
|
|
|
this.startSchedule(); |
|
|
}else if(e!='stockexchange-operation'&&this.isLogin){ |
|
|
}else if(e!='stockexchange-operation'&&this.isLogin){ |
|
|
clearInterval(this.dtime); |
|
|
clearInterval(this.dtime); |
|
|
clearInterval(this.holdPositiondtime); |
|
|
clearInterval(this.holdPositiondtime); |
|
|
|
|
|
clearInterval(this.timer); |
|
|
} |
|
|
} |
|
|
}, |
|
|
}, |
|
|
list(e){ |
|
|
list(e){ |
|
|
@ -708,6 +741,7 @@ export default { |
|
|
// 计算滑动出来的金额 |
|
|
// 计算滑动出来的金额 |
|
|
sliderChange(n,i) { |
|
|
sliderChange(n,i) { |
|
|
// console.log(n, i, this.form.direction); |
|
|
// console.log(n, i, this.form.direction); |
|
|
|
|
|
if(!n)return |
|
|
let num = n/100; |
|
|
let num = n/100; |
|
|
this.sliderActive=i |
|
|
this.sliderActive=i |
|
|
if (this.form.direction == "buy") { |
|
|
if (this.form.direction == "buy") { |
|
|
@ -720,10 +754,15 @@ export default { |
|
|
); |
|
|
); |
|
|
} else if (this.form.type == 1) { |
|
|
} else if (this.form.type == 1) { |
|
|
// 市价 |
|
|
// 市价 |
|
|
this.form.amount = this.form.amount = math.multiple( |
|
|
// this.form.amount = this.form.amount = math.multiple( |
|
|
this.targetBalance.usable_balance, |
|
|
// this.targetBalance.usable_balance, |
|
|
|
|
|
// num, |
|
|
|
|
|
// 4 |
|
|
|
|
|
// ); |
|
|
|
|
|
this.form.amount = math.multiple( |
|
|
|
|
|
this.targetBalance.usable_balance / this.form.entrust_price, |
|
|
num, |
|
|
num, |
|
|
4 |
|
|
6 |
|
|
); |
|
|
); |
|
|
} |
|
|
} |
|
|
} else if (this.form.direction == "sell") { |
|
|
} else if (this.form.direction == "sell") { |
|
|
@ -783,12 +822,14 @@ export default { |
|
|
if(ti===3){ |
|
|
if(ti===3){ |
|
|
clearInterval(timer); |
|
|
clearInterval(timer); |
|
|
} |
|
|
} |
|
|
}, 1000) |
|
|
}, 2000) |
|
|
} |
|
|
} |
|
|
console.log('123'); |
|
|
// console.log('123'); |
|
|
this.dtime = setInterval(() => { |
|
|
this.dtime = setInterval(() => { |
|
|
this.getCurrentEntrust(true) |
|
|
this.getCurrentEntrust(true) |
|
|
}, 3000); |
|
|
}, 3000); |
|
|
|
|
|
this.sliderChange(null,-1) |
|
|
|
|
|
this.sliderActive = -1 |
|
|
// this.getCurrentEntrust() |
|
|
// this.getCurrentEntrust() |
|
|
}) |
|
|
}) |
|
|
.catch(() => {}); |
|
|
.catch(() => {}); |
|
|
@ -808,16 +849,77 @@ export default { |
|
|
this.newPrice = this.tradeList[0]||{}; |
|
|
this.newPrice = this.tradeList[0]||{}; |
|
|
}); |
|
|
}); |
|
|
}, |
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
tradingOpen(){ |
|
|
|
|
|
Market.getstocktradingOpen().then(res => { |
|
|
|
|
|
this.tradingOpenshow = res.data |
|
|
|
|
|
}).catch(err => {}); |
|
|
|
|
|
}, |
|
|
|
|
|
startSchedule() { |
|
|
|
|
|
this.timer = setInterval(() => { |
|
|
|
|
|
const now = new Date(); |
|
|
|
|
|
const minutes = now.getMinutes(); |
|
|
|
|
|
const seconds = now.getSeconds(); |
|
|
|
|
|
|
|
|
|
|
|
let remainingSeconds = 0; |
|
|
|
|
|
|
|
|
|
|
|
// 1. 如果正好是 00分00秒 或 30分00秒,说明时间到了! |
|
|
|
|
|
if (minutes % 30 === 0 && seconds === 0) { |
|
|
|
|
|
remainingSeconds = 0; |
|
|
|
|
|
console.log(`距离下次刷新还有 ${remainingSeconds} 秒,正在执行刷新...`); |
|
|
|
|
|
|
|
|
|
|
|
// 触发接口调用 |
|
|
|
|
|
this.tradingOpen(); |
|
|
|
|
|
} |
|
|
|
|
|
// 2. 否则,计算距离下一次刷新的秒数 |
|
|
|
|
|
else { |
|
|
|
|
|
if (minutes < 30) { |
|
|
|
|
|
// 如果当前是 0~29 分,目标是 30 分 |
|
|
|
|
|
remainingSeconds = (30 - minutes) * 60 - seconds; |
|
|
|
|
|
} else { |
|
|
|
|
|
// 如果当前是 30~59 分,目标是 60 分 (下一个整点) |
|
|
|
|
|
remainingSeconds = (60 - minutes) * 60 - seconds; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 一直打印倒计时提示 |
|
|
|
|
|
// console.log(`距离下次刷新还有 ${remainingSeconds} 秒`); |
|
|
|
|
|
} |
|
|
|
|
|
}, 1000); |
|
|
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 获取默认价格 |
|
|
// 获取默认价格 |
|
|
getDefaultPrice() { |
|
|
getDefaultPrice() { |
|
|
|
|
|
// if (this.form.direction == "buy") { |
|
|
|
|
|
// this.form.entrust_price = Math.min( |
|
|
|
|
|
// ...this.tradeList.map((item) => item.price) |
|
|
|
|
|
// ); |
|
|
|
|
|
// } else { |
|
|
|
|
|
// this.form.entrust_price = Math.max( |
|
|
|
|
|
// ...this.buyList.map((item) => item.price) |
|
|
|
|
|
// ); |
|
|
|
|
|
// } |
|
|
if (this.form.direction == "buy") { |
|
|
if (this.form.direction == "buy") { |
|
|
|
|
|
// 确保 tradeList 有数据 |
|
|
|
|
|
if (this.tradeList && this.tradeList.length > 0) { |
|
|
this.form.entrust_price = Math.min( |
|
|
this.form.entrust_price = Math.min( |
|
|
...this.tradeList.map((item) => item.price) |
|
|
...this.tradeList.map((item) => Number(item.price)) |
|
|
); |
|
|
); |
|
|
} else { |
|
|
} else { |
|
|
|
|
|
// 兜底方案:如果没有数据,使用最新价或0 |
|
|
|
|
|
this.form.entrust_price = this.newPrice.price || 0; |
|
|
|
|
|
} |
|
|
|
|
|
} else { // 卖出 |
|
|
|
|
|
// 确保 buyList 有数据 |
|
|
|
|
|
if (this.buyList && this.buyList.length > 0) { |
|
|
this.form.entrust_price = Math.max( |
|
|
this.form.entrust_price = Math.max( |
|
|
...this.buyList.map((item) => item.price) |
|
|
...this.buyList.map((item) => Number(item.price)) |
|
|
); |
|
|
); |
|
|
|
|
|
} else { |
|
|
|
|
|
// 兜底方案:如果没有买盘数据,使用最新价或0 |
|
|
|
|
|
this.form.entrust_price = this.newPrice.price || 0; |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
}, |
|
|
}, |
|
|
// 切换方向 |
|
|
// 切换方向 |
|
|
@ -825,7 +927,7 @@ export default { |
|
|
this.form.direction = type; |
|
|
this.form.direction = type; |
|
|
this.getDefaultPrice(); |
|
|
this.getDefaultPrice(); |
|
|
let n = this.progress[this.sliderActive]; |
|
|
let n = this.progress[this.sliderActive]; |
|
|
// this.sliderChange(n, this.sliderActive); |
|
|
this.sliderChange(n, this.sliderActive); |
|
|
}, |
|
|
}, |
|
|
// 计算深度 |
|
|
// 计算深度 |
|
|
getValue(amount) { |
|
|
getValue(amount) { |
|
|
@ -944,6 +1046,10 @@ export default { |
|
|
this.getBooks(); |
|
|
this.getBooks(); |
|
|
this.getUserBalance(); |
|
|
this.getUserBalance(); |
|
|
this.socketMessage(); |
|
|
this.socketMessage(); |
|
|
|
|
|
|
|
|
|
|
|
this.tradingOpen() |
|
|
|
|
|
this.startSchedule(); |
|
|
|
|
|
|
|
|
if (this.query.direction) { |
|
|
if (this.query.direction) { |
|
|
this.form.direction = this.query.direction; |
|
|
this.form.direction = this.query.direction; |
|
|
} |
|
|
} |
|
|
@ -959,6 +1065,9 @@ export default { |
|
|
// this.unLink(this.unSymbol); |
|
|
// this.unLink(this.unSymbol); |
|
|
clearInterval(this.dtime); |
|
|
clearInterval(this.dtime); |
|
|
clearInterval(this.holdPositiondtime); |
|
|
clearInterval(this.holdPositiondtime); |
|
|
|
|
|
if (this.timer) { |
|
|
|
|
|
clearInterval(this.timer); |
|
|
|
|
|
} |
|
|
}, |
|
|
}, |
|
|
}; |
|
|
}; |
|
|
</script> |
|
|
</script> |
|
|
@ -1130,4 +1239,7 @@ export default { |
|
|
.bor5-active{ |
|
|
.bor5-active{ |
|
|
border-bottom: 4px solid $theme-2; |
|
|
border-bottom: 4px solid $theme-2; |
|
|
} |
|
|
} |
|
|
|
|
|
/deep/uni-input{ |
|
|
|
|
|
background-color: transparent; |
|
|
|
|
|
} |
|
|
</style> |
|
|
</style> |