// ********************************************************************** // * Управление заявками * // ********************************************************************** string SendOrder(char op, int price, int quantity, out int tid) { if (connected) { tid = ++transId; Trans2Quik.Result r = Trans2Quik.SEND_ASYNC_TRANSACTION( "TRANS_ID=" + tid + "; ACCOUNT=" + cfg.u.QuikAccount + "; CLIENT_CODE=" + cfg.u.QuikClientCode + "//" + cfg.FullProgName + "; SECCODE=" + secCode + "; CLASSCODE=" + classCode + "; ACTION=NEW_ORDER; OPERATION=" + op + "; PRICE=" + Price.GetRaw(price) + "; QUANTITY=" + quantity + ";", out error, msg, msg.Capacity); if (r == Trans2Quik.Result.SUCCESS) { return(null); } else { tid = 0; return(msg.Length > 0 ? Trim(msg.ToString()) : r + ", " + error); } } else { tid = 0; return(NoConnectionText); } }
// ********************************************************************** public string KillOrder(long oid) { if (connected) { transId++; Trans2Quik.Result r = Trans2Quik.SEND_ASYNC_TRANSACTION( "TRANS_ID=" + transId + "; SECCODE=" + secCode + "; CLASSCODE=" + classCode + "; ACTION=KILL_ORDER; ORDER_KEY=" + oid + ";", out error, msg, msg.Capacity); if (r == Trans2Quik.Result.SUCCESS) { return(null); } else { return(msg.Length > 0 ? Trim(msg.ToString()) : r + ", " + error); } } else { return(NoConnectionText); } }
// ********************************************************************** void StatusCallback(Trans2Quik.Result evnt, int err, string m) { switch (evnt) { case Trans2Quik.Result.QUIK_DISCONNECTED: connecting.Change(0, cfg.QuikTryConnectInterval); break; case Trans2Quik.Result.DLL_DISCONNECTED: connected = false; connecting.Change(0, cfg.QuikTryConnectInterval); break; } }
// ********************************************************************** void StatusCallback(Trans2Quik.Result evnt, int err, string m) { switch (evnt) { case Trans2Quik.Result.QUIK_DISCONNECTED: SetStatus(Broken, m); connecting.Change(0, cfg.TryConnectInterval); break; case Trans2Quik.Result.DLL_DISCONNECTED: SetStatus(Broken, "Связь с терминалом разорвана"); connected = false; connecting.Change(0, cfg.TryConnectInterval); break; } }
// ********************************************************************** // * Соединение * // ********************************************************************** void TryConnect(Object state) { if (working) { try { if ( Trans2Quik.SET_CONNECTION_STATUS_CALLBACK(StatusCallback, out error, msg, msg.Capacity) != Trans2Quik.Result.SUCCESS || Trans2Quik.SET_TRANSACTIONS_REPLY_CALLBACK(TransactionReplyCallback, out error, msg, msg.Capacity) != Trans2Quik.Result.SUCCESS ) { mgr.ConnectionUpdate(TermConnection.None, msg.ToString()); return; } Trans2Quik.Result result = Trans2Quik.CONNECT(cfg.u.QuikFolder, out error, msg, msg.Capacity); if (result != Trans2Quik.Result.SUCCESS && result != Trans2Quik.Result.ALREADY_CONNECTED_TO_QUIK) { mgr.ConnectionUpdate(TermConnection.None, msg.ToString()); return; } } catch (Exception e) { mgr.ConnectionUpdate(TermConnection.None, e.Message); return; } connected = true; if (Trans2Quik.UNSUBSCRIBE_ORDERS() != Trans2Quik.Result.SUCCESS || Trans2Quik.UNSUBSCRIBE_TRADES() != Trans2Quik.Result.SUCCESS || Trans2Quik.SUBSCRIBE_ORDERS(cfg.u.ClassCode, cfg.u.SecCode) != Trans2Quik.Result.SUCCESS || Trans2Quik.START_ORDERS(OrderStatusCallback) != Trans2Quik.Result.SUCCESS || Trans2Quik.SUBSCRIBE_TRADES(cfg.u.ClassCode, cfg.u.SecCode) != Trans2Quik.Result.SUCCESS || Trans2Quik.START_TRADES(TradeStatusCallback) != Trans2Quik.Result.SUCCESS) { mgr.ConnectionUpdate(TermConnection.Partial, "Соединение установлено неполностью"); return; } mgr.ConnectionUpdate(TermConnection.Full, "Соединение с сервером QUIK установлено"); } connecting.Change(Timeout.Infinite, Timeout.Infinite); }
// ********************************************************************** // * Заявки * // ********************************************************************** void TransactionReplyCallback( Trans2Quik.Result r, int err, int rc, int tid, double order_id, string msg) { if (r == Trans2Quik.Result.SUCCESS && rc == 3) { mgr.ActionReply(tid, (long)order_id, null); } else { mgr.ActionReply(tid, (long)order_id, msg.Length == 0 ? r + ", " + err : msg.ToString()); } }
// ********************************************************************** // * Заявки * // ********************************************************************** void TransactionReplyCallback( Trans2Quik.Result r, int err, int rc, int tid, double order_id, string msg) { if (TraderReplyHandler != null) { if (r == Trans2Quik.Result.SUCCESS && rc == 3) { TraderReplyHandler(tid, (long)order_id, null); } else { TraderReplyHandler(tid, (long)order_id, msg.Length > 0 ? Trim(msg) : r + ", " + err); } } }