fc2ブログ

注文一覧画面

注文一覧画面の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&nbsp;</nobr>
<nobr>hh:mm</nobr>
</div>
</td>
<td>
<div>
<nobr>執行待ち<br>-</nobr>
</div>
</td>
<td>
<div>
みずほフィナンシャルG<br>
<nobr>8411&nbsp;東証</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>
このような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
注文一覧から注文を読み取るとき、上から順に読みますが、注文ごとに毎回上から読み直すのは非効率です。そのため、以下のようなOrderCacheクラスを用意し、注文情報をキャッシュしています。
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
OrderListクラスは、AbstructOrderFrameクラスを継承し、IWebScreenPagingインタフェースを実装しています。
ConfirmContructメソッドは、出した注文の約定確認を行います。SearchOrderメソッドで、引数dtで渡されたトレードの注文と一致する注文を探しています。
Cancelメソッドは注文の取り消し、Modifyメソッドは注文の訂正、DetailListメソッドは注文の詳細一覧の確認をそれぞれ行います。
ConfirmContructActionメソッドは、Cancelメソッド、Modifyメソッド、DetailListメソッドから呼び出され、SearchOrderメソッドで、引数dtで渡されたトレードの注文と一致する注文を探してそれぞれに対応するリンクをクリックしています。
SearchOrderメソッドは、注文一覧から、引数dtで渡されたトレードの注文と銘柄コード、注文枚数、注文価格が一致する注文の行を探します。もし、そのページで見つからなければ、「次へ」リンクをクリックします。
スポンサーリンク
<<売り注文画面 | ホーム | 注文取消画面>>
コメント(0)
コメントの投稿
トラックバック(0)