# API of Crypto market
![](./introduction.jpg)<br/>
Session of managing ordering, getting data of historical bars and market, and crypto market from server for JavaScript apps.<br/>
[`IntenseLabCryptoMarket`](references/IntenseLabCryptoMarket.md) is API for transfer data between browser and server via WebSocket,
it has 4 channels for receiving / sending data from server: [`ExecutionDataClient`](references/clients/CryptoExecutionDataClient.md);
[`HistoricalDataClient`](references/clients/CryptoHistoricalDataClient.md); [`MarketDataClient`](references/clients/CryptoMarketDataClient.md);
[`ManagementDataClient`](references/clients/CryptoManagementDataClient.md). Also this API has a lot [messages](references/messages/Readme.md)
for receiving / sending data from server and collection of [enumerations](references/enumerations/Readme.md).
This API has methods and subscribers for authentication.

## Usage

### Initializing and connection

```js
import IntenseLabCryptoMarket from 'intenselab-crypto-market';

var onAuthenticationSuccess = function(authenticationSuccess) {
    /* There code for successful authentication. */
};

var onAuthenticationFail = function(authenticationFail) {
    /* There code for failure authentication. */
};

IntenseLabCryptoMarket.OnAuthenticationSuccessResponse.subscribe(onAuthenticationSuccess); // Subscribe onAuthenticationSuccess on this event.
IntenseLabCryptoMarket.OnAuthenticationSuccessResponse.subscribe(onAuthenticationFail); // Subscribe onAuthenticationSuccess on this event.

IntenseLabCryptoMarket.Connect('user', 'password', 'wss://http://pro.trader.intenselab.eu'); // Connect to server of IntenseLab.

IntenseLabCryptoMarket.Disconnect(); // Disconnect from server.

/* Example removes functions from subscribers */
IntenseLabCryptoMarket.OnAuthenticationSuccessResponse.unsubscribe(onAuthenticationSuccess);
IntenseLabCryptoMarket.OnAuthenticationSuccessResponse.unsubscribe(onAuthenticationFail); 
```

### Subscription on exception of IntenseLabCryptoMarket
```js
var onError = function(error) {
    /* There code for exception of IntenseLabCryptoMarket. */
};

IntenseLabCryptoMarket.OnException.subscribe(onError); // Subscribe onAuthenticationSuccess on this event.
```

### Clients of data
`IntenseLabCryptoMarket.ExecutionDataClient` - the client of execution data, reference of [CryptoExecutionDataClient](references/clients/CryptoExecutionDataClient.md).<br>
`IntenseLabCryptoMarket.HistoricalDataClient` - the client of historical data, reference of [CryptoHistoricalDataClient](references/clients/CryptoHistoricalDataClient.md).<br>
`IntenseLabCryptoMarket.MarketDataClient` - the client of market data, reference of [CryptoMarketDataClient](references/clients/CryptoMarketDataClient.md).<br>
`IntenseLabCryptoMarket.ManagementDataClient` - the client for management data, reference of [CryptoManagementDataClient](references/clients/CryptoManagementDataClient.md).<br>

### Messages
``IntenseLabCryptoMarket.Messages`` - there is a lot of [messages](references/messages/Readme.md), example to use message:

```js
var newOrder = new IntenseLabCryptoMarket.Messages.Execution.NewCryptoOrder();
newOrder.Price = 115.5;
/* A lot of code for sets model of newOrder */

IntenseLabCryptoMarket.ExecutionDataClient.PlaceOrder(newOrder);
```

### Enum
Enum is type of value or constants value, value of enumeration is [`EnumValue`](references/enumerations/EnumValue.md) and
a lot collection of [enumerations](references/enumerations/Readme.md) can be found in `IntenseLabCryptoMarket.Enums`.<br/>
Example to use enumeration:

```js
var newOrder = new IntenseLabCryptoMarket.Messages.Execution.NewCryptoOrder();
newOrder.OrderSide = IntenseLabCryptoMarket.Enums.OrderSide.Sell;
```

### Equaling enumeration
Example to use equaling enumeration:

```js
var equaled = dataReceiving.ServerState === IntenseLabCryptoMarket.Enums.ServerState.Disconnected; // False.

var serverState = IntenseLabCryptoMarket.Enums.ServerState.getValue(dataReceiving.ServerState); // Sets serverState for fix conflict of equaling.

equaled = serverState === IntenseLabCryptoMarket.Enums.ServerState.Disconnected; // True.
```

Or use for high performance:

```js
var equaled = dataReceiving.ServerState.name === IntenseLabCryptoMarket.Enums.ServerState.Disconnected.name; // True.
```

Using switch:

```js
var serverState = IntenseLabCryptoMarket.Enums.ServerState.getValue(dataReceiving.ServerState); // Sets serverState for fix conflict of equaling.

switch (serverState) {
    case IntenseLabCryptoMarket.Enums.ServerState.Disconnected:
        /* There code, where serverState is ServerState.Disconnected */
        break;
    case IntenseLabCryptoMarket.Enums.ServerState.Connected:
        /* There code, where serverState is ServerState.Connected */
        break;
    case IntenseLabCryptoMarket.Enums.ServerState.Ready:
        /* There code, where serverState is ServerState.Ready */
        break;
}
```

### When can send message from client
Subscribe on event `OnServerStateChanged` every clients, if this event called and returned value `ServerState.Ready`, then client can send message to server.

### Creating new IntenseLabCryptoMarket
```js
var newIntenseLabCryptoMarket = IntenseLabCryptoMarket.CreateNewInstance();
```
