首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在锈病中操纵结构/vec

在锈病中操纵结构/vec
EN

Stack Overflow用户
提问于 2022-08-04 03:35:29
回答 1查看 60关注 0票数 0

我正试着建立一个小的生锈计划来追踪我的交易。

我有这样的csv:

代码语言:javascript
复制
"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程序打印每笔交易的利润,这是基本的买卖费。我可以对所有交易进行汇总,但我希望它能逐个打印每一笔交易,这样我就可以做一份更详细的报告。我不知道该怎么写这个逻辑。

我所写的计算每笔交易的数字的程序:

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

发布于 2022-08-04 04:16:59

免责声明:我是生锈新手,所以这可能不是最佳实践,但它适用于¯\_(ツ)_/¯

代码语言:javascript
复制
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"调用它(您可以将其重命名为任何您想要的名称),然后漂亮地打印它。

代码语言:javascript
复制
    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"),
    };

你的投入的产出:

代码语言:javascript
复制
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。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73230080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档