我正试着建立一个小的生锈计划来追踪我的交易。
我有这样的csv:
"ID","Time","Market","Side","Order Type","Size","Price","Total","Fee","Fee Currency","TWAP"
"9388115186","2022-08-03T00:23:23.579534+00:00","WAVES-PERP","buy","Market","45","5.612","252.54","0.17147466","USD","false"
"9387838330","2022-08-03T00:10:59.413454+00:00","WAVES-PERP","sell","Market","45","5.7175","257.2875","0.1746982125","USD","false"
"9386385927","2022-08-02T21:49:32.641156+00:00","WAVES-PERP","sell","Market","76","5.7805","439.318","0.298296922","USD","false"
"9386350793","2022-08-02T21:46:09.927443+00:00","WAVES-PERP","buy","Market","76","5.758","437.608","0.297135832","USD","false"
"9386323186","2022-08-02T21:43:54.643217+00:00","WAVES-PERP","buy","Market","81.5","5.7565","469.15475","0.31855607525","USD","false"
"9386299652","2022-08-02T21:39:22.444948+00:00","WAVES-PERP","sell","Market","80","5.7335","458.68","0.31144372","USD","false"
"9386299650","2022-08-02T21:39:22.444948+00:00","WAVES-PERP","sell","Market","1.5","5.7335","8.60025","0.00583956975","USD","false"
"9386280602","2022-08-02T21:35:45.667046+00:00","WAVES-PERP","sell","Market","80","5.738","459.04","0.31168816","USD","false"
"9386122733","2022-08-02T21:12:10.951077+00:00","WAVES-PERP","buy","Market","5","5.713","28.565","0.019395635","USD","false"
"9386122731","2022-08-02T21:12:10.951077+00:00","WAVES-PERP","buy","Market","75","5.713","428.475","0.290934525","USD","false"
"9386106303","2022-08-02T21:10:54.380241+00:00","WAVES-PERP","sell","Market","81","5.722","463.482","0.314704278","USD","false"
"9386096811","2022-08-02T21:10:06.837460+00:00","WAVES-PERP","buy","Market","81","5.7285","464.0085","0.3150617715","USD","false"
"9384995941","2022-08-02T19:13:33.987751+00:00","WAVES-PERP","sell","Market","8","5.7255","45.804","0.031100916","USD","false"
"9384995939","2022-08-02T19:13:33.987751+00:00","WAVES-PERP","sell","Market","41.5","5.7255","237.60825","0.16133600175","USD","false"
"9384994161","2022-08-02T19:13:07.187765+00:00","WAVES-PERP","buy","Market","43.5","5.74","249.69","0.16953951","USD","false"
"9384994159","2022-08-02T19:13:07.187765+00:00","WAVES-PERP","buy","Market","6","5.7395","34.437","0.023382723","USD","false"
"9384980319","2022-08-02T19:11:57.794552+00:00","WAVES-PERP","buy","Market","36.5","5.7315","209.19975","0.14204663025","USD","false"
"9384822588","2022-08-02T19:01:35.959545+00:00","WAVES-PERP","sell","Market","36.5","5.7395","209.49175","0.14224489825","USD","false"
"9384765277","2022-08-02T18:57:51.339876+00:00","WAVES-PERP","buy","Market","78","5.736","447.40799999999996","0.303790032","USD","false"
"9384665536","2022-08-02T18:51:33.017459+00:00","WAVES-PERP","sell","Market","64.5","5.771","372.2295","0.2527438305","USD","false"
"9384665534","2022-08-02T18:51:33.017459+00:00","WAVES-PERP","sell","Market","13.5","5.7725","77.92875","0.05291362125","USD","false"我要我的cli程序打印每笔交易的利润,这是基本的买卖费。我可以对所有交易进行汇总,但我希望它能逐个打印每一笔交易,这样我就可以做一份更详细的报告。我不知道该怎么写这个逻辑。
我所写的计算每笔交易的数字的程序:
use clap::{Parser};
use csv::Reader;
use serde::Deserialize;
use std::{fs::File};
#[derive(Debug, Deserialize)]
#[allow(non_snake_case)]
struct FtxTransactions {
Market: String,
Fee: f64,
Total: f64,
Side: String,
}
#[derive(Parser, Debug)]
#[clap(author, version, about, long_about = None)]
struct Args {
#[clap(short, long, value_parser)]
exchange: String,
}
fn main() {
let args = Args::parse();
let mut file_ftx = Reader::from_path("./src/csv/scalp_trades.csv").unwrap();
match args.exchange.as_str() {
"ftx_total" => println!("ftx profit: {:.3} usd", ftx_total(&mut file_ftx)),
_ => println!("no function"),
};
}
fn ftx_total(args: &mut Reader<File>) -> f64 {
let mut value_sum = 0.0;
for result in args.deserialize::<FtxTransactions>() {
let record = result.unwrap();
if record.Market == "WAVES-PERP" && record.Side == "buy" {
value_sum = value_sum - record.Total - record.Fee;
}
if record.Market == "WAVES-PERP" && record.Side == "sell" {
value_sum = value_sum + record.Total - record.Fee;
}
}
return value_sum;
}发布于 2022-08-04 04:16:59
免责声明:我是生锈新手,所以这可能不是最佳实践,但它适用于¯\_(ツ)_/¯
fn ftx_vec(args: &mut Reader<File>) -> Vec<f64> {
args.deserialize::<FtxTransactions>()
.map(|result| {
let record = result.unwrap();
if record.Market == "WAVES-PERP" && record.Side == "buy" {
-record.Total - record.Fee
} else if record.Market == "WAVES-PERP" && record.Side == "sell" {
record.Total - record.Fee
} else {
0.0
}
})
.collect()
}这要求文件读取器作为您的另一个函数(您可能希望在它自己的函数中解析此函数一次,并使这些函数只接受对FtxTransactions向量不可变的引用),并返回64位浮点数的向量。
只需修改match语句,使用exchange "ftx_vec"调用它(您可以将其重命名为任何您想要的名称),然后漂亮地打印它。
match args.exchange.as_str() {
"ftx_total" => println!("ftx profit: {:.3} usd", ftx_total(&mut file_ftx)),
"ftx_vec" => for (i, record) in ftx_vec(&mut file_ftx).iter().enumerate() {
println!("Transaction #{}: ${:?} USD", i, record)
}
_ => println!("no function"),
};你的投入的产出:
Transaction #0: $-252.71147466 USD
Transaction #1: $257.1128017875 USD
Transaction #2: $439.01970307799996 USD
Transaction #3: $-437.905135832 USD
Transaction #4: $-469.47330607525 USD
Transaction #5: $458.36855628 USD
Transaction #6: $8.59441043025 USD
Transaction #7: $458.72831184 USD
Transaction #8: $-28.584395635 USD
Transaction #9: $-428.76593452500003 USD
Transaction #10: $463.167295722 USD
Transaction #11: $-464.3235617715 USD
Transaction #12: $45.772899084 USD
Transaction #13: $237.44691399825 USD
Transaction #14: $-249.85953951 USD
Transaction #15: $-34.460382722999995 USD
Transaction #16: $-209.34179663025 USD
Transaction #17: $209.34950510175 USD
Transaction #18: $-447.71179003199995 USD
Transaction #19: $371.9767561695 USD
Transaction #20: $77.87583637875 USD您可能希望舍入到最近的一分,并可能打印出i + 1而不是i,成为1-indexed。
https://stackoverflow.com/questions/73230080
复制相似问题