Filter Overbought and Oversold Stocks using JAVA and Zerodha Kiteconnect API.

IMPORT LIBRARIES

import com.zerodhatech.kiteconnect.KiteConnect;
import com.zerodhatech.kiteconnect.kitehttp.exceptions.KiteException;
import com.zerodhatech.models.*;
import java.io.IOException;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import org.json.JSONException;

DECLARE VARIABLES

public static KiteConnect kiteSdk;
public static String instrumentToken[][]=new String[1900][2];
public static int instrumentCount=0;
public static boolean stopScan=false;

 CONNECTING TO KITE

String req_token=JOptionPane.showInputDialog(this,"ENTER REQUEST TOKEN");
String api_key="";
String sec_key="";
kiteSdk = new KiteConnect("");
kiteSdk.setUserId("LP8865");
User users = null;
         try {
             users = kiteSdk.generateSession(req_token, sec_key);
         }  catch (IOException ex) {
          
        } catch (KiteException | JSONException ex) {
        Logger.getLogger(mainFrame.class.getName()).log(Level.SEVERE, null, ex);
    }
kiteSdk.setAccessToken(users.accessToken);
kiteSdk.setPublicToken(users.publicToken);
Profile profile = null;
        importStocks();

    
 IMPORT STOCKS
   
private void importStocks()
{
           
        
        int j=0;
        try {
            List<Instrument> instruments = kiteSdk.getInstruments();
            System.out.println(instruments.size());
            
            for(int i=0;i<instruments.size();i++)
            {
                if((!instruments.get(i).segment.equals("INDICES"))&&(instruments.get(i).exchange.equals("NSE"))&&(instruments.get(i).name!=null)&&(instruments.get(i).instrument_type.equals("EQ"))){
                
               
                instrumentToken[j][0]=instruments.get(i).instrument_token+"";
                instrumentToken[j][1]=instruments.get(i).tradingsymbol;
                j+=1;
                }
            }
        } catch (KiteException ex) {
            Logger.getLogger(mainFrame.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(mainFrame.class.getName()).log(Level.SEVERE, null, ex);
        } catch (JSONException ex) {
            Logger.getLogger(mainFrame.class.getName()).log(Level.SEVERE, null, ex);
        }
instrumentCount=j;
jLabel1.setText(j+" STOCKS");
System.out.println(instrumentCount+" STOCKS IMPORTED");
        // TODO add your handling code here:
    }                           

STRATEGY CLASS

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.table.DefaultTableModel;
/**
 *
 * @author mukesh
 */
public class strategy implements Runnable{
    DefaultTableModel model;

    @Override
    public void run() {
        
      model=(DefaultTableModel)mainFrame.jTable1.getModel();
      int count=model.getRowCount();
      for(int i=0;i<count;i++)
      {
          model.removeRow(0);
      }
String instrumentToken[][]=mainFrame.instrumentToken;
int j=mainFrame.instrumentCount;
        /** Get historical data dump, requires from and to date, intrument token, interval, continuous (for expired F&O contracts), oi (open interest)
         * returns historical data object which will have list of historical data inside the object.*/
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String fromString ="";
        String toString = "";
         
        LocalDate fromDay = LocalDate.now().minusDays(60);
        System.out.println(fromDay);
        fromString = fromDay+" 09:15:00";
        toString = formatter.format(new Date());
Date from = null;
Date to = null;
    try {
        from = formatter.parse(fromString);
        to = formatter.parse(toString);
    } catch (ParseException ex) {
        Logger.getLogger(mainFrame.class.getName()).log(Level.SEVERE, null, ex);
    }
    String timeFrame=mainFrame.jComboBox3.getSelectedItem().toString();
    mainFrame.jProgressBar1.setMaximum(j);
  for(int i=0;i<j;i++){
      if(mainFrame.stopScan)
      {
          break;
      }
      if(mainFrame.jComboBox1.getSelectedItem().toString().equals("RSI")){
new Thread(new rsiStrtegy(from,to,instrumentToken[i][0],timeFrame,model,instrumentToken[i][1])).start();}
      else
      {
          break;
      }
    if((i%30==0)&&(i>0))
    {
    try {
        Thread.sleep(2000);
    } catch (InterruptedException ex) {
        Logger.getLogger(strategy.class.getName()).log(Level.SEVERE, null, ex);
    }
    }
    mainFrame.jProgressBar1.setValue(i);
    
  }
    }
    
}


RSI CALCULATION CLASS

import com.zerodhatech.kiteconnect.kitehttp.exceptions.KiteException;
import com.zerodhatech.models.HistoricalData;
import java.io.IOException;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.table.DefaultTableModel;
import org.json.JSONException;
import static stockscanner.mainFrame.kiteSdk;

/**
 *
 * @author mukesh
 */
public class rsiStrtegy implements Runnable{
    DefaultTableModel model;
    Date from;
    Date to;
    String instrument;
    String timeFrame;
    String stockName;
    rsiStrtegy(Date from,Date to,String instrument,String timeFrame,DefaultTableModel model,String stockName)
    {
        this.from=from;
        this.to=to;
        this.instrument=instrument;
        this.timeFrame=timeFrame;
        this.model=model;
        this.stockName=stockName;
    }

    @Override
    public void run() {
       
        HistoricalData historicalData = null;
    try {
        historicalData = kiteSdk.getHistoricalData(from, to, instrument, timeFrame, false, false);
        int size=historicalData.dataArrayList.size()-1;
    double gain=0;double loss=0;
for(int i=0;i<14;i++)
{
    
    if(historicalData.dataArrayList.get(i+1).close>historicalData.dataArrayList.get(i).close)
    {
        gain+=((historicalData.dataArrayList.get(i+1).close-historicalData.dataArrayList.get(i).close)/historicalData.dataArrayList.get(i).close)*100;
    
    }
    else
    {
        loss+=((historicalData.dataArrayList.get(i).close-historicalData.dataArrayList.get(i+1).close)/historicalData.dataArrayList.get(i+1).close)*100;
    }
    
    
}
gain=gain/14;
    loss=loss/14;
    double rsi=100-(100/(1+(gain/loss)));
for(int i=14;i<size;i++)
{
    
    if(historicalData.dataArrayList.get(i+1).close>historicalData.dataArrayList.get(i).close)
    {
        gain=(gain*13+((historicalData.dataArrayList.get(i+1).close-historicalData.dataArrayList.get(i).close)/historicalData.dataArrayList.get(i).close)*100)/14;
    loss=(loss*13)/14;
    }
    else
    {
        loss=(loss*13+((historicalData.dataArrayList.get(i).close-historicalData.dataArrayList.get(i+1).close)/historicalData.dataArrayList.get(i+1).close)*100)/14;
        gain=(gain*13)/14;
    }
    rsi=100-100/(1+(gain/loss));
    
}
if(mainFrame.jComboBox2.getSelectedItem().toString().equals("GREATER THAN")){
    if((rsi>Double.parseDouble(mainFrame.jTextField1.getText())))
    {
      model.addRow(new Object[]{stockName,(int)(rsi),historicalData.dataArrayList.get(size).close});  
    }
} else if(rsi<Double.parseDouble(mainFrame.jTextField1.getText()))
    {
      model.addRow(new Object[]{stockName,(int)(rsi),historicalData.dataArrayList.get(size).close});   
    }
        
    } catch (KiteException ex) {
        Logger.getLogger(mainFrame.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IOException ex) {
        Logger.getLogger(mainFrame.class.getName()).log(Level.SEVERE, null, ex);
    } catch (JSONException ex) {
        Logger.getLogger(mainFrame.class.getName()).log(Level.SEVERE, null, ex);
    }
    }
    
}

START THREAD

stopScan=false;
new Thread(new strategy()).start();

STOP THREAD

stopScan=true;

LOOK AND FEEL
            try {
            // select Look and Feel
            UIManager.setLookAndFeel("com.jtattoo.plaf.hifi.HiFiLookAndFeel");
            // start application
            new mainFrame().setVisible(true);
        }
        catch (Exception ex) {
            ex.printStackTrace();
        }

Comments

Popular posts from this blog

Create Option Chain using PYTHON.

How to Place Order in Zerodha using Python

How to place order in zerodha when RSI crosses below 30? Algo Trading Python