From 5502ececefd6a90298d1a539981869d63380e443 Mon Sep 17 00:00:00 2001 From: Carlos Queiroz Date: Sun, 10 Apr 2016 13:07:35 +0800 Subject: [PATCH 01/10] first commit. --- .gitignore | 30 +++++ .idea/uiDesigner.xml | 124 ++++++++++++++++++ pom.xml | 100 +++++++------- src/main/java/JavaApiStreaming.java | 80 ----------- .../fx/oanda/streaming/FXOandaStreaming.java | 63 +++++++++ .../java/io/cax/fx/oanda/streaming/Tick.java | 19 +++ 6 files changed, 287 insertions(+), 129 deletions(-) create mode 100644 .idea/uiDesigner.xml delete mode 100644 src/main/java/JavaApiStreaming.java create mode 100644 src/main/java/io/cax/fx/oanda/streaming/FXOandaStreaming.java create mode 100644 src/main/java/io/cax/fx/oanda/streaming/Tick.java diff --git a/.gitignore b/.gitignore index eb5a316..0f13eb8 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,31 @@ target +### Java template +*.class + +*.iml + +.idea + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* +### JetBrains template +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff: +.idea/ + +application.properties + +# IntelliJ +/out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +### Maven template +target/ diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..e96534f --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index 8298b6a..4701611 100644 --- a/pom.xml +++ b/pom.xml @@ -1,69 +1,71 @@ - 4.0.0 - Oanda - streaming-example-java - 1 + io.cax.fx + oanda.streaming + 0.0.1-SNAPSHOT + jar + + oanda.streaming + Demo project for Spring Boot + + + org.springframework.boot + spring-boot-starter-parent + 1.3.3.RELEASE + + + + + UTF-8 + 1.8 + - org.apache.httpcomponents - httpclient - 4.3 - compile + org.springframework.boot + spring-boot-starter-actuator + + + + + + + org.springframework.boot + spring-boot-devtools + + + org.springframework.boot + spring-boot-starter-web + + + + + + + + + + + - com.googlecode.json-simple - json-simple - 1.1 - compile + org.springframework.boot + spring-boot-starter-test + test - org.apache.maven.plugins - maven-compiler-plugin - 2.3.2 + org.springframework.boot + spring-boot-maven-plugin - - - org.apache.maven.plugins - maven-jar-plugin - - - - true - dependency-jars/ - JavaApiStreaming - - - - - - - org.apache.maven.plugins - maven-dependency-plugin - 2.5.1 - - - copy-dependencies - package - - copy-dependencies - - - ${project.build.directory}/dependency-jars/ - - - - - + diff --git a/src/main/java/JavaApiStreaming.java b/src/main/java/JavaApiStreaming.java deleted file mode 100644 index 3bf5e57..0000000 --- a/src/main/java/JavaApiStreaming.java +++ /dev/null @@ -1,80 +0,0 @@ -import java.io.IOException; -import java.io.InputStream; -import java.io.BufferedReader; -import java.io.InputStreamReader; -import java.util.Date; - -import org.apache.http.*; -import org.apache.http.client.methods.*; -import org.apache.http.impl.client.BasicResponseHandler; -import org.apache.http.impl.client.HttpClientBuilder; -import org.apache.http.client.HttpClient; -import org.apache.http.message.BasicHeader; -import org.apache.http.util.EntityUtils; - -import org.json.simple.JSONObject; -import org.json.simple.JSONValue; - -public class JavaApiStreaming { - public static void main (String[]args) throws IOException { - - HttpClient httpClient = HttpClientBuilder.create().build(); - - try { - - // Set these variables to whatever personal ones are preferred - String domain = "https://stream-fxpractice.oanda.com"; - String access_token = "ACCESS-TOKEN"; - String account_id = "1234567"; - String instruments = "EUR_USD,USD_JPY,EUR_JPY"; - - - HttpUriRequest httpGet = new HttpGet(domain + "/v1/prices?accountId=" + account_id + "&instruments=" + instruments); - httpGet.setHeader(new BasicHeader("Authorization", "Bearer " + access_token)); - - System.out.println("Executing request: " + httpGet.getRequestLine()); - - HttpResponse resp = httpClient.execute(httpGet); - HttpEntity entity = resp.getEntity(); - - if (resp.getStatusLine().getStatusCode() == 200 && entity != null) { - InputStream stream = entity.getContent(); - String line; - BufferedReader br = new BufferedReader(new InputStreamReader(stream)); - - while ((line = br.readLine()) != null) { - - Object obj = JSONValue.parse(line); - JSONObject tick = (JSONObject) obj; - - // unwrap if necessary - if (tick.containsKey("tick")) { - tick = (JSONObject) tick.get("tick"); - } - - // ignore heartbeats - if (tick.containsKey("instrument")) { - System.out.println("-------"); - - String instrument = tick.get("instrument").toString(); - String time = tick.get("time").toString(); - double bid = Double.parseDouble(tick.get("bid").toString()); - double ask = Double.parseDouble(tick.get("ask").toString()); - - System.out.println(instrument); - System.out.println(time); - System.out.println(bid); - System.out.println(ask); - } - } - } else { - // print error message - String responseString = EntityUtils.toString(entity, "UTF-8"); - System.out.println(responseString); - } - - } finally { - httpClient.getConnectionManager().shutdown(); - } - } -} diff --git a/src/main/java/io/cax/fx/oanda/streaming/FXOandaStreaming.java b/src/main/java/io/cax/fx/oanda/streaming/FXOandaStreaming.java new file mode 100644 index 0000000..bc692d0 --- /dev/null +++ b/src/main/java/io/cax/fx/oanda/streaming/FXOandaStreaming.java @@ -0,0 +1,63 @@ +package io.cax.fx.oanda.streaming; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.CommandLineRunner; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.client.RestOperations; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.util.UriComponents; +import org.springframework.web.util.UriComponentsBuilder; + +import java.io.IOException; +import java.util.Scanner; + + +@SpringBootApplication +public class FXOANDAStreaming implements CommandLineRunner{ + + @Value("${oanda.access_token}") + private String accessToken; + + @Value("${oanda.account_id}") + private String accountId; + + + @Value("${oanda.domain}") + private String domain; + + private RestOperations restTemplate; + + public static void main (String[]args) throws IOException { + SpringApplication.run(FXOANDAStreaming.class, args); + } + + @Override + public void run(String... strings) throws Exception { + + restTemplate = new RestTemplate(); + + String instruments = "EUR_USD,USD_JPY,EUR_JPY"; + + UriComponents uriComponents = UriComponentsBuilder.fromUriString(domain).path("/v1/prices").queryParam("accountId",accountId).queryParam("instruments",instruments).build(); + + restTemplate.execute(uriComponents.toUriString(), + HttpMethod.GET, + clientHttpRequest -> clientHttpRequest.getHeaders().add("Authorization","Bearer " + accessToken), + clientHttpResponse -> { + + try(Scanner scanner = new Scanner(clientHttpResponse.getBody(),"utf-8")){ + scanner.useDelimiter("\\n"); + while(scanner.hasNext()) System.out.println(scanner.next()); + } + + return new ResponseEntity<>(HttpStatus.OK); + }, + Object.class); + + } + +} diff --git a/src/main/java/io/cax/fx/oanda/streaming/Tick.java b/src/main/java/io/cax/fx/oanda/streaming/Tick.java new file mode 100644 index 0000000..ceef3f8 --- /dev/null +++ b/src/main/java/io/cax/fx/oanda/streaming/Tick.java @@ -0,0 +1,19 @@ +package io.cax.fx.oanda.streaming; + +/** + * Created by cq on 10/4/16. + */ +public class Tick { + + //{"tick":{"instrument":"EUR_USD","time":"2016-04-08T20:59:58.540499Z","bid":1.13929,"ask":1.14029}} + + private String instrument; + private double bid; + private double ask; + private String currentTime; + + + + + +} From 4801b656674d0cb6e3ceebc3d9bb094bfbbb6527 Mon Sep 17 00:00:00 2001 From: Carlos Queiroz Date: Sun, 10 Apr 2016 13:32:20 +0800 Subject: [PATCH 02/10] Add generic application.properties. --- .gitignore | 2 +- .../fx/oanda/streaming/FXOandaStreaming.java | 15 +++++++-------- .../java/io/cax/fx/oanda/streaming/Tick.java | 19 ------------------- src/main/resources/application.properties | 3 +++ 4 files changed, 11 insertions(+), 28 deletions(-) delete mode 100644 src/main/java/io/cax/fx/oanda/streaming/Tick.java create mode 100644 src/main/resources/application.properties diff --git a/.gitignore b/.gitignore index 0f13eb8..a0ed885 100644 --- a/.gitignore +++ b/.gitignore @@ -19,7 +19,7 @@ hs_err_pid* # User-specific stuff: .idea/ -application.properties +/src/main/resources/application-local.properties # IntelliJ /out/ diff --git a/src/main/java/io/cax/fx/oanda/streaming/FXOandaStreaming.java b/src/main/java/io/cax/fx/oanda/streaming/FXOandaStreaming.java index bc692d0..75aa795 100644 --- a/src/main/java/io/cax/fx/oanda/streaming/FXOandaStreaming.java +++ b/src/main/java/io/cax/fx/oanda/streaming/FXOandaStreaming.java @@ -1,5 +1,7 @@ package io.cax.fx.oanda.streaming; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; @@ -19,6 +21,8 @@ @SpringBootApplication public class FXOANDAStreaming implements CommandLineRunner{ + Logger logger = LoggerFactory.getLogger(FXOANDAStreaming.class); + @Value("${oanda.access_token}") private String accessToken; @@ -48,16 +52,11 @@ public void run(String... strings) throws Exception { HttpMethod.GET, clientHttpRequest -> clientHttpRequest.getHeaders().add("Authorization","Bearer " + accessToken), clientHttpResponse -> { - try(Scanner scanner = new Scanner(clientHttpResponse.getBody(),"utf-8")){ - scanner.useDelimiter("\\n"); - while(scanner.hasNext()) System.out.println(scanner.next()); + while(scanner.hasNext()) logger.info(scanner.nextLine()); } - return new ResponseEntity<>(HttpStatus.OK); }, - Object.class); - + String.class); } - -} +} \ No newline at end of file diff --git a/src/main/java/io/cax/fx/oanda/streaming/Tick.java b/src/main/java/io/cax/fx/oanda/streaming/Tick.java deleted file mode 100644 index ceef3f8..0000000 --- a/src/main/java/io/cax/fx/oanda/streaming/Tick.java +++ /dev/null @@ -1,19 +0,0 @@ -package io.cax.fx.oanda.streaming; - -/** - * Created by cq on 10/4/16. - */ -public class Tick { - - //{"tick":{"instrument":"EUR_USD","time":"2016-04-08T20:59:58.540499Z","bid":1.13929,"ask":1.14029}} - - private String instrument; - private double bid; - private double ask; - private String currentTime; - - - - - -} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 0000000..ebe126f --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1,3 @@ +oanda.domain= +oanda.access_token= +oanda.account_id= \ No newline at end of file From e263f327aadda38a3149ab1fd9a9b11c215104a6 Mon Sep 17 00:00:00 2001 From: Carlos Queiroz Date: Sun, 10 Apr 2016 13:33:28 +0800 Subject: [PATCH 03/10] Modify pom.xml. remove not used libs. --- pom.xml | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/pom.xml b/pom.xml index 4701611..cb9f2bb 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ jar oanda.streaming - Demo project for Spring Boot + Demo FX OANDA Streaming with Spring Boot org.springframework.boot @@ -28,10 +28,6 @@ org.springframework.boot spring-boot-starter-actuator - - - - org.springframework.boot spring-boot-devtools @@ -41,16 +37,6 @@ spring-boot-starter-web - - - - - - - - - - org.springframework.boot spring-boot-starter-test From 4bf81ece7c78f1d3fc0146e7db85726f74c14da2 Mon Sep 17 00:00:00 2001 From: Carlos Queiroz Date: Sun, 10 Apr 2016 13:42:29 +0800 Subject: [PATCH 04/10] Moves instruments to application.properties. - change README file. --- README.md | 12 ++++++------ .../io/cax/fx/oanda/streaming/FXOandaStreaming.java | 5 +++-- src/main/resources/application.properties | 3 ++- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 9252965..bebbb3e 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,16 @@ java-api-streaming ================== -A simple demo app in Java for getting streaming rates using OANDA -API. This example uses [apache httpcomponents](http://hc.apache.org/httpcomponents-client-ga/) for https -connections and [json-simple](https://code.google.com/p/json-simple/) for json decoding. +A simple demo app in Java 8 using Spring Boot for getting streaming rates using OANDA +API. This example uses [Spring (RestTemplate](https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html) for https +connections. ### Setup Clone this repo to the location of your choice. Modify the following variables in -[JavaApiStreaming.java](src/main/java/JavaApiStreaming.java): +[application.properites](src/main/resources/appllication.properties): domain access_token @@ -22,8 +22,8 @@ On Ubuntu, you can run `sudo apt-get install maven`. To create and execute the jar file, run - mvn package - java -jar target/streaming-example-java-1.jar + mvn clean package + java -jar target/oanda.streaming-0.0.1-SNAPSHOT.jar ### Sample Output diff --git a/src/main/java/io/cax/fx/oanda/streaming/FXOandaStreaming.java b/src/main/java/io/cax/fx/oanda/streaming/FXOandaStreaming.java index 75aa795..d601b8e 100644 --- a/src/main/java/io/cax/fx/oanda/streaming/FXOandaStreaming.java +++ b/src/main/java/io/cax/fx/oanda/streaming/FXOandaStreaming.java @@ -33,6 +33,9 @@ public class FXOANDAStreaming implements CommandLineRunner{ @Value("${oanda.domain}") private String domain; + @Value("${oanda.instruments}") + private String instruments; + private RestOperations restTemplate; public static void main (String[]args) throws IOException { @@ -44,8 +47,6 @@ public void run(String... strings) throws Exception { restTemplate = new RestTemplate(); - String instruments = "EUR_USD,USD_JPY,EUR_JPY"; - UriComponents uriComponents = UriComponentsBuilder.fromUriString(domain).path("/v1/prices").queryParam("accountId",accountId).queryParam("instruments",instruments).build(); restTemplate.execute(uriComponents.toUriString(), diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index ebe126f..2254c61 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,3 +1,4 @@ oanda.domain= oanda.access_token= -oanda.account_id= \ No newline at end of file +oanda.account_id= +oanda.instruments= \ No newline at end of file From 27d6177aa6de5e3ab20bce70da574e461be153cf Mon Sep 17 00:00:00 2001 From: Carlos Queiroz Date: Sun, 10 Apr 2016 13:43:42 +0800 Subject: [PATCH 05/10] change app name in README. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index bebbb3e..0277ec7 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -java-api-streaming +FX-OANDA-Streaming ================== A simple demo app in Java 8 using Spring Boot for getting streaming rates using OANDA From 28c2dc8368fc6658949f448dd03d2460f40d8c8c Mon Sep 17 00:00:00 2001 From: Carlos Queiroz Date: Sun, 10 Apr 2016 13:44:56 +0800 Subject: [PATCH 06/10] fix type with application.properties name. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0277ec7..fff8f9c 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ connections. Clone this repo to the location of your choice. Modify the following variables in -[application.properites](src/main/resources/appllication.properties): +[application.properites](src/main/resources/application.properties): domain access_token From d3485b07fcb41037e469e5857438ef6e05ea4575 Mon Sep 17 00:00:00 2001 From: Carlos Queiroz Date: Sun, 10 Apr 2016 14:32:03 +0800 Subject: [PATCH 07/10] Adds jackson to convert ticks to POJOs. - Modify README to add sample output. - ignore heartbeat messages. - add Tick POJO. --- README.md | 39 +++++++---- .../fx/oanda/streaming/FXOandaStreaming.java | 28 +++++++- .../cax/fx/oanda/streaming/domain/Tick.java | 68 +++++++++++++++++++ 3 files changed, 117 insertions(+), 18 deletions(-) create mode 100644 src/main/java/io/cax/fx/oanda/streaming/domain/Tick.java diff --git a/README.md b/README.md index fff8f9c..e06da22 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ Modify the following variables in instruments Maven is used for building. Install from http://maven.apache.org/download.cgi. -On Ubuntu, you can run `sudo apt-get install maven`. +On Ubuntu, you can run `sudo apt-get install maven`. On Mac using brew `brew install maven` To create and execute the jar file, run @@ -27,20 +27,29 @@ To create and execute the jar file, run ### Sample Output - EUR_USD - 2014-03-21T17:56:09.932922Z - 1.37912 - 1.37923 - ------- - USD_CAD - 2014-03-21T17:56:20.776248Z - 1.12011 - 1.12029 - ------- - USD_JPY - 2014-03-21T17:56:13.668154Z - 102.262 - 102.275 + 2016-04-10 14:28:57.068 INFO 84369 --- [ restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 + 2016-04-10 14:28:57.121 INFO 84369 --- [ restartedMain] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup + 2016-04-10 14:28:57.132 INFO 84369 --- [ restartedMain] o.s.c.support.DefaultLifecycleProcessor : Starting beans in phase 0 + 2016-04-10 14:28:57.305 INFO 84369 --- [ restartedMain] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http) + 2016-04-10 14:28:58.809 INFO 84369 --- [ restartedMain] i.c.fx.oanda.streaming.FXOANDAStreaming : { + "instrument" : "EUR_USD", + "bid" : 1.13929, + "ask" : 1.14029, + "time" : "2016-04-08T21:08:58.499" + } + 2016-04-10 14:28:58.813 INFO 84369 --- [ restartedMain] i.c.fx.oanda.streaming.FXOANDAStreaming : { + "instrument" : "USD_JPY", + "bid" : 108.028, + "ask" : 108.128, + "time" : "2016-04-08T21:09:00.391" + } + 2016-04-10 14:28:58.819 INFO 84369 --- [ restartedMain] i.c.fx.oanda.streaming.FXOANDAStreaming : { + "instrument" : "EUR_JPY", + "bid" : 123.133, + "ask" : 123.233, + "time" : "2016-04-08T21:08:59.84" + } + ### More Information diff --git a/src/main/java/io/cax/fx/oanda/streaming/FXOandaStreaming.java b/src/main/java/io/cax/fx/oanda/streaming/FXOandaStreaming.java index d601b8e..c90c066 100644 --- a/src/main/java/io/cax/fx/oanda/streaming/FXOandaStreaming.java +++ b/src/main/java/io/cax/fx/oanda/streaming/FXOandaStreaming.java @@ -1,5 +1,9 @@ package io.cax.fx.oanda.streaming; +import com.fasterxml.jackson.core.util.DefaultPrettyPrinter; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import io.cax.fx.oanda.streaming.domain.Tick; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; @@ -47,6 +51,7 @@ public void run(String... strings) throws Exception { restTemplate = new RestTemplate(); + UriComponents uriComponents = UriComponentsBuilder.fromUriString(domain).path("/v1/prices").queryParam("accountId",accountId).queryParam("instruments",instruments).build(); restTemplate.execute(uriComponents.toUriString(), @@ -54,10 +59,27 @@ public void run(String... strings) throws Exception { clientHttpRequest -> clientHttpRequest.getHeaders().add("Authorization","Bearer " + accessToken), clientHttpResponse -> { try(Scanner scanner = new Scanner(clientHttpResponse.getBody(),"utf-8")){ - while(scanner.hasNext()) logger.info(scanner.nextLine()); + + while(scanner.hasNext()) formatPrintContent(scanner.nextLine()); } return new ResponseEntity<>(HttpStatus.OK); - }, - String.class); + }); + } + + private void formatPrintContent(String content){ + + ObjectMapper mapper = new ObjectMapper(); + + try { + + mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true); + Tick tick = mapper.readValue(content,Tick.class); + logger.info(mapper.writer(new DefaultPrettyPrinter()).writeValueAsString(tick)); + + } catch (IOException e) { + logger.debug("heartbeat not processed: " + e.getMessage()); + } + + } } \ No newline at end of file diff --git a/src/main/java/io/cax/fx/oanda/streaming/domain/Tick.java b/src/main/java/io/cax/fx/oanda/streaming/domain/Tick.java new file mode 100644 index 0000000..dbd17d8 --- /dev/null +++ b/src/main/java/io/cax/fx/oanda/streaming/domain/Tick.java @@ -0,0 +1,68 @@ +package io.cax.fx.oanda.streaming.domain; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonRootName; + +import java.util.Date; + +/** + * Created by cq on 10/4/16. + */ +@JsonRootName(value = "tick") +public class Tick { + + //{"tick":{"instrument":"EUR_USD","time":"2016-04-08T20:59:58.540499Z","bid":1.13929,"ask":1.14029}} + private String instrument; + + @JsonProperty("time") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.S", locale = "ENGLISH") + private Date dateTime; + + private double bid; + + private double ask; + + public String getInstrument() { + return instrument; + } + + public void setInstrument(String instrument) { + this.instrument = instrument; + } + + public Date getDateTime() { + return dateTime; + } + + public void setDateTime(Date dateTime) { + this.dateTime = dateTime; + } + + public double getBid() { + return bid; + } + + public void setBid(double bid) { + this.bid = bid; + } + + public double getAsk() { + return ask; + } + + public void setAsk(double ask) { + this.ask = ask; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("Tick{"); + sb.append("instrument='").append(instrument).append('\''); + sb.append(", dateTime=").append(dateTime); + sb.append(", bid=").append(bid); + sb.append(", ask=").append(ask); + sb.append('}'); + return sb.toString(); + } +} From 4d8e46b92b359c9917b84b601a64eb26e1c3c9ae Mon Sep 17 00:00:00 2001 From: Carlos Queiroz Date: Sun, 10 Apr 2016 14:37:53 +0800 Subject: [PATCH 08/10] fix typo README. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e06da22..29e9d47 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ FX-OANDA-Streaming ================== A simple demo app in Java 8 using Spring Boot for getting streaming rates using OANDA -API. This example uses [Spring (RestTemplate](https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html) for https +API. This example uses [Spring RestTemplate](https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html) for https connections. ### Setup From b48c2494e3043c478d9fd2c9a2113949dcde9a36 Mon Sep 17 00:00:00 2001 From: Carlos Queiroz Date: Sun, 10 Apr 2016 14:39:53 +0800 Subject: [PATCH 09/10] add instruments example - README. --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 29e9d47..7153ae5 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,10 @@ Modify the following variables in domain access_token account_id - instruments + instruments + +Make sure you separate the instruments by comma (e.g: EUR_USD,USD_JPY,EUR_JPY). + Maven is used for building. Install from http://maven.apache.org/download.cgi. On Ubuntu, you can run `sudo apt-get install maven`. On Mac using brew `brew install maven` From 7ee262534588a3586e4d46f92c584cb2b45b9d74 Mon Sep 17 00:00:00 2001 From: Carlos Queiroz Date: Mon, 11 Apr 2016 09:25:01 +0800 Subject: [PATCH 10/10] remove .idea folder. --- .idea/uiDesigner.xml | 124 ------------------------------------------- 1 file changed, 124 deletions(-) delete mode 100644 .idea/uiDesigner.xml diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml deleted file mode 100644 index e96534f..0000000 --- a/.idea/uiDesigner.xml +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file