Browse Source

更新多语言文件,调整交易相关字段翻译,新增模拟交易和盈亏字段。

master
TorsenLi 2 days ago
parent
commit
57c39d076a
  1. 27
      src/api/aiStock.js
  2. 21
      src/i18n/de.json
  3. 21
      src/i18n/en.json
  4. 21
      src/i18n/fra.json
  5. 21
      src/i18n/he.json
  6. 21
      src/i18n/it.json
  7. 21
      src/i18n/jp.json
  8. 19
      src/i18n/kor.json
  9. 21
      src/i18n/pt.json
  10. 21
      src/i18n/spa.json
  11. 21
      src/i18n/tr.json
  12. 21
      src/i18n/tw.json
  13. 159
      src/views/ellasAlpha/index.vue

27
src/api/aiStock.js

@ -0,0 +1,27 @@
import server from './server';
class AiStock {
static getAccount(config) {
return server.get('/ai-stock/account', { config });
}
static getOrders(params, config) {
return server.get('/ai-stock/orders', {
params,
config,
});
}
static transferToSpot(data, config) {
return server.post('/ai-stock/transfer-to-spot', data, config);
}
static getTransfers(params, config) {
return server.get('/ai-stock/transfers', {
params,
config,
});
}
}
export default AiStock;

21
src/i18n/de.json

@ -1175,14 +1175,14 @@
"a13":"Währung", "a13":"Währung",
"a14":"Kurs", "a14":"Kurs",
"a15":"Änderung", "a15":"Änderung",
"a16":"Name / Ticker", "a16":"Handelszeit",
"a17":"Kaufpreis", "a17":"Symbol",
"a18":"Verkaufspreis", "a18":"Richtung",
"a19":"Menge", "a19":"Preis",
"a20":"Servicegebühr", "a20":"Menge",
"a21":"Transaktionsbetrag", "a21":"Betrag",
"a22":"Gewinn", "a22":"G/V",
"a23":"Richtung", "a23":"Ergebnis",
"a24":"Kaufzeitpunkt", "a24":"Kaufzeitpunkt",
"a25":"Verkaufszeitpunkt", "a25":"Verkaufszeitpunkt",
"a26":"Keine Daten verfügbar", "a26":"Keine Daten verfügbar",
@ -1190,6 +1190,9 @@
"a28":"Mindesteinzahlungsbetrag", "a28":"Mindesteinzahlungsbetrag",
"a29":"Abbrechen", "a29":"Abbrechen",
"a30":"Bestätigen", "a30":"Bestätigen",
"a31":"Bitte Betrag eingeben" "a31":"Bitte Betrag eingeben",
"a32":"Simuliert",
"a33":"Gewinn",
"a34":"Verlust"
} }
} }

21
src/i18n/en.json

@ -1280,14 +1280,14 @@
"a13":"Currency", "a13":"Currency",
"a14":"Price", "a14":"Price",
"a15":"Change", "a15":"Change",
"a16":"Name / Ticker", "a16":"Trade Time",
"a17":"Purchase Price", "a17":"Symbol",
"a18":"Selling Price", "a18":"Direction",
"a19":"Quantity", "a19":"Price",
"a20":"Service Fee", "a20":"Quantity",
"a21":"Transaction Amount", "a21":"Amount",
"a22":"Profit", "a22":"P&L",
"a23":"Direction", "a23":"Result",
"a24":"Purchase Time", "a24":"Purchase Time",
"a25":"Sell Time", "a25":"Sell Time",
"a26":"No Data Available", "a26":"No Data Available",
@ -1295,7 +1295,10 @@
"a28":"Minimum Deposit Amount", "a28":"Minimum Deposit Amount",
"a29":"Cancel", "a29":"Cancel",
"a30":"Confirm", "a30":"Confirm",
"a31":"Please Enter Amount" "a31":"Please Enter Amount",
"a32":"Simulated",
"a33":"Profit",
"a34":"Loss"
}, },
"flashSwap": { "flashSwap": {
"from": "From", "from": "From",

21
src/i18n/fra.json

@ -1175,14 +1175,14 @@
"a13":"Devise", "a13":"Devise",
"a14":"Prix", "a14":"Prix",
"a15":"Variation", "a15":"Variation",
"a16":"Nom / Symbole boursier", "a16":"Heure d'exécution",
"a17":"Prix d'achat", "a17":"Symbole",
"a18":"Prix de vente", "a18":"Sens",
"a19":"Quantité", "a19":"Prix",
"a20":"Frais de service", "a20":"Quantité",
"a21":"Montant de la transaction", "a21":"Montant",
"a22":"Profit", "a22":"P&L",
"a23":"Sens", "a23":"Résultat",
"a24":"Heure d'achat", "a24":"Heure d'achat",
"a25":"Heure de vente", "a25":"Heure de vente",
"a26":"Aucune donnée disponible", "a26":"Aucune donnée disponible",
@ -1190,6 +1190,9 @@
"a28":"Montant minimum de dépôt", "a28":"Montant minimum de dépôt",
"a29":"Annuler", "a29":"Annuler",
"a30":"Confirmer", "a30":"Confirmer",
"a31":"Veuillez saisir le montant" "a31":"Veuillez saisir le montant",
"a32":"Simulé",
"a33":"Profit",
"a34":"Perte"
} }
} }

21
src/i18n/he.json

@ -1192,14 +1192,14 @@
"a13":"מטבע", "a13":"מטבע",
"a14":"מחיר", "a14":"מחיר",
"a15":"עודף", "a15":"עודף",
"a16":"שם / טיקר", "a16":"זמן עסקה",
"a17":"מחיר קנייה", "a17":"סימול",
"a18":"מחיר מכירה", "a18":"כיוון",
"a19":"כמות", "a19":"מחיר",
"a20":"עמלת שירות", "a20":"כמות",
"a21":"עסקה סכום", "a21":"סכום",
"a22":"רווח", "a22":"רווח/הפסד",
"a23":"כיוון", "a23":"תוצאה",
"a24":"זמן רכישה", "a24":"זמן רכישה",
"a25":"זמן מכירה", "a25":"זמן מכירה",
"a26":"אין נתונים זמינים", "a26":"אין נתונים זמינים",
@ -1207,6 +1207,9 @@
"a28":"סכום הפקדה מינימלי", "a28":"סכום הפקדה מינימלי",
"a29":"ביטול", "a29":"ביטול",
"a30":"אישור", "a30":"אישור",
"a31":"אנא הזן סכום" "a31":"אנא הזן סכום",
"a32":"מסחר מדומה",
"a33":"רווח",
"a34":"הפסד"
} }
} }

21
src/i18n/it.json

@ -1174,14 +1174,14 @@
"a13":"Valuta", "a13":"Valuta",
"a14":"Prezzo", "a14":"Prezzo",
"a15":"Variazione", "a15":"Variazione",
"a16":"Nome / Ticker", "a16":"Ora esecuzione",
"a17":"Prezzo di Acquisto", "a17":"Simbolo",
"a18":"Prezzo di Vendita", "a18":"Direzione",
"a19":"Quantità", "a19":"Prezzo",
"a20":"Commissione di Servizio", "a20":"Quantità",
"a21":"Importo della Transazione", "a21":"Importo",
"a22":"Profitto", "a22":"P&L",
"a23":"Direzione", "a23":"Risultato",
"a24":"Ora di Acquisto", "a24":"Ora di Acquisto",
"a25":"Ora di Vendita", "a25":"Ora di Vendita",
"a26":"Nessun Dato Disponibile", "a26":"Nessun Dato Disponibile",
@ -1189,6 +1189,9 @@
"a28":"Importo Minimo di Deposito", "a28":"Importo Minimo di Deposito",
"a29":"Annulla", "a29":"Annulla",
"a30":"Conferma", "a30":"Conferma",
"a31":"Inserisci l'Importo" "a31":"Inserisci l'Importo",
"a32":"Simulato",
"a33":"Profitto",
"a34":"Perdita"
} }
} }

21
src/i18n/jp.json

@ -1173,14 +1173,14 @@
"a13":"通貨", "a13":"通貨",
"a14":"価格", "a14":"価格",
"a15":"変動", "a15":"変動",
"a16":"名称 / ティッカー", "a16":"約定時間",
"a17":"購入価格", "a17":"銘柄",
"a18":"売却価格", "a18":"方向",
"a19":"数量", "a19":"約定価格",
"a20":"手数料", "a20":"数量",
"a21":"取引額", "a21":"取引額",
"a22":"益", "a22":"益",
"a23":"方向", "a23":"結果",
"a24":"購入日時", "a24":"購入日時",
"a25":"売却日時", "a25":"売却日時",
"a26":"データなし", "a26":"データなし",
@ -1188,6 +1188,9 @@
"a28":"最低入金額", "a28":"最低入金額",
"a29":"キャンセル", "a29":"キャンセル",
"a30":"確定", "a30":"確定",
"a31":"金額を入力してください" "a31":"金額を入力してください",
"a32":"模擬取引",
"a33":"利益",
"a34":"損失"
} }
} }

19
src/i18n/kor.json

@ -1173,14 +1173,14 @@
"a13":"통화", "a13":"통화",
"a14":"가격", "a14":"가격",
"a15":"변동", "a15":"변동",
"a16":"종목명 / 티커", "a16":"체결 시간",
"a17":"매수가", "a17":"종목",
"a18":"매도가", "a18":"방향",
"a19":"수량", "a19":"체결가",
"a20":"수수료", "a20":"수",
"a21":"거래 금액", "a21":"거래 금액",
"a22":"익", "a22":"익",
"a23":"방향", "a23":"결과",
"a24":"매수 시간", "a24":"매수 시간",
"a25":"매도 시간", "a25":"매도 시간",
"a26":"데이터 없음", "a26":"데이터 없음",
@ -1188,6 +1188,9 @@
"a28":"최소 입금액", "a28":"최소 입금액",
"a29":"취소", "a29":"취소",
"a30":"확인", "a30":"확인",
"a31":"금액을 입력해 주세요" "a31":"금액을 입력해 주세요",
"a32":"모의 거래",
"a33":"수익",
"a34":"손실"
} }
} }

21
src/i18n/pt.json

@ -1174,14 +1174,14 @@
"a13":"Moeda", "a13":"Moeda",
"a14":"Preço", "a14":"Preço",
"a15":"Variação", "a15":"Variação",
"a16":"Nome / Ticker", "a16":"Hora da execução",
"a17":"Preço de Compra", "a17":"Símbolo",
"a18":"Preço de Venda", "a18":"Direção",
"a19":"Quantidade", "a19":"Preço",
"a20":"Taxa de Serviço", "a20":"Quantidade",
"a21":"Valor da Transação", "a21":"Valor",
"a22":"Lucro", "a22":"P&L",
"a23":"Direção", "a23":"Resultado",
"a24":"Hora da Compra", "a24":"Hora da Compra",
"a25":"Hora da Venda", "a25":"Hora da Venda",
"a26":"Nenhum Dado Disponível", "a26":"Nenhum Dado Disponível",
@ -1189,6 +1189,9 @@
"a28":"Valor Mínimo de Depósito", "a28":"Valor Mínimo de Depósito",
"a29":"Cancelar", "a29":"Cancelar",
"a30":"Confirmar", "a30":"Confirmar",
"a31":"Por favor, insira o valor" "a31":"Por favor, insira o valor",
"a32":"Simulado",
"a33":"Lucro",
"a34":"Prejuízo"
} }
} }

21
src/i18n/spa.json

@ -1174,14 +1174,14 @@
"a13":"Divisa", "a13":"Divisa",
"a14":"Precio", "a14":"Precio",
"a15":"Variación", "a15":"Variación",
"a16":"Nombre / Símbolo", "a16":"Hora de ejecución",
"a17":"Precio de compra", "a17":"Símbolo",
"a18":"Precio de venta", "a18":"Dirección",
"a19":"Cantidad", "a19":"Precio",
"a20":"Comisión de servicio", "a20":"Cantidad",
"a21":"Importe de la transacción", "a21":"Importe",
"a22":"Ganancia", "a22":"P&L",
"a23":"Dirección", "a23":"Resultado",
"a24":"Hora de compra", "a24":"Hora de compra",
"a25":"Hora de venta", "a25":"Hora de venta",
"a26":"Sin datos disponibles", "a26":"Sin datos disponibles",
@ -1189,6 +1189,9 @@
"a28":"Importe mínimo de depósito", "a28":"Importe mínimo de depósito",
"a29":"Cancelar", "a29":"Cancelar",
"a30":"Confirmar", "a30":"Confirmar",
"a31":"Por favor, introduzca el importe" "a31":"Por favor, introduzca el importe",
"a32":"Simulado",
"a33":"Ganancia",
"a34":"Pérdida"
} }
} }

21
src/i18n/tr.json

@ -1174,14 +1174,14 @@
"a13":"Para Birimi", "a13":"Para Birimi",
"a14":"Fiyat", "a14":"Fiyat",
"a15":"Değişim", "a15":"Değişim",
"a16":sim / Sembol", "a16":şlem Zamanı",
"a17":"Alış Fiyatı", "a17":"Sembol",
"a18":"Satış Fiyatı", "a18":"Yön",
"a19":"Miktar", "a19":"Fiyat",
"a20":"Hizmet Ücreti", "a20":"Miktar",
"a21":"İşlem Tutarı", "a21":"Tutar",
"a22":"Kazanç", "a22":"K/Z",
"a23":"Yön", "a23":"Sonuç",
"a24":"Alış Zamanı", "a24":"Alış Zamanı",
"a25":"Satış Zamanı", "a25":"Satış Zamanı",
"a26":"Veri Bulunmuyor", "a26":"Veri Bulunmuyor",
@ -1189,6 +1189,9 @@
"a28":"Minimum Yatırma Tutarı", "a28":"Minimum Yatırma Tutarı",
"a29":"İptal", "a29":"İptal",
"a30":"Onayla", "a30":"Onayla",
"a31":"Lütfen Tutar Girin" "a31":"Lütfen Tutar Girin",
"a32":"Simüle",
"a33":"Kâr",
"a34":"Zarar"
} }
} }

21
src/i18n/tw.json

@ -1210,14 +1210,14 @@
"a13":"幣種", "a13":"幣種",
"a14":"價格", "a14":"價格",
"a15":"漲跌", "a15":"漲跌",
"a16":"名稱 / 代碼", "a16":"成交時間",
"a17":"購買價格", "a17":"股票",
"a18":"售價", "a18":"方向",
"a19":"數量", "a19":"成交價",
"a20":"服務費", "a20":"數量",
"a21":"成交額", "a21":"買賣金額",
"a22":"收益", "a22":"盈虧",
"a23":"方向", "a23":"結果",
"a24":"購買時間", "a24":"購買時間",
"a25":"賣出時間", "a25":"賣出時間",
"a26":"暫無資料", "a26":"暫無資料",
@ -1225,7 +1225,10 @@
"a28":"最低存款金額", "a28":"最低存款金額",
"a29":"取消", "a29":"取消",
"a30":"確認", "a30":"確認",
"a31":"請輸入金額" "a31":"請輸入金額",
"a32":"模擬交易",
"a33":"盈利",
"a34":"虧損"
}, },
"flashSwap": { "flashSwap": {
"from": "從", "from": "從",

159
src/views/ellasAlpha/index.vue

@ -66,7 +66,7 @@
</div> </div>
<div <div
:class="['tab-item', subTab === 'history' ? 'active' : '']" :class="['tab-item', subTab === 'history' ? 'active' : '']"
@click="subTab = 'history'" @click="switchSubTab('history')"
> >
{{$t('automation.a12')}} {{$t('automation.a12')}}
</div> </div>
@ -118,23 +118,39 @@
<th>{{$t('automation.a20')}}</th> <th>{{$t('automation.a20')}}</th>
<th>{{$t('automation.a21')}}</th> <th>{{$t('automation.a21')}}</th>
<th>{{$t('automation.a22')}}</th> <th>{{$t('automation.a22')}}</th>
<th>{{$t('automation.a23')}}</th> <th class="text-right">{{$t('automation.a23')}}</th>
<th>{{$t('automation.a24')}}</th>
<th class="text-right">{{$t('automation.a25')}}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr v-if="currentHistory.length === 0"> <tr v-if="currentHistory.length === 0">
<td colspan="10" class="empty-text">{{$t('automation.a26')}}</td> <td colspan="8" class="empty-text">{{$t('automation.a26')}}</td>
</tr>
<tr v-for="item in currentHistory" :key="item.id">
<td>{{ item.trade_time }}</td>
<td>{{ item.symbol }}</td>
<td>{{ formatSide(item.side) }}</td>
<td>{{ item.price }}</td>
<td>{{ item.quantity }}</td>
<td>{{ item.amount }}</td>
<td :class="pnlClass(item.pnl)">{{ item.pnl }}</td>
<td class="text-right">
<span :class="pnlClass(item.pnl)">{{ formatPnlStatus(item.pnl) }}</span>
</td>
</tr> </tr>
<!-- 这里可以写 v-for 渲染历史数据 -->
</tbody> </tbody>
</table> </table>
<!-- 分页占位 --> <div class="pagination" v-if="orderTotal > 0">
<div class="pagination"> <span
<span class="arrow">&lt;</span> class="arrow"
<span class="page-num">1</span> :class="{ disabled: orderPage <= 1 }"
<span class="arrow">&gt;</span> @click="changeOrderPage(orderPage - 1)"
>&lt;</span>
<span class="page-num">{{ orderPage }}</span>
<span
class="arrow"
:class="{ disabled: orderPage >= orderTotalPages }"
@click="changeOrderPage(orderPage + 1)"
>&gt;</span>
</div> </div>
</div> </div>
</div> </div>
@ -186,6 +202,8 @@
</template> </template>
<script> <script>
import AiStock from '@/api/aiStock';
export default { export default {
name: 'EaTrading', name: 'EaTrading',
data() { data() {
@ -194,8 +212,12 @@ export default {
subTab: 'list', // 'list' | 'history' subTab: 'list', // 'list' | 'history'
modalType: '', // '' | 'deposit' | 'withdraw' modalType: '', // '' | 'deposit' | 'withdraw'
formAmount: '', formAmount: '',
orderPage: 1,
orderPerPage: 20,
orderTotal: 0,
orderList: [],
// mock //
accountData: { accountData: {
stock: { stock: {
total: '0.00', total: '0.00',
@ -228,10 +250,6 @@ export default {
{ name: 'GRT/USDC', symbol: 'GRT', price: '0.0205', change: -5.94 }, { name: 'GRT/USDC', symbol: 'GRT', price: '0.0205', change: -5.94 },
{ name: 'HBAR/USDC', symbol: 'HBAR', price: '0.0815', change: -5.08 }, { name: 'HBAR/USDC', symbol: 'HBAR', price: '0.0815', change: -5.08 },
], ],
// mock ()
stockHistory: [],
cryptoHistory: []
} }
}, },
computed: { computed: {
@ -245,13 +263,114 @@ export default {
return this.mainTab === 'stock' ? this.stockList : this.cryptoList; return this.mainTab === 'stock' ? this.stockList : this.cryptoList;
}, },
currentHistory() { currentHistory() {
return this.mainTab === 'stock' ? this.stockHistory : this.cryptoHistory; return this.mainTab === 'stock' ? this.orderList : [];
},
orderTotalPages() {
return Math.ceil(this.orderTotal / this.orderPerPage) || 1;
}
},
watch: {
mainTab(tab) {
if (tab === 'stock') {
this.fetchStockAccount();
}
if (this.subTab === 'history') {
if (tab === 'stock') {
this.fetchOrders(1);
} else {
this.orderList = [];
this.orderTotal = 0;
}
}
}
},
mounted() {
if (this.mainTab === 'stock') {
this.fetchStockAccount();
}
if (this.subTab === 'history' && this.mainTab === 'stock') {
this.fetchOrders(1);
} }
}, },
methods: { methods: {
switchMainTab(tab) { switchMainTab(tab) {
this.mainTab = tab; this.mainTab = tab;
// },
fetchStockAccount() {
const today = this.getTodayDate();
Promise.all([
AiStock.getAccount({ loading: false }),
AiStock.getOrders({ config_date: today, page: 1, per_page: 100 }, { loading: false }),
AiStock.getOrders({ page: 1, per_page: 100 }, { loading: false }),
]).then(([account, todayOrders, allOrders]) => {
const gift = parseFloat(account.gift_balance) || 0;
const profit = parseFloat(account.profit_balance) || 0;
this.accountData.stock = {
total: this.formatAmount(gift + profit),
usable: this.formatAmount(profit),
todayProfit: this.formatAmount(this.sumPnl(todayOrders.list)),
totalProfit: this.formatAmount(this.sumPnl(allOrders.list)),
};
}).catch(() => {
this.accountData.stock = {
total: '0.00',
usable: '0.00',
todayProfit: '0.00',
totalProfit: '0.00',
};
});
},
getTodayDate() {
const d = new Date();
const y = d.getFullYear();
const m = String(d.getMonth() + 1).padStart(2, '0');
const day = String(d.getDate()).padStart(2, '0');
return `${y}-${m}-${day}`;
},
sumPnl(list) {
return (list || []).reduce((sum, item) => sum + (parseFloat(item.pnl) || 0), 0);
},
formatAmount(value) {
const num = parseFloat(value);
if (Number.isNaN(num)) return '0.00';
return num.toFixed(2);
},
switchSubTab(tab) {
this.subTab = tab;
if (tab === 'history' && this.mainTab === 'stock') {
this.fetchOrders(1);
}
},
fetchOrders(page = this.orderPage) {
if (this.mainTab !== 'stock') return;
AiStock.getOrders({
page,
per_page: this.orderPerPage,
}, { loading: false }).then(data => {
this.orderList = data.list || [];
this.orderTotal = data.total || 0;
this.orderPage = data.page || page;
}).catch(() => {
this.orderList = [];
this.orderTotal = 0;
});
},
changeOrderPage(page) {
if (page < 1 || page > this.orderTotalPages) return;
this.fetchOrders(page);
},
formatSide(side) {
return side === 'buy' ? this.$t('common.buy-in') : this.$t('common.sell-out');
},
pnlClass(pnl) {
const value = parseFloat(pnl);
if (Number.isNaN(value) || value === 0) return '';
return value > 0 ? 'text-green' : 'text-red';
},
formatPnlStatus(pnl) {
const value = parseFloat(pnl);
if (Number.isNaN(value) || value === 0) return '-';
return value > 0 ? this.$t('automation.a33') : this.$t('automation.a34');
}, },
showModal(type) { showModal(type) {
this.modalType = type; this.modalType = type;
@ -501,6 +620,10 @@ export default {
cursor: pointer; cursor: pointer;
color: #666; color: #666;
} }
.pagination .arrow.disabled {
color: #ccc;
cursor: not-allowed;
}
/* ================= 弹窗样式 ================= */ /* ================= 弹窗样式 ================= */
.modal-overlay { .modal-overlay {

Loading…
Cancel
Save