private static void position_xls_readin(_Excel.Worksheet wsheet, TradeBooks book) { int i = 0; _Excel.Range myRange = wsheet.UsedRange; //These two lines clear up the blank cells. wsheet.Columns.ClearFormats(); wsheet.Rows.ClearFormats(); book.positionCNT = myRange.Rows.Count - 2; for (i = 1; i < myRange.Rows.Count - 1; i++) { book.symbol[i - 1] = wsheet.Cells[i + 2, 6].value2; book.expiration[i - 1] = wsheet.Cells[i + 2, 4].value2; book.CallPut[i - 1] = wsheet.Cells[i + 2, 7].value2; book.legS[i - 1] = Convert.ToDouble(wsheet.Cells[2 + i, 8].value2); book.legB[i - 1] = Convert.ToDouble(wsheet.Cells[2 + i, 9].value2); book.size[i - 1] = (int)wsheet.Cells[i + 2, 10].value2; book.premium[i - 1] = wsheet.Cells[i + 2, 12].value2; book.day_cnt[i - 1] = (int)wsheet.Cells[i + 2, 15].value2; book.accountID[i - 1] = wsheet.Cells[i + 2, 14].value2; book.model[i - 1] = wsheet.Cells[i + 2, 24].value2; book.multipler[i - 1] = (int)wsheet.Cells[i + 2, 30].value2; book.underlyingExp[i - 1] = wsheet.Cells[i + 2, 31].Text; } }
private static int getContractID(EClientSocket client, EWrapperImpl Allture, TradeBooks Book, int m, int leg, string sectype, string exchange) { Allture.checkContractEnd = false; client.reqContractDetails(20010, ContractSamples.Contract_Options(Book.symbol[m], sectype, Book.expiration[m], Book.CallPut[m], leg, Book.multipler[m].ToString(), exchange)); //Thread.Sleep(sleep1); while (!Allture.checkContractEnd) { Thread.Sleep(200); } Console.WriteLine("contract_ID: " + Allture.contract_ID + "\n"); return(Allture.contract_ID); }
public static int Main(string[] args) { // specify account and strategy string IBaccount = TradeBooks.accountInit(); string tradingModel = "es_growth"; string tradingInstrument = "ES"; int multipler = 50; int tryCNT = 1; int tryGap = (int)openBook.gap * 20; int bestCNT = 0; double[] Returns = new double[2]; double[] Premium = new double[tryCNT]; int[] LegB_ID = new int[tryCNT]; int[] LegB = new int[tryCNT]; int legS; int legS_ID; openBook.positionCNT = 1; for (int n = 0; n < openBook.positionCNT; n++) { openBook.symbol[n] = tradingInstrument; openBook.multipler[n] = multipler; } //! start the connection int[] channel = new int[2]; channel = TradeBooks.channelSetup(IBaccount, tradingModel); EClientSocket clientSocket = Allture.ClientSocket; EReaderSignal readerSignal = Allture.Signal; //! [connect] clientSocket.eConnect("127.0.0.1", channel[0], channel[1]); //! [connect] //! [ereader] //Create a reader to consume messages from the TWS. The EReader will consume the incoming messages and put them in a queue var reader = new EReader(clientSocket, readerSignal); reader.Start(); //Once the messages are in the queue, an additional thread can be created to fetch them new Thread(() => { while (clientSocket.IsConnected()) { readerSignal.waitForSignal(); reader.processMsgs(); } }) { IsBackground = true }.Start(); //! [ereader] //**** current time ***** string date_time, last_time; date_time = DateTime.Now.ToString("hh:mm:ss tt"); //************************** //*** Account Info *** //************************** clientSocket.reqAccountSummary(9001, "All", AccountSummaryTags.GetAllTags()); Thread.Sleep(1000); Console.WriteLine("account ID: " + Allture.account_ID); Console.WriteLine("account Value: " + Allture.account_value); Console.WriteLine("account_BuyingPower: " + Allture.account_BuyingPower); Console.WriteLine("account_InitMarginReq: " + Allture.account_InitMarginReq); Console.WriteLine("account_MaintMarginReq: " + Allture.account_MaintMarginReq); Console.WriteLine("account_ExcessLiquidity: " + Allture.account_ExcessLiquidity); Console.WriteLine("account_AvailableFunds: " + Allture.account_AvailableFunds); Console.WriteLine("\n"); Allture.remainingOrderSize = 100000; // set to maxium order size clientSocket.reqMarketDataType(1); // clientSocket.reqGlobalCancel(); Thread.Sleep(sleep1); while ((DateTime.Now > Convert.ToDateTime("09:30:00 AM")) && (DateTime.Now < Convert.ToDateTime("16:00:00 PM"))) { last_time = date_time; for (int n = 0; n < openBook.positionCNT; n++) { if (openBook.status[n] == "complete") { continue; } if (openBook.status[n] == "submit") { Allture.currOrderId = openBook.currOrderID[n]; Allture.remainingOrderSize = 0; Allture.checkOrderEnd = false; clientSocket.reqOpenOrders(); while (!Allture.checkOrderEnd) { Thread.Sleep(200); } if (Allture.remainingOrderSize == 0) { openBook.status[n] = "complete"; openBook.capital[n] = 0; openBook.size[n] = 0; continue; // if remaining size = 0, means this order has completely filled. then go to the next position } } legS = 2700; legS_ID = getContractID(clientSocket, Allture, openBook, n, legS, "FOP", "GLOBEX"); LegB[0] = legS - 100; LegB_ID[0] = getContractID(clientSocket, Allture, openBook, n, LegB[0], "FOP", "GLOBEX"); //******* check the order status again. if still exiting, cancel the order order, update the order size and capital if (openBook.status[n] == "submit") { Allture.currOrderId = openBook.currOrderID[n]; Allture.remainingOrderSize = 0; Allture.checkOrderEnd = false; clientSocket.reqOpenOrders(); while (!Allture.checkOrderEnd) { Thread.Sleep(200); } if (Allture.remainingOrderSize == 0) { openBook.status[n] = "complete"; openBook.capital[n] = 0; openBook.size[n] = 0; continue; } else { clientSocket.cancelOrder(openBook.currOrderID[n]); //cancel existing order Thread.Sleep(sleep1); openBook.status[n] = "cancel"; if (Allture.remainingOrderSize > openBook.size[n]) { Allture.remainingOrderSize = openBook.size[n]; } openBook.capital[n] = openBook.capital[n] - (openBook.size[n] - Allture.remainingOrderSize) * openBook.margin[n]; openBook.size[n] = (int)(openBook.usingCapital * openBook.capital[n] / 10000); } } else { openBook.size[n] = (int)(100); } //********* Place order ************************ clientSocket.reqIds(-1); Thread.Sleep(sleep1); clientSocket.placeOrder(Allture.NextOrderId, ContractSamples.Contract_Combo(openBook.symbol[n], "BAG", openBook.expiration[n], openBook.CallPut[n], LegB_ID[0], legS_ID, openBook.multipler[n].ToString(), "GLOBEX"), OrderSamples.ComboLimitOrder("BUY", openBook.size[n], -1.0, false)); Thread.Sleep(sleep1); //********* update remaining of the trading book ************** openBook.status[n] = "submit"; openBook.currOrderID[n] = Allture.NextOrderId; openBook.legS[n] = legS; openBook.legB[n] = LegB[0]; openBook.premium[n] = 1.0; } } clientSocket.reqGlobalCancel(); Thread.Sleep(sleep1); Console.WriteLine("today's trading is done...time: " + DateTime.Now); clientSocket.eDisconnect(); return(0); }
private static double getSpreadPremium(EClientSocket client, EWrapperImpl Allture, TradeBooks Book, int m, double LegS, double LegB, string sectype, string exchange) { double LegB_price, LegS_price; client.reqMktData(3011, ContractSamples.Contract_Options(Book.symbol[m], sectype, Book.expiration[m], Book.CallPut[m], LegB, Book.multipler[m].ToString(), exchange), string.Empty, false, false, null); Thread.Sleep(1000); client.cancelMktData(3011); LegB_price = Allture.ask_price; Console.WriteLine("legB ask: " + LegB_price + "\n"); client.reqMktData(3012, ContractSamples.Contract_Options(Book.symbol[m], sectype, Book.expiration[m], Book.CallPut[m], LegS, Book.multipler[m].ToString(), exchange), string.Empty, false, false, null); Thread.Sleep(1000); client.cancelMktData(3012); LegS_price = Allture.ask_price; Console.WriteLine("legS ask: " + LegS_price + "\n"); return(LegS_price - LegB_price); }
public static int Main(string[] args) { // specify account and strategy string IBaccount = TradeBooks.accountInit(); string tradingModel = "monitor"; double indexPrice = 0, lastPrice = 0, vixPrice = 0, vix1Price = 0, vix2Price = 0; int legB_ID, legS_ID; double spread_premium; //*** set the monitoring parameters ********** bool autoExit = false; double SPXexitPoint = 30; double ESexitPoint = 30; double CLexitPoint = 3; double GCexitPoint = 20; double exitPoint = 100; int Alert1 = 0; int Alert2 = 0; bool[] alert1 = new bool[Constants.max_position]; bool[] alert2 = new bool[Constants.max_position]; bool[] alert3 = new bool[Constants.max_position]; bool alert_vix = false; // vix/vix1 backwardation bool alert_vix1 = false; // vix1/vix2 backwardation List <double> putSPXlegS = new List <double>(); List <double> callSPXlegS = new List <double>(); List <double> putESlegS = new List <double>(); List <double> callESlegS = new List <double>(); List <double> putCLlegS = new List <double>(); List <double> callCLlegS = new List <double>(); List <double> putGClegS = new List <double>(); List <double> callGClegS = new List <double>(); //**** current date and time ***** string date_time, today; date_time = DateTime.Now.ToString("h:mm:ss tt"); today = DateTime.Now.ToString("MMdd"); // today = "0928"; // if today is not the trading close day //***** set up excel ************** _Excel.Application excel = new _Excel.Application(); excel.DisplayAlerts = false; _Excel.Workbook monitor_wb = excel.Workbooks.Open("C:\\Users\\Jack\\Documents\\Companies\\allture\\Trading\\option_spread\\Accounts\\All_Account_Oct_2018.xlsm"); _Excel.Worksheet csheet = monitor_wb.Worksheets[today]; // string path = TradeBooks.xlsPathSetup(IBaccount); // _Excel.Workbook monitor_wb = excel.Workbooks.Open(path + IBaccount + "\\account_" + IBaccount + ".xlsm"); // _Excel.Worksheet csheet = monitor_wb.Worksheets["Positions"]; Console.WriteLine("\n start calculating, time: " + DateTime.Now + " \n"); //******* read position data to openBook position_xls_readin(csheet, openBook); monitor_wb.Close(0); excel.Quit(); for (int n = 0; n < openBook.positionCNT; n++) { if (openBook.symbol[n] == "SPX") { if (openBook.CallPut[n] == "Put") { putSPXlegS.Add(openBook.legS[n]); } else { callSPXlegS.Add(openBook.legS[n]); } } if (openBook.symbol[n] == "ES") { if (openBook.CallPut[n] == "Put") { putESlegS.Add(openBook.legS[n]); } else { callESlegS.Add(openBook.legS[n]); } } if (openBook.symbol[n] == "CL") { if (openBook.CallPut[n] == "Put") { putCLlegS.Add(openBook.legS[n]); } else { callCLlegS.Add(openBook.legS[n]); } } if (openBook.symbol[n] == "GC") { if (openBook.CallPut[n] == "Put") { putGClegS.Add(openBook.legS[n]); } else { callGClegS.Add(openBook.legS[n]); } } } callSPXlegS.Sort((s1, s2) => s1.CompareTo(s2)); callESlegS.Sort((s1, s2) => s1.CompareTo(s2)); callCLlegS.Sort((s1, s2) => s1.CompareTo(s2)); callGClegS.Sort((s1, s2) => s1.CompareTo(s2)); putSPXlegS.Sort((s1, s2) => s2.CompareTo(s1)); putESlegS.Sort((s1, s2) => s2.CompareTo(s1)); putCLlegS.Sort((s1, s2) => s2.CompareTo(s1)); putGClegS.Sort((s1, s2) => s2.CompareTo(s1)); //! start the connection ********************************// int[] channel = new int[2]; channel = TradeBooks.channelSetup(IBaccount, tradingModel); EClientSocket clientSocket = Allture.ClientSocket; EReaderSignal readerSignal = Allture.Signal; //! [connect] clientSocket.eConnect("127.0.0.1", channel[0], channel[1]); //! [connect] //! [ereader] //Create a reader to consume messages from the TWS. The EReader will consume the incoming messages and put them in a queue var reader = new EReader(clientSocket, readerSignal); reader.Start(); //Once the messages are in the queue, an additional thread can be created to fetch them new Thread(() => { while (clientSocket.IsConnected()) { readerSignal.waitForSignal(); reader.processMsgs(); } }) { IsBackground = true }.Start(); //! [ereader] //************************** //*** Account Info *** //************************** clientSocket.reqAccountSummary(9001, "All", AccountSummaryTags.GetAllTags()); Thread.Sleep(1000); Console.WriteLine("account ID: " + Allture.account_ID); Console.WriteLine("account Value: " + Allture.account_value); Console.WriteLine("account_BuyingPower: " + Allture.account_BuyingPower); Console.WriteLine("account_ExcessLiquidity: " + Allture.account_ExcessLiquidity); Console.WriteLine("account_AvailableFunds: " + Allture.account_AvailableFunds); Console.WriteLine("\n"); //******* calculate the adj std, return with spx, vix, vxx at order execuation in xls // runSPXstrategyCurr(trading_new, csheet, clientSocket); for (int n = 0; n < openBook.positionCNT; n++) { alert1[n] = false; alert2[n] = false; alert3[n] = false; } clientSocket.reqMarketDataType(1); Thread.Sleep(sleep1); while ((DateTime.Now > Convert.ToDateTime("09:30:00 AM")) && (DateTime.Now < Convert.ToDateTime("16:01:00 PM"))) { do { indexPrice = getMktData(clientSocket, Allture, "SPX", "IND", "", "CBOE"); }while (indexPrice == lastPrice); lastPrice = indexPrice; // to ensure vix, vix1, vix2 not consecutive, since their prices aren't chaning very much each time, can't be consecutive for lastPrice. do { vixPrice = getMktData(clientSocket, Allture, "VIX", "IND", "", "CBOE"); }while (vixPrice == lastPrice); lastPrice = vixPrice; do { indexPrice = getMktData(clientSocket, Allture, "SPX", "IND", "", "CBOE"); }while (indexPrice == lastPrice); lastPrice = indexPrice; // to ensure vix, vix1, vix2 not consecutive, since their prices aren't chaning very much each time, can't be consecutive for lastPrice. do { vix1Price = getMktData(clientSocket, Allture, "VIX", "FUT", openBook.vx1Exp, "CFE"); }while (vix1Price == lastPrice); lastPrice = vix1Price; do { indexPrice = getMktData(clientSocket, Allture, "SPX", "IND", "", "CBOE"); }while (indexPrice == lastPrice); lastPrice = indexPrice; // to ensure vix, vix1, vix2 not consecutive, since their prices aren't chaning very much each time, can't be consecutive for lastPrice. do { vix2Price = getMktData(clientSocket, Allture, "VIX", "FUT", openBook.vx2Exp, "CFE"); }while (vix2Price == lastPrice); lastPrice = vix2Price; Console.WriteLine("\n UX2 price: " + vix2Price + "\n"); if (!alert_vix && (vix1Price < vixPrice)) { SendMail("*****@*****.**", "Alert vix backwardation ! ", "VIX:" + vixPrice + " UX1:" + vix1Price); // SendMail("*****@*****.**", "Alert vix backwardation ! ", "VIX:" + vixPrice + " UX1:" + vix1Price); alert_vix = true; } if (!alert_vix1 && (vix2Price < vix1Price)) { SendMail("*****@*****.**", "Alert UX1 backwardation ! ", "UX1:" + vix1Price + " UX2:" + vix2Price); // SendMail("*****@*****.**", "Alert UX1 backwardation ! ", "UX1:" + vix1Price + " UX2:" + vix2Price); alert_vix1 = true; } for (int n = 0; n < openBook.positionCNT; n++) { if (openBook.size[n] == 0) { continue; } //********************************************************** //*** Real time market price - Real Time Index bid/ask/mid** //********************************************************** if (openBook.symbol[n] == "SPX") { if (openBook.CallPut[n] == "Put") { if (openBook.legS[n] < putSPXlegS[0]) { continue; } } do { indexPrice = getMktData(clientSocket, Allture, "SPX", "IND", "", "CBOE"); }while (indexPrice == lastPrice); lastPrice = indexPrice; Console.WriteLine("\n spx price: " + indexPrice + "\n"); exitPoint = SPXexitPoint; } else if (openBook.symbol[n] == "ES") { if (openBook.CallPut[n] == "Put") { if (openBook.legS[n] < putESlegS[0]) { continue; } } do { indexPrice = getMktData(clientSocket, Allture, "ES", "FUT", openBook.underlyingExp[n], "GLOBEX"); }while (indexPrice == lastPrice); lastPrice = indexPrice; Console.WriteLine("\n es price: " + indexPrice + "\n"); exitPoint = ESexitPoint; } else if (openBook.symbol[n] == "CL") { if (openBook.CallPut[n] == "Put") { if (openBook.legS[n] < putCLlegS[0]) { continue; } } do { indexPrice = getMktData(clientSocket, Allture, "CL", "FUT", openBook.underlyingExp[n], "NYMEX"); }while (indexPrice == lastPrice); lastPrice = indexPrice; Console.WriteLine("\n cl price: " + indexPrice + "\n"); exitPoint = CLexitPoint; } else if (openBook.symbol[n] == "GC") { if (openBook.CallPut[n] == "Put") { if (openBook.legS[n] < putGClegS[0]) { continue; } } do { indexPrice = getMktData(clientSocket, Allture, "GC", "FUT", openBook.underlyingExp[n], "NYMEX"); }while (indexPrice == lastPrice); lastPrice = indexPrice; Console.WriteLine("\n GC price: " + indexPrice + "\n"); exitPoint = GCexitPoint; } else { continue; } if (openBook.CallPut[n] == "Put") { if (!alert1[n] && (indexPrice <= (openBook.legS[n] + exitPoint + Alert1))) { // if alert1, sending email; SendMail("*****@*****.**", "Alert1 !! " + openBook.model[n], openBook.symbol[n] + " " + indexPrice + ", " + openBook.legS[n] + ", " + openBook.expiration[n].Substring(4) + ", " + openBook.size[n] + ", " + openBook.accountID[n]); // SendMail("*****@*****.**", "Alert1 ! " + openBook.model[n], openBook.symbol[n] + " " + indexPrice + ", " + openBook.legS[n] + ", " + openBook.expiration[n].Substring(4) + ", " + openBook.size[n] + ", " + openBook.accountID[n]); alert1[n] = true; } /* if (!alert2[n] && (indexPrice <= (openBook.legS[n] + exitPoint + Alert2))) * // { * // if alert2, sending email; * // SendMail("*****@*****.**", "Alert2 !! " + openBook.model[n], openBook.symbol[n] + " " + indexPrice + ", " + openBook.legS[n] + ", " + openBook.expiration[n].Substring(4) + ", " + openBook.legS[n] + ", " + openBook.size[n] + ", " + openBook.accountID[n]); * // SendMail("*****@*****.**", "Alert2 ! " + openBook.model[n], openBook.symbol[n] + " " + indexPrice + ", " + openBook.legS[n] + ", " + openBook.expiration[n].Substring(4) + ", " + openBook.size[n] + ", " + openBook.accountID[n]); * // alert2[n] = true; * // } * if (!alert3[n] && (indexPrice <= (openBook.legS[n] + exitPoint))) * { * // if alert3, sending email; * SendMail("*****@*****.**", "Alert3 !! " + openBook.model[n], openBook.symbol[n] + " " + indexPrice + ", " + openBook.legS[n] + ", " + openBook.expiration[n].Substring(4) + ", " + openBook.size[n] + ", " + openBook.accountID[n]); * // SendMail("*****@*****.**", "Alert3 ! " + openBook.model[n], openBook.symbol[n] + " " + indexPrice + ", " + ", " + openBook.legS[n] + openBook.expiration[n].Substring(4) + ", " + openBook.size[n] + ", " + openBook.accountID[n]); * alert3[n] = true; * } */ // very complicated for auto exit and high risk, need more time to think through !!! // seems if we don't directly get position info from IB, then should not do any auto exits if (autoExit) { if (alert3[n]) { //*** estimate the current spread's price and contract ID for combo orders if (openBook.symbol[n] == "SPX") { spread_premium = 0; // spread_premium = 0.05 + getSpreadPremium(clientSocket, Allture, openBook, n, openBook.legS[n], openBook.legB[n], "OPT", "SMART"); legS_ID = getContractID(clientSocket, Allture, openBook, n, openBook.legS[n], "OPT", "SMART"); legB_ID = getContractID(clientSocket, Allture, openBook, n, openBook.legB[n], "OPT", "SMART"); //********* Place order *************************** clientSocket.reqIds(-1); Thread.Sleep(sleep1); clientSocket.placeOrder(Allture.NextOrderId, ContractSamples.Contract_Combo(openBook.symbol[n], "BAG", openBook.expiration[n], openBook.CallPut[n], legB_ID, legS_ID, "100", "SMART"), OrderSamples.ComboLimitOrder("SELL", openBook.size[n], -spread_premium, false)); Thread.Sleep(sleep2); openBook.size[n] = 0; if (openBook.legS[n] == putSPXlegS[0]) { putSPXlegS.RemoveAt(0); } // else if (openBook.legS[n] == putSPXlegS[1]) putSPXlegS.RemoveAt(1); // else if (openBook.legS[n] == putSPXlegS[2]) putSPXlegS.RemoveAt(2); } else if (openBook.symbol[n] == "ES") { spread_premium = 0; // spread_premium = 0.05 + getSpreadPremium(clientSocket, Allture, openBook, n, openBook.legS[n], openBook.legB[n], "FOP", "GLOBEX"); legS_ID = getContractID(clientSocket, Allture, openBook, n, openBook.legS[n], "FOP", "GLOBEX"); legB_ID = getContractID(clientSocket, Allture, openBook, n, openBook.legB[n], "FOP", "GLOBEX"); //********* Place order ************************ clientSocket.reqIds(-1); Thread.Sleep(sleep1); clientSocket.placeOrder(Allture.NextOrderId, ContractSamples.Contract_Combo(openBook.symbol[n], "BAG", openBook.expiration[n], openBook.CallPut[n], legB_ID, legS_ID, "50", "GLOBEX"), OrderSamples.ComboLimitOrder("SELL", openBook.size[n], -spread_premium, false)); Thread.Sleep(sleep2); openBook.size[n] = 0; if (openBook.legS[n] == putESlegS[0]) { putESlegS.RemoveAt(0); } // else if (openBook.legS[n] == putESlegS[1]) putESlegS.RemoveAt(1); // else if (openBook.legS[n] == putESlegS[2]) putESlegS.RemoveAt(2); } else if (openBook.symbol[n] == "CL") { spread_premium = 0; // spread_premium = getSpreadPremium(clientSocket, Allture, openBook, n, openBook.legS[n], openBook.legB[n], "FOP", "NYMEX"); legS_ID = getContractID(clientSocket, Allture, openBook, n, openBook.legS[n], "FOP", "NYMEX"); legB_ID = getContractID(clientSocket, Allture, openBook, n, openBook.legB[n], "FOP", "NYMEX"); //********* Place order ************************ clientSocket.reqIds(-1); Thread.Sleep(sleep1); clientSocket.placeOrder(Allture.NextOrderId, ContractSamples.Contract_Combo(openBook.symbol[n], "BAG", openBook.expiration[n], openBook.CallPut[n], legB_ID, legS_ID, "1000", "NYMEX"), OrderSamples.ComboLimitOrder("SELL", openBook.size[n], -spread_premium, false)); Thread.Sleep(sleep2); openBook.size[n] = 0; if (openBook.legS[n] == putESlegS[0]) { putCLlegS.RemoveAt(0); } // else if (openBook.legS[n] == putESlegS[1]) putESlegS.RemoveAt(1); // else if (openBook.legS[n] == putESlegS[2]) putESlegS.RemoveAt(2); } else if (openBook.symbol[n] == "GC") { spread_premium = 0; // spread_premium = getSpreadPremium(clientSocket, Allture, openBook, n, openBook.legS[n], openBook.legB[n], "FOP", "NYMEX"); legS_ID = getContractID(clientSocket, Allture, openBook, n, openBook.legS[n], "FOP", "NYMEX"); legB_ID = getContractID(clientSocket, Allture, openBook, n, openBook.legB[n], "FOP", "NYMEX"); //********* Place order ************************ clientSocket.reqIds(-1); Thread.Sleep(sleep1); clientSocket.placeOrder(Allture.NextOrderId, ContractSamples.Contract_Combo(openBook.symbol[n], "BAG", openBook.expiration[n], openBook.CallPut[n], legB_ID, legS_ID, "100", "NYMEX"), OrderSamples.ComboLimitOrder("SELL", openBook.size[n], -spread_premium, false)); Thread.Sleep(sleep2); openBook.size[n] = 0; if (openBook.legS[n] == putESlegS[0]) { putGClegS.RemoveAt(0); } // else if (openBook.legS[n] == putESlegS[1]) putESlegS.RemoveAt(1); // else if (openBook.legS[n] == putESlegS[2]) putESlegS.RemoveAt(2); } else { continue; } // very complicated, need more time to think through !!! one thought - just simply place order, don't cancel it, until it filled // seems if we don't directly get position info from IB, then should not do any auto exits } } } else if (openBook.CallPut[n] == "Call") { if (!alert3[n] && (indexPrice >= (openBook.legS[n] - exitPoint))) { // if alert3, sending email; SendMail("*****@*****.**", "call Alert3 !! " + openBook.model[n], openBook.symbol[n] + " " + indexPrice + ", " + openBook.legS[n] + ", " + openBook.expiration[n].Substring(4) + ", " + openBook.size[n] + ", " + openBook.accountID[n]); SendMail("*****@*****.**", "call Alert3 ! " + openBook.model[n], openBook.symbol[n] + " " + indexPrice + ", " + ", " + openBook.legS[n] + openBook.expiration[n].Substring(4) + ", " + openBook.size[n] + ", " + openBook.accountID[n]); alert3[n] = true; } // very complicated for auto exit and high risk, need more time to think through !!! // seems if we don't directly get position info from IB, then should not do any auto exits // must have the auto exit. otherwise, you can't handle that many position mannually. and sychological/emotion is another issue. if (autoExit) { if (alert3[n]) { //*** estimate the current spread's price and contract ID for combo orders if (openBook.symbol[n] == "SPX") { // spread_premium = 0; spread_premium = 0.05 + getSpreadPremium(clientSocket, Allture, openBook, n, openBook.legS[n], openBook.legB[n], "OPT", "SMART"); legS_ID = getContractID(clientSocket, Allture, openBook, n, openBook.legS[n], "OPT", "SMART"); legB_ID = getContractID(clientSocket, Allture, openBook, n, openBook.legB[n], "OPT", "SMART"); //********* Place order *************************** clientSocket.reqIds(-1); Thread.Sleep(sleep1); clientSocket.placeOrder(Allture.NextOrderId, ContractSamples.Contract_Combo(openBook.symbol[n], "BAG", openBook.expiration[n], openBook.CallPut[n], legB_ID, legS_ID, "100", "SMART"), OrderSamples.ComboLimitOrder("SELL", openBook.size[n], -spread_premium, false)); Thread.Sleep(sleep2); openBook.size[n] = 0; if (openBook.legS[n] == callSPXlegS[0]) { callSPXlegS.RemoveAt(0); } // else if (openBook.legS[n] == callSPXlegS[1]) callSPXlegS.RemoveAt(1); // else if (openBook.legS[n] == callSPXlegS[2]) callSPXlegS.RemoveAt(2); } else if (openBook.symbol[n] == "ES") { // spread_premium = 0; spread_premium = 0.05 + getSpreadPremium(clientSocket, Allture, openBook, n, openBook.legS[n], openBook.legB[n], "FOP", "GLOBEX"); legS_ID = getContractID(clientSocket, Allture, openBook, n, openBook.legS[n], "FOP", "GLOBEX"); legB_ID = getContractID(clientSocket, Allture, openBook, n, openBook.legB[n], "FOP", "GLOBEX"); //********* Place order ************************ clientSocket.reqIds(-1); Thread.Sleep(sleep1); clientSocket.placeOrder(Allture.NextOrderId, ContractSamples.Contract_Combo(openBook.symbol[n], "BAG", openBook.expiration[n], openBook.CallPut[n], legB_ID, legS_ID, "50", "GLOBEX"), OrderSamples.ComboLimitOrder("SELL", openBook.size[n], -spread_premium, false)); Thread.Sleep(sleep2); openBook.size[n] = 0; if (openBook.legS[n] == callESlegS[0]) { callESlegS.RemoveAt(0); } // else if (openBook.legS[n] == callESlegS[1]) callESlegS.RemoveAt(1); // else if (openBook.legS[n] == callESlegS[2]) callESlegS.RemoveAt(2); else if (openBook.symbol[n] == "CL") { spread_premium = 0; // spread_premium = getSpreadPremium(clientSocket, Allture, openBook, n, openBook.legS[n], openBook.legB[n], "FOP", "NYMEX"); legS_ID = getContractID(clientSocket, Allture, openBook, n, openBook.legS[n], "FOP", "NYMEX"); legB_ID = getContractID(clientSocket, Allture, openBook, n, openBook.legB[n], "FOP", "NYMEX"); //********* Place order ************************ clientSocket.reqIds(-1); Thread.Sleep(sleep1); clientSocket.placeOrder(Allture.NextOrderId, ContractSamples.Contract_Combo(openBook.symbol[n], "BAG", openBook.expiration[n], openBook.CallPut[n], legB_ID, legS_ID, "1000", "NYMEX"), OrderSamples.ComboLimitOrder("SELL", openBook.size[n], -spread_premium, false)); Thread.Sleep(sleep2); openBook.size[n] = 0; if (openBook.legS[n] == callCLlegS[0]) { callCLlegS.RemoveAt(0); } // else if (openBook.legS[n] == callCLlegS[1]) callCLlegS.RemoveAt(1); // else if (openBook.legS[n] == callCLlegS[2]) callCLlegS.RemoveAt(2); } else if (openBook.symbol[n] == "GC") { spread_premium = 0; // spread_premium = getSpreadPremium(clientSocket, Allture, openBook, n, openBook.legS[n], openBook.legB[n], "FOP", "NYMEX"); legS_ID = getContractID(clientSocket, Allture, openBook, n, openBook.legS[n], "FOP", "NYMEX"); legB_ID = getContractID(clientSocket, Allture, openBook, n, openBook.legB[n], "FOP", "NYMEX"); //********* Place order ************************ clientSocket.reqIds(-1); Thread.Sleep(sleep1); clientSocket.placeOrder(Allture.NextOrderId, ContractSamples.Contract_Combo(openBook.symbol[n], "BAG", openBook.expiration[n], openBook.CallPut[n], legB_ID, legS_ID, "100", "NYMEX"), OrderSamples.ComboLimitOrder("SELL", openBook.size[n], -spread_premium, false)); Thread.Sleep(sleep2); openBook.size[n] = 0; if (openBook.legS[n] == callCLlegS[0]) { callGClegS.RemoveAt(0); } // else if (openBook.legS[n] == callCLlegS[1]) callCLlegS.RemoveAt(1); // else if (openBook.legS[n] == callCLlegS[2]) callCLlegS.RemoveAt(2); } // very complicated, need more time to think through !!! one thought - just simply place order, don't cancel it, until it filled // seems if we don't directly get position info from IB, then should not do any auto exits } } } } } } Console.WriteLine("\n start finish, time: " + DateTime.Now + " \n"); return(0); }