2010年6月29日 星期二

DBCC CHECKDB 與 DBCC CHECKTABLE 搭配使用 REPAIR_REBUILD 修復參數

DBCC CHECKDB 的檢查與修復對象是指定的資料庫。
DBCC CHECKTABLE 的檢查與修復對象是指定的資料表或索引檢視表。
DBCC CHECKDB 與 DBCC CHECKTABLE 都支援修復的作業,以下為參數的說明:
(1) REPAIR_ALLOW_DATA_LOSS
嘗試修復所有報告的錯誤。這些修復可能會造成某些資料的遺失。
(2) REPAIR_FAST
維護這個語法的目的,只是為了與舊版相容。不會執行任何修復動作。
(3) REPAIR_REBUILD
執行不可能造成資料遺失的修復,這可包括快速修復 (例如,修復非叢集索引中遺失的資料列) 以及更耗時的修復 (例如,重建索引)。
REPAIR_REBUILD 不會修復與 FILESTREAM 資料有關的錯誤。

而且,指定的資料庫必須為「單一使用者模式」。
重要事項:
* 最好不要使用這些 REPAIR 選項。
* 若要修復錯誤,我們建議您從備份中還原。
* 修復作業並不考慮資料表或資料表之間的任何條件約束。
* 如果指定的資料表涉及一或多項條件約束,建議您在修復作業之後,執行 DBCC CHECKCONSTRAINTS。
* 如果您必須使用 REPAIR,請執行不含修復選項的 DBCC CHECKDB 來尋找要使用的修復層級。
* 如果您使用 REPAIR_ALLOW_DATA_LOSS 層級,建議您在搭配這個選項執行 DBCC CHECKDB 之前,先備份資料庫。
以下為 DBCC CHECKDB 搭配使用 REPAIR_REBUILD 修復參數的範例程式碼:

USE master
GO
-- 先設定此資料庫的狀態為:SINGLE_USER
ALTER DATABASE [資料庫名稱]
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE;
GO

-- 執行 DBCC CHECKDB 搭配使用 REPAIR_REBUILD 參數
DBCC CHECKDB (Northwind, REPAIR_REBUILD);
GO

/*
若是非處於「單一使用者模式」時,將遇到以下的錯誤:
訊息 7919,層級 16,狀態 3,行 1
修復陳述式並未處理。資料庫必須處於單一使用者模式。
*/

-- 設定此資料庫的狀態為:MULTI_USER,回復正常上線
ALTER DATABASE [資料庫名稱]
SET MULTI_USER;
GO

以下為 DBCC CHECKTABLE 搭配使用 REPAIR_REBUILD 修復參數的範例程式碼:

USE master
GO
-- 先設定此資料庫的狀態為:SINGLE_USER
-- 使用終止選項 WITH ROLLBACK IMMEDIATE。所有未完成的交易都會回復,而且資料庫的任何其他連接都會立即中斷
ALTER DATABASE [資料庫名稱]
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE;
GO

-- 執行 DBCC CHECKTABLE 搭配使用 REPAIR_REBUILD 參數
USE [資料庫名稱]
GO
DBCC CHECKTABLE ([資料表], REPAIR_REBUILD);
GO
/*
若是非處於「單一使用者模式」時,將遇到以下的錯誤:
訊息 7919,層級 16,狀態 3,行 1
修復陳述式並未處理。資料庫必須處於單一使用者模式。
*/

-- 設定此資料庫的狀態為:MULTI_USER,回復正常上線
ALTER DATABASE [資料庫名稱]
SET MULTI_USER;
GO


2010年6月27日 星期日

第二次運行時自動關閉程式如何實現

以下做法可以實現:一支程式,第一次可正常運行,重複運行時,不但不能運行,還把第一次運行的程式關閉
uses Tlhelp32;

function FindProcess(AFileName: string): boolean;
var
hSnapshot: THandle;
lppe: TProcessEntry32;
Found: Boolean;
KillHandle: THandle;
begin
Result :=False;
hSnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
lppe.dwSize := SizeOf(TProcessEntry32);
Found := Process32First(hSnapshot, lppe);
while Found do
begin
if ((UpperCase(ExtractFileName(lppe.szExeFile))=UpperCase(AFileName)) or (UpperCase(lppe.szExeFile )=UpperCase(AFileName))) then
begin
Result :=True;
end;
Found := Process32Next(hSnapshot, lppe);
end;
end;


procedure EndProcess(AFileName: string);
const
PROCESS_TERMINATE = $0001;
var
ContinueLoop: BOOL;
FSnapShotHandle: THandle;
FProcessEntry32: TProcessEntry32;
begin
FSnapShotHandle := CreateToolhelp32SnapShot(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
while integer(ContinueLoop) <> 0 do
begin
if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile))=UpperCase(AFileName)) or (UpperCase(FProcessEntry32.szExeFile )=UpperCase(AFileName))) then
TerminateProcess(OpenProcess(PROCESS_TERMINATE, BOOL(0),FProcessEntry32.th32ProcessID), 0);
ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
end;
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
if FindProcess('notepad.exe') then
begin
EndProcess('notepad.exe');
end;
end;

Dataset存成CSV檔

use Excel2000;

procedure TFMstGDS_1903R14.SaveToExcel_CSV(var DBGrid: TInfoDBGrid);
var aExeclFile:TSaveDialog;
begin
if DBGrid.DataSource=nil then Exit;
if not DBGrid.DataSource.DataSet.Active then Exit;
if DBGrid.DataSource.DataSet.RecordCount = 0 then Exit;
aExeclFile:=TSaveDialog.Create(nil);
try
aExeclFile.DefaultExt:='.CSV';
aExeclFile.Filter:='*.CSV|*.CSV';
aExeclFile.Title:='請選擇EXECL(CSV)的目錄';
aExeclFile.Options:=[ofOverwritePrompt,ofHideReadOnly,ofEnableSizing];
if aExeclFile.Execute then DBGrid3Excel_CSV(DBGrid,aExeclFile.filename);
finally
aExeclFile.Free;
end;
end;


procedure TFMstGDS_1903R14.DBGrid3Excel_CSV(var DBGrid: TINFODBGrid;
ExcelFileName: string);
var
lcid: integer;
Temp_Worksheet: _WorkSheet;
SheetType:OleVariant;
ExCelApplication1 : TExCelApplication;
ExcelWorkBook1 : TExcelWorkBook;
ExcelWorksheet1 : TExcelWorksheet;
ExcelChart1 : TExcelChart;

begin
inherited;

SaveDataSet(DBGrid.DataSource.DataSet,ExcelFileName, ',');
try
//開始轉換
lcid := GetUserDefaultLCID;
//動態新增;
ExCelApplication1 := TExCelApplication.Create(nil);
ExcelWorkBook1 := TExcelWorkBook.Create(nil);
ExcelWorksheet1 := TExcelWorksheet.Create(nil);
ExcelChart1 := TExcelChart.Create(nil);
//開啟現存的檔案
ExcelApplication1.Connect;
ExcelWorkbook1.ConnectTo(
ExcelApplication1.Workbooks.Open (ExcelFileName, EmptyParam,EmptyParam,EmptyParam,EmptyParam,
EmptyParam,EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam,0));
ExcelWorksheet1.ConnectTo(ExcelWorkbook1.Worksheets[1] as _Worksheet);
ExcelWorksheet1.Name := '資料';
except
ON E: EXCEPTION DO
BEGIN
showmessage(e.Message);
showmessage('無法連上Excel');
END;
end;
end;


procedure TFMstGDS_1903R14.SaveDataSet(TT: TDataSet; FileName,
Delimiter: String);
var
i, j : integer;line : string;
M : TStringList;
begin
TT.Active := true;
TT.First;
M := TStringList.Create;
//M.Add(Printstr); //條件
{//抬頭
Line := TT.Fields[0].DisplayName;
For i := 1 to TT.FieldCount -1 do
begin
if TT.Fields[i].Visible then
Line := Line + Delimiter + TT.Fields[i].DisplayLabel;
end;
M.Add(Line);
}
j:=0;
while not TT.Eof do
begin
Line := TT.Fields[0].AsString;
For i := 1 to TT.FieldCount -1 do
begin
if TT.Fields[i].Visible then
begin
if TT.Fields[i].DataType = ftString then
begin
if Copy(TT.Fields[i].AsString, 1, 1) = '0' then Line := Line + Delimiter +''''+ TT.Fields[i].AsString
else Line := Line + Delimiter + TT.Fields[i].AsString;
end
else
begin
Line := Line + Delimiter + TT.Fields[i].AsString;
end;
end;
end;
M.Add(Line);
inc(j);
// Label1.Caption := '第' + inttostr(j) + '筆';
Application.ProcessMessages;
TT.Next;
end;
M.SaveToFile(FileName);
end;

2010年6月25日 星期五

關於期貨結算日期以及摩台結算影響

台指期、電子、金融期貨及選擇權都是:
每個月的第三個星期三為最後的交易日,
隔天(星期四)上午則為結算日,結算價則是開盤前15分鐘均價做為結算價。
摩台結算為該月倒數的第二個交易日
例如3月31日為最後一天,結算日就是3月30日。
結算價則是:最後一盤的成交價為結算價!
又如:如11月摩台指因11/29(六)及11 /30(日)為假日,故倒數第二個交易日為11/27(四),
12月摩根台指將於12/30(二)
以當日1:30分之價格結算。買賣小技巧
用市價買進,表示以外盤(賣價)買進;反之市價賣出,以內盤(買價)賣出。
比如說12月台指買賣價分別為 5825、5831
則用市價買進會以5831價格回來,用市價賣出會以5825價格回來。

P.S. 以上這是普通及正常的狀況。
可是如果遇到快市(市場行情劇烈變動)時,難以擔保市價賣出不會以跌停價成交。
而市價買進也有可能以漲停價成交。所以盡量少下市價單的好,如果可以盡量用better price下單。

如上面的例子:
如果要買進,建議多掛個10點。
如買進5841價格,而成交回來的價格應該會是在 5831附近,不會偏離太遠。

如果要賣出,建議少掛個10點。
如賣出5815價格,而成交回來的價格應該會是在5825附近,不會偏離太遠。
這樣就可以避免市價單,以漲停、跌停價回來的窘境。


另外關於摩台結算:(轉貼自Yahoo知識)

因為摩台的成分股大都是台灣加權指數裡比重較高的個股,所以外資在摩台期貨的持有部位,會影響這些成分股未來的表現,相對也會影響台灣加權指數的表現。

若外資持有摩台期貨多單部位較多,則結算時就會拉高這些成分股,使摩台現貨指數拉高,以提高獲利;若外資持有摩台期貨空單部位較多,則以相同手段壓低摩台現貨結算。

其實不論拉高結算或是壓低結算不一定會給台股造成決定性的訊號。
一搬直覺為以為摩刻意作價後,下個月走勢就會反轉,其實結果不然。
會拉高結算表示外資或大型作手手上多單較多,所以拉台現貨,以利期結算的價位,但這不表示其也是為了拉高佈空單,主因是主力的多單可能在結算前就已經佈好,拉抬指數只是幫助即將到期之多單結算
而已。
不過其比較客觀的觀察方法可以觀察結算前的未平艙量,假若未平艙量相較前幾月同時點都來的大時,顯然有人刻意在結算前佈下期的單,隨後又拉高結算,就可以顯示作手可能還是持有多單為主,反之亦然。
但個人認為拉高或壓低結算,在即使觀察過未平艙量變化後,一切現象都只能參考,在未來有500點的行情變化下,幾十點的變動,對作手來說是可以容忍的,另外若真的有明確訊號的話,作手也就騙不到散戶的錢啦。

個人的操作手法是當OI有異常大量時,自己又無法判斷多空時,可在變盤日在選擇權上佈勒氏,或盡量避免賣出來賺取時間價值,因行情可能有大變化。

2010年6月10日 星期四

[SQL]提升查詢效率與避免LOCK發生

以下文章轉貼:湯瑪的吳@安達利.機車行.台南
要提升SQL的查詢效能,一般來說大家會以建立索引(index)為第一考量
其實除了index的建立之外,當我們在下SQL Command時,
在語法中加一段WITH (NOLOCK)
可以改善線上大量查詢的環境中資料集被LOCK的現象藉此改善查詢的效能。

不過有一點千萬要注意的就是,WITH (NOLOCK)的SQL SELECT 有可能會造成Dirty Read。 例如:
SELECT COUNT(UserID)
FROM EMPLOYEE WITH (NOLOCK)
JOIN WORKING_GROUP WITH (NOLOCK) ON
EMPLOYEE.UserID = WORKING_GROUP.UserID

因為SQL Server 會執行對應的鎖定一致性檢查。
欲改善整體資料庫查詢的效能,請將WITH (NOLOCK)加在您的SELECT語法中 Table名稱的後面,
雖然(NOLOCK)也可以,但是微軟還是建議大家要加WITH
除了簡單的SELECT之外,有JOIN 的SELECT語法也是可以使用的。
但是DELETE、INSERT、UPDATE這些需要transaction的指令就不行了…

有些文件說,加了WITH (NOLOCK)的SQL查詢效率可以增加33%
小弟試的結果…是有快了點,但是33%的效能提升…
我就不太清楚是怎麼算出來的!!

加了WITH (NOLOCK)即告訴SQL Server,我們的這段SELECT指令
無需去考慮目前table的transaction lock狀態,因此效能上會有明顯的提升,
而且資料庫系統的Lock現象會有明顯的減少(包含Dead Lock)。

有一點要特別注意,因為WITH (NOLOCK)不考慮目前table的transaction lock,
因此當有某些資料正處於多個phase交易(例如跨多個table的transaction交易-->如提款系統),
WITH (NOLOCK)會讓目前處理交易process的資料被乎略…

講白話一點,也就是說當使用NoLock時,它允許閱讀那些已經修改但是還沒有交易完成的資料。
因此如果有需要考量transaction交易資料的即時完整性時,使用WITH (NOLOCK)就要好好考慮一下。

如果不需考量transaction,WITH (NOLOCK)或許是個好用的參考

註1:WITH ( < table_hint > )
指定由查詢最佳化器使用的資料表掃描、一或多個索引,
或由查詢最佳化器利用此資料表以及為此陳述式使用鎖定模式。

註2:WITH (NOLOCK)相當於 READ UNCOMMITTED

2010年6月3日 星期四

正價差?逆價差?到底哪裡有差?

期指正價差及逆價差所透露的玄機

在期指中,正價差及逆價差的幅度高低,是預判後市的重要指標。當出現正價差時,代表未來行情看好;反之若出現逆價差時,顯示未來趨於保守,因此進軍期指市場,必須隨時掌握正逆價差的變化,才能成為台指期貨的常勝軍。

經常在分析報導中聽到專家說:「期指正價差過大,後市可能轉空」,或是「逆價差過大,後勢低檔無多。」什麼叫做正、逆價差呢?台指期貨與現貨的價格差距,就叫做價差。
提到價差,先來了解他是怎麼來的?
價差=期貨與現貨的差值期貨價值=現貨價值+成本
正價差:期貨價值>現貨價值
逆價差:期貨價值<現貨價值
這就是價差的最原始公式,而成本在指數期貨中就是代表利息.以加權為例:今天收在7777,那成本就是1555400台幣,我將它放在銀行生利息,所得的利息就是價差.這是最基本的觀念

理論上期貨價格應高於現貨價格
(1)正價差:期貨價格>現貨價格
(2)逆價差:期貨價格<現貨價格

期貨市場上也有人採用「基差」,來作為價格發現功能的研判,
基差同樣是現貨價格與期貨價格的價差,
但基差則是以現貨價格減去期貨價格,當基差為正數,相當於逆價差」
基差為負數,則是「正價差」。

期貨價格與現貨間,維持微幅正價差為正常狀態,但是如果正價差或逆價差過大,對於現貨未來的走勢,則呈現「價格發現」功能。如果正價差持續擴大,表示期貨市場的交易人對後市樂觀,寧願多付出價差,來搶進多單。
但是如果逆價差過大,則是預期後市,還有低檔,先在期貨市場作賣出或是放空,為現貨部位避險,或是避免日後損失。
實例觀察:
觀察台灣期貨市場的價差變化,在2000年11月,國安基金進場護盤時,一度將正價差拉大至200點,否則極少出現百點以上的正價差。
逆價差的表現,也是同樣的情況,
在2001年9月,加權指數滑落至4000點以下時,曾經出現超過150點的逆價差,顯示當時期貨市場對後市極度悲觀。因此有時候過大的正價差或逆價差,也被視為市場的心理指標,需留意過度樂觀或是過度悲觀,都有可能導致行情逆轉。

■理論上期貨價格應高於現貨價格

由於期貨價格代表投資人對未來的預期,因此若預期未來走揚,就會出現期貨價格高於現貨價格,也就是正價差;若是預期未來會走弱,期貨價格就會低於現貨價格,就叫做逆價差。

由於加計持有成本的關係,期貨價格理論上應會高於現貨價格,也就是期貨的理論價格,等於現貨價格加利息後,再減去股利所得;因此當期貨價格反而低於現貨價格時,當然代表的意義重大。

Tips:期貨理論價格的計算公式
期貨理論價格=現貨價格 ×(1+利息-股利)

摩台指多為外資所投資,台期指則為國內法人或投資人進出,因此摩台指的正、逆價差數據,代表外資對未來行情的看法,而台期指則代表國內投資人對後市的看法。

Tips:正逆價差在某些時期不具參考意義
期指到期前三日在多、空雙方逐漸平倉的狀況下,正逆價差會逐漸縮小,因為期貨到期時會以現貨價格結算,所以此時不具參考價值。

Tips:金融期指的正逆價差參考意義不大
金融股在多年走空後,即使金融期指出現正價差,行情卻未必能走揚,正逆價差參考意義不大。雖然今年金融股已有轉為多頭趨勢,但行情恐需持續一年以上,正逆價差的指標意義,才會漸受肯定。


■正、逆價差操作策略各有不同

那麼,是不是看到正價差就做多,看到逆價差就做空呢?其實不全然如此,提出以下七項操作原則:

◆準則1:正價差超過50點,未來行情樂觀

若正價差趨勢可持續,期指可持續走多,現股亦可做多。例如去年10月11日時台期指與現貨出現正價差55點,顯示後市可望走多,而當日台股指數為3789點,台期指為3845點;到了11月9日加權指數漲到4123點,台期指亦漲到4020點。

◆準則2:逆價差超過50點,未來行情悲觀

此時賣壓也會加重,甚至還會引發現股賣壓出籠。例如在2000年11月16日時,台指期貨出現逆價差80點,當時台股指數為5454點,台期指為5374點,但是到了12月16日時,台股指數已跌到5134點,而台期指亦跌到5136點。

◆準則3:正、逆價差超過100點,以套利方式操作

因為正、逆價差超過100點以上,通常行情走多或走空已有一段時間,在此時加碼的風險相對提高,因此最好採取買進現貨、放空期指,或賣出現貨、買進期指的套利方式,以降低風險。

◆準則4:正逆價差升到近期高點時,趨勢將出現反轉

例如在1998年11月30日時台指期貨創下正價差235點的紀錄,接著就反轉重挫;而在2000年3月30日,台期指也曾出現逆價差271點,此後便反轉上漲,並出現軋空行情。

◆ 準則5:正逆價差出現2%以上的差距,可能出現大行情

而且若2%價差時間愈長,行情就持續愈久。持續一周以上可望有一個月行情,連續一個月以上可望有三個月行情,連續兩個月以上可望有半年行情。

◆準則6:若出現摩台指、台期指不同調時,以摩台指為準

通常以摩台指代表外資,以台期指代表國內法人或散戶,因此當兩者正逆價差同步時,代表期指、現貨可望同步走揚或下跌。但若出現摩台指、台期指不同調時,應以摩台指為依據,因為外資的影響力畢竟還是高於國內法人或散戶。

例如前年911事件後,台股反彈到3800點時,許多國內投資人認為最多反彈到4100點,因此在3900點以上放空台指期貨,台期指出現逆價差1%;但外資卻一路買進,使得摩台指出現0.5%的正價差,台期指、摩台指的價差幅度雖未達2%,但在看法出現極大差異下,之後也確實引發一段大多頭行情。

價差對於交易上的手段:
1.當行情長期出現正價差,通常代表未來的市場對於多方的勢力還是比較看好的,所以一路呈現正價差,通常代表這是多頭市場的現象.
2.當行情長期出現逆價差,通常代表未來的市場對於空方的勢力還是比較看好的,所以一路呈現逆價差,通常代表這是空頭市場的現象.
以上這兩點是市場在判斷多頭與空頭的直覺式判斷法則.
3.當市場一路的出現正價差之際,突然在盤中出現逆價差,這是多頭的短線進場買點,但是僅就短線交易為主,並沒有統計是否可以長期交易.
所以,不要市場一片的緊張轉為逆價差時跟著殺盤,反而應當可以逆勢的思考賺取短線上的利潤.
為何會出現這樣的狀況?這就是說明了:當市場是長期的多頭的時候,一次兩次的逆價差並不會改變太多的多頭因子.
所以上面的策略可以應用再第一次跟第二次,只要不貪心,那通常會有意外的利潤出現.
4.就第三點的相反,討論到逆價差的部份.相同的,如果一路的逆價差之中,出現正價差,並不代表市場將由此出現逆轉的現象,反倒是趁機反彈空點.如果有價差圖可以觀察的話,正價差出現轉折向下的時候應當是比較好的進場點位.
以上法則是關於指數的市場部分.大宗物資的價差結構有些許的不同.這是許多交易者比較會去忽視的價差觀點.許多時候,交易機會就隱藏在忽視的細節中.