Skip to content

Latest commit

 

History

History
353 lines (292 loc) · 12.9 KB

README.md

File metadata and controls

353 lines (292 loc) · 12.9 KB

IqOptionApiDotNet

Action Build NuGet Downloads Nuget Downloads

IqOption Api Dot Net to connect to www.iqoption.com (unofficial).

Package Installation

Please be sure to install using the NUGET Package Manager

PM> Install-Package IqOptionApiDotNet

How it work

This api using websocket to communicate realtime-data to IqOption server through secured websocket channel, so the realtime metadata that come on this channel will be handles by .net reactive programming called "Rx.NET", cause of a haundred of data type stream on only one channle so we need to selected subscribe on specific topic.

Milestone

  • BuyBack Position
  • Subscribe to the channel
  • support open Long/Short for CFD contract (Digital Options)

Last Features

  • Get Top Assets

Features

  • Requirement to define the request identifier to improve returns.
  • Reset Balance Practice
  • Get Financial Information
  • Get User Profile by User Id
  • Get Users Availabilty by USer Id
  • Get Leaderboard (TOP TRADERS)
  • Get Leaderboard Details bu User Id
  • Reset Balance Practice
  • Alerts (List, Create, Delete, Update, ObservableChanged and ObservableTriggered)

How to use

var client = new IqOptionApiDotNetClient("emailIqOption", "passwordIqOption");

string requestId; // this is new

try
{

    //begin connect
    if(await client.ConnectAsync())
    {
        try
        {
          //get user profile
          requestId = Guid.NewGuid().ToString().Replace("-", string.Empty); // New
          var profile = await client.GetProfileAsync(requestId);
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error getting profile: {ex.Message}");
        }
        
        try
        {
          // Reset Training Balance
          requestId = Guid.NewGuid().ToString().Replace("-", string.Empty);
          client.ResetTrainingBalanceAsync(requestId);
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error when resetting training balance: {ex.Message}");
        }
        
        try
        {
          //Get Profile from User ID.
          requestId = Guid.NewGuid().ToString().Replace("-", string.Empty); // New
          var userId = ""; // <-- Id User in Here!
          var profile = await client.GetUserProfileClientAsync(requestId, userId);
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error getting user profile: {ex.Message}");
        }
        
        try
        {
          //Get Status from users id array.
          requestId = Guid.NewGuid().ToString().Replace("-", string.Empty); // New
          long[] userId = { 0, 0, 0 }; // Substituir os zeros por IDS de usuarios
          var profile = await client.GetUsersAvailabilityAsync(requestId, userId);
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error getting user status: {ex.Message}");
        }
        
        try
        {
          //Get Top Traders.
          requestId = Guid.NewGuid().ToString().Replace("-", string.Empty); // New
          CountryType country = CountryType.Worldwide;
          long from_position = 1;
          long to_position = 10;
          var leader = await client.RequestLeaderboardDealsClientAsync(requestId, country, from_position, to_position);
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error getting data from top traders: {ex.Message}");
        }

        try
        {
          //Get Top Traders Details from User Id.
          requestId = Guid.NewGuid().ToString().Replace("-", string.Empty); // New
          CountryType[] countryes = {CountryType.Worldwide, };
          var userId = ""; // <-- User ID here!
          var leader = await client.RequestLeaderboardUserinfoDealsClientAsync(requestId, countryes, userId);
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error getting data from top trader by id: {ex.Message}");
        }

        try
        {
          // open order EurUsd in smallest period (1min)
          requestId = Guid.NewGuid().ToString().Replace("-", string.Empty); // New
          var exp = DateTime.Now.AddMinutes(1);
          var buyResult = await api.BuyAsync(requestId, ActivePair.EURUSD, (decimal)1.5, OrderDirection.Call, exp);
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error opening order: {ex.Message}");
        }

        try
        {
          // get candles data
          requestId = Guid.NewGuid().ToString().Replace("-", string.Empty); // New
          var candles = await api.GetCandlesAsync(requestId, ActivePair.EURUSD, TimeFrame.Min1, 100, DateTimeOffset.Now);
          _logger.LogInformation($"CandleCollections received {candles.Count}");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error getting candles: {ex.Message}");
        }


          // subscribe to pair to get real-time data for tf1min and tf5min
          requestId = Guid.NewGuid().ToString().Replace("-", string.Empty); // New
          var streamMin1 = await api.SubscribeRealtimeDataAsync(requestId, ActivePair.EURUSD, TimeFrame.Min1);
          requestId = Guid.NewGuid().ToString().Replace("-", string.Empty); // New
          var streamMin5 = await api.SubscribeRealtimeDataAsync(requestId, ActivePair.EURUSD, TimeFrame.Min5);

          streamMin5.Merge(streamMin1)
              .Subscribe(candleInfo => {
                  _logger.LogInformation($"Now {ActivePair.EURUSD} {candleInfo.TimeFrame} : Bid={candleInfo.Bid}\t Ask={candleInfo.Ask}\t");
          });

          // after this line no-more realtime data for min5 print on console
          requestId = Guid.NewGuid().ToString().Replace("-", string.Empty);
          await api.UnSubscribeRealtimeData(requestId, ActivePair.EURUSD, TimeFrame.Min5);

        try
        {
          // Get list Alerts
          requestId = Guid.NewGuid().ToString().Replace("-", string.Empty);
          var alerts = await IqClientApiDotNet.GetAlerts(requestId);
          _logger.Information(JsonConvert.SerializeObject(alerts));
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error getting alerts: {ex.Message}");
        }

        try
        {
          // Create Alert
          requestId = Guid.NewGuid().ToString().Replace("-", string.Empty);
          ActivePair activeId = ActivePair.EURAUD;
          InstrumentType instrumentType = InstrumentType.DigitalOption;
          double value = 200.10;
          int activations = 0; // 1 - For one time OR 2 - For all time
          var alertCreated = await client.CreateAlert(requestId
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error creating alert: {ex.Message}");
        }

        try
        {
          // Update Alert
          requestId = Guid.NewGuid().ToString().Replace("-", string.Empty);
          long alertId = alertCreated.Id; // Get id alert created this sample
          ActivePair newActiveId = ActivePair.EURAUD;
          InstrumentType newInstrumentType = InstrumentType.DigitalOption;
          double newValue = 300.51;
          int newActivations = 0; // 1 - For one time OR 2 - For all time
          var alertUpdated = await client.UpdateAlert(requestId, alertId, newActiveId, newInstrumentType, newValue, newActivations);
          _logger.Information(JsonConvert.SerializeObject(alertUpdated));
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error updating alert: {ex.Message}");
        }

        try
        {
          // Delete Alert
          requestId = Guid.NewGuid().ToString().Replace("-", string.Empty);
          alertId = alertCreated.Id; // Get id alert created this sample
          var alertDelete = await client.DeleteAlert(requestId, alertId);
          _logger.Information(JsonConvert.SerializeObject(alertDelete));
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error deleting alert: {ex.Message}");
        }

  
    }
    else
    {
        Console.WriteLine("Error connecting to API!")    
    }
}
catch (Exception ex)
{
    Console.WriteLine($"Erro: {ex.Message}")
}

Example Use Cases

This is example use cases that this api could solve your problems

Trading follower

public async Task TradingFollower_ExampleAsync() {

    var trader = new IqOptionApiDotNetClient("[email protected]", "changeme");
    var follower = new IqOptionApiDotNetClient("[email protected]", "changeme");

    await Task.WhenAll(trader.ConnectAsync(), follower.ConnectAsync());

    trader.WsClient.OpenOptionObservable().Subscribe(x => {
        string requestId = Guid.NewGuid().ToString().Replace("-", string.Empty);
        follower.BuyAsync(requestId, x.Active, (int) x.Amount, x.Direction, x.ExpirationTime);
    });
}

BuyAsync

To open turbo-option within (1M-5M) duration

var api = new IqOptionApiDotNetClient("[email protected]", "passcode");
string requestId; // New

try {
    //logging in
    if (await api.ConnectAsync()) {
        //open order EurUsd in smallest period(1min)
        var exp = DateTime.Now.AddMinutes(1);
        string requestId; // this is new
        requestId = Guid.NewGuid().ToString().Replace("-", string.Empty);
        await api.BuyAsync(requestId, ActivePair.EURUSD, 1, OrderDirection.Call, exp);
    }
}
catch (Exception ex) {
    Console.WriteLine(ex.Message);
}
finally {
    Console.ReadLine();
}

TradersMood

To check traders mood on specific Instrument/ActivePair Print Trader Mood

var api = new IqOptionApiDotNetClient("[email protected]", "passcode");
string requestId; // this is new
try {
    //logging in
    if (await api.ConnectAsync()) {
	
        // call the subscribe to listening when mood changed
        api.WsClient.TradersMoodObservable().Subscribe(x => {

            // values goes here
            _logger.Information(
                $"TradersMood on {x.InstrumentType} - {x.ActivePair} values Higher :{x.Higher}, Lower: {x.Lower}"
            );
        });

        // begin subscribe 2 pairs
        requestId = Guid.NewGuid().ToString().Replace("-", string.Empty);
        api.SubscribeTradersMoodChanged(requestId, InstrumentType.BinaryOption, ActivePair.EURUSD);
        
        requestId = Guid.NewGuid().ToString().Replace("-", string.Empty);
        api.SubscribeTradersMoodChanged(requestId, InstrumentType.BinaryOption, ActivePair.GBPUSD);

        //wait for 10 secs
        await Task.Delay(10000);

        // after unsubscribe GBPUSD moods will not come anymore
        requestId = Guid.NewGuid().ToString().Replace("-", string.Empty);
        api.UnSubscribeTradersMoodChanged(requestId, InstrumentType.BinaryOption, ActivePair.GBPUSD);
    }
}
catch (Exception ex) {
    Console.WriteLine(ex.Message);
}
finally {
    Console.ReadLine();
}

PrintCopyTrader

Copy Trade This option no longer works, time has passed...! :~(

now using ReactiveUI way for subscribe the changing of model following this

    var trader = new IqOptionApiDotNetClient("[email protected]", "changeme");
    var follower = new IqOptionApiDotNetClient("[email protected]", "changeme");

    await Task.WhenAll(trader.ConnectAsync(), follower.ConnectAsync());

    trader.WsClient.OpenOptionObservable().Subscribe(x => {
	var requestId = Guid.NewGuid().ToString().Replace("-", string.Empty);
        follower.BuyAsync(requestId, x.Active, (int) x.Amount, x.Direction, x.ExpirationTime);
    });

Support Me

If you've got value from any of the content which I have created, but pull requests are not your thing, then I would also very much appreciate your support by buying me a coffee.
Buy Me A Coffee Jorge Beserra (Este Repositorio)
Buy Me A Coffee MongkonEiadon (Developer from Repository base)