From 8de75ec7441e13912c6d4332d15e3d1aad427d2d Mon Sep 17 00:00:00 2001 From: Param Pal Singh Date: Sun, 9 Jul 2023 10:10:49 +0200 Subject: [PATCH] data processing with Actix Actors --- Cargo.lock | 215 +++++++++- Cargo.toml | 4 +- sp500.may.2020.csv | 1011 ++++++++++++++++++++++++++++++++++++++++++++ src/actors/mod.rs | 112 +++++ src/lib.rs | 1 + src/main.rs | 68 ++- src/utils/mod.rs | 74 ++-- 7 files changed, 1432 insertions(+), 53 deletions(-) create mode 100644 sp500.may.2020.csv create mode 100644 src/actors/mod.rs diff --git a/Cargo.lock b/Cargo.lock index 6cb784d..8a0a76f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,77 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "actix" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "543c47e7827f8fcc9d1445bd98ba402137bfce80ee2187429de49c52b5131bd3" +dependencies = [ + "actix-rt", + "actix_derive", + "bitflags", + "bytes", + "crossbeam-channel", + "futures-core", + "futures-sink", + "futures-task", + "futures-util", + "log", + "once_cell", + "parking_lot 0.11.2", + "pin-project-lite", + "smallvec", + "tokio", + "tokio-util 0.6.10", +] + +[[package]] +name = "actix-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "465a6172cf69b960917811022d8f29bc0b7fa1398bc4f78b3c466673db1213b6" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "actix-rt" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15265b6b8e2347670eb363c47fc8c75208b4a4994b27192f345fcbe707804f3e" +dependencies = [ + "actix-macros", + "futures-core", + "tokio", +] + +[[package]] +name = "actix_derive" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d44b8fee1ced9671ba043476deddef739dd0959bf77030b26b738cc591737a7" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "addr2line" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + [[package]] name = "android-tzdata" version = "0.1.1" @@ -45,6 +116,21 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "backtrace" +version = "0.3.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + [[package]] name = "base64" version = "0.21.2" @@ -157,6 +243,25 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" +[[package]] +name = "crossbeam-channel" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" +dependencies = [ + "cfg-if", +] + [[package]] name = "encoding_rs" version = "0.8.32" @@ -241,6 +346,12 @@ dependencies = [ "wasi 0.11.0+wasi-snapshot-preview1", ] +[[package]] +name = "gimli" +version = "0.27.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" + [[package]] name = "h2" version = "0.3.20" @@ -256,7 +367,7 @@ dependencies = [ "indexmap", "slab", "tokio", - "tokio-util", + "tokio-util 0.7.8", "tracing", ] @@ -418,6 +529,15 @@ dependencies = [ "hashbrown", ] +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", +] + [[package]] name = "ipnet" version = "2.7.2" @@ -471,6 +591,8 @@ checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" name = "manning-lp-async-rust-project" version = "0.1.0" dependencies = [ + "actix", + "actix-rt", "async-trait", "chrono", "clap", @@ -505,12 +627,27 @@ dependencies = [ "xml5ever", ] +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + [[package]] name = "mime" version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +[[package]] +name = "miniz_oxide" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +dependencies = [ + "adler", +] + [[package]] name = "mio" version = "0.8.8" @@ -547,6 +684,15 @@ dependencies = [ "libc", ] +[[package]] +name = "object" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" +dependencies = [ + "memchr", +] + [[package]] name = "once_cell" version = "1.18.0" @@ -559,6 +705,17 @@ version = "6.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d5d9eb14b174ee9aa2ef96dc2b94637a2d4b6e7cb873c7e171f0c20c6cf3eac" +[[package]] +name = "parking_lot" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" +dependencies = [ + "instant", + "lock_api", + "parking_lot_core 0.8.6", +] + [[package]] name = "parking_lot" version = "0.12.1" @@ -566,7 +723,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" dependencies = [ "lock_api", - "parking_lot_core", + "parking_lot_core 0.9.8", +] + +[[package]] +name = "parking_lot_core" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" +dependencies = [ + "cfg-if", + "instant", + "libc", + "redox_syscall 0.2.16", + "smallvec", + "winapi", ] [[package]] @@ -577,7 +748,7 @@ checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" dependencies = [ "cfg-if", "libc", - "redox_syscall", + "redox_syscall 0.3.5", "smallvec", "windows-targets", ] @@ -722,6 +893,15 @@ dependencies = [ "getrandom", ] +[[package]] +name = "redox_syscall" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags", +] + [[package]] name = "redox_syscall" version = "0.3.5" @@ -785,6 +965,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + [[package]] name = "rustls" version = "0.21.2" @@ -946,7 +1132,7 @@ checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b" dependencies = [ "new_debug_unreachable", "once_cell", - "parking_lot", + "parking_lot 0.12.1", "phf_shared", "precomputed-hash", "serde", @@ -1092,16 +1278,17 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.28.2" +version = "1.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94d7b1cfd2aa4011f2de74c2c4c63665e27a71006b0a192dcd2710272e73dfa2" +checksum = "532826ff75199d5833b9d2c5fe410f29235e25704ee5f0ef599fb51c21f4a4da" dependencies = [ "autocfg", + "backtrace", "bytes", "libc", "mio", "num_cpus", - "parking_lot", + "parking_lot 0.12.1", "pin-project-lite", "signal-hook-registry", "socket2", @@ -1130,6 +1317,20 @@ dependencies = [ "tokio", ] +[[package]] +name = "tokio-util" +version = "0.6.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36943ee01a6d67977dd3f84a5a1d2efeb4ada3a1ae771cadfaa535d9d9fc6507" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "log", + "pin-project-lite", + "tokio", +] + [[package]] name = "tokio-util" version = "0.7.8" diff --git a/Cargo.toml b/Cargo.toml index 7e321c9..adafe07 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,6 +10,8 @@ version = "0.1.0" chrono = { version = "0.4", features = ["serde"] } clap = {version = "3.1.8", features = ["derive"]} yahoo_finance_api = { version = "1.1" } -tokio = { version = "1", features= ["full"]} +tokio = { version = "1.29", features= ["full"]} time = { version="0.3" } async-trait = { version = "0.1" } +actix = "0.11" +actix-rt = "2.2" diff --git a/sp500.may.2020.csv b/sp500.may.2020.csv new file mode 100644 index 0000000..03916ac --- /dev/null +++ b/sp500.may.2020.csv @@ -0,0 +1,1011 @@ +period start,symbol,price,change %,min,max,30d avg +2020-07-03T12:00:09+00:00,MMM,$97.29,-30.71%,$93.31,$189.17,$99.47 +2020-07-03T12:00:09+00:00,AOS,$70.64,55.29%,$44.95,$83.48,$69.40 +2020-07-03T12:00:09+00:00,ABT,$106.35,20.10%,$88.07,$137.81,$104.87 +2020-07-03T12:00:09+00:00,ABBV,$135.50,55.75%,$72.56,$167.01,$136.50 +2020-07-03T12:00:09+00:00,ABMD,$381.02,43.13%,$224.73,$381.30,$378.35 +2020-07-03T12:00:09+00:00,ACN,$305.76,46.49%,$206.48,$406.56,$307.51 +2020-07-03T12:00:09+00:00,ATVI,$82.43,5.91%,$56.94,$102.70,$81.30 +2020-07-03T12:00:09+00:00,ADBE,$485.27,7.22%,$275.20,$688.37,$458.59 +2020-07-03T12:00:09+00:00,AAP,$69.38,-46.64%,$63.58,$230.37,$74.14 +2020-07-03T12:00:09+00:00,AMD,$113.17,111.93%,$52.93,$161.91,$117.64 +2020-07-03T12:00:09+00:00,AES,$21.09,58.22%,$12.82,$28.88,$20.56 +2020-07-03T12:00:09+00:00,AFL,$70.04,109.89%,$31.47,$72.94,$67.80 +2020-07-03T12:00:09+00:00,A,$117.00,33.51%,$87.54,$177.03,$118.16 +2020-07-03T12:00:09+00:00,APD,$286.84,23.39%,$210.22,$319.62,$282.91 +2020-07-03T12:00:09+00:00,AKAM,$89.77,-20.28%,$70.75,$121.92,$90.79 +2020-07-03T12:00:09+00:00,ALK,$53.75,44.96%,$34.00,$73.74,$49.25 +2020-07-03T12:00:09+00:00,ALB,$237.52,199.81%,$73.89,$323.68,$219.00 +2020-07-03T12:00:09+00:00,ARE,$117.01,-22.45%,$107.88,$211.91,$114.75 +Could not fetch closing data +2020-07-03T12:00:09+00:00,ALGN,$329.54,16.68%,$174.58,$729.92,$317.85 +2020-07-03T12:00:09+00:00,ALLE,$116.79,16.60%,$88.27,$144.41,$113.79 +Could not fetch closing data +2020-07-03T12:00:09+00:00,LNT,$52.63,17.55%,$43.12,$62.67,$52.54 +2020-07-03T12:00:09+00:00,ALL,$108.27,22.51%,$79.30,$139.26,$109.88 +2020-07-03T12:00:09+00:00,GOOGL,$119.48,59.34%,$70.47,$149.84,$122.33 +2020-07-03T12:00:09+00:00,GOOG,$120.14,60.65%,$70.76,$150.71,$123.05 +2020-07-03T12:00:09+00:00,MO,$45.98,46.52%,$29.17,$51.00,$44.34 +2020-07-03T12:00:09+00:00,AMZN,$129.78,-15.09%,$81.82,$186.57,$125.56 +2020-07-03T12:00:09+00:00,AMCR,$9.94,4.55%,$9.11,$12.92,$9.98 +2020-07-03T12:00:09+00:00,AEE,$82.26,21.59%,$65.66,$95.15,$81.97 +2020-07-03T12:00:09+00:00,AAL,$18.35,43.36%,$10.95,$25.82,$16.14 +2020-07-03T12:00:09+00:00,AEP,$84.29,13.85%,$69.23,$102.31,$83.88 +2020-07-03T12:00:09+00:00,AXP,$169.80,82.85%,$87.09,$194.26,$167.68 +2020-07-03T12:00:09+00:00,AIG,$58.20,105.01%,$24.68,$63.71,$55.83 +2020-07-03T12:00:09+00:00,AMT,$195.55,-21.03%,$179.62,$288.50,$188.89 +2020-07-03T12:00:09+00:00,AWK,$141.06,12.90%,$124.25,$183.98,$144.79 +2020-07-03T12:00:09+00:00,AMP,$332.62,134.00%,$135.61,$353.63,$318.26 +2020-07-03T12:00:09+00:00,ABC,$190.86,97.59%,$90.59,$192.43,$181.10 +2020-07-03T12:00:09+00:00,AME,$157.08,78.49%,$84.57,$161.88,$153.38 +2020-07-03T12:00:09+00:00,AMGN,$218.65,-6.34%,$189.32,$285.16,$222.25 +2020-07-03T12:00:09+00:00,APH,$83.62,75.60%,$45.83,$86.49,$79.79 +2020-07-03T12:00:09+00:00,ADI,$185.31,58.27%,$106.03,$196.28,$184.47 +2020-07-03T12:00:09+00:00,ANSS,$320.17,6.14%,$200.33,$411.22,$323.81 +Could not fetch closing data +2020-07-03T12:00:09+00:00,AON,$335.41,78.21%,$176.57,$345.20,$324.09 +2020-07-03T12:00:09+00:00,APA,$34.91,168.37%,$7.52,$50.29,$33.54 +2020-07-03T12:00:09+00:00,AIV,$8.47,123.90%,$2.99,$9.58,$8.35 +2020-07-03T12:00:09+00:00,AAPL,$190.68,107.80%,$90.93,$193.97,$183.70 +2020-07-03T12:00:09+00:00,AMAT,$139.57,126.07%,$53.69,$164.65,$138.05 +2020-07-03T12:00:09+00:00,APTV,$107.55,37.13%,$75.39,$178.12,$97.91 +2020-07-03T12:00:09+00:00,ADM,$78.01,110.79%,$35.27,$96.56,$73.69 +2020-07-03T12:00:09+00:00,ANET,$158.00,194.71%,$48.78,$174.42,$159.94 +2020-07-03T12:00:09+00:00,AJG,$214.05,129.74%,$93.17,$219.57,$209.47 +2020-07-03T12:00:09+00:00,AIZ,$125.86,30.21%,$92.22,$188.45,$125.86 +2020-07-03T12:00:09+00:00,T,$15.61,-12.05%,$13.97,$20.84,$15.50 +2020-07-03T12:00:09+00:00,ATO,$117.31,25.01%,$79.90,$118.96,$116.17 +2020-07-03T12:00:09+00:00,ADSK,$201.57,-17.51%,$164.31,$342.27,$204.93 +2020-07-03T12:00:09+00:00,ADP,$218.74,54.27%,$121.90,$265.54,$216.20 +2020-07-03T12:00:09+00:00,AZO,$2469.51,117.12%,$1095.99,$2733.65,$2428.72 +2020-07-03T12:00:09+00:00,AVB,$191.07,32.68%,$121.10,$245.21,$183.44 +2020-07-03T12:00:09+00:00,AVY,$171.65,52.25%,$105.52,$221.01,$167.10 +2020-07-03T12:00:09+00:00,BKR,$33.11,134.08%,$11.66,$37.50,$30.10 +Could not fetch closing data +2020-07-03T12:00:09+00:00,BAC,$28.53,29.28%,$21.24,$47.57,$28.60 +2020-07-03T12:00:09+00:00,BAX,$45.30,-45.86%,$37.31,$86.67,$43.36 +2020-07-03T12:00:09+00:00,BDX,$256.92,9.61%,$207.66,$270.52,$253.07 +Could not fetch closing data +2020-07-03T12:00:09+00:00,BBY,$79.30,0.34%,$60.71,$128.06,$76.94 +2020-07-03T12:00:09+00:00,BIIB,$275.07,1.95%,$187.54,$414.71,$294.88 +2020-07-03T12:00:09+00:00,BLK,$684.10,32.02%,$500.27,$926.67,$680.95 +2020-07-03T12:00:09+00:00,BA,$212.10,12.87%,$115.86,$269.19,$211.01 +2020-07-03T12:00:09+00:00,BKNG,$2636.91,54.77%,$1604.13,$2780.98,$2634.38 +2020-07-03T12:00:09+00:00,BWA,$44.95,52.40%,$27.29,$46.24,$41.49 +2020-07-03T12:00:09+00:00,BXP,$59.08,-25.63%,$45.69,$122.08,$52.91 +2020-07-03T12:00:09+00:00,BSX,$52.29,46.92%,$33.15,$54.64,$52.51 +2020-07-03T12:00:09+00:00,BMY,$62.65,14.37%,$50.73,$79.13,$64.21 +2020-07-03T12:00:09+00:00,AVGO,$846.75,190.91%,$279.20,$881.48,$825.20 +2020-07-03T12:00:09+00:00,BR,$163.30,33.60%,$118.84,$179.73,$156.54 +Could not fetch closing data +2020-07-03T12:00:09+00:00,CHRW,$95.26,27.62%,$74.63,$116.77,$93.94 +Could not fetch closing data +2020-07-03T12:00:09+00:00,CDNS,$226.89,129.79%,$98.21,$239.00,$229.64 +2020-07-03T12:00:09+00:00,CPB,$45.54,2.05%,$37.83,$56.33,$47.16 +2020-07-03T12:00:09+00:00,COF,$108.04,81.74%,$55.37,$171.39,$108.48 +2020-07-03T12:00:09+00:00,CAH,$93.97,100.43%,$41.00,$94.63,$88.40 +2020-07-03T12:00:09+00:00,KMX,$81.39,-9.95%,$55.69,$154.85,$78.77 +2020-07-03T12:00:09+00:00,CCL,$19.04,21.97%,$6.38,$31.31,$14.81 +2020-07-03T12:00:09+00:00,CARR,$49.33,112.27%,$22.95,$56.59,$45.98 +2020-07-03T12:00:09+00:00,CAT,$245.18,102.69%,$117.51,$263.11,$233.29 +2020-07-03T12:00:09+00:00,CBOE,$135.84,42.99%,$78.47,$139.72,$135.55 +2020-07-03T12:00:09+00:00,CBRE,$81.87,76.52%,$41.35,$110.30,$77.88 +2020-07-03T12:00:09+00:00,CDW,$183.33,61.40%,$105.50,$212.89,$175.96 +2020-07-03T12:00:09+00:00,CE,$116.94,38.94%,$78.74,$167.81,$112.38 +2020-07-03T12:00:09+00:00,CNC,$66.50,-0.20%,$54.30,$97.22,$66.23 +2020-07-03T12:00:09+00:00,CNP,$29.48,62.33%,$17.56,$32.47,$28.92 +Could not fetch closing data +Could not fetch closing data +2020-07-03T12:00:09+00:00,CF,$71.85,158.53%,$24.22,$116.65,$67.88 +2020-07-03T12:00:09+00:00,SCHW,$56.79,72.63%,$31.88,$93.69,$54.70 +2020-07-03T12:00:09+00:00,CHTR,$371.94,-29.33%,$303.35,$821.01,$340.86 +2020-07-03T12:00:09+00:00,CVX,$154.22,99.08%,$59.34,$184.34,$155.50 +2020-07-03T12:00:09+00:00,CMG,$2077.46,84.51%,$1088.92,$2139.00,$2068.41 +2020-07-03T12:00:09+00:00,CB,$191.53,58.91%,$108.51,$229.04,$190.78 +2020-07-03T12:00:09+00:00,CHD,$98.97,31.65%,$70.04,$102.57,$95.83 +2020-07-03T12:00:09+00:00,CI,$277.12,52.83%,$153.71,$336.27,$266.25 +2020-07-03T12:00:09+00:00,CINF,$98.17,55.67%,$62.41,$136.55,$98.62 +2020-07-03T12:00:09+00:00,CTAS,$480.24,81.73%,$257.03,$497.08,$482.62 +2020-07-03T12:00:09+00:00,CSCO,$50.99,20.43%,$32.85,$60.60,$50.21 +2020-07-03T12:00:09+00:00,C,$45.74,-1.50%,$37.12,$74.11,$46.57 +2020-07-03T12:00:09+00:00,CFG,$26.93,26.28%,$19.97,$52.89,$26.95 +Could not fetch closing data +2020-07-03T12:00:09+00:00,CME,$181.95,22.94%,$134.19,$237.54,$181.55 +2020-07-03T12:00:09+00:00,CMS,$59.30,7.67%,$50.46,$70.85,$59.28 +2020-07-03T12:00:09+00:00,KO,$59.76,44.75%,$40.08,$63.82,$60.42 +2020-07-03T12:00:09+00:00,CTSH,$65.34,21.26%,$51.26,$91.16,$63.41 +2020-07-03T12:00:09+00:00,CL,$75.59,10.43%,$67.18,$82.28,$76.25 +2020-07-03T12:00:09+00:00,CMCSA,$41.43,10.33%,$28.04,$58.56,$40.26 +2020-07-03T12:00:09+00:00,CMA,$44.27,41.57%,$29.17,$94.51,$41.23 +2020-07-03T12:00:09+00:00,CAG,$33.22,3.48%,$28.77,$40.24,$34.30 +Could not fetch closing data +2020-07-03T12:00:09+00:00,COP,$103.23,181.38%,$25.79,$130.72,$102.10 +2020-07-03T12:00:09+00:00,ED,$92.03,40.82%,$60.51,$99.57,$92.26 +2020-07-03T12:00:09+00:00,STZ,$253.49,41.83%,$158.84,$259.14,$244.23 +2020-07-03T12:00:09+00:00,CPRT,$88.11,107.51%,$40.75,$91.21,$88.20 +2020-07-03T12:00:09+00:00,GLW,$34.70,40.76%,$24.34,$43.33,$33.18 +2020-07-03T12:00:09+00:00,CTVA,$57.30,115.65%,$24.44,$66.96,$56.72 +2020-07-03T12:00:09+00:00,COST,$525.05,76.85%,$296.89,$602.62,$520.56 +2020-07-03T12:00:09+00:00,COTY,$12.45,179.78%,$2.65,$12.53,$11.90 +2020-07-03T12:00:09+00:00,CCI,$115.53,-26.13%,$109.42,$196.06,$112.83 +2020-07-03T12:00:09+00:00,CSX,$33.30,47.56%,$21.70,$37.18,$32.62 +2020-07-03T12:00:09+00:00,CMI,$245.80,48.82%,$159.61,$260.41,$229.28 +2020-07-03T12:00:09+00:00,CVS,$69.17,15.25%,$52.55,$107.33,$69.37 +2020-07-03T12:00:09+00:00,DHI,$115.39,112.79%,$54.23,$123.05,$115.13 +2020-07-03T12:00:09+00:00,DHR,$233.08,28.75%,$180.08,$329.99,$235.40 +2020-07-03T12:00:09+00:00,DRI,$163.45,137.63%,$65.44,$166.30,$162.33 +2020-07-03T12:00:09+00:00,DVA,$103.89,27.91%,$65.42,$133.78,$97.99 +2020-07-03T12:00:09+00:00,DE,$405.28,162.18%,$152.10,$441.61,$387.64 +2020-07-03T12:00:09+00:00,DAL,$47.88,68.35%,$24.94,$51.65,$41.54 +2020-07-03T12:00:09+00:00,XRAY,$38.83,-10.10%,$26.53,$67.27,$38.50 +2020-07-03T12:00:09+00:00,DVN,$48.85,440.20%,$6.79,$73.29,$48.16 +2020-07-03T12:00:09+00:00,DXCM,$126.71,19.77%,$67.99,$162.82,$124.24 +2020-07-03T12:00:09+00:00,FANG,$132.40,252.60%,$21.73,$160.40,$129.60 +2020-07-03T12:00:09+00:00,DLR,$113.80,-14.08%,$85.48,$166.04,$105.08 +2020-07-03T12:00:09+00:00,DFS,$116.94,146.42%,$43.55,$129.87,$112.71 +Could not fetch closing data +Could not fetch closing data +2020-07-03T12:00:09+00:00,DISH,$7.28,-78.27%,$6.02,$46.53,$6.67 +2020-07-03T12:00:09+00:00,DG,$169.33,-7.39%,$153.05,$259.14,$171.00 +2020-07-03T12:00:09+00:00,DLTR,$143.54,59.88%,$84.54,$174.08,$139.43 +2020-07-03T12:00:09+00:00,D,$52.24,-20.34%,$49.02,$83.83,$51.82 +2020-07-03T12:00:09+00:00,DPZ,$341.68,-8.34%,$288.69,$553.18,$313.47 +2020-07-03T12:00:09+00:00,DOV,$146.10,54.83%,$90.85,$178.99,$142.03 +2020-07-03T12:00:09+00:00,DOW,$53.10,44.99%,$34.03,$66.25,$51.96 +2020-07-03T12:00:09+00:00,DTE,$109.99,31.09%,$82.54,$133.73,$110.02 +2020-07-03T12:00:09+00:00,DUK,$89.77,26.71%,$70.78,$109.93,$90.32 +Could not fetch closing data +2020-07-03T12:00:09+00:00,DD,$70.41,36.34%,$48.15,$82.50,$69.38 +2020-07-03T12:00:09+00:00,DXC,$27.22,78.02%,$15.16,$43.42,$26.17 +Could not fetch closing data +2020-07-03T12:00:09+00:00,EMN,$84.96,29.43%,$62.30,$121.13,$81.12 +2020-07-03T12:00:09+00:00,ETN,$198.46,138.41%,$80.21,$201.10,$190.32 +2020-07-03T12:00:09+00:00,EBAY,$44.26,-17.39%,$36.21,$78.00,$44.47 +2020-07-03T12:00:09+00:00,ECL,$183.40,-6.01%,$130.04,$230.97,$177.21 +2020-07-03T12:00:09+00:00,EIX,$68.86,40.33%,$43.16,$73.40,$67.48 +2020-07-03T12:00:09+00:00,EW,$90.26,29.81%,$67.19,$130.68,$87.91 +2020-07-03T12:00:09+00:00,EA,$129.20,-2.31%,$109.03,$146.92,$127.67 +2020-07-03T12:00:09+00:00,EMR,$88.94,52.70%,$55.41,$101.48,$85.23 +2020-07-03T12:00:09+00:00,ETR,$97.46,13.05%,$79.82,$120.01,$99.06 +2020-07-03T12:00:09+00:00,EOG,$116.20,173.43%,$27.90,$143.28,$111.89 +2020-07-03T12:00:09+00:00,EFX,$225.61,34.56%,$133.83,$293.63,$223.22 +2020-07-03T12:00:09+00:00,EQIX,$772.31,12.38%,$498.16,$855.47,$756.63 +2020-07-03T12:00:09+00:00,EQR,$66.54,24.65%,$41.91,$88.63,$63.88 +2020-07-03T12:00:09+00:00,ESS,$233.25,9.72%,$170.11,$342.07,$225.95 +2020-07-03T12:00:09+00:00,EL,$192.46,3.00%,$176.53,$365.95,$190.59 +2020-07-03T12:00:09+00:00,RE,$351.28,82.84%,$184.29,$387.21,$345.35 +2020-07-03T12:00:09+00:00,EVRG,$58.69,6.75%,$44.37,$69.23,$58.55 +2020-07-03T12:00:09+00:00,ES,$70.83,-7.61%,$67.92,$90.93,$70.48 +2020-07-03T12:00:09+00:00,EXC,$40.96,69.90%,$22.45,$48.26,$40.28 +2020-07-03T12:00:09+00:00,EXPE,$111.88,28.10%,$79.74,$213.80,$105.90 +2020-07-03T12:00:09+00:00,EXPD,$118.90,59.12%,$73.97,$133.20,$116.39 +2020-07-03T12:00:09+00:00,EXR,$148.12,69.95%,$86.13,$214.41,$145.28 +2020-07-03T12:00:09+00:00,XOM,$103.16,172.24%,$27.48,$117.32,$105.30 +2020-07-03T12:00:09+00:00,FFIV,$143.42,2.66%,$117.77,$247.78,$146.52 +Could not fetch closing data +2020-07-03T12:00:09+00:00,FAST,$57.87,41.52%,$39.78,$62.05,$56.18 +2020-07-03T12:00:09+00:00,FRT,$95.98,26.39%,$60.67,$130.65,$92.46 +2020-07-03T12:00:09+00:00,FDX,$251.25,68.66%,$140.37,$303.17,$231.82 +2020-07-03T12:00:09+00:00,FIS,$59.27,-54.40%,$49.23,$148.23,$54.63 +2020-07-03T12:00:09+00:00,FITB,$26.65,57.92%,$15.56,$47.49,$25.82 +Could not fetch closing data +2020-07-03T12:00:09+00:00,FE,$38.77,9.69%,$23.83,$46.13,$38.45 +2020-07-03T12:00:09+00:00,FISV,$125.20,10.84%,$112.19,$126.15,$0.00 +2020-07-03T12:00:09+00:00,FLT,$253.49,-1.05%,$164.00,$293.44,$240.53 +Could not fetch closing data +2020-07-03T12:00:09+00:00,FLS,$36.96,36.90%,$23.85,$41.87,$35.64 +2020-07-03T12:00:09+00:00,FMC,$104.25,7.86%,$84.42,$136.06,$105.30 +2020-07-03T12:00:09+00:00,F,$14.98,170.32%,$5.23,$22.66,$13.72 +2020-07-03T12:00:09+00:00,FTNT,$74.68,167.29%,$22.07,$75.59,$71.08 +2020-07-03T12:00:09+00:00,FTV,$72.35,26.59%,$53.33,$78.54,$69.84 +Could not fetch closing data +2020-07-03T12:00:09+00:00,FOXA,$34.08,33.90%,$23.41,$43.12,$33.04 +2020-07-03T12:00:09+00:00,FOX,$31.92,25.59%,$23.42,$40.26,$30.89 +2020-07-03T12:00:09+00:00,BEN,$26.15,44.02%,$16.60,$34.87,$25.67 +2020-07-03T12:00:09+00:00,FCX,$38.64,212.52%,$12.34,$50.85,$38.02 +2020-07-03T12:00:09+00:00,GPS,$8.91,-20.15%,$7.30,$32.67,$8.74 +2020-07-03T12:00:09+00:00,GRMN,$105.03,14.10%,$76.75,$169.18,$104.36 +2020-07-03T12:00:09+00:00,IT,$347.74,183.80%,$117.45,$356.54,$345.06 +2020-07-03T12:00:09+00:00,GD,$214.15,55.18%,$122.99,$251.36,$210.63 +2020-07-03T12:00:09+00:00,GE,$108.27,150.39%,$36.75,$109.85,$105.38 +2020-07-03T12:00:09+00:00,GIS,$75.17,33.46%,$50.48,$89.91,$80.48 +2020-07-03T12:00:09+00:00,GM,$39.61,55.43%,$23.20,$65.11,$36.32 +2020-07-03T12:00:09+00:00,GPC,$165.42,104.79%,$78.00,$185.05,$159.36 +2020-07-03T12:00:09+00:00,GILD,$74.42,10.10%,$50.98,$87.06,$76.89 +2020-07-03T12:00:09+00:00,GPN,$105.85,-36.82%,$92.67,$215.37,$100.00 +2020-07-03T12:00:09+00:00,GL,$111.66,54.83%,$68.48,$122.86,$107.26 +2020-07-03T12:00:09+00:00,GS,$315.17,62.95%,$174.65,$404.78,$325.50 +2020-07-03T12:00:09+00:00,GWW,$776.18,151.16%,$296.17,$788.59,$722.65 +2020-07-03T12:00:09+00:00,HRB,$31.41,147.20%,$11.60,$46.97,$31.55 +2020-07-03T12:00:09+00:00,HAL,$35.58,183.31%,$10.80,$42.26,$31.84 +2020-07-03T12:00:09+00:00,HBI,$4.28,-57.87%,$3.87,$20.58,$4.46 +2020-07-03T12:00:09+00:00,HOG,$34.80,44.07%,$21.88,$51.27,$33.85 +2020-07-03T12:00:09+00:00,HIG,$72.73,104.07%,$33.10,$77.98,$70.67 +2020-07-03T12:00:09+00:00,HAS,$64.56,-4.26%,$46.59,$97.99,$61.58 +2020-07-03T12:00:09+00:00,HCA,$291.49,201.44%,$91.95,$303.48,$282.46 +2020-07-03T12:00:09+00:00,PEAK,$20.55,-15.55%,$19.27,$34.33,$20.30 +2020-07-03T12:00:09+00:00,HSIC,$78.66,32.16%,$56.08,$91.96,$77.06 +2020-07-03T12:00:09+00:00,HES,$134.41,183.38%,$34.82,$159.40,$133.11 +2020-07-03T12:00:09+00:00,HPE,$16.87,94.84%,$7.65,$17.57,$16.05 +2020-07-03T12:00:09+00:00,HLT,$148.32,95.61%,$73.11,$162.25,$141.58 +Could not fetch closing data +2020-07-03T12:00:09+00:00,HOLX,$77.51,33.96%,$56.85,$87.67,$79.58 +2020-07-03T12:00:09+00:00,HD,$302.81,30.22%,$230.49,$400.17,$299.71 +2020-07-03T12:00:09+00:00,HON,$203.26,46.35%,$133.37,$225.63,$199.96 +2020-07-03T12:00:09+00:00,HRL,$39.35,-12.49%,$37.69,$53.52,$40.16 +2020-07-03T12:00:09+00:00,HST,$17.45,63.59%,$9.70,$20.24,$16.90 +2020-07-03T12:00:09+00:00,HWM,$49.40,215.74%,$14.68,$49.56,$46.26 +2020-07-03T12:00:09+00:00,HPQ,$31.13,95.63%,$14.96,$38.67,$30.18 +2020-07-03T12:00:09+00:00,HUM,$430.14,10.69%,$359.40,$560.00,$475.29 +2020-07-03T12:00:09+00:00,HBAN,$10.89,42.87%,$7.01,$16.38,$10.66 +2020-07-03T12:00:09+00:00,HII,$224.25,38.92%,$129.27,$252.97,$215.22 +2020-07-03T12:00:09+00:00,IEX,$209.98,35.65%,$151.81,$240.69,$206.88 +2020-07-03T12:00:09+00:00,IDXX,$498.01,46.70%,$324.64,$705.76,$475.81 +Could not fetch closing data +2020-07-03T12:00:09+00:00,ITW,$243.81,46.94%,$161.84,$250.90,$237.32 +2020-07-03T12:00:09+00:00,ILMN,$183.32,-51.68%,$177.23,$524.84,$197.80 +2020-07-03T12:00:09+00:00,INCY,$62.07,-42.42%,$60.95,$109.69,$62.14 +2020-07-03T12:00:09+00:00,IR,$64.26,119.83%,$27.79,$65.36,$62.37 +2020-07-03T12:00:09+00:00,INTC,$31.85,-41.19%,$24.31,$63.35,$32.34 +2020-07-03T12:00:09+00:00,ICE,$112.29,26.20%,$88.20,$135.40,$109.55 +2020-07-03T12:00:09+00:00,IBM,$132.08,33.64%,$88.85,$146.74,$132.80 +2020-07-03T12:00:09+00:00,IP,$31.80,6.54%,$27.50,$56.09,$31.16 +2020-07-03T12:00:09+00:00,IPG,$37.94,144.27%,$14.66,$40.59,$38.75 +2020-07-03T12:00:09+00:00,IFF,$78.59,-33.25%,$75.28,$147.52,$78.04 +2020-07-03T12:00:09+00:00,INTU,$448.19,47.75%,$280.04,$686.64,$440.91 +2020-07-03T12:00:09+00:00,ISRG,$331.29,70.00%,$183.06,$365.42,$321.03 +2020-07-03T12:00:09+00:00,IVZ,$16.92,75.86%,$8.74,$27.22,$16.04 +2020-07-03T12:00:09+00:00,IPGP,$132.32,-19.73%,$83.02,$258.58,$123.42 +2020-07-03T12:00:09+00:00,IQV,$216.81,50.94%,$141.28,$282.61,$210.70 +2020-07-03T12:00:09+00:00,IRM,$57.95,159.55%,$22.00,$58.27,$55.36 +2020-07-03T12:00:09+00:00,JBHT,$179.61,52.37%,$117.88,$215.57,$174.51 +2020-07-03T12:00:09+00:00,JKHY,$163.01,-7.84%,$140.65,$208.58,$159.23 +2020-07-03T12:00:09+00:00,J,$121.23,46.04%,$76.82,$146.69,$115.99 +2020-07-03T12:00:09+00:00,SJM,$147.71,52.23%,$94.76,$160.44,$149.36 +2020-07-03T12:00:09+00:00,JNJ,$159.25,20.54%,$127.53,$179.75,$160.58 +2020-07-03T12:00:09+00:00,JCI,$66.90,105.62%,$31.27,$78.37,$64.24 +2020-07-03T12:00:09+00:00,JPM,$144.34,65.77%,$83.66,$162.90,$139.77 +2020-07-03T12:00:09+00:00,JNPR,$31.08,47.00%,$18.17,$36.39,$30.69 +Could not fetch closing data +2020-07-03T12:00:09+00:00,K,$67.19,12.79%,$52.05,$74.86,$66.61 +2020-07-03T12:00:09+00:00,KEY,$9.59,-8.48%,$8.75,$25.16,$9.88 +2020-07-03T12:00:09+00:00,KEYS,$163.77,60.84%,$90.69,$207.93,$162.52 +2020-07-03T12:00:09+00:00,KMB,$135.36,5.07%,$106.68,$145.10,$135.86 +2020-07-03T12:00:09+00:00,KIM,$19.90,72.10%,$9.21,$24.98,$19.04 +2020-07-03T12:00:09+00:00,KMI,$16.92,35.80%,$9.81,$18.92,$16.77 +2020-07-03T12:00:09+00:00,KLAC,$455.83,132.85%,$166.04,$485.02,$463.33 +2020-07-03T12:00:09+00:00,KSS,$24.21,30.13%,$16.32,$57.52,$21.84 +2020-07-03T12:00:09+00:00,KHC,$35.46,25.83%,$25.63,$42.06,$36.67 +2020-07-03T12:00:09+00:00,KR,$47.17,48.73%,$29.07,$60.08,$46.55 +Could not fetch closing data +2020-07-03T12:00:09+00:00,LHX,$194.66,18.68%,$150.63,$262.47,$188.80 +2020-07-03T12:00:09+00:00,LH,$208.28,42.92%,$145.73,$265.31,$195.87 +2020-07-03T12:00:09+00:00,LRCX,$617.87,91.23%,$283.59,$714.99,$619.44 +2020-07-03T12:00:09+00:00,LW,$112.62,82.91%,$49.22,$115.12,$113.22 +2020-07-03T12:00:09+00:00,LVS,$55.72,18.38%,$30.14,$66.20,$57.52 +2020-07-03T12:00:09+00:00,LEG,$28.88,-6.44%,$28.87,$52.20,$30.38 +2020-07-03T12:00:09+00:00,LDOS,$88.04,4.04%,$76.20,$109.22,$83.86 +2020-07-03T12:00:09+00:00,LEN,$120.21,102.80%,$59.27,$125.68,$116.78 +2020-07-03T12:00:09+00:00,LLY,$452.08,183.19%,$125.40,$468.98,$448.12 +2020-07-03T12:00:09+00:00,LNC,$26.08,-16.76%,$18.77,$69.89,$23.35 +2020-07-03T12:00:09+00:00,LIN,$364.51,69.67%,$208.22,$381.08,$366.45 +2020-07-03T12:00:09+00:00,LYV,$91.76,101.85%,$45.04,$126.04,$86.44 +2020-07-03T12:00:09+00:00,LKQ,$57.19,128.15%,$24.59,$58.37,$54.97 +2020-07-03T12:00:09+00:00,LMT,$458.71,37.29%,$300.44,$498.05,$455.88 +2020-07-03T12:00:09+00:00,L,$60.45,77.59%,$32.36,$67.01,$58.48 +2020-07-03T12:00:09+00:00,LOW,$221.94,71.87%,$128.43,$254.03,$214.13 +2020-07-03T12:00:09+00:00,LYB,$90.50,60.68%,$51.27,$106.48,$89.57 +2020-07-03T12:00:09+00:00,MTB,$128.56,38.76%,$82.71,$185.64,$123.47 +2020-07-03T12:00:09+00:00,MRO,$23.52,317.93%,$3.70,$32.67,$23.00 +2020-07-03T12:00:09+00:00,MPC,$118.02,261.48%,$25.07,$134.72,$112.11 +2020-07-03T12:00:09+00:00,MKTX,$248.10,-51.28%,$217.46,$578.54,$268.98 +2020-07-03T12:00:09+00:00,MAR,$185.66,109.09%,$82.56,$188.11,$176.95 +2020-07-03T12:00:09+00:00,MMC,$183.99,78.19%,$99.30,$188.08,$179.67 +2020-07-03T12:00:09+00:00,MLM,$440.17,107.93%,$199.06,$461.69,$428.28 +2020-07-03T12:00:09+00:00,MAS,$55.21,15.48%,$42.18,$67.98,$54.18 +2020-07-03T12:00:09+00:00,MA,$388.68,29.49%,$282.07,$394.16,$376.99 +Could not fetch closing data +2020-07-03T12:00:09+00:00,MKC,$84.67,-1.99%,$69.93,$101.86,$89.20 +2020-07-03T12:00:09+00:00,MCD,$292.10,65.80%,$172.28,$298.41,$289.67 +2020-07-03T12:00:09+00:00,MCK,$414.80,180.18%,$137.67,$427.31,$403.14 +2020-07-03T12:00:09+00:00,MDT,$85.89,-0.31%,$74.23,$127.55,$85.25 +2020-07-03T12:00:09+00:00,MRK,$109.00,58.01%,$63.51,$117.59,$111.20 +2020-07-03T12:00:09+00:00,MET,$57.61,72.06%,$31.95,$75.67,$54.10 +2020-07-03T12:00:09+00:00,MTD,$1269.09,54.12%,$818.19,$1702.53,$1308.08 +2020-07-03T12:00:09+00:00,MGM,$43.09,158.09%,$14.95,$50.35,$41.92 +2020-07-03T12:00:09+00:00,MCHP,$86.62,67.85%,$46.93,$90.69,$82.33 +2020-07-03T12:00:09+00:00,MU,$60.65,20.80%,$42.06,$96.24,$66.58 +2020-07-03T12:00:09+00:00,MSFT,$337.22,64.49%,$195.45,$348.10,$333.83 +2020-07-03T12:00:09+00:00,MAA,$153.17,44.09%,$101.09,$219.44,$150.99 +2020-07-03T12:00:09+00:00,MHK,$103.18,-0.08%,$70.47,$229.74,$98.72 +2020-07-03T12:00:09+00:00,TAP,$65.92,95.92%,$30.81,$67.75,$65.05 +2020-07-03T12:00:09+00:00,MDLZ,$72.00,49.13%,$47.01,$77.95,$73.07 +2020-07-03T12:00:09+00:00,MNST,$55.87,56.70%,$35.28,$59.94,$57.95 +2020-07-03T12:00:09+00:00,MCO,$339.57,22.85%,$233.49,$400.24,$333.60 +2020-07-03T12:00:09+00:00,MS,$83.36,86.67%,$42.76,$104.02,$85.07 +2020-07-03T12:00:09+00:00,MSI,$291.87,123.84%,$123.11,$296.52,$283.22 +2020-07-03T12:00:09+00:00,MSCI,$471.75,37.85%,$331.28,$665.06,$472.31 +Could not fetch closing data +2020-07-03T12:00:09+00:00,NDAQ,$48.97,26.42%,$38.45,$69.25,$52.32 +2020-07-03T12:00:09+00:00,NOV,$17.39,43.23%,$7.85,$24.65,$15.54 +2020-07-03T12:00:09+00:00,NTAP,$76.25,86.52%,$37.62,$91.34,$72.02 +2020-07-03T12:00:09+00:00,NFLX,$438.10,-11.28%,$166.37,$691.69,$416.86 +2020-07-03T12:00:09+00:00,NWL,$8.87,-36.46%,$7.85,$26.50,$8.55 +2020-07-03T12:00:09+00:00,NEM,$42.24,-23.19%,$36.63,$81.05,$41.96 +2020-07-03T12:00:09+00:00,NWSA,$19.71,67.20%,$11.36,$27.05,$19.09 +2020-07-03T12:00:09+00:00,NWS,$19.91,68.36%,$11.36,$25.40,$19.29 +2020-07-03T12:00:09+00:00,NEE,$72.05,24.31%,$57.91,$90.24,$73.94 +Could not fetch closing data +2020-07-03T12:00:09+00:00,NKE,$104.46,7.54%,$82.36,$174.24,$108.49 +2020-07-03T12:00:09+00:00,NI,$27.52,31.22%,$19.43,$31.09,$27.17 +Could not fetch closing data +2020-07-03T12:00:09+00:00,JWN,$19.36,29.45%,$11.14,$43.26,$18.51 +2020-07-03T12:00:09+00:00,NSC,$226.72,34.30%,$161.47,$288.42,$219.05 +2020-07-03T12:00:09+00:00,NTRS,$74.32,3.17%,$68.96,$127.44,$73.33 +2020-07-03T12:00:09+00:00,NOC,$452.45,52.10%,$272.28,$542.85,$449.56 +Could not fetch closing data +2020-07-03T12:00:09+00:00,NCLH,$21.89,35.71%,$10.38,$33.71,$18.35 +2020-07-03T12:00:09+00:00,NRG,$38.12,28.73%,$25.80,$45.03,$34.90 +2020-07-03T12:00:09+00:00,NUE,$161.95,311.78%,$36.64,$177.20,$149.15 +2020-07-03T12:00:09+00:00,NVDA,$425.03,333.13%,$98.13,$438.08,$404.69 +2020-07-03T12:00:09+00:00,NVR,$6062.78,83.36%,$3214.63,$6350.62,$5936.59 +2020-07-03T12:00:09+00:00,ORLY,$934.47,119.44%,$419.41,$962.10,$922.04 +2020-07-03T12:00:09+00:00,OXY,$58.61,227.96%,$8.74,$75.37,$58.37 +2020-07-03T12:00:09+00:00,ODFL,$369.94,112.68%,$170.40,$375.75,$330.92 +2020-07-03T12:00:09+00:00,OMC,$92.99,88.44%,$41.40,$96.75,$93.13 +2020-07-03T12:00:09+00:00,OKE,$62.17,175.62%,$20.17,$68.93,$59.60 +2020-07-03T12:00:09+00:00,ORCL,$114.61,112.59%,$51.64,$126.55,$113.61 +2020-07-03T12:00:09+00:00,OTIS,$86.86,58.95%,$53.93,$90.12,$85.85 +2020-07-03T12:00:09+00:00,PCAR,$82.31,76.24%,$45.05,$83.65,$77.20 +2020-07-03T12:00:09+00:00,PKG,$132.50,46.18%,$86.12,$159.09,$129.43 +2020-07-03T12:00:09+00:00,PH,$384.17,115.91%,$167.34,$391.01,$361.03 +2020-07-03T12:00:09+00:00,PAYX,$113.44,58.22%,$66.03,$136.43,$110.89 +2020-07-03T12:00:09+00:00,PAYC,$324.51,1.10%,$259.62,$552.49,$306.84 +2020-07-03T12:00:09+00:00,PYPL,$66.79,-62.09%,$59.37,$308.53,$65.02 +2020-07-03T12:00:09+00:00,PNR,$62.84,74.17%,$34.85,$78.09,$60.26 +Could not fetch closing data +2020-07-03T12:00:09+00:00,PEP,$183.08,49.25%,$120.54,$194.76,$183.82 +2020-07-03T12:00:09+00:00,PKI,$116.32,16.91%,$99.06,$200.47,$115.85 +2020-07-03T12:00:09+00:00,PRGO,$32.63,-36.23%,$30.63,$54.18,$33.22 +2020-07-03T12:00:09+00:00,PFE,$35.53,21.16%,$28.43,$58.15,$38.02 +2020-07-03T12:00:09+00:00,PM,$97.70,62.50%,$59.73,$103.36,$93.31 +2020-07-03T12:00:09+00:00,PSX,$99.44,67.57%,$39.09,$109.95,$95.32 +2020-07-03T12:00:09+00:00,PNW,$81.92,21.92%,$57.68,$83.55,$80.44 +2020-07-03T12:00:09+00:00,PXD,$206.40,154.73%,$63.88,$257.61,$203.76 +2020-07-03T12:00:09+00:00,PNC,$125.61,34.64%,$89.23,$214.48,$124.57 +2020-07-03T12:00:09+00:00,PPG,$146.77,40.54%,$99.87,$176.03,$140.68 +2020-07-03T12:00:09+00:00,PPL,$26.21,16.05%,$21.29,$30.25,$26.48 +2020-07-03T12:00:09+00:00,PFG,$76.62,103.25%,$34.14,$92.61,$71.96 +2020-07-03T12:00:09+00:00,PG,$148.80,31.69%,$112.99,$159.21,$147.59 +2020-07-03T12:00:09+00:00,PGR,$131.26,77.66%,$71.98,$148.89,$130.38 +2020-07-03T12:00:09+00:00,PLD,$121.99,37.07%,$85.78,$167.13,$121.93 +2020-07-03T12:00:09+00:00,PRU,$89.85,70.41%,$49.90,$113.70,$84.83 +2020-07-03T12:00:09+00:00,PEG,$62.54,36.99%,$44.90,$71.53,$61.55 +2020-07-03T12:00:09+00:00,PSA,$287.09,66.48%,$162.64,$387.62,$285.75 +2020-07-03T12:00:09+00:00,PHM,$75.03,128.10%,$32.68,$78.67,$72.80 +2020-07-03T12:00:09+00:00,PVH,$83.69,80.63%,$42.36,$122.81,$83.49 +2020-07-03T12:00:09+00:00,QRVO,$100.23,-11.79%,$78.34,$199.54,$99.62 +2020-07-03T12:00:09+00:00,QCOM,$115.94,32.79%,$83.52,$182.88,$116.54 +2020-07-03T12:00:09+00:00,PWR,$193.60,400.09%,$35.89,$196.45,$185.48 +2020-07-03T12:00:09+00:00,DGX,$139.00,24.31%,$101.61,$168.07,$137.07 +2020-07-03T12:00:09+00:00,RL,$122.55,82.36%,$61.08,$131.45,$117.76 +2020-07-03T12:00:09+00:00,RJF,$104.33,136.46%,$41.83,$122.44,$97.31 +2020-07-03T12:00:09+00:00,RTX,$97.42,65.57%,$49.00,$104.02,$96.82 +2020-07-03T12:00:09+00:00,O,$59.57,16.66%,$48.16,$71.52,$59.79 +2020-07-03T12:00:09+00:00,REG,$61.31,51.19%,$30.45,$73.13,$59.28 +2020-07-03T12:00:09+00:00,REGN,$692.45,10.39%,$446.73,$830.35,$743.17 +2020-07-03T12:00:09+00:00,RF,$18.33,89.10%,$8.82,$24.05,$17.84 +2020-07-03T12:00:09+00:00,RSG,$150.33,92.88%,$76.44,$153.17,$145.42 +2020-07-03T12:00:09+00:00,RMD,$215.80,14.01%,$164.10,$293.43,$216.32 +2020-07-03T12:00:09+00:00,RHI,$77.53,57.07%,$46.26,$120.52,$71.79 +2020-07-03T12:00:09+00:00,ROK,$325.38,59.58%,$187.78,$341.98,$307.33 +2020-07-03T12:00:09+00:00,ROL,$43.16,56.84%,$27.52,$43.48,$41.27 +2020-07-03T12:00:09+00:00,ROP,$476.41,23.38%,$357.42,$493.30,$459.71 +2020-07-03T12:00:09+00:00,ROST,$107.46,22.80%,$69.35,$129.38,$106.05 +2020-07-03T12:00:09+00:00,RCL,$102.01,103.94%,$31.28,$103.74,$93.25 +2020-07-03T12:00:09+00:00,SPGI,$393.25,18.33%,$284.48,$472.24,$384.13 +2020-07-03T12:00:09+00:00,CRM,$209.59,6.00%,$128.27,$309.96,$211.89 +2020-07-03T12:00:09+00:00,SBAC,$240.85,-18.18%,$220.69,$382.81,$227.44 +2020-07-03T12:00:09+00:00,SLB,$53.35,200.58%,$13.51,$57.87,$47.28 +2020-07-03T12:00:09+00:00,STX,$60.28,41.48%,$39.31,$108.75,$61.27 +2020-07-03T12:00:09+00:00,SEE,$40.94,26.03%,$31.06,$68.79,$39.40 +2020-07-03T12:00:09+00:00,SRE,$144.13,31.80%,$103.95,$170.36,$144.83 +2020-07-03T12:00:09+00:00,NOW,$552.98,32.79%,$341.76,$701.73,$548.28 +2020-07-03T12:00:09+00:00,SHW,$255.42,32.90%,$186.96,$346.95,$245.75 +2020-07-03T12:00:09+00:00,SPG,$118.55,107.85%,$51.00,$153.95,$109.66 +2020-07-03T12:00:09+00:00,SWKS,$108.34,-13.08%,$77.94,$191.17,$106.11 +2020-07-03T12:00:09+00:00,SLG,$31.47,-22.45%,$19.07,$74.09,$26.06 +2020-07-03T12:00:09+00:00,SNA,$280.73,121.29%,$119.34,$288.19,$270.70 +2020-07-03T12:00:09+00:00,SO,$70.68,51.72%,$45.99,$77.77,$70.46 +2020-07-03T12:00:09+00:00,LUV,$37.59,11.33%,$28.39,$63.10,$32.83 +2020-07-03T12:00:09+00:00,SWK,$90.18,-31.16%,$69.56,$207.33,$86.10 +2020-07-03T12:00:09+00:00,SBUX,$96.05,35.19%,$68.10,$120.92,$98.98 +2020-07-03T12:00:09+00:00,STT,$73.88,25.57%,$52.63,$98.65,$71.64 +2020-07-03T12:00:09+00:00,STE,$217.85,45.61%,$146.21,$249.92,$210.30 +2020-07-03T12:00:09+00:00,SYK,$294.27,65.40%,$171.98,$305.09,$287.29 +Could not fetch closing data +2020-07-03T12:00:09+00:00,SYF,$33.61,59.17%,$19.76,$50.16,$32.92 +2020-07-03T12:00:09+00:00,SNPS,$431.29,116.30%,$191.04,$464.83,$436.82 +2020-07-03T12:00:09+00:00,SYY,$74.33,48.89%,$47.34,$86.93,$72.15 +2020-07-03T12:00:09+00:00,TMUS,$138.97,30.15%,$101.62,$152.41,$134.20 +2020-07-03T12:00:09+00:00,TROW,$110.23,-1.36%,$94.92,$207.95,$109.66 +2020-07-03T12:00:09+00:00,TTWO,$143.19,-1.71%,$93.57,$213.34,$139.64 +2020-07-03T12:00:09+00:00,TPR,$42.59,242.06%,$11.66,$46.40,$42.36 +2020-07-03T12:00:09+00:00,TGT,$130.05,15.42%,$111.22,$257.50,$132.94 +2020-07-03T12:00:09+00:00,TEL,$139.82,77.97%,$75.01,$161.37,$131.26 +2020-07-03T12:00:09+00:00,FTI,$17.14,198.40%,$3.97,$17.14,$15.06 +2020-07-03T12:00:09+00:00,TFX,$235.92,-35.05%,$185.95,$439.09,$238.72 +2020-07-03T12:00:09+00:00,TXN,$173.70,45.26%,$118.56,$191.70,$174.00 +2020-07-03T12:00:09+00:00,TXT,$67.53,104.08%,$30.01,$78.11,$65.26 +2020-07-03T12:00:09+00:00,BK,$44.38,26.14%,$30.51,$61.05,$43.24 +2020-07-03T12:00:09+00:00,CLX,$157.99,-22.64%,$118.71,$220.34,$157.82 +2020-07-03T12:00:09+00:00,COO,$378.38,32.74%,$248.65,$455.80,$368.19 +2020-07-03T12:00:09+00:00,HSY,$242.98,98.73%,$119.72,$275.28,$256.22 +2020-07-03T12:00:09+00:00,MOS,$36.75,190.60%,$11.24,$76.37,$34.65 +2020-07-03T12:00:09+00:00,TRV,$171.65,60.41%,$101.10,$191.81,$173.32 +2020-07-03T12:00:09+00:00,DIS,$88.64,-22.54%,$84.17,$201.91,$90.06 +2020-07-03T12:00:09+00:00,TMO,$513.73,35.27%,$376.47,$664.90,$519.89 +Could not fetch closing data +2020-07-03T12:00:09+00:00,TJX,$82.70,63.60%,$47.88,$84.79,$80.34 +2020-07-03T12:00:09+00:00,TSCO,$216.86,69.42%,$123.21,$248.77,$216.93 +2020-07-03T12:00:09+00:00,TT,$189.19,114.31%,$86.13,$200.02,$179.93 +2020-07-03T12:00:09+00:00,TDG,$883.08,108.55%,$399.61,$896.45,$828.07 +2020-07-03T12:00:09+00:00,TFC,$31.88,-1.93%,$25.72,$62.91,$31.37 +Could not fetch closing data +2020-07-03T12:00:09+00:00,TSN,$51.76,-5.93%,$46.85,$95.16,$50.76 +2020-07-03T12:00:09+00:00,USB,$33.54,2.74%,$28.25,$59.03,$31.93 +2020-07-03T12:00:09+00:00,UDR,$42.65,25.20%,$26.98,$57.20,$41.40 +2020-07-03T12:00:09+00:00,ULTA,$471.63,125.66%,$191.29,$551.43,$445.76 +2020-07-03T12:00:09+00:00,UAA,$7.35,-25.83%,$6.62,$26.96,$7.40 +2020-07-03T12:00:09+00:00,UA,$6.80,-24.44%,$5.92,$22.63,$6.81 +2020-07-03T12:00:09+00:00,UNP,$202.82,25.68%,$155.59,$268.21,$200.14 +2020-07-03T12:00:09+00:00,UAL,$55.39,57.31%,$30.17,$62.45,$51.68 +2020-07-03T12:00:09+00:00,UNH,$461.58,58.98%,$279.17,$549.23,$478.86 +2020-07-03T12:00:09+00:00,UPS,$179.76,69.58%,$104.53,$220.59,$173.46 +2020-07-03T12:00:09+00:00,URI,$433.57,189.83%,$142.57,$477.49,$394.99 +2020-07-03T12:00:09+00:00,UHS,$150.96,61.63%,$87.28,$158.65,$143.51 +2020-07-03T12:00:09+00:00,UNM,$49.01,231.14%,$13.57,$49.01,$45.95 +2020-07-03T12:00:09+00:00,VFC,$18.66,-66.75%,$16.76,$81.72,$18.61 +2020-07-03T12:00:09+00:00,VLO,$114.88,134.44%,$31.96,$147.51,$112.76 +Could not fetch closing data +2020-07-03T12:00:09+00:00,VTR,$47.90,43.46%,$30.71,$60.12,$45.24 +2020-07-03T12:00:09+00:00,VRSN,$222.45,4.83%,$156.51,$255.93,$222.86 +2020-07-03T12:00:09+00:00,VRSK,$224.97,32.15%,$157.16,$228.01,$222.02 +2020-07-03T12:00:09+00:00,VZ,$35.90,-23.03%,$33.63,$53.28,$35.26 +2020-07-03T12:00:09+00:00,VRTX,$338.18,16.09%,$177.01,$351.91,$339.53 +Could not fetch closing data +2020-07-03T12:00:09+00:00,V,$236.45,22.05%,$176.56,$247.30,$228.05 +2020-07-03T12:00:09+00:00,VNO,$18.50,-41.91%,$12.38,$44.95,$15.60 +2020-07-03T12:00:09+00:00,VMC,$217.38,80.47%,$114.00,$225.44,$209.04 +2020-07-03T12:00:09+00:00,WRB,$59.86,65.61%,$35.24,$75.40,$57.89 +2020-07-03T12:00:09+00:00,WAB,$109.64,84.78%,$55.21,$109.67,$101.43 +2020-07-03T12:00:09+00:00,WBA,$29.10,-22.89%,$28.37,$51.32,$30.68 +2020-07-03T12:00:09+00:00,WMT,$153.49,35.32%,$113.43,$158.20,$152.89 +2020-07-03T12:00:09+00:00,WM,$170.01,69.96%,$97.05,$173.42,$165.26 +2020-07-03T12:00:09+00:00,WAT,$264.15,43.28%,$184.36,$424.70,$260.09 +2020-07-03T12:00:09+00:00,WEC,$88.98,8.19%,$75.30,$105.06,$88.82 +2020-07-03T12:00:09+00:00,WFC,$42.77,78.09%,$20.00,$57.15,$41.65 +2020-07-03T12:00:09+00:00,WELL,$79.81,68.65%,$44.51,$94.50,$78.63 +2020-07-03T12:00:09+00:00,WST,$371.60,59.79%,$208.91,$469.62,$357.97 +2020-07-03T12:00:09+00:00,WDC,$37.67,-12.29%,$30.21,$77.17,$38.94 +2020-07-03T12:00:09+00:00,WU,$11.54,-36.96%,$9.91,$23.01,$11.52 +2020-07-03T12:00:09+00:00,WRK,$29.00,8.29%,$24.40,$58.44,$28.72 +2020-07-03T12:00:09+00:00,WY,$33.45,69.36%,$19.43,$39.97,$30.55 +2020-07-03T12:00:09+00:00,WHR,$148.28,23.48%,$119.81,$232.09,$142.14 +2020-07-03T12:00:09+00:00,WMB,$32.73,102.91%,$15.26,$35.40,$30.60 +Could not fetch closing data +2020-07-03T12:00:09+00:00,WYNN,$101.32,32.40%,$51.90,$139.68,$102.87 +2020-07-03T12:00:09+00:00,XEL,$62.93,7.69%,$54.03,$75.15,$63.12 +2020-07-03T12:00:09+00:00,XRX,$15.10,12.15%,$12.40,$23.37,$14.50 +Could not fetch closing data +2020-07-03T12:00:09+00:00,XYL,$109.57,68.97%,$63.48,$135.09,$108.28 +2020-07-03T12:00:09+00:00,YUM,$133.45,59.18%,$81.82,$142.24,$134.31 +2020-07-03T12:00:09+00:00,ZBRA,$295.22,12.84%,$226.88,$614.55,$277.35 +2020-07-03T12:00:09+00:00,ZBH,$140.86,25.58%,$100.87,$170.52,$137.37 +2020-07-03T12:00:09+00:00,ZION,$28.98,-3.05%,$19.59,$70.52,$28.52 +2020-07-03T12:00:09+00:00,ZTS,$167.14,23.02%,$130.55,$244.13,$167.88period start,symbol,price,change %,min,max,30d avg +2020-07-03T12:00:09+00:00,MMM,$97.29,-30.71%,$93.31,$189.17,$99.47 +2020-07-03T12:00:09+00:00,AOS,$70.64,55.29%,$44.95,$83.48,$69.40 +2020-07-03T12:00:09+00:00,ABT,$106.35,20.10%,$88.07,$137.81,$104.87 +2020-07-03T12:00:09+00:00,ABBV,$135.50,55.75%,$72.56,$167.01,$136.50 +2020-07-03T12:00:09+00:00,ABMD,$381.02,43.13%,$224.73,$381.30,$378.35 +2020-07-03T12:00:09+00:00,ACN,$305.76,46.49%,$206.48,$406.56,$307.51 +2020-07-03T12:00:09+00:00,ATVI,$82.43,5.91%,$56.94,$102.70,$81.30 +2020-07-03T12:00:09+00:00,ADBE,$485.27,7.22%,$275.20,$688.37,$458.59 +2020-07-03T12:00:09+00:00,AAP,$69.38,-46.64%,$63.58,$230.37,$74.14 +2020-07-03T12:00:09+00:00,AMD,$113.17,111.93%,$52.93,$161.91,$117.64 +2020-07-03T12:00:09+00:00,AES,$21.09,58.22%,$12.82,$28.88,$20.56 +2020-07-03T12:00:09+00:00,AFL,$70.04,109.89%,$31.47,$72.94,$67.80 +2020-07-03T12:00:09+00:00,A,$117.00,33.51%,$87.54,$177.03,$118.16 +2020-07-03T12:00:09+00:00,APD,$286.84,23.39%,$210.22,$319.62,$282.91 +2020-07-03T12:00:09+00:00,AKAM,$89.77,-20.28%,$70.75,$121.92,$90.79 +2020-07-03T12:00:09+00:00,ALK,$53.75,44.96%,$34.00,$73.74,$49.25 +2020-07-03T12:00:09+00:00,ALB,$237.52,199.81%,$73.89,$323.68,$219.00 +2020-07-03T12:00:09+00:00,ARE,$117.01,-22.45%,$107.88,$211.91,$114.75 +Could not fetch closing data +2020-07-03T12:00:09+00:00,ALGN,$329.54,16.68%,$174.58,$729.92,$317.85 +2020-07-03T12:00:09+00:00,ALLE,$116.79,16.60%,$88.27,$144.41,$113.79 +Could not fetch closing data +2020-07-03T12:00:09+00:00,LNT,$52.63,17.55%,$43.12,$62.67,$52.54 +2020-07-03T12:00:09+00:00,ALL,$108.27,22.51%,$79.30,$139.26,$109.88 +2020-07-03T12:00:09+00:00,GOOGL,$119.48,59.34%,$70.47,$149.84,$122.33 +2020-07-03T12:00:09+00:00,GOOG,$120.14,60.65%,$70.76,$150.71,$123.05 +2020-07-03T12:00:09+00:00,MO,$45.98,46.52%,$29.17,$51.00,$44.34 +2020-07-03T12:00:09+00:00,AMZN,$129.78,-15.09%,$81.82,$186.57,$125.56 +2020-07-03T12:00:09+00:00,AMCR,$9.94,4.55%,$9.11,$12.92,$9.98 +2020-07-03T12:00:09+00:00,AEE,$82.26,21.59%,$65.66,$95.15,$81.97 +2020-07-03T12:00:09+00:00,AAL,$18.35,43.36%,$10.95,$25.82,$16.14 +2020-07-03T12:00:09+00:00,AEP,$84.29,13.85%,$69.23,$102.31,$83.88 +2020-07-03T12:00:09+00:00,AXP,$169.80,82.85%,$87.09,$194.26,$167.68 +2020-07-03T12:00:09+00:00,AIG,$58.20,105.01%,$24.68,$63.71,$55.83 +2020-07-03T12:00:09+00:00,AMT,$195.55,-21.03%,$179.62,$288.50,$188.89 +2020-07-03T12:00:09+00:00,AWK,$141.06,12.90%,$124.25,$183.98,$144.79 +2020-07-03T12:00:09+00:00,AMP,$332.62,134.00%,$135.61,$353.63,$318.26 +2020-07-03T12:00:09+00:00,ABC,$190.86,97.59%,$90.59,$192.43,$181.10 +2020-07-03T12:00:09+00:00,AME,$157.08,78.49%,$84.57,$161.88,$153.38 +2020-07-03T12:00:09+00:00,AMGN,$218.65,-6.34%,$189.32,$285.16,$222.25 +2020-07-03T12:00:09+00:00,APH,$83.62,75.60%,$45.83,$86.49,$79.79 +2020-07-03T12:00:09+00:00,ADI,$185.31,58.27%,$106.03,$196.28,$184.47 +2020-07-03T12:00:09+00:00,ANSS,$320.17,6.14%,$200.33,$411.22,$323.81 +Could not fetch closing data +2020-07-03T12:00:09+00:00,AON,$335.41,78.21%,$176.57,$345.20,$324.09 +2020-07-03T12:00:09+00:00,APA,$34.91,168.37%,$7.52,$50.29,$33.54 +2020-07-03T12:00:09+00:00,AIV,$8.47,123.90%,$2.99,$9.58,$8.35 +2020-07-03T12:00:09+00:00,AAPL,$190.68,107.80%,$90.93,$193.97,$183.70 +2020-07-03T12:00:09+00:00,AMAT,$139.57,126.07%,$53.69,$164.65,$138.05 +2020-07-03T12:00:09+00:00,APTV,$107.55,37.13%,$75.39,$178.12,$97.91 +2020-07-03T12:00:09+00:00,ADM,$78.01,110.79%,$35.27,$96.56,$73.69 +2020-07-03T12:00:09+00:00,ANET,$158.00,194.71%,$48.78,$174.42,$159.94 +2020-07-03T12:00:09+00:00,AJG,$214.05,129.74%,$93.17,$219.57,$209.47 +2020-07-03T12:00:09+00:00,AIZ,$125.86,30.21%,$92.22,$188.45,$125.86 +2020-07-03T12:00:09+00:00,T,$15.61,-12.05%,$13.97,$20.84,$15.50 +2020-07-03T12:00:09+00:00,ATO,$117.31,25.01%,$79.90,$118.96,$116.17 +2020-07-03T12:00:09+00:00,ADSK,$201.57,-17.51%,$164.31,$342.27,$204.93 +2020-07-03T12:00:09+00:00,ADP,$218.74,54.27%,$121.90,$265.54,$216.20 +2020-07-03T12:00:09+00:00,AZO,$2469.51,117.12%,$1095.99,$2733.65,$2428.72 +2020-07-03T12:00:09+00:00,AVB,$191.07,32.68%,$121.10,$245.21,$183.44 +2020-07-03T12:00:09+00:00,AVY,$171.65,52.25%,$105.52,$221.01,$167.10 +2020-07-03T12:00:09+00:00,BKR,$33.11,134.08%,$11.66,$37.50,$30.10 +Could not fetch closing data +2020-07-03T12:00:09+00:00,BAC,$28.53,29.28%,$21.24,$47.57,$28.60 +2020-07-03T12:00:09+00:00,BAX,$45.30,-45.86%,$37.31,$86.67,$43.36 +2020-07-03T12:00:09+00:00,BDX,$256.92,9.61%,$207.66,$270.52,$253.07 +Could not fetch closing data +2020-07-03T12:00:09+00:00,BBY,$79.30,0.34%,$60.71,$128.06,$76.94 +2020-07-03T12:00:09+00:00,BIIB,$275.07,1.95%,$187.54,$414.71,$294.88 +2020-07-03T12:00:09+00:00,BLK,$684.10,32.02%,$500.27,$926.67,$680.95 +2020-07-03T12:00:09+00:00,BA,$212.10,12.87%,$115.86,$269.19,$211.01 +2020-07-03T12:00:09+00:00,BKNG,$2636.91,54.77%,$1604.13,$2780.98,$2634.38 +2020-07-03T12:00:09+00:00,BWA,$44.95,52.40%,$27.29,$46.24,$41.49 +2020-07-03T12:00:09+00:00,BXP,$59.08,-25.63%,$45.69,$122.08,$52.91 +2020-07-03T12:00:09+00:00,BSX,$52.29,46.92%,$33.15,$54.64,$52.51 +2020-07-03T12:00:09+00:00,BMY,$62.65,14.37%,$50.73,$79.13,$64.21 +2020-07-03T12:00:09+00:00,AVGO,$846.75,190.91%,$279.20,$881.48,$825.20 +2020-07-03T12:00:09+00:00,BR,$163.30,33.60%,$118.84,$179.73,$156.54 +Could not fetch closing data +2020-07-03T12:00:09+00:00,CHRW,$95.26,27.62%,$74.63,$116.77,$93.94 +Could not fetch closing data +2020-07-03T12:00:09+00:00,CDNS,$226.89,129.79%,$98.21,$239.00,$229.64 +2020-07-03T12:00:09+00:00,CPB,$45.54,2.05%,$37.83,$56.33,$47.16 +2020-07-03T12:00:09+00:00,COF,$108.04,81.74%,$55.37,$171.39,$108.48 +2020-07-03T12:00:09+00:00,CAH,$93.97,100.43%,$41.00,$94.63,$88.40 +2020-07-03T12:00:09+00:00,KMX,$81.39,-9.95%,$55.69,$154.85,$78.77 +2020-07-03T12:00:09+00:00,CCL,$19.04,21.97%,$6.38,$31.31,$14.81 +2020-07-03T12:00:09+00:00,CARR,$49.33,112.27%,$22.95,$56.59,$45.98 +2020-07-03T12:00:09+00:00,CAT,$245.18,102.69%,$117.51,$263.11,$233.29 +2020-07-03T12:00:09+00:00,CBOE,$135.84,42.99%,$78.47,$139.72,$135.55 +2020-07-03T12:00:09+00:00,CBRE,$81.87,76.52%,$41.35,$110.30,$77.88 +2020-07-03T12:00:09+00:00,CDW,$183.33,61.40%,$105.50,$212.89,$175.96 +2020-07-03T12:00:09+00:00,CE,$116.94,38.94%,$78.74,$167.81,$112.38 +2020-07-03T12:00:09+00:00,CNC,$66.50,-0.20%,$54.30,$97.22,$66.23 +2020-07-03T12:00:09+00:00,CNP,$29.48,62.33%,$17.56,$32.47,$28.92 +Could not fetch closing data +Could not fetch closing data +2020-07-03T12:00:09+00:00,CF,$71.85,158.53%,$24.22,$116.65,$67.88 +2020-07-03T12:00:09+00:00,SCHW,$56.79,72.63%,$31.88,$93.69,$54.70 +2020-07-03T12:00:09+00:00,CHTR,$371.94,-29.33%,$303.35,$821.01,$340.86 +2020-07-03T12:00:09+00:00,CVX,$154.22,99.08%,$59.34,$184.34,$155.50 +2020-07-03T12:00:09+00:00,CMG,$2077.46,84.51%,$1088.92,$2139.00,$2068.41 +2020-07-03T12:00:09+00:00,CB,$191.53,58.91%,$108.51,$229.04,$190.78 +2020-07-03T12:00:09+00:00,CHD,$98.97,31.65%,$70.04,$102.57,$95.83 +2020-07-03T12:00:09+00:00,CI,$277.12,52.83%,$153.71,$336.27,$266.25 +2020-07-03T12:00:09+00:00,CINF,$98.17,55.67%,$62.41,$136.55,$98.62 +2020-07-03T12:00:09+00:00,CTAS,$480.24,81.73%,$257.03,$497.08,$482.62 +2020-07-03T12:00:09+00:00,CSCO,$50.99,20.43%,$32.85,$60.60,$50.21 +2020-07-03T12:00:09+00:00,C,$45.74,-1.50%,$37.12,$74.11,$46.57 +2020-07-03T12:00:09+00:00,CFG,$26.93,26.28%,$19.97,$52.89,$26.95 +Could not fetch closing data +2020-07-03T12:00:09+00:00,CME,$181.95,22.94%,$134.19,$237.54,$181.55 +2020-07-03T12:00:09+00:00,CMS,$59.30,7.67%,$50.46,$70.85,$59.28 +2020-07-03T12:00:09+00:00,KO,$59.76,44.75%,$40.08,$63.82,$60.42 +2020-07-03T12:00:09+00:00,CTSH,$65.34,21.26%,$51.26,$91.16,$63.41 +2020-07-03T12:00:09+00:00,CL,$75.59,10.43%,$67.18,$82.28,$76.25 +2020-07-03T12:00:09+00:00,CMCSA,$41.43,10.33%,$28.04,$58.56,$40.26 +2020-07-03T12:00:09+00:00,CMA,$44.27,41.57%,$29.17,$94.51,$41.23 +2020-07-03T12:00:09+00:00,CAG,$33.22,3.48%,$28.77,$40.24,$34.30 +Could not fetch closing data +2020-07-03T12:00:09+00:00,COP,$103.23,181.38%,$25.79,$130.72,$102.10 +2020-07-03T12:00:09+00:00,ED,$92.03,40.82%,$60.51,$99.57,$92.26 +2020-07-03T12:00:09+00:00,STZ,$253.49,41.83%,$158.84,$259.14,$244.23 +2020-07-03T12:00:09+00:00,CPRT,$88.11,107.51%,$40.75,$91.21,$88.20 +2020-07-03T12:00:09+00:00,GLW,$34.70,40.76%,$24.34,$43.33,$33.18 +2020-07-03T12:00:09+00:00,CTVA,$57.30,115.65%,$24.44,$66.96,$56.72 +2020-07-03T12:00:09+00:00,COST,$525.05,76.85%,$296.89,$602.62,$520.56 +2020-07-03T12:00:09+00:00,COTY,$12.45,179.78%,$2.65,$12.53,$11.90 +2020-07-03T12:00:09+00:00,CCI,$115.53,-26.13%,$109.42,$196.06,$112.83 +2020-07-03T12:00:09+00:00,CSX,$33.30,47.56%,$21.70,$37.18,$32.62 +2020-07-03T12:00:09+00:00,CMI,$245.80,48.82%,$159.61,$260.41,$229.28 +2020-07-03T12:00:09+00:00,CVS,$69.17,15.25%,$52.55,$107.33,$69.37 +2020-07-03T12:00:09+00:00,DHI,$115.39,112.79%,$54.23,$123.05,$115.13 +2020-07-03T12:00:09+00:00,DHR,$233.08,28.75%,$180.08,$329.99,$235.40 +2020-07-03T12:00:09+00:00,DRI,$163.45,137.63%,$65.44,$166.30,$162.33 +2020-07-03T12:00:09+00:00,DVA,$103.89,27.91%,$65.42,$133.78,$97.99 +2020-07-03T12:00:09+00:00,DE,$405.28,162.18%,$152.10,$441.61,$387.64 +2020-07-03T12:00:09+00:00,DAL,$47.88,68.35%,$24.94,$51.65,$41.54 +2020-07-03T12:00:09+00:00,XRAY,$38.83,-12.35%,$26.83,$69.00,$38.61 +2020-07-03T12:00:09+00:00,DVN,$48.85,377.01%,$7.69,$78.04,$48.49 +2020-07-03T12:00:09+00:00,DXCM,$126.71,19.77%,$67.99,$162.82,$124.24 +2020-07-03T12:00:09+00:00,FANG,$132.40,252.60%,$21.73,$160.40,$129.60 +2020-07-03T12:00:09+00:00,DLR,$113.80,-19.35%,$86.49,$176.87,$105.63 +2020-07-03T12:00:09+00:00,DFS,$116.94,139.26%,$44.86,$133.76,$112.71 +Could not fetch closing data +Could not fetch closing data +2020-07-03T12:00:09+00:00,DISH,$7.28,-78.27%,$6.02,$46.53,$6.67 +2020-07-03T12:00:09+00:00,DG,$169.33,-8.50%,$153.05,$260.44,$171.00 +2020-07-03T12:00:09+00:00,DLTR,$143.54,59.88%,$84.54,$174.08,$139.43 +2020-07-03T12:00:09+00:00,D,$52.24,-20.34%,$49.02,$83.83,$51.82 +2020-07-03T12:00:09+00:00,DPZ,$341.68,-10.15%,$289.85,$564.33,$314.03 +2020-07-03T12:00:09+00:00,DOV,$146.10,51.99%,$92.54,$182.33,$142.08 +2020-07-03T12:00:09+00:00,DOW,$53.10,36.04%,$36.27,$70.61,$52.03 +2020-07-03T12:00:09+00:00,DTE,$109.99,25.14%,$86.47,$139.12,$110.48 +2020-07-03T12:00:09+00:00,DUK,$89.77,26.71%,$70.78,$109.93,$90.32 +Could not fetch closing data +2020-07-03T12:00:09+00:00,DD,$70.41,36.34%,$48.15,$82.50,$69.38 +2020-07-03T12:00:09+00:00,DXC,$27.22,78.02%,$15.16,$43.42,$26.17 +Could not fetch closing data +2020-07-03T12:00:09+00:00,EMN,$84.96,22.79%,$65.67,$127.69,$81.48 +2020-07-03T12:00:09+00:00,ETN,$198.46,130.94%,$82.80,$201.10,$190.32 +2020-07-03T12:00:09+00:00,EBAY,$44.26,-17.39%,$36.21,$78.00,$44.47 +2020-07-03T12:00:09+00:00,ECL,$183.40,-7.87%,$131.35,$235.64,$177.48 +2020-07-03T12:00:09+00:00,EIX,$68.86,31.44%,$46.08,$74.19,$68.11 +2020-07-03T12:00:09+00:00,EW,$90.26,29.81%,$67.19,$130.68,$87.91 +2020-07-03T12:00:09+00:00,EA,$129.20,-3.41%,$109.19,$148.61,$127.69 +2020-07-03T12:00:09+00:00,EMR,$88.94,48.17%,$57.11,$104.59,$85.23 +2020-07-03T12:00:09+00:00,ETR,$97.46,7.81%,$83.70,$125.84,$99.06 +2020-07-03T12:00:09+00:00,EOG,$116.20,173.43%,$27.90,$143.28,$111.89 +2020-07-03T12:00:09+00:00,EFX,$225.61,33.26%,$135.14,$296.50,$223.22 +2020-07-03T12:00:09+00:00,EQIX,$772.31,8.52%,$505.39,$882.83,$756.63 +2020-07-03T12:00:09+00:00,EQR,$66.54,17.65%,$44.41,$93.24,$64.31 +2020-07-03T12:00:09+00:00,ESS,$233.25,9.72%,$170.11,$342.07,$225.95 +2020-07-03T12:00:09+00:00,EL,$192.46,1.57%,$176.53,$371.10,$190.66 +2020-07-03T12:00:09+00:00,RE,$351.28,77.04%,$190.33,$390.84,$345.52 +2020-07-03T12:00:09+00:00,EVRG,$58.69,0.83%,$46.97,$72.62,$58.55 +2020-07-03T12:00:09+00:00,ES,$70.83,-11.23%,$67.92,$93.96,$70.48 +2020-07-03T12:00:09+00:00,EXC,$40.96,69.90%,$22.45,$48.26,$40.28 +2020-07-03T12:00:09+00:00,EXPE,$111.88,28.10%,$79.74,$213.80,$105.90 +2020-07-03T12:00:09+00:00,EXPD,$118.90,55.56%,$75.66,$135.62,$116.48 +2020-07-03T12:00:09+00:00,EXR,$148.12,60.72%,$91.08,$226.73,$146.04 +2020-07-03T12:00:09+00:00,XOM,$103.16,160.48%,$28.72,$119.17,$105.30 +2020-07-03T12:00:09+00:00,FFIV,$143.42,2.66%,$117.77,$247.78,$146.52 +Could not fetch closing data +2020-07-03T12:00:09+00:00,FAST,$57.87,41.52%,$39.78,$62.05,$56.18 +2020-07-03T12:00:09+00:00,FRT,$95.98,26.39%,$60.67,$130.65,$92.46 +2020-07-03T12:00:09+00:00,FDX,$251.25,63.38%,$142.90,$312.96,$232.28 +2020-07-03T12:00:09+00:00,FIS,$59.27,-54.40%,$49.23,$148.23,$54.63 +2020-07-03T12:00:09+00:00,FITB,$26.65,57.92%,$15.56,$47.49,$25.82 +Could not fetch closing data +2020-07-03T12:00:09+00:00,FE,$38.77,4.43%,$25.03,$48.46,$38.45 +2020-07-03T12:00:09+00:00,FISV,$125.20,10.84%,$112.19,$126.15,$0.00 +2020-07-03T12:00:09+00:00,FLT,$253.49,-1.05%,$164.00,$293.44,$240.53 +Could not fetch closing data +2020-07-03T12:00:09+00:00,FLS,$36.96,36.90%,$23.85,$41.87,$35.64 +2020-07-03T12:00:09+00:00,FMC,$104.25,7.86%,$84.42,$136.06,$105.30 +2020-07-03T12:00:09+00:00,F,$14.98,170.32%,$5.23,$22.66,$13.72 +2020-07-03T12:00:09+00:00,FTNT,$74.68,167.29%,$22.07,$75.59,$71.08 +2020-07-03T12:00:09+00:00,FTV,$72.35,25.92%,$53.56,$78.97,$69.84 +Could not fetch closing data +2020-07-03T12:00:09+00:00,FOXA,$34.08,30.38%,$24.04,$44.18,$33.04 +2020-07-03T12:00:09+00:00,FOX,$31.92,22.02%,$24.11,$41.44,$30.89 +2020-07-03T12:00:09+00:00,BEN,$26.15,44.02%,$16.60,$34.87,$25.67 +2020-07-03T12:00:09+00:00,FCX,$38.64,205.52%,$12.63,$51.93,$38.02 +2020-07-03T12:00:09+00:00,GPS,$8.91,-27.10%,$7.42,$35.78,$8.87 +2020-07-03T12:00:09+00:00,GRMN,$105.03,14.10%,$76.75,$169.18,$104.36 +2020-07-03T12:00:09+00:00,IT,$347.74,183.80%,$117.45,$356.54,$345.06 +2020-07-03T12:00:09+00:00,GD,$214.15,50.02%,$127.23,$255.74,$211.84 +2020-07-03T12:00:09+00:00,GE,$108.27,148.35%,$37.06,$109.85,$105.38 +2020-07-03T12:00:09+00:00,GIS,$75.17,28.01%,$52.63,$90.61,$81.09 +2020-07-03T12:00:09+00:00,GM,$39.61,53.94%,$23.42,$65.74,$36.34 +2020-07-03T12:00:09+00:00,GPC,$165.42,98.89%,$80.32,$187.28,$159.52 +2020-07-03T12:00:09+00:00,GILD,$74.42,10.10%,$50.98,$87.06,$76.89 +2020-07-03T12:00:09+00:00,GPN,$105.85,-37.66%,$93.13,$218.27,$100.12 +2020-07-03T12:00:09+00:00,GL,$111.66,52.98%,$69.31,$123.37,$107.45 +2020-07-03T12:00:09+00:00,GS,$315.17,62.95%,$174.65,$404.78,$325.50 +2020-07-03T12:00:09+00:00,GWW,$776.18,147.41%,$300.66,$788.59,$722.65 +2020-07-03T12:00:09+00:00,HRB,$31.41,135.38%,$12.18,$48.44,$31.62 +2020-07-03T12:00:09+00:00,HAL,$35.58,177.78%,$11.01,$42.97,$31.88 +2020-07-03T12:00:09+00:00,HBI,$4.28,-59.92%,$3.87,$21.63,$4.46 +2020-07-03T12:00:09+00:00,HOG,$34.80,41.13%,$22.33,$51.72,$33.89 +2020-07-03T12:00:09+00:00,HIG,$72.73,98.32%,$34.06,$78.90,$70.73 +2020-07-03T12:00:09+00:00,HAS,$64.56,-10.36%,$47.15,$103.92,$61.58 +2020-07-03T12:00:09+00:00,HCA,$291.49,197.02%,$93.32,$303.48,$282.74 +2020-07-03T12:00:09+00:00,PEAK,$20.55,-20.35%,$19.27,$36.41,$20.30 +2020-07-03T12:00:09+00:00,HSIC,$78.66,32.16%,$56.08,$91.96,$77.06 +2020-07-03T12:00:09+00:00,HES,$134.41,177.99%,$35.49,$160.44,$133.30 +2020-07-03T12:00:09+00:00,HPE,$16.87,94.84%,$7.65,$17.57,$16.05 +2020-07-03T12:00:09+00:00,HLT,$148.32,94.54%,$73.51,$163.14,$141.58 +Could not fetch closing data +2020-07-03T12:00:09+00:00,HOLX,$77.51,33.96%,$56.85,$87.67,$79.58 +2020-07-03T12:00:09+00:00,HD,$302.81,25.21%,$239.71,$416.18,$299.98 +2020-07-03T12:00:09+00:00,HON,$203.26,46.35%,$133.37,$225.63,$199.96 +2020-07-03T12:00:09+00:00,HRL,$39.35,-14.97%,$37.95,$54.81,$40.16 +2020-07-03T12:00:09+00:00,HST,$17.45,55.66%,$10.19,$21.24,$17.03 +2020-07-03T12:00:09+00:00,HWM,$49.40,214.45%,$14.74,$49.56,$46.26 +2020-07-03T12:00:09+00:00,HPQ,$31.13,86.23%,$15.71,$40.34,$30.29 +2020-07-03T12:00:09+00:00,HUM,$430.14,10.69%,$359.40,$560.00,$475.29 +2020-07-03T12:00:09+00:00,HBAN,$10.89,30.14%,$7.69,$17.63,$10.74 +2020-07-03T12:00:09+00:00,HII,$224.25,35.10%,$132.92,$257.36,$215.26 +2020-07-03T12:00:09+00:00,IEX,$209.98,35.65%,$151.81,$240.69,$206.88 +2020-07-03T12:00:09+00:00,IDXX,$498.01,46.70%,$324.64,$705.76,$475.81 +Could not fetch closing data +2020-07-03T12:00:09+00:00,ITW,$243.81,41.75%,$167.77,$250.90,$238.32 +2020-07-03T12:00:09+00:00,ILMN,$183.32,-51.68%,$177.23,$524.84,$197.80 +2020-07-03T12:00:09+00:00,INCY,$62.07,-42.42%,$60.95,$109.69,$62.14 +2020-07-03T12:00:09+00:00,IR,$64.26,119.32%,$27.85,$65.36,$62.37 +2020-07-03T12:00:09+00:00,INTC,$31.85,-45.09%,$24.90,$67.84,$32.34 +2020-07-03T12:00:09+00:00,ICE,$112.29,26.20%,$88.20,$135.40,$109.55 +2020-07-03T12:00:09+00:00,IBM,$132.08,25.95%,$94.33,$150.57,$132.80 +2020-07-03T12:00:09+00:00,IP,$31.80,6.54%,$27.50,$56.09,$31.16 +2020-07-03T12:00:09+00:00,IPG,$37.94,144.27%,$14.66,$40.59,$38.75 +2020-07-03T12:00:09+00:00,IFF,$78.59,-36.47%,$75.28,$154.99,$78.56 +2020-07-03T12:00:09+00:00,INTU,$448.19,45.86%,$283.67,$694.66,$441.65 +2020-07-03T12:00:09+00:00,ISRG,$331.29,70.00%,$183.06,$365.42,$321.03 +2020-07-03T12:00:09+00:00,IVZ,$16.92,67.19%,$9.19,$28.63,$16.04 +2020-07-03T12:00:09+00:00,IPGP,$132.32,-19.73%,$83.02,$258.58,$123.42 +2020-07-03T12:00:09+00:00,IQV,$216.81,50.94%,$141.28,$282.61,$210.70 +2020-07-03T12:00:09+00:00,IRM,$57.95,141.83%,$23.61,$58.27,$55.64 +2020-07-03T12:00:09+00:00,JBHT,$179.61,49.82%,$119.88,$218.06,$174.51 +2020-07-03T12:00:09+00:00,JKHY,$163.01,-9.93%,$141.27,$211.07,$159.25 +2020-07-03T12:00:09+00:00,J,$121.23,44.59%,$77.58,$148.16,$116.00 +2020-07-03T12:00:09+00:00,SJM,$147.71,47.04%,$98.10,$162.59,$149.36 +2020-07-03T12:00:09+00:00,JNJ,$159.25,20.54%,$127.53,$179.75,$160.58 +2020-07-03T12:00:09+00:00,JCI,$66.90,98.19%,$32.44,$81.31,$64.43 +2020-07-03T12:00:09+00:00,JPM,$144.34,65.77%,$83.66,$162.90,$139.77 +2020-07-03T12:00:09+00:00,JNPR,$31.08,41.95%,$18.82,$37.69,$30.72 +Could not fetch closing data +2020-07-03T12:00:09+00:00,K,$67.19,8.11%,$54.30,$76.82,$66.69 +2020-07-03T12:00:09+00:00,KEY,$9.59,-8.48%,$8.75,$25.16,$9.88 +2020-07-03T12:00:09+00:00,KEYS,$163.77,60.84%,$90.69,$207.93,$162.52 +2020-07-03T12:00:09+00:00,KMB,$135.36,0.46%,$109.59,$149.95,$136.26 +2020-07-03T12:00:09+00:00,KIM,$19.90,72.10%,$9.21,$24.98,$19.04 +2020-07-03T12:00:09+00:00,KMI,$16.92,25.67%,$10.60,$20.14,$16.77 +2020-07-03T12:00:09+00:00,KLAC,$455.83,127.04%,$170.29,$485.02,$463.33 +2020-07-03T12:00:09+00:00,KSS,$24.21,17.49%,$17.99,$63.71,$21.96 +2020-07-03T12:00:09+00:00,KHC,$35.46,15.63%,$27.89,$44.29,$36.77 +2020-07-03T12:00:09+00:00,KR,$47.17,44.91%,$29.83,$61.67,$46.55 +Could not fetch closing data +2020-07-03T12:00:09+00:00,LHX,$194.66,15.06%,$155.38,$270.74,$188.99 +2020-07-03T12:00:09+00:00,LH,$208.28,42.92%,$145.73,$265.31,$195.87 +2020-07-03T12:00:09+00:00,LRCX,$617.87,86.47%,$290.82,$729.82,$620.16 +2020-07-03T12:00:09+00:00,LW,$112.62,80.21%,$49.96,$115.12,$113.22 +2020-07-03T12:00:09+00:00,LVS,$55.72,18.38%,$30.14,$66.20,$57.52 +2020-07-03T12:00:09+00:00,LEG,$28.88,-13.42%,$28.87,$56.41,$30.59 +2020-07-03T12:00:09+00:00,LDOS,$88.04,1.71%,$76.92,$111.08,$84.03 +2020-07-03T12:00:09+00:00,LEN,$120.21,97.85%,$60.76,$126.06,$117.11 +2020-07-03T12:00:09+00:00,LLY,$452.08,178.91%,$127.32,$468.98,$448.12 +2020-07-03T12:00:09+00:00,LNC,$26.08,-22.24%,$19.11,$75.66,$23.75 +2020-07-03T12:00:09+00:00,LIN,$364.51,65.87%,$212.99,$381.08,$366.67 +2020-07-03T12:00:09+00:00,LYV,$91.76,101.85%,$45.04,$126.04,$86.44 +2020-07-03T12:00:09+00:00,LKQ,$57.19,120.47%,$25.45,$60.03,$54.97 +2020-07-03T12:00:09+00:00,LMT,$458.71,32.96%,$310.23,$501.41,$456.28 +2020-07-03T12:00:09+00:00,L,$60.45,77.59%,$32.36,$67.01,$58.48 +2020-07-03T12:00:09+00:00,LOW,$221.94,67.58%,$131.72,$260.52,$214.13 +2020-07-03T12:00:09+00:00,LYB,$90.50,42.27%,$57.91,$117.08,$89.66 +2020-07-03T12:00:09+00:00,MTB,$128.56,33.41%,$86.03,$191.41,$123.64 +2020-07-03T12:00:09+00:00,MRO,$23.52,310.83%,$3.76,$33.03,$23.00 +2020-07-03T12:00:09+00:00,MPC,$118.02,250.44%,$25.86,$135.64,$112.11 +2020-07-03T12:00:09+00:00,MKTX,$248.10,-52.06%,$219.06,$587.94,$268.98 +2020-07-03T12:00:09+00:00,MAR,$185.66,106.68%,$83.52,$190.30,$176.97 +2020-07-03T12:00:09+00:00,MMC,$183.99,75.09%,$101.06,$188.08,$179.67 +2020-07-03T12:00:09+00:00,MLM,$440.17,106.07%,$200.86,$461.69,$428.37 +2020-07-03T12:00:09+00:00,MAS,$55.21,15.48%,$42.18,$67.98,$54.18 +2020-07-03T12:00:09+00:00,MA,$388.68,29.49%,$282.07,$394.16,$376.99 +Could not fetch closing data +2020-07-03T12:00:09+00:00,MKC,$84.67,-1.99%,$69.93,$101.86,$89.20 +2020-07-03T12:00:09+00:00,MCD,$292.10,61.28%,$177.11,$298.41,$289.97 +2020-07-03T12:00:09+00:00,MCK,$414.80,178.16%,$138.67,$427.31,$403.21 +2020-07-03T12:00:09+00:00,MDT,$85.89,-4.86%,$76.13,$133.66,$85.67 +2020-07-03T12:00:09+00:00,MRK,$109.00,58.01%,$63.51,$117.59,$111.20 +2020-07-03T12:00:09+00:00,MET,$57.61,65.50%,$33.21,$76.95,$54.10 +2020-07-03T12:00:09+00:00,MTD,$1269.09,54.12%,$818.19,$1702.53,$1308.08 +2020-07-03T12:00:09+00:00,MGM,$43.09,157.99%,$14.95,$50.37,$41.92 +2020-07-03T12:00:09+00:00,MCHP,$86.62,64.58%,$48.02,$90.69,$82.33 +2020-07-03T12:00:09+00:00,MU,$60.65,19.11%,$42.66,$97.36,$66.70 +2020-07-03T12:00:09+00:00,MSFT,$337.22,64.49%,$195.45,$348.10,$333.83 +2020-07-03T12:00:09+00:00,MAA,$153.17,39.59%,$104.35,$228.29,$150.99 +2020-07-03T12:00:09+00:00,MHK,$103.18,-0.08%,$70.47,$229.74,$98.72 +2020-07-03T12:00:09+00:00,TAP,$65.92,87.65%,$32.16,$67.75,$65.12 +2020-07-03T12:00:09+00:00,MDLZ,$72.00,42.47%,$49.21,$78.36,$73.38 +2020-07-03T12:00:09+00:00,MNST,$55.87,56.70%,$35.28,$59.94,$57.95 +2020-07-03T12:00:09+00:00,MCO,$339.57,21.36%,$235.25,$405.15,$333.60 +2020-07-03T12:00:09+00:00,MS,$83.36,91.28%,$41.73,$108.73,$85.07 +2020-07-03T12:00:09+00:00,MSI,$291.87,119.30%,$125.67,$297.45,$283.63 +2020-07-03T12:00:09+00:00,MSCI,$471.75,37.85%,$331.28,$665.06,$472.31 +Could not fetch closing data +2020-07-03T12:00:09+00:00,NDAQ,$48.97,26.63%,$38.48,$70.94,$52.43 +2020-07-03T12:00:09+00:00,NOV,$17.39,40.96%,$7.98,$24.80,$15.57 +2020-07-03T12:00:09+00:00,NTAP,$76.25,86.52%,$37.62,$91.34,$72.02 +2020-07-03T12:00:09+00:00,NFLX,$438.10,-11.28%,$166.37,$691.69,$416.86 +2020-07-03T12:00:09+00:00,NWL,$8.87,-42.14%,$7.85,$29.10,$8.56 +2020-07-03T12:00:09+00:00,NEM,$42.24,-23.19%,$36.63,$81.05,$41.96 +2020-07-03T12:00:09+00:00,NWSA,$19.71,63.65%,$11.61,$27.64,$19.09 +2020-07-03T12:00:09+00:00,NWS,$19.91,64.81%,$11.61,$25.95,$19.29 +2020-07-03T12:00:09+00:00,NEE,$72.05,24.31%,$57.91,$90.24,$73.94 +Could not fetch closing data +2020-07-03T12:00:09+00:00,NKE,$104.46,5.74%,$83.12,$177.19,$108.56 +2020-07-03T12:00:09+00:00,NI,$27.52,25.66%,$20.29,$32.46,$27.17 +Could not fetch closing data +2020-07-03T12:00:09+00:00,JWN,$19.36,22.30%,$11.79,$45.79,$18.52 +2020-07-03T12:00:09+00:00,NSC,$226.72,30.68%,$165.94,$296.39,$219.05 +2020-07-03T12:00:09+00:00,NTRS,$74.32,-2.78%,$69.65,$133.62,$73.57 +2020-07-03T12:00:09+00:00,NOC,$452.45,49.32%,$277.36,$549.01,$449.68 +Could not fetch closing data +2020-07-03T12:00:09+00:00,NCLH,$21.89,35.71%,$10.38,$33.71,$18.35 +2020-07-03T12:00:09+00:00,NRG,$38.12,28.73%,$25.80,$45.03,$34.90 +2020-07-03T12:00:09+00:00,NUE,$161.95,302.39%,$37.49,$178.37,$149.52 +2020-07-03T12:00:09+00:00,NVDA,$425.03,333.13%,$98.13,$438.08,$404.69 +2020-07-03T12:00:09+00:00,NVR,$6062.78,83.36%,$3214.63,$6350.62,$5936.59 +2020-07-03T12:00:09+00:00,ORLY,$934.47,119.44%,$419.41,$962.10,$922.04 +2020-07-03T12:00:09+00:00,OXY,$58.61,223.33%,$8.86,$75.97,$58.43 +2020-07-03T12:00:09+00:00,ODFL,$369.94,111.00%,$171.75,$375.75,$331.03 +2020-07-03T12:00:09+00:00,OMC,$92.99,78.56%,$43.69,$96.75,$93.36 +2020-07-03T12:00:09+00:00,OKE,$62.17,155.96%,$21.72,$73.62,$59.60 +2020-07-03T12:00:09+00:00,ORCL,$114.61,112.59%,$51.64,$126.55,$113.61 +2020-07-03T12:00:09+00:00,OTIS,$86.86,55.98%,$54.95,$91.83,$85.85 +2020-07-03T12:00:09+00:00,PCAR,$82.31,65.42%,$48.00,$83.65,$77.20 +2020-07-03T12:00:09+00:00,PKG,$132.50,38.35%,$90.99,$166.97,$130.00 +2020-07-03T12:00:09+00:00,PH,$384.17,111.10%,$171.16,$391.01,$361.03 +2020-07-03T12:00:09+00:00,PAYX,$113.44,58.22%,$66.03,$136.43,$110.89 +2020-07-03T12:00:09+00:00,PAYC,$324.51,0.96%,$259.97,$553.23,$306.87 +2020-07-03T12:00:09+00:00,PYPL,$66.79,-62.09%,$59.37,$308.53,$65.02 +2020-07-03T12:00:09+00:00,PNR,$62.84,70.38%,$35.62,$79.83,$60.26 +Could not fetch closing data +2020-07-03T12:00:09+00:00,PEP,$183.08,41.46%,$127.19,$196.12,$184.04 +2020-07-03T12:00:09+00:00,PKI,$116.32,16.62%,$99.31,$200.98,$115.85 +2020-07-03T12:00:09+00:00,PRGO,$32.63,-38.58%,$31.12,$56.25,$33.27 +2020-07-03T12:00:09+00:00,PFE,$35.53,21.16%,$28.43,$58.15,$38.02 +2020-07-03T12:00:09+00:00,PM,$97.70,50.10%,$64.67,$111.90,$94.09 +2020-07-03T12:00:09+00:00,PSX,$99.44,67.57%,$39.09,$109.95,$95.32 +2020-07-03T12:00:09+00:00,PNW,$81.92,14.99%,$59.76,$85.98,$80.44 +2020-07-03T12:00:09+00:00,PXD,$206.40,123.96%,$72.65,$285.28,$204.21 +2020-07-03T12:00:09+00:00,PNC,$125.61,28.23%,$93.69,$225.20,$124.57 +2020-07-03T12:00:09+00:00,PPG,$146.77,40.54%,$99.87,$176.03,$140.68 +2020-07-03T12:00:09+00:00,PPL,$26.21,16.05%,$21.29,$30.25,$26.48 +2020-07-03T12:00:09+00:00,PFG,$76.62,89.26%,$36.67,$95.00,$72.04 +2020-07-03T12:00:09+00:00,PG,$148.80,27.59%,$116.62,$164.14,$147.59 +2020-07-03T12:00:09+00:00,PGR,$131.26,76.82%,$72.32,$149.00,$130.48 +2020-07-03T12:00:09+00:00,PLD,$121.99,31.73%,$89.25,$173.01,$122.37 +2020-07-03T12:00:09+00:00,PRU,$89.85,60.06%,$53.13,$121.06,$84.83 +2020-07-03T12:00:09+00:00,PEG,$62.54,30.06%,$47.30,$74.73,$61.73 +2020-07-03T12:00:09+00:00,PSA,$287.09,52.83%,$177.17,$419.90,$287.05 +2020-07-03T12:00:09+00:00,PHM,$75.03,123.80%,$33.31,$78.67,$72.88 +2020-07-03T12:00:09+00:00,PVH,$83.69,80.04%,$42.50,$123.22,$83.50 +2020-07-03T12:00:09+00:00,QRVO,$100.23,-11.79%,$78.34,$199.54,$99.62 +2020-07-03T12:00:09+00:00,QCOM,$115.94,27.23%,$87.17,$189.28,$116.64 +2020-07-03T12:00:09+00:00,PWR,$193.60,398.53%,$36.01,$196.45,$185.54 +2020-07-03T12:00:09+00:00,DGX,$139.00,21.29%,$104.14,$172.26,$137.07 +2020-07-03T12:00:09+00:00,RL,$122.55,74.78%,$63.73,$137.15,$118.33 +2020-07-03T12:00:09+00:00,RJF,$104.33,132.90%,$42.47,$123.98,$97.63 +2020-07-03T12:00:09+00:00,RTX,$97.42,60.80%,$50.45,$104.97,$96.82 +2020-07-03T12:00:09+00:00,O,$59.57,9.89%,$51.13,$74.93,$60.03 +2020-07-03T12:00:09+00:00,REG,$61.31,39.53%,$32.99,$77.86,$59.54 +2020-07-03T12:00:09+00:00,REGN,$692.45,10.39%,$446.73,$830.35,$743.17 +2020-07-03T12:00:09+00:00,RF,$18.33,78.99%,$9.32,$25.41,$17.87 +2020-07-03T12:00:09+00:00,RSG,$150.33,88.81%,$78.09,$153.17,$145.82 +2020-07-03T12:00:09+00:00,RMD,$215.80,14.01%,$164.10,$293.43,$216.32 +2020-07-03T12:00:09+00:00,RHI,$77.53,52.59%,$47.62,$124.07,$71.79 +2020-07-03T12:00:09+00:00,ROK,$325.38,55.96%,$191.09,$349.93,$307.33 +2020-07-03T12:00:09+00:00,ROL,$43.16,53.80%,$28.06,$43.48,$41.27 +2020-07-03T12:00:09+00:00,ROP,$476.41,22.27%,$359.64,$497.77,$460.35 +2020-07-03T12:00:09+00:00,ROST,$107.46,19.78%,$70.23,$132.64,$106.13 +2020-07-03T12:00:09+00:00,RCL,$102.01,103.94%,$31.28,$103.74,$93.25 +2020-07-03T12:00:09+00:00,SPGI,$393.25,16.89%,$286.62,$478.05,$384.16 +2020-07-03T12:00:09+00:00,CRM,$209.59,6.00%,$128.27,$309.96,$211.89 +2020-07-03T12:00:09+00:00,SBAC,$240.85,-19.75%,$220.69,$389.02,$227.46 +2020-07-03T12:00:09+00:00,SLB,$53.35,200.58%,$13.51,$57.87,$47.28 +2020-07-03T12:00:09+00:00,STX,$60.28,41.48%,$39.31,$108.75,$61.27 +2020-07-03T12:00:09+00:00,SEE,$40.94,23.16%,$31.78,$70.17,$39.46 +2020-07-03T12:00:09+00:00,SRE,$144.13,25.93%,$108.80,$175.65,$145.87 +2020-07-03T12:00:09+00:00,NOW,$552.98,32.79%,$341.76,$701.73,$548.28 +2020-07-03T12:00:09+00:00,SHW,$255.42,31.23%,$189.33,$351.34,$245.75 +2020-07-03T12:00:09+00:00,SPG,$118.55,89.66%,$55.90,$168.71,$110.24 +2020-07-03T12:00:09+00:00,SWKS,$108.34,-13.08%,$77.94,$191.17,$106.11 +2020-07-03T12:00:09+00:00,SLG,$31.47,-31.95%,$19.96,$83.92,$26.27 +2020-07-03T12:00:09+00:00,SNA,$280.73,121.29%,$119.34,$288.19,$270.70 +2020-07-03T12:00:09+00:00,SO,$70.68,44.56%,$48.27,$80.16,$70.46 +2020-07-03T12:00:09+00:00,LUV,$37.59,9.59%,$28.54,$64.10,$32.92 +2020-07-03T12:00:09+00:00,SWK,$90.18,-34.57%,$71.66,$218.12,$86.26 +2020-07-03T12:00:09+00:00,SBUX,$96.05,35.19%,$68.10,$120.92,$98.98 +2020-07-03T12:00:09+00:00,STT,$73.88,19.38%,$55.36,$103.77,$72.15 +2020-07-03T12:00:09+00:00,STE,$217.85,43.88%,$147.97,$252.92,$210.50 +2020-07-03T12:00:09+00:00,SYK,$294.27,62.49%,$175.06,$305.09,$287.86 +Could not fetch closing data +2020-07-03T12:00:09+00:00,SYF,$33.61,53.98%,$20.43,$51.85,$32.92 +2020-07-03T12:00:09+00:00,SNPS,$431.29,116.30%,$191.04,$464.83,$436.82 +2020-07-03T12:00:09+00:00,SYY,$74.33,43.42%,$49.15,$89.74,$72.60 +2020-07-03T12:00:09+00:00,TMUS,$138.97,30.15%,$101.62,$152.41,$134.20 +2020-07-03T12:00:09+00:00,TROW,$110.23,-8.38%,$98.07,$223.87,$110.22 +2020-07-03T12:00:09+00:00,TTWO,$143.19,-1.71%,$93.57,$213.34,$139.64 +2020-07-03T12:00:09+00:00,TPR,$42.59,229.24%,$12.11,$48.21,$42.46 +2020-07-03T12:00:09+00:00,TGT,$130.05,12.05%,$114.56,$265.24,$132.94 +2020-07-03T12:00:09+00:00,TEL,$139.82,77.97%,$75.01,$161.37,$131.26 +2020-07-03T12:00:09+00:00,FTI,$17.14,198.40%,$3.97,$17.14,$15.06 +2020-07-03T12:00:09+00:00,TFX,$235.92,-35.05%,$185.95,$439.09,$238.72 +2020-07-03T12:00:09+00:00,TXN,$173.70,38.34%,$124.49,$201.29,$174.00 +2020-07-03T12:00:09+00:00,TXT,$67.53,104.08%,$30.01,$78.11,$65.26 +2020-07-03T12:00:09+00:00,BK,$44.38,20.97%,$31.81,$63.66,$43.24 +2020-07-03T12:00:09+00:00,CLX,$157.99,-25.65%,$122.57,$229.26,$157.82 +2020-07-03T12:00:09+00:00,COO,$378.38,32.72%,$248.67,$455.89,$368.19 +2020-07-03T12:00:09+00:00,HSY,$242.98,98.73%,$119.72,$275.28,$256.22 +2020-07-03T12:00:09+00:00,MOS,$36.75,183.99%,$11.50,$78.15,$34.68 +2020-07-03T12:00:09+00:00,TRV,$171.65,55.34%,$104.40,$193.92,$173.65 +2020-07-03T12:00:09+00:00,DIS,$88.64,-22.54%,$84.17,$201.91,$90.06 +2020-07-03T12:00:09+00:00,TMO,$513.73,34.79%,$377.80,$667.24,$520.05 +Could not fetch closing data +2020-07-03T12:00:09+00:00,TJX,$82.70,60.03%,$48.95,$84.79,$80.34 +2020-07-03T12:00:09+00:00,TSCO,$216.86,69.42%,$123.21,$248.77,$216.93 +2020-07-03T12:00:09+00:00,TT,$189.19,109.71%,$88.02,$204.40,$180.06 +2020-07-03T12:00:09+00:00,TDG,$883.08,102.78%,$410.98,$896.45,$828.07 +2020-07-03T12:00:09+00:00,TFC,$31.88,-7.80%,$26.21,$66.92,$31.37 +Could not fetch closing data +2020-07-03T12:00:09+00:00,TSN,$51.76,-9.21%,$47.28,$98.60,$50.83 +2020-07-03T12:00:09+00:00,USB,$33.54,-4.11%,$28.68,$63.25,$32.31 +2020-07-03T12:00:09+00:00,UDR,$42.65,18.53%,$28.50,$60.42,$41.79 +2020-07-03T12:00:09+00:00,ULTA,$471.63,125.66%,$191.29,$551.43,$445.76 +2020-07-03T12:00:09+00:00,UAA,$7.35,-25.83%,$6.62,$26.96,$7.40 +2020-07-03T12:00:09+00:00,UA,$6.80,-24.44%,$5.92,$22.63,$6.81 +2020-07-03T12:00:09+00:00,UNP,$202.82,25.68%,$155.59,$268.21,$200.14 +2020-07-03T12:00:09+00:00,UAL,$55.39,57.31%,$30.17,$62.45,$51.68 +2020-07-03T12:00:09+00:00,UNH,$461.58,55.77%,$284.92,$555.15,$479.85 +2020-07-03T12:00:09+00:00,UPS,$179.76,62.34%,$109.19,$230.44,$173.46 +2020-07-03T12:00:09+00:00,URI,$433.57,189.83%,$142.57,$477.49,$394.99 +2020-07-03T12:00:09+00:00,UHS,$150.96,60.34%,$87.81,$159.93,$143.54 +2020-07-03T12:00:09+00:00,UNM,$49.01,217.11%,$14.17,$49.01,$45.95 +2020-07-03T12:00:09+00:00,VFC,$18.66,-69.22%,$17.02,$88.30,$18.72 +2020-07-03T12:00:09+00:00,VLO,$114.88,125.18%,$33.28,$149.96,$112.76 +Could not fetch closing data +2020-07-03T12:00:09+00:00,VTR,$47.90,35.52%,$32.51,$63.64,$45.59 +2020-07-03T12:00:09+00:00,VRSN,$222.45,4.83%,$156.51,$255.93,$222.86 +2020-07-03T12:00:09+00:00,VRSK,$224.97,30.43%,$158.23,$230.03,$222.18 +2020-07-03T12:00:09+00:00,VZ,$35.90,-23.03%,$33.63,$53.28,$35.26 +2020-07-03T12:00:09+00:00,VRTX,$338.18,16.09%,$177.01,$351.91,$339.53 +Could not fetch closing data +2020-07-03T12:00:09+00:00,V,$236.45,20.86%,$177.65,$249.74,$228.05 +2020-07-03T12:00:09+00:00,VNO,$18.50,-46.04%,$12.38,$48.39,$15.60 +2020-07-03T12:00:09+00:00,VMC,$217.38,80.18%,$114.18,$225.44,$209.05 +2020-07-03T12:00:09+00:00,WRB,$59.86,63.78%,$35.63,$76.28,$57.96 +2020-07-03T12:00:09+00:00,WAB,$109.64,84.78%,$55.21,$109.67,$101.43 +2020-07-03T12:00:09+00:00,WBA,$29.10,-29.73%,$28.37,$56.32,$30.68 +2020-07-03T12:00:09+00:00,WMT,$153.49,35.32%,$113.43,$158.20,$152.89 +2020-07-03T12:00:09+00:00,WM,$170.01,65.77%,$99.50,$175.29,$165.37 +2020-07-03T12:00:09+00:00,WAT,$264.15,43.28%,$184.36,$424.70,$260.09 +2020-07-03T12:00:09+00:00,WEC,$88.98,8.19%,$75.30,$105.06,$88.82 +2020-07-03T12:00:09+00:00,WFC,$42.77,72.33%,$20.67,$59.06,$41.65 +2020-07-03T12:00:09+00:00,WELL,$79.81,62.11%,$46.30,$98.31,$78.63 +2020-07-03T12:00:09+00:00,WST,$371.60,59.28%,$209.34,$471.12,$357.97 +2020-07-03T12:00:09+00:00,WDC,$37.67,-12.29%,$30.21,$77.17,$38.94 +2020-07-03T12:00:09+00:00,WU,$11.54,-43.16%,$10.34,$25.52,$11.64 +2020-07-03T12:00:09+00:00,WRK,$29.00,4.35%,$25.32,$60.65,$28.72 +2020-07-03T12:00:09+00:00,WY,$33.45,60.33%,$20.52,$42.22,$30.58 +2020-07-03T12:00:09+00:00,WHR,$148.28,16.43%,$126.09,$246.15,$142.14 +2020-07-03T12:00:09+00:00,WMB,$32.73,87.42%,$16.52,$37.82,$30.75 +Could not fetch closing data +2020-07-03T12:00:09+00:00,WYNN,$101.32,32.10%,$52.02,$140.00,$102.87 +2020-07-03T12:00:09+00:00,XEL,$62.93,1.68%,$57.22,$77.41,$63.36 +2020-07-03T12:00:09+00:00,XRX,$15.10,1.73%,$13.08,$25.76,$14.71 +Could not fetch closing data +2020-07-03T12:00:09+00:00,XYL,$109.57,66.28%,$64.51,$137.28,$108.30 +2020-07-03T12:00:09+00:00,YUM,$133.45,59.18%,$81.82,$142.24,$134.31 +2020-07-03T12:00:09+00:00,ZBRA,$295.22,12.84%,$226.88,$614.55,$277.35 +2020-07-03T12:00:09+00:00,ZBH,$140.86,24.13%,$101.65,$172.53,$137.52 +2020-07-03T12:00:09+00:00,ZION,$28.98,-9.16%,$19.93,$74.31,$28.52 +2020-07-03T12:00:09+00:00,ZTS,$167.14,21.77%,$131.14,$246.63,$167.88 \ No newline at end of file diff --git a/src/actors/mod.rs b/src/actors/mod.rs new file mode 100644 index 0000000..a3475d3 --- /dev/null +++ b/src/actors/mod.rs @@ -0,0 +1,112 @@ +use actix::{Actor, Context, Handler, Message, ResponseFuture}; +use chrono::{DateTime, Utc}; +use tokio::{fs::OpenOptions, io::AsyncWriteExt}; + +use crate::utils::fetch_stock_data; + +#[derive(Debug)] +pub struct MonoActor {} + +impl Actor for MonoActor { + type Context = Context; +} + +#[derive(Message)] +#[rtype(result = "Result")] +pub struct MonoMessage { + pub content: String, + pub from: DateTime, + pub to: DateTime, +} + +impl Handler for MonoActor { + type Result = ResponseFuture>; + fn handle(&mut self, msg: MonoMessage, _: &mut Self::Context) -> Self::Result { + Box::pin(async move { + let content = msg.content; + let from = msg.from; + let to = msg.to; + let csv_content = fetch_stock_data(&content, &from, &to).await?; + Ok(csv_content) + }) + } +} + +pub struct DataLoadActor {} + +impl Actor for DataLoadActor { + type Context = Context; +} + +#[derive(Message)] +#[rtype(result = "Result")] +pub struct DataLoadMessage { + pub path: String, +} + +impl Handler for DataLoadActor { + type Result = ResponseFuture>; + fn handle(&mut self, msg: DataLoadMessage, _: &mut Self::Context) -> Self::Result { + Box::pin(async move { + let path = msg.path; + let content = tokio::fs::read_to_string(path).await?; + Ok(content) + }) + } +} + +pub struct DataProcessActor {} + +impl Actor for DataProcessActor { + type Context = Context; +} + +#[derive(Message)] +#[rtype(result = "Result")] +pub struct DataProcessMessage { + pub content: String, + pub from: DateTime, + pub to: DateTime, +} + +impl Handler for DataProcessActor { + type Result = ResponseFuture>; + fn handle(&mut self, msg: DataProcessMessage, _: &mut Self::Context) -> Self::Result { + Box::pin(async move { + let content = msg.content; + let from = msg.from; + let to = msg.to; + let csv_content = fetch_stock_data(&content, &from, &to).await?; + Ok(csv_content) + }) + } +} + +pub struct DataSaveActor {} +impl Actor for DataSaveActor { + type Context = Context; +} + +#[derive(Message)] +#[rtype(result = "Result<(), std::io::Error>")] +pub struct DataSaveMessage { + pub path: String, + pub content: String, +} + +impl Handler for DataSaveActor { + type Result = ResponseFuture>; + fn handle(&mut self, msg: DataSaveMessage, _: &mut Self::Context) -> Self::Result { + Box::pin(async move { + let path = msg.path; + let content = msg.content; + let mut file = OpenOptions::new() + .append(true) + .create(true) + .open(path) + .await?; + file.write_all(content.as_bytes()).await?; + Ok(()) + }) + } +} diff --git a/src/lib.rs b/src/lib.rs index 7729639..b84c924 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,4 @@ +pub mod actors; pub mod calculations; pub mod types; pub mod utils; diff --git a/src/main.rs b/src/main.rs index 06e78f8..569ae52 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,24 +1,70 @@ +use std::{error::Error, time::Duration}; + +use actix::Actor; +use chrono::{DateTime, Utc}; use clap::Parser; -use manning_lp_async_rust_project::{types::Opts, utils::fetch_stock_data}; +use manning_lp_async_rust_project::{ + actors::{ + DataLoadActor, DataLoadMessage, DataProcessActor, DataProcessMessage, DataSaveActor, + DataSaveMessage, + }, + types::Opts, +}; -use chrono::prelude::*; -use tokio::{fs, time}; +use tokio::time; -#[tokio::main] -async fn main() { +#[actix_rt::main] +async fn main() -> Result<(), Box> { let opts = Opts::parse(); let from: DateTime = opts.from.parse().expect("Couldn't parse 'from' date"); let to = Utc::now(); + let mut interval = time::interval(Duration::from_secs(30)); + let path = "sp500.may.2020.txt"; + let save_path = path.replace(".txt", ".csv"); + // let content = fs::read_to_string(path).await?; - let csv_content = fs::read_to_string("sp500.may.2020.txt") - .await - .expect("Couldn't read symbols file"); - + // let mono_addr = MonoActor {}.start(); + let data_load_addr = DataLoadActor {}.start(); + let data_process_addr = DataProcessActor {}.start(); + let data_save_addr = DataSaveActor {}.start(); // a simple way to output a CSV header + let mut iterations = 1; println!("period start,symbol,price,change %,min,max,30d avg"); - let mut interval = time::interval(time::Duration::from_secs(30)); loop { - fetch_stock_data(csv_content.as_str(), &from, &to).await; + // let mono_process = mono_addr + // .send(MonoMessage { + // content: content.to_string(), + // from: from.clone(), + // to: to.clone(), + // }) + // .await??; + // println!("{}\niteration #{}", mono_process, iterations); + let data_load_process = data_load_addr + .send(DataLoadMessage { + path: path.to_string(), + }) + .await??; + + let data_process_process = data_process_addr + .send(DataProcessMessage { + content: data_load_process.to_string(), + from: from.clone(), + to: to.clone(), + }) + .await??; + + data_save_addr + .send(DataSaveMessage { + content: data_process_process.to_string(), + path: save_path.to_string(), + }) + .await??; + iterations += 1; + if iterations > 2 { + break; + } + interval.tick().await; } + Ok(()) } diff --git a/src/utils/mod.rs b/src/utils/mod.rs index 3a8748b..ff0e059 100644 --- a/src/utils/mod.rs +++ b/src/utils/mod.rs @@ -35,10 +35,14 @@ pub async fn fetch_closing_data( } } -pub async fn fetch_stock_data(content: &str, from: &DateTime, to: &DateTime) { +pub async fn fetch_stock_data( + content: &str, + from: &DateTime, + to: &DateTime, +) -> Result { let csv_symbols = content.split(','); let mut handles = vec![]; - + let mut lines = vec!["period start,symbol,price,change %,min,max,30d avg".to_string()]; for symbol in csv_symbols { handles.push(tokio::spawn(fetch_symbol( symbol.to_owned(), @@ -48,51 +52,53 @@ pub async fn fetch_stock_data(content: &str, from: &DateTime, to: &DateTime } for handle in handles { - handle.await.unwrap(); + lines.push(handle.await.unwrap()); } + + Ok(lines.join("\n")) } -async fn fetch_symbol(symbol: String, from: DateTime, to: DateTime) { +async fn fetch_symbol(symbol: String, from: DateTime, to: DateTime) -> String { let closes_fetched = fetch_closing_data(&symbol, &from, &to).await; if closes_fetched.is_err() { - eprintln!("Error fetch closing data for {}", symbol); - return; + return "Could not fetch closing data".to_string(); } let closes = closes_fetched.unwrap(); - if !closes.is_empty() { - // min/max of the period. unwrap() because those are Option types - let max_signal = MaxPrice {}; + if closes.is_empty() { + return "Retrieved Series is is empty".to_string(); + } + // min/max of the period. unwrap() because those are Option types + let max_signal = MaxPrice {}; - let min_signal = MinPrice {}; + let min_signal = MinPrice {}; - let last_price = *closes.last().unwrap_or(&0.0); + let last_price = *closes.last().unwrap_or(&0.0); - let price_diff_signal = PriceDifference {}; + let price_diff_signal = PriceDifference {}; - // .await - // .unwrap_or((0.0, 0.0)); - let sma_signal = WindowedSMA { window_size: 30 }; + // .await + // .unwrap_or((0.0, 0.0)); + let sma_signal = WindowedSMA { window_size: 30 }; - let (period_max, period_min, price_diff, sma) = join!( - max_signal.calculate(&closes), - min_signal.calculate(&closes), - price_diff_signal.calculate(&closes), - sma_signal.calculate(&closes) - ); + let (period_max, period_min, price_diff, sma) = join!( + max_signal.calculate(&closes), + min_signal.calculate(&closes), + price_diff_signal.calculate(&closes), + sma_signal.calculate(&closes) + ); - let (_, pct_change) = price_diff.unwrap_or((0.0, 0.0)); + let (_, pct_change) = price_diff.unwrap_or((0.0, 0.0)); - // a simple way to output CSV data - println!( - "{},{},${:.2},{:.2}%,${:.2},${:.2},${:.2}", - from.to_rfc3339(), - symbol, - last_price, - pct_change * 100.0, - period_min.unwrap(), - period_max.unwrap(), - sma.unwrap().last().unwrap_or(&0.0) - ); - } + // a simple way to output CSV data + format!( + "{},{},${:.2},{:.2}%,${:.2},${:.2},${:.2}", + from.to_rfc3339(), + symbol, + last_price, + pct_change * 100.0, + period_min.unwrap(), + period_max.unwrap(), + sma.unwrap().last().unwrap_or(&0.0) + ) }