2022年1月21日 星期五

VS code 無法連線 MySQL 8 解決

 

連線錯誤訊息:

ER_NOT_SUPPORTED_AUTH_MODE:client does not support authentication protocol requested by server,consider upgrading mysql client

解決方法:
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_new_password';
mysql> FLUSH PRIVILEGES;
mysql> quit


2020年12月23日 星期三

SQL Server Express 如何設定TCP/IP連線


1.點選【資料庫】/滑鼠右鍵【屬性】

2.切換到【安全性】/勾選【SQL server及Windws驗證模式】/【確定】

3.到檔案總管,點選【本機】/按【滑鼠右鍵】選【管理】

4.找到SQLExpress的通訊協定,將TCP/IP點選,按滑鼠右鍵選【啟用】

5.出現要重新啟動,改的設定才會有效

6.接著點選滑鼠右鍵/選【內容】

7.切換到【IP位置】/將TCP Dynamic Ports 的0清空,TCP Port輸入1433,【確定】

8.找到【SQL Server服務】,在SQL server點選滑鼠右鍵/【停止】

9.在停止的SQL Server按滑鼠右鍵,選【啟用】,這樣就可以正常使用了

from: http://wordpress.bestdaylong.com/blog/archives/19735 

2020年11月26日 星期四

SQL條件判斷式 Case When Then

 

Case When Then 可以說是 SQL的  IF 判斷式

大致上語法如下


Select Case (要判斷的欄位)

  When ('條件1') Then ('結果1')

  When ('條件2') Then ('結果2')

  ...

  (Else "結果N")

  End

From TableA



2020年4月29日 星期三

在GridView中加入自動編號的序號

參考: https://blog.xuite.net/xiaolian/blog/46204394-%E5%9C%A8GridView%E4%B8%AD%E5%8A%A0%E5%85%A5%E8%87%AA%E5%8B%95%E7%B7%A8%E8%99%9F%E7%9A%84%E5%BA%8F%E8%99%9F

在Aspx檔案中GridView表格內插入一個欄位,在第一欄加上TemplateField的欄位,語法如下:

流水號從第一筆編起
  <asp:TemplateField HeaderText="序號">
          <ItemTemplate>
             <%#GridView1.PageIndex * GridView1.PageSize + GridView1.Rows.Count + 1%>
           </ItemTemplate>
           <HeaderStyle Wrap="False"  />
            <ItemStyle  HorizontalAlign="Center" VerticalAlign="Middle" />
  </asp:TemplateField>

OR

  <asp:TemplateField HeaderText="序號">
         <ItemTemplate>
            <%#Container.DataItemIndex + 1%>
         </ItemTemplate>
         <HeaderStyle Wrap="False"  />
         <ItemStyle  HorizontalAlign="Center" VerticalAlign="Middle" />
  </asp:TemplateField>


流水號每頁從1編起
   <asp:TemplateField HeaderText="序號">
           <ItemTemplate>
              <%#Container.DisplayIndex + 1%>
            </ItemTemplate>
            <HeaderStyle Wrap="False"  />
            <ItemStyle HorizontalAlign="Center" VerticalAlign="Middle" />
   </asp:TemplateField>
 

2019年5月14日 星期二

SQL 日期格式



1. date和datetime类型的区别

date是SQL Server 2008新引进的数据类型。它表示一个日期,不包含时间部分,可以表示的日期范围从公元元年1月1日到9999年12月31日。只需要3个字节的存储空间。
dateTime 日期和时间部分,可以表示的日期范围从公元1753年1月1日00:00:00.000 到9999年12月31日23:59:59.997 ,精确到3.33毫秒,它需要8个字节的存储空间。

2. GETDATE()函数,返回当前日期时间(datetime类型)

SELECT GETDATE();
返回
2017-03-16 09:10:08.947
例如创建表格M
CREATE TABLE [dbo].[M](
    [id] [int] NULL,
    [日期] [date] NULL,
    [时间] [datetime] NULL
) ON [PRIMARY]
可以使用GETDATE()函数插入数据
INSERT INTO M(id, 日期, 时间) VALUES (1, CONVERT(VARCHAR, GETDATE(), 110), GETDATE());

3. CONVERT()函数,格式化日期

CONVERT() 函数是把日期转换为新数据类型的通用函数,也可以用不同的格式显示日期/时间数据。
语法:
CONVERT(data_type(length),date,style)
  • data_type(length) 规定目标数据类型(带有可选的长度)。date指需要转换的值。style 规定日期/时间的输出格式。
  • 可以使用的 style 值:当前时间2017年1月3日 09:09:10:037
Style IDSQL对应格式
1SELECT CONVERT(varchar(100), GETDATE(), 1);01/03/17
2SELECT CONVERT(varchar(100), GETDATE(), 2);17.01.03
3SELECT CONVERT(varchar(100), GETDATE(), 3);03/01/17
4SELECT CONVERT(varchar(100), GETDATE(), 4);03.01.17
5SELECT CONVERT(varchar(100), GETDATE(), 5);03-01-17
6SELECT CONVERT(varchar(100), GETDATE(), 6);03 01 17
7SELECT CONVERT(varchar(100), GETDATE(), 7);01 03, 17
8SELECT CONVERT(varchar(100), GETDATE(), 8);09:09:10
9SELECT CONVERT(varchar(100), GETDATE(), 9);01 3 2017 9:09:10:037AM
10SELECT CONVERT(varchar(100), GETDATE(), 10);01-03-17
11SELECT CONVERT(varchar(100), GETDATE(), 11);17/01/03
12SELECT CONVERT(varchar(100), GETDATE(), 12);170103
13SELECT CONVERT(varchar(100), GETDATE(), 13);03 01 2017 09:09:10:037
14SELECT CONVERT(varchar(100), GETDATE(), 14);09:09:10:037
20SELECT CONVERT(varchar(100), GETDATE(), 20);2017-01-03 09:09:10
21SELECT CONVERT(varchar(100), GETDATE(), 21);2017-01-03 09:09:10.037
22SELECT CONVERT(varchar(100), GETDATE(), 22);01/03/17 9:09:10 AM
23SELECT CONVERT(varchar(100), GETDATE(), 23);2017-01-03
24SELECT CONVERT(varchar(100), GETDATE(), 24);09:09:10
25SELECT CONVERT(varchar(100), GETDATE(), 25);2017-01-03 09:09:10.037
100SELECT CONVERT(varchar(100), GETDATE(), 100);01 3 2017 9:09AM
101SELECT CONVERT(varchar(100), GETDATE(), 101);01/03/2017
102SELECT CONVERT(varchar(100), GETDATE(), 102);2017.01.03
103SELECT CONVERT(varchar(100), GETDATE(), 103);03/01/2017
104SELECT CONVERT(varchar(100), GETDATE(), 104);03.01.2017
105SELECT CONVERT(varchar(100), GETDATE(), 105);03-01-2017
106SELECT CONVERT(varchar(100), GETDATE(), 106);03 01 2017
107SELECT CONVERT(varchar(100), GETDATE(), 107);01 03, 2017
108SELECT CONVERT(varchar(100), GETDATE(), 108);09:09:10
109SELECT CONVERT(varchar(100), GETDATE(), 109);01 3 2017 9:09:10:037AM
110SELECT CONVERT(varchar(100), GETDATE(), 110);01-03-2017
111SELECT CONVERT(varchar(100), GETDATE(), 111);2017/01/03
112SELECT CONVERT(varchar(100), GETDATE(), 112);20170103
113SELECT CONVERT(varchar(100), GETDATE(), 113);03 01 2017 09:09:10:037
114SELECT CONVERT(varchar(100), GETDATE(), 114);09:09:10:037
120SELECT CONVERT(varchar(100), GETDATE(), 120);2017-01-03 09:09:10
121SELECT CONVERT(varchar(100), GETDATE(), 121);2017-01-03 09:09:10.037
126SELECT CONVERT(varchar(100), GETDATE(), 126);2017-01-03T09:09:10.037
130SELECT CONVERT(varchar(100), GETDATE(), 130);5 ???? ?????? 1438 9:09:10:037AM
131SELECT CONVERT(varchar(100), GETDATE(), 131);5/04/1438 9:09:10:037AM



REF:https://www.cnblogs.com/rainman/p/6558261.html

SSMS修改資料表出現"不允許儲存變更,您所做的變更要求下列資料表必須先卸除然後再重新建立。"(SQL 14)

解決方法: 工具→選項→設計師→取消勾選【防止儲存需要資料表重建的變更】 原因: 預設 SQL Server Management Studio 會禁止使用者進行需要資料表重建的變更。這些動作包括: 將新的資料行加入資料表的中間 卸除資料行 變更資料行的 Null 屬性 變更資料行的順序 變更資料行的資料類型 參考連結

2019年3月11日 星期一

word加千分符號

進入表格內, 插入(I)/ 數字(E), 寫入數字 譬如 54321 選 1, 2, 3, ..... 確定 還是得到 54321 滑鼠點入,整個變成灰色區 按 shift-F9 出現公式 { 54321 \* Arabic } 滑鼠點入 改成 { 54321 \# ##,##0 } 按F9 得到 54,321 完成 記得 word的函數公式都是 手動的 ,要經常按 F9 才會得到你要的東西。

2019年3月6日 星期三

gridview選取出現跳動解決方法

在 PostBack後會回到最頂端的位置,有三個方式可讓單頁停留在原來位置

在 PostBack後會回到最頂端的位置,有三個方式可讓單頁停留在原來位置

1.
Web.config

//在<system.web></system.web>之間增加節點
<pages maintainScrollPositionOnPostBack="true"></pages>

2.
.aspx

<@page MaintainScrollPositionOnPostback="true" .......>

3.
.cs

Page.MaintainScrollPositionOnPostBack = true;
code轉換

2019年2月15日 星期五

content 內加入jquery

<script src="Scripts/bootstrap-datepicker.min.js"></script>
    <script>
        $(document).ready(function () {
            $('#<% =DateText.ClientID %>').datepicker({
                changeMonth: true,
                changeYear: true,
                format: 'yyyy/mm/dd',

            });
    </script>


code轉換

2019年1月24日 星期四

SQL 匯入EXCEL 出現錯誤




問題: microsoft.ace.oledb.12.0 提供者並未登錄於畚箕電腦上 問題解決

解決:

安裝
Microsoft Access Database Engine 2010 Redistributable
http://www.microsoft.com/downloads/details.aspx?familyid=C06B8369-60DD-4B64-A44B-84B371EDE16D&displaylang=en

2007 Office system 驅動程式:資料連線元件
http://www.microsoft.com/downloads/zh-tw/confirmation.aspx?displaylang=zh-tw&FamilyID=7554f536-8c28-4598-9b72-ef94e038c891



2018年12月7日 星期五

Sony VAIO 筆電重灌


光碟開機設定
按 F2 進 BIOS
BOOT
External device boot 改 enabled
BOOT Priority 按 F5 上升把 external device 調到第一個
按 F10 儲存設定並重新開機

form: http://pejslin.blogspot.com/2017/02/sony-vaio.html

2018年8月28日 星期二

如何藉由使用 Excel 中的 Visual Basic 程序選取儲存格/範圍

from: https://support.microsoft.com/zh-tw/help/291308/how-to-select-cells-ranges-by-using-visual-basic-procedures-in-excel

1: 如何在使用中的工作表上選取儲存格

若要在使用中的工作表上選取儲存格 D5,您可以使用下列其中一個範例:
ActiveSheet.Cells(5, 4).Select
- 或 -
ActiveSheet.Range("D5").Select

2: 如何在相同的活頁簿中選取另一個工作表上的儲存格

若要在相同的活頁簿中選取另一個工作表上的儲存格 E6,您可以使用下列其中一個範例:
Application.Goto ActiveWorkbook.Sheets("Sheet2").Cells(6, 5)
   - 或 -
 
Application.Goto (ActiveWorkbook.Sheets("Sheet2").Range("E6"))
或者,您可以啟動工作表,然後使用上述的方法 1 來選取儲存格:
Sheets("Sheet2").Activate
ActiveSheet.Cells(6, 5).Select

3: 如何在不同的活頁簿中選取工作表上的儲存格

若要在不同的活頁簿中選取工作表上的儲存格 F7,您可以使用下列其中一個範例:
Application.Goto Workbooks("BOOK2.XLS").Sheets("Sheet1").Cells(7, 6)
- 或 -
Application.Goto Workbooks("BOOK2.XLS").Sheets("Sheet1").Range("F7")
或者,您可以啟動工作表,然後使用上述的方法 1 來選取儲存格:
Workbooks("BOOK2.XLS").Sheets("Sheet1").Activate
ActiveSheet.Cells(7, 6).Select

4: 如何在使用中的工作表上選取儲存格範圍

若要在使用中的工作表上選取範圍 C2:D10,您可以使用下列其中一個範例:
ActiveSheet.Range(Cells(2, 3), Cells(10, 4)).Select
ActiveSheet.Range("C2:D10").Select
ActiveSheet.Range("C2", "D10").Select

5: 如何在相同的活頁簿中選取另一個工作表上的儲存格範圍

若要在相同的活頁簿中選取另一個工作表上的範圍 D3:E11,您可以使用下列其中一個範例:
Application.Goto ActiveWorkbook.Sheets("Sheet3").Range("D3:E11")
Application.Goto ActiveWorkbook.Sheets("Sheet3").Range("D3", "E11")
或者,您可以啟動工作表,然後使用上述的方法 4 來選取範圍:
Sheets("Sheet3").Activate
ActiveSheet.Range(Cells(3, 4), Cells(11, 5)).Select

6: 如何在不同的活頁簿中選取工作表上的儲存格範圍

若要在不同的活頁簿中選取工作表上的範圍 E4:F12,您可以使用下列其中一個範例:
Application.Goto Workbooks("BOOK2.XLS").Sheets("Sheet1").Range("E4:F12")
Application.Goto _
      Workbooks("BOOK2.XLS").Sheets("Sheet1").Range("E4", "F12")
或者,您可以啟動工作表,然後使用上述的方法 4 來選取範圍:
Workbooks("BOOK2.XLS").Sheets("Sheet1").Activate
   ActiveSheet.Range(Cells(4, 5), Cells(12, 6)).Select

7: 如何在使用中的工作表上選取具名的範圍

若要在使用中的工作表上選取具名範圍 "Test",您可以使用下列其中一個範例:
Range("Test").Select
Application.Goto "Test"

8: 如何在相同的活頁簿中選取另一個工作表上的具名範圍

若要在相同的活頁簿中選取另一個工作表上的具名範圍 "Test",您可以使用下列範例:
Application.Goto Sheets("Sheet1").Range("Test")
或者,您可以啟動工作表,然後使用上述的方法 7 來選取具名範圍:
Sheets("Sheet1").Activate
Range("Test").Select

9: 如何在不同的活頁簿中選取工作表上的具名範圍

若要在不同的活頁簿中選取工作表上的具名範圍 "Test",您可以使用下列範例:
Application.Goto _
   Workbooks("BOOK2.XLS").Sheets("Sheet2").Range("Test")
或者,您可以啟動工作表,然後使用上述的方法 7 來選取具名範圍:
Workbooks("BOOK2.XLS").Sheets("Sheet2").Activate
Range("Test").Select

10: 如何選取相對於使用中儲存格的儲存格

若要選取位於使用中儲存格下方五列和左邊四欄之間的儲存格,您可以使用下列範例:
ActiveCell.Offset(5, -4).Select
若要選取位於使用中儲存格上方兩列和右邊三欄之間的儲存格,您可以使用下列範例:
ActiveCell.Offset(-2, 3).Select
注意 如果嘗試選取「不在工作表之內」的儲存格,將會發生錯誤。 如果使用中儲存格是在欄 A 到 D 之間,則上面的第一個範例將會傳回錯誤,因為向左移動四欄會讓使用中儲存格置於無效的儲存格位址。 

11: 如何選取相對於另一個 (不是使用中) 儲存格的儲存格

若要選取位於儲存格 C7 下方五列和右邊四欄之間的儲存格,您可以使用下列其中一個範例:
ActiveSheet.Cells(7, 3).Offset(5, 4).Select
ActiveSheet.Range("C7").Offset(5, 4).Select

12: 如何選取從指定範圍位移的儲存格範圍

若要選取與具名範圍 "Test" 大小相同,但向下移動四列和向右移動三欄的儲存格範圍,您可以使用下列範例:
ActiveSheet.Range("Test").Offset(4, 3).Select
如果具名範圍是在另一個 (不是使用中) 工作表上,請先啟動該工作表,然後使用下列範例來選取範圍:
Sheets("Sheet3").Activate
ActiveSheet.Range("Test").Offset(4, 3).Select

13: 如何選取指定範圍和調整選取範圍大小

若要選取具名範圍 "Database",然後將選取範圍延伸五列,您可以使用下列範例:
Range("Database").Select
Selection.Resize(Selection.Rows.Count + 5, _
   Selection.Columns.Count).Select

14: 如何選取指定範圍、進行位移,然後調整大小

若要選取位於具名範圍 "Database" 下方四列和右邊三欄的範圍,並包括大於具名範圍兩列和一欄,您可以使用下列範例:
Range("Database").Select
Selection.Offset(4, 3).Resize(Selection.Rows.Count + 2, _
   Selection.Columns.Count + 1).Select

15: 如何選取兩個指定範圍以上的聯集

若要選取兩個具名範圍 "Test" 和 "Sample" 的聯集 (亦即合併區域),您可以使用下列範例:
Application.Union(Range("Test"), Range("Sample")).Select
請注意,這兩個範圍都必須在相同的工作表中,此範例才能正常運作。 另請注意,Union 方法無法同時在不同工作表之間使用。 例如,這一行沒有問題
Set y = Application.Union(Range("Sheet1!A1:B2"), Range("Sheet1!C3:D4"))
但這一行
Set y = Application.Union(Range("Sheet1!A1:B2"), Range("Sheet2!C3:D4"))
會傳回錯誤訊息:
Union method of application class failed (應用程式類別的 Union 方法失敗)

16: 如何選取兩個指定範圍以上的交集

若要選取兩個具名範圍 "Test" 和 "Sample" 的交集,您可以使用下列範例:
Application.Intersect(Range("Test"), Range("Sample")).Select
請注意,這兩個範圍都必須在相同的工作表中,此範例才能正常運作。 



本文中的範例 17-21 會參照下列範例資料集。 每一個範例都會陳述在範例資料中所選取的儲存格範圍。
   A1: Name    B1: Sales    C1: Quantity
   A2: a       B2: $10      C2: 5
   A3: b       B3:          C3: 10
   A4: c       B4: $10      C4: 5
   A5:         B5:          C5:
   A6: Total   B6: $20      C6: 20
 

17: 如何選取連續資料欄的最後一個儲存格

若要選取連續欄中的最後一個儲存格,請使用下列範例:
ActiveSheet.Range("a1").End(xlDown).Select
當這個程式碼與範例資料表搭配使用時,會選取儲存格 A4。


18: 如何選取連續資料欄下方的空白儲存格

若要選取連續儲存格範圍下面的儲存格,請使用下列範例:
ActiveSheet.Range("a1").End(xlDown).Offset(1,0).Select
當這個程式碼與範例資料表搭配使用時,會選取儲存格 A5。


19: 如何在欄中選取連續儲存格的整個範圍

若要在欄中選取連續儲存格範圍,請使用下列其中一個範例:
ActiveSheet.Range("a1", ActiveSheet.Range("a1").End(xlDown)).Select
   - 或 -
 
ActiveSheet.Range("a1:" & ActiveSheet.Range("a1"). _
      End(xlDown).Address).Select
當這個程式碼與範例資料表搭配使用時,會選取儲存格 A1 到 A4。 

20: 如何在欄中選取非連續儲存格的整個範圍

若要選取非連續的儲存格範圍,請使用下列其中一個範例:
ActiveSheet.Range("a1",ActiveSheet.Range("a65536").End(xlUp)).Select
   - 或 -
 
ActiveSheet.Range("a1:" & ActiveSheet.Range("a65536"). _
   End(xlUp).Address).Select
當這個程式碼與範例資料表搭配使用時,會選取儲存格 A1 到 A6。 

21: 如何選取矩形儲存格範圍

若要選取某儲存格四周的矩形儲存格範圍,請使用 CurrentRegion 方法。 透過 CurrentRegion 方法選取的範圍,是以任何組合的空白列與空白欄為邊界的區域。 下列範例說明如何使用 CurrentRegion 方法:
ActiveSheet.Range("a1").CurrentRegion.Select
這個程式碼會選取儲存格 A1 到 C4。 下面列出選取相同儲存格範圍的其他範例:
ActiveSheet.Range("a1", _
   ActiveSheet.Range("a1").End(xlDown).End(xlToRight)).Select
   - 或 -
 
ActiveSheet.Range("a1:" & _
   ActiveSheet.Range("a1").End(xlDown).End(xlToRight).Address).Select
在某些情況下,您可能需要選取儲存格 A1 到 C6。 在此範例中,CurrentRegion 方法沒有作用,因為第 5 列是空白行。 下列範例會選取所有儲存格:
lastCol = ActiveSheet.Range("a1").End(xlToRight).Column
lastRow = ActiveSheet.Cells(65536, lastCol).End(xlUp).Row
ActiveSheet.Range("a1", ActiveSheet.Cells(lastRow, lastCol)).Select
    - 或 -
 
lastCol = ActiveSheet.Range("a1").End(xlToRight).Column
lastRow = ActiveSheet.Cells(65536, lastCol).End(xlUp).Row
ActiveSheet.Range("a1:" & _
   ActiveSheet.Cells(lastRow, lastCol).Address).Select

22: 如何選取不同長度的多個非連續欄

若要選取不同長度的多個非連續欄,請使用下列範例資料表和巨集範例:
   A1: 1  B1: 1  C1: 1  D1: 1
   A2: 2  B2: 2  C2: 2  D2: 2
   A3: 3  B3: 3  C3: 3  D3: 3
   A4:    B4: 4  C4: 4  D4: 4
   A5:    B5: 5  C5: 5  D5:
   A6:    B6:    C6: 6  D6:
 
StartRange = "A1"
EndRange = "C1"
Set a = Range(StartRange, Range(StartRange).End(xlDown))
Set b = Range(EndRange, Range(EndRange).End(xlDown))
Union(a,b).Select
當這個程式碼與範例資料表搭配使用時,會選取儲存格 A1:A3 和 C1:C6。

範例的注意事項

  • 通常可以省略 ActiveSheet 屬性,因為如果未命名特定工作表,則會隱含該屬性。 例如,與其使用
    ActiveSheet.Range("D5").Select
    您可以使用:
    Range("D5").Select
  • 通常也可以省略 ActiveWorkbook 屬性。 除非已命名特定活頁簿,否則會隱含使用中的活頁簿。
  • 使用 Application.Goto 方法時,當指定的範圍是在另一個 (不是使用中) 工作表的情況下,如果要在 Range 方法內使用兩個 Cells 方法,則每次都必須包括 Sheets 物件。 例如:
    Application.Goto Sheets("Sheet1").Range( _
          Sheets("Sheet1").Range(Sheets("Sheet1").Cells(2, 3), _
          Sheets("Sheet1").Cells(4, 5)))
  • 針對引號中的任何項目而言 (例如,具名範圍 "Test"),您也可以使用其值是文字字串的變數。 例如,與其使用
    ActiveWorkbook.Sheets("Sheet1").Activate
    您可以使用
    ActiveWorkbook.Sheets(myVar).Activate
    其中 myVar 的值是 "Sheet1"。

2018年4月26日 星期四

win10 開啟 SMB v1


win10預設smb1是關閉的 錯誤訊息如下

因為檔案共享不安全,所以你不能連線到檔案共享。 共享需要過時的 SMB1 協議,而此協議是不安全的,可能會使你的系統遭受攻擊。你的系統需要 SMB2 或更高版本。

如果需要使用,需要使用管理員開啟 Powershell 輸入下面程式碼

Enable-WindowsOptionalFeature -Online -FeatureName smb1protocol

輸入之後需要重新啟動,如果還是無法使用,請輸入下面程式碼 

Get-WindowsFeature FS-SMB1



參考連結:https://support.microsoft.com/en-us/help/2696547/how-to-enable-and-disable-smbv1-smbv2-and-smbv3-in-windows-and-windows-server


2018年3月9日 星期五

探索Facebook 隱藏的秘密: 使用Graph API





R語言

使用 R 語言建立自己的演算法交易事業

https://www.slideshare.net/tw_dsconf/r-71023024




搭配部位控管,使用R語言六個步驟輕鬆上手
https://m.moneydj.com/f1a.aspx?a=3c3bfe06-0843-4613-9617-0a485065a551&c=LIFENEWS

最近給了幾場實做的課程,原本是為了教學R語言與quantmod套件,沒想到隨意開發的結果,這績效竟然也還能看,似乎真的可以拿來上線操作。於是我決定把他寫下來分享,但我也沒實際玩過,所以後過自負。畢竟有些我使用了很有";;致命吸引力";;的馬丁。在風險沒控制好的前提下,這絕對不是一個好的做法!!
 ;;
R語言的好處就是免費,搭配quantmod套件,不用購買行情資料。你只需照著打,複製貼上,三分鐘就做開始玩策略回測。
第一步:下載安裝R語言。可參考第一次使用R語言做回測就上手
當然,對R語言不熟悉的朋友可參考R語言翻轉教室,全部完成保證實力強強滾。
 ;;
第二步:安裝quantmod套件,兩行指令如下:(輸入後按ctrl+a 全選,ctrl+r 執行就對了)
install.packages(";;quantmod";;)
library(qantmod)
 ;;
第三步:下載雅虎股市日K資料
STK=get(getSymbols(";;2330.tw";;))  ##下載台積電歷史日K資料
STK=as.matrix(to.weekly(STK))  ##將日K資料轉為週K資料
chartSeries(STK)  ##畫出台積電歷史周K
 ;;
第四步:設定參數與損益向量
profit=setNames(numeric(length(rownames(STK))), rownames(STK))
##設定profit向量紀錄每周損益
 ;;
lastC=STK[1,4]  ##先記錄第一週的收盤價
 ;;
資料下載ready後,便可開始做回測。我們進場依據為為每周第一天,開低買進台積電一張,週五收盤結束部位。因此實際的行情回測需從第二週開始,第一週只能記錄收盤價:
 ;;
for (m in rownames(STK)[-1]) {  ##開始以每週為單位跑迴圈
 ;;
fee=ceiling(STK[m,1]*1000*(0.001425*2*0.5+0.003))  
 ;;##設定手續費與稅(假設手續費打5折)
 ;;
if(STK[m,1]<;;=lastC){profit[m]=(STK[m,4]-STK[m,1])*1000-fee}  ##開低買進的損益
 ;;
lastC=STK[m,4]  ##紀錄本周收盤價,做為下週判斷開高開低的依據
}
 ;;
第五步:檢查策略程式碼的回測結果是否正確?
head(cbind(STK,profit),20)
## 可觀察前20筆的績效,是否確實執行策略
 ;;
第六步: 畫出績效曲線圖
plot(cumsum(profit),type=";;l";;,col=";;red";;,lwd=2)
x

由於雅虎股市下載的資料從2007-01-05到現在,可以發現這將近10年的績效沒有很好,扣掉手續費後賺賺賠賠。別灰心,我們先使出大絕招: 馬丁格爾。(註:這是風險很高的做法,哥有練過,只是為了示範教學別亂用。)

使用馬丁格爾:上次輸,這次加倍壓;上次贏,這次壓1張。

績效瞬間變的還不差,這十年來來賺了將近30萬,最大壓的張數為64張,也就是連輸6次。

當然,馬丁的風險絕對很大,過去成功更不代表未來,我們當然不可能實際上線這樣做。來看保險一點的類馬丁。

等差類馬丁:上次輸,這次多壓1張;上次贏,這次壓1張。


雖然等差類馬丁賺得更少,但似乎更穩定了。這十年來賺了將近20萬,但最大張數只壓了7張。這樣的風險一般民眾應該還可接受。

當然,上面還是過於激進的做法。我們用一個較為保守的方法:上次輸,這次壓2張;上次贏,這次壓1張。
 ;;
 ;;
 ;;
左圖是原始策略,右圖是資金控管後的損益。總獲利達到NT 121,735,最大回檔為NT 34,289。且最大張數只有2張。當然,我們可以把上面的策略弄得更完美,舉例來說,只有上次輸,這次才會壓1張。
 ;;

很明顯的,綠色的回檔被有效控制住,總績效雖然只有 NT 108,757,但回檔只有NT 10,636。這個策略,再搭配部分分數資金控管法,我想就是一個可以上線的策略了。週一買,週五賣,中間過程請專心上班不用盯盤,還蠻適合上班族的朋友的。

另外申明,已上皆為教學內容,如果你覺得合理可上場廝殺,後果就要自行負責唷。當然你也可以測其他股票,其他策略,但最終還是那句話,交易的資金控管還是最重要的!

上場前請先規劃好想清楚,再來就是徹底執行瞜!! 祝大家操作順利!!
 ;;


R_Repository

https://github.com/kaiyu33/R_Repository

第一次使用R語言做回測:六分鐘,就上手!