注文一覧画面のHTMLソース(一部を抜粋)は以下のようになっています。
<html>
<head></head>
<body>
<table>
<table></table>
<table>
<table></table>
</table>
<table></table>
<table></table>
<table>
<tr>
<th><div><nobr>注文番号<br>注文日時</nobr></div></th>
<th><div><nobr>状況<br>状況(逆指値)</nobr></div></th>
<th><div><nobr>銘柄</nobr></div></th>
<th><div><nobr>取引<br>条件</nobr></div></th>
<th><div><nobr>口座</nobr></div>/th>
<th><div><nobr>注文区分</nobr></div></th>
<th><div><nobr>注文数量</nobr></div></th>
<th><div><nobr>注文単価</nobr><nobr>[円]</nobr></div></th>
<th><div><nobr>約定数量</nobr></div></th>
<th><div><nobr>詳細</nobr></div></th>
</tr>
<tr>
<td class='ta1' valign="top" align="left" rowspan="2">
<div>
<nobr>1234</nobr><br>
<nobr>MM/DD </nobr>
<nobr>hh:mm</nobr>
</div>
</td>
<td>
<div>
<nobr>執行待ち<br>-</nobr>
</div>
</td>
<td>
<div>
みずほフィナンシャルG<br>
<nobr>8411 東証</nobr>
</div>
</td>
<td>
<div>
<nobr>買付</nobr><br>
<nobr>本日中</nobr>
</div>
</td>
<td>
<div>
<nobr>特定</nobr>
</div>
</td>
<td>
<div>
<nobr>通常注文</nobr>
</div>
</td>
<td>
<div>
<nobr>100 株</nobr>
</div>
</td>
<td>
<div>
<nobr>150</nobr>
</div>
</td>
<td>
<div>
<nobr>0 株</nobr>
</div>
</td>
<td><div><nobr>
<a href="xxx">注文詳細</a><br>
<img src="xxx"><a href="xxx">訂正</a>
<img src="xxx"><a href="xxx">取消</a>
</nobr></div>
</td>
</tr>
<tr><td><div><nobr>逆指値条件:-</nobr></div></td></tr>
</table>
<table></table>
</table>
<table></table>
<table></table>
<table></table>
</html>
Public Class OrderList
Inherits AbstructOrderFrame
Implements IWebScreenPaging
Private Shared ReadOnly log As log4net.ILog = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType)
Private _pageNo As Integer = 1
Public ReadOnly Property PageNo As Integer Implements IWebScreenPaging.PageNo
Get
Return _pageNo
End Get
End Property
Sub New(ByVal screen As RakutenTop)
MyBase.new(DirectCast(screen, AbstructWebScreen))
End Sub
Function ConfirmContruct(ByVal buysell As AbstructWebOrder.OrderType, ByVal confType As AbstructWebOrder.ConfirmType, ByVal dt As IDayTrade, Optional ByRef contructUnit As Integer = 0, _
Optional ByVal cacheMap As Dictionary(Of String, OrderCache) = Nothing, Optional ByVal strContructState As String = "") As Boolean
Dim order As TradeOrder
If buysell = AbstructWebOrder.OrderType.買付 Then
order = dt.BuyOrder
Else
order = dt.SellOrder
End If
log.InfoFormat("{0}の注文確認({1})をします。code={2} unit={3} price={4}", buysell.ToString(), confType.ToString(), dt.company_id, dt.unit, order.price)
Try
If strContructState = "" Then
FocusMainFrame()
Dim objTr As IEWrapperFixed = Nothing
Dim isFind As Boolean
isFind = SearchOrder(objTr, contructUnit, buysell, dt, cacheMap, 1, 0)
If Not objTr Is Nothing AndAlso isFind = True Then
_ie = objTr.GetIE()
strContructState = _ie.Element("td", 1).Element("nobr", 0).InnerText
End If
End If
If strContructState = "" Then
log.WarnFormat("{0}の注文確認({1})に失敗しました。code={2} unit={3} price={4}", buysell.ToString(), confType.ToString(), dt.company_id, dt.unit, order.price)
Return False
End If
If strContructState.IndexOf(confType.ToString()) < 0 Then
log.InfoFormat("{0}({1})の執行中です。code={2} unit={3} price={4}", buysell.ToString(), confType.ToString(), dt.company_id, dt.unit, order.price)
Return False
End If
Catch e As Exception
DispatchException(e, String.Format("{0}({1})注文確認処理", buysell.ToString(), confType.ToString()))
Return False
End Try
Return True
End Function
Function Cancel(ByVal buysell As AbstructWebOrder.OrderType, ByVal dt As IDayTrade, _
Optional ByVal cacheMap As Dictionary(Of String, OrderCache) = Nothing, Optional ByVal goPageNo As Integer = 1, Optional ByVal goIndex As Integer = 0) As OrderCancel
Return DirectCast(ConfirmContructAction(buysell, AbstructWebOrder.ConfirmActionType.取消, dt, cacheMap, goPageNo, goIndex), OrderCancel)
End Function
Function Modify(ByVal buysell As AbstructWebOrder.OrderType, ByVal dt As IDayTrade, _
Optional ByVal cacheMap As Dictionary(Of String, OrderCache) = Nothing, Optional ByVal goPageNo As Integer = 1, Optional ByVal goIndex As Integer = 0) As OrderModify
Return DirectCast(ConfirmContructAction(buysell, ConfirmActionType.訂正, dt, cacheMap, goPageNo, goIndex), OrderModify)
End Function
Function DetailList(ByVal buysell As AbstructWebOrder.OrderType, ByVal dt As IDayTrade, _
Optional ByVal cacheMap As Dictionary(Of String, OrderCache) = Nothing, Optional ByVal goPageNo As Integer = 1, Optional ByVal goIndex As Integer = 0) As OrderDetailList
Return DirectCast(ConfirmContructAction(buysell, AbstructWebOrder.ConfirmActionType.注文詳細, dt, cacheMap, goPageNo, goIndex), OrderDetailList)
End Function
Private Function ConfirmContructAction(ByVal buysell As AbstructWebOrder.OrderType, ByVal action As AbstructWebOrder.ConfirmActionType, ByVal dt As IDayTrade, _ Optional ByVal cacheMap As Dictionary(Of String, OrderCache) = Nothing, Optional ByVal goPageNo As Integer = 1, Optional ByVal goIndex As Integer = 0) As AbstructOrderFrame
Dim order As TradeOrder
If buysell = AbstructWebOrder.OrderType.買付 Then
order = dt.BuyOrder
Else
order = dt.SellOrder
End If
log.InfoFormat("{0}注文の{1}をします。code={2} unit={3} price={4}", buysell.ToString(), action.ToString(), dt.company_id, dt.unit, order.price)
Try
FocusMainFrame()
Dim objTr As IEWrapperFixed = Nothing
Dim isFind As Boolean
isFind = SearchOrder(objTr, 0, buysell, dt, cacheMap, goPageNo, goIndex)
Dim str As String
If Not objTr Is Nothing AndAlso isFind = True Then
_ie = objTr.GetIE()
Dim objTd As New IEWrapperFixed(_ie.Element("td", 9))
For i = 0 To _ie.Element("a").length - 1
_ie = objTd.GetIE()
_ie.Element("a", i)
If _ie.IsNothingElement() Then Continue For
If _ie.InnerText Is Nothing Then Continue For
str = _ie.InnerText
If str = action.ToString() Then
_ie.Click()
If action = AbstructWebOrder.ConfirmActionType.取消 Then
Return New OrderCancel(Me, dt, buysell)
ElseIf action = AbstructWebOrder.ConfirmActionType.訂正 Then
Return New OrderModify(Me, dt, buysell)
Else
Return New OrderDetailList(Me, dt, buysell)
End If
End If
Next
End If
Catch e As Exception
DispatchException(e, String.Format("{0}注文の{1}", buysell.ToString(), action.ToString()))
End Try
Throw New WebScreenException(String.Format("{0}注文の{1}", buysell.ToString(), action.ToString()))
End Function
Private Function SearchOrder(ByRef objTr As IEWrapperFixed, ByRef contructUnit As Integer, ByVal buysell As AbstructWebOrder.OrderType, ByVal dt As IDayTrade, _
Optional ByVal cacheMap As Dictionary(Of String, OrderCache) = Nothing, Optional ByVal goPageNo As Integer = 1, Optional ByVal goIndex As Integer = 0) As Boolean
If _pageNo < goPageNo Then
If Not GoNext() Is Nothing Then
Return SearchOrder(objTr, contructUnit, buysell, dt, cacheMap, goPageNo, goIndex)
End If
End If
Dim order As TradeOrder
If buysell = AbstructWebOrder.OrderType.買付 Then
order = dt.BuyOrder
Else
order = dt.SellOrder
End If
Dim strNo As String, strCode As String, strUnit As String, strPrice As String, strBuySell As String, strContructState As String
Dim order_no As Integer
Dim objTable As New IEWrapperFixed(_ie.RootDocument().Element("table", 6))
For i As Integer = goIndex To _ie.Element("tr").length - 1
_ie = objTable.GetIE()
objTr = New IEWrapperFixed(_ie.Element("tr", i))
If _ie.IsNothingElement() Then Continue For
If _ie.Element("td").length >= 9 Then
strNo = _ie.Element("td", 0).Element("nobr", 0).InnerText
order_no = Integer.Parse(strNo, Globalization.NumberStyles.AllowThousands)
_ie = objTr.GetIE()
strCode = _ie.Element("td", 2).Element("nobr", 0).InnerText
_ie = objTr.GetIE()
strBuySell = _ie.Element("td", 3).Element("nobr", 0).InnerText
_ie = objTr.GetIE()
strUnit = _ie.Element("td", 6).Element("nobr", 0).InnerText
_ie = objTr.GetIE()
strPrice = _ie.Element("td", 7).Element("nobr", 0).InnerText
_ie = objTr.GetIE()
Dim strContructUnit As String = _ie.Element("td", 8).Element("nobr", 0).InnerText
strContructUnit = strContructUnit.Substring(0, strContructUnit.Length - 2)
contructUnit = Integer.Parse(strContructUnit, Globalization.NumberStyles.AllowThousands)
_ie = objTr.GetIE()
strContructState = _ie.Element("td", 1).Element("nobr", 0).InnerText
If Not cacheMap Is Nothing Then
Dim key As String = OrderCache.CreateKey(buysell, dt, order)
If cacheMap.ContainsKey(key) = False Then
Dim cache As New OrderCache(_pageNo, i, order_no, contructUnit, strContructState)
cacheMap.Add(key, cache)
End If
End If
If order.order_no = 0 Then
If strCode.IndexOf(CStr(dt.company_id)) >= 0 Then
If strBuySell = buysell.ToString() Then
If Long.Parse(strUnit.Substring(0, strUnit.Length - 2), Globalization.NumberStyles.AllowThousands) = dt.unit Then
If contructUnit > 0 Then
'約定数量が0のときは、order_noは入れない。
order.order_no = order_no
End If
If order.price = 0 AndAlso strPrice = "成行" OrElse order.price = Long.Parse(strPrice, Globalization.NumberStyles.AllowThousands) Then
Return True
End If
End If
End If
End If
Else
If order_no = order.order_no Then
_ie = objTr.GetIE()
strContructUnit = _ie.Element("td", 8).Element("nobr", 0).InnerText
strContructUnit = strContructUnit.Substring(0, strContructUnit.Length - 2)
Return True
End If
End If
End If
Next
If Not GoNext() Is Nothing Then
Return SearchOrder(objTr, contructUnit, buysell, dt, cacheMap, goPageNo, goIndex)
End If
Return False
End Function
Private Function GoNext() As IWebScreen Implements IWebScreenPaging.GoNext
_pageNo += 1
Return GoNextCommon()
End Function
End Class
Public Class OrderCache
Const KEY_SEPARATOR As String = "_"
Public Property PageNo As Integer
Public Property Index As Integer
Public Property OrderNo As Integer
Public Property ContructUnit As Integer
Public Property StrContructState As String
Sub New(ByVal page As Integer, ByVal idx As Integer, ByVal odrNo As Integer, ByVal contructUt As Integer, ByVal contructState As String)
PageNo = page
Index = idx
OrderNo = odrNo
ContructUnit = contructUt
StrContructState = contructState
End Sub
Shared Function CreateKey(ByVal buysell As AbstructWebOrder.OrderType, ByVal dt As IDayTrade, ByVal order As TradeOrder) As String
Dim keyBuff As New System.Text.StringBuilder
keyBuff.Append(buysell.ToString())
keyBuff.Append(dt.company_id)
keyBuff.Append(order.price).Append(KEY_SEPARATOR)
keyBuff.Append(dt.unit)
Return keyBuff.ToString()
End Function
End Class
ConfirmContructメソッドは、出した注文の約定確認を行います。SearchOrderメソッドで、引数dtで渡されたトレードの注文と一致する注文を探しています。
Cancelメソッドは注文の取り消し、Modifyメソッドは注文の訂正、DetailListメソッドは注文の詳細一覧の確認をそれぞれ行います。
ConfirmContructActionメソッドは、Cancelメソッド、Modifyメソッド、DetailListメソッドから呼び出され、SearchOrderメソッドで、引数dtで渡されたトレードの注文と一致する注文を探してそれぞれに対応するリンクをクリックしています。
SearchOrderメソッドは、注文一覧から、引数dtで渡されたトレードの注文と銘柄コード、注文枚数、注文価格が一致する注文の行を探します。もし、そのページで見つからなければ、「次へ」リンクをクリックします。
スポンサーリンク