ブログジャンル

にほんブログ村 為替ブログ 100通貨単位・1000通貨単位へ
にほんブログ村の為替ブログランキングに参加中です。応援よろしくお願いいたします♪

検索フォーム


カレンダー

09 | 2017/10 | 11
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -

最新記事


最新コメント


最新トラックバック


月別アーカイブ


カテゴリ


リンク


スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

第10回 自動売買用プログラム - for ExcelVBA

2011/07/11 22:00
いま気づいたのですが、変なところに停止プログラムを追加したのでエラーが出ますね。先ほど修正しましたので、お手数ですがもう一度ダウンロードし直してください。
(For文がないところにExit Forと書いておりました^^;)



おはようございます!

「マネーパートナーズFXnanoで一括注文に挑戦!」の最終回。
今回は「⑤一括発注をする。」です。
(本来、つけるはずだった機能がついておらず不便ですが、とりあえず動作はしますので公開致します。)

前回、「④取引注文画面に進む。」まで出来ましたので、
あとはエクセルの表より注文内容を読み込み、必要な項目を入力して発注をかけていきます。


プログラムの流れは下記のようになります。

・1次注文を入力後に2次注文簡易入力ボタンをクリックする。
・2次注文の残りを入力する。
・注文の確認画面へ移動。
 (このとき執行区分エラーが出たら、指値と逆指値を入れ替えて何度もトライ。)
・注文内容を確認の上、注文実行ボタンをクリックする。


エクセルの表を読み込むプログラムはこんな感じになります。
例題は通貨ペアの場合。
objDOC.forms("LeaveOrderForm").Item("productId1").Value = "SPOT_" & Cells(yCNT, "C")

これはWEBページ上のフォーム(名前はLeaveOrderForm)のプルダウンメニュー(名前はproductId1)に SPOT + yCNT番目C列のCellsの値 を入力してください。という指示になります。
入力する値は注文ページのソースを見ればわかります。USD/JPY(米ドル/日本円)を指定したい場合はSPOT_USD/JPYとなります。
20110701-vba2


んで、1次注文を入力後簡易入力ボタンをクリックしたいのですが、このままだとなぜかクリックできないので一旦注文フォームをonchangeで更新?してやります。
その後、2次注文簡易入力ボタンをクリックします。
objDOC.forms("LeaveOrderForm").Item("productId1").onchange
objDOC.forms("LeaveOrderForm").Item("autoSecondaryOrderBtn").Click


次に2次注文の残りの「執行区分・注文レート・有効期限」を入力します。そして確認ボタンを押します。

ここで注文が正しく処理されれば、注文の確認画面へ進めますが、レートによっては執行区分エラーが出る場合があります。
なので、エラーが出た場合は簡易対応ですが指値と逆指値を入れ替えて、再度確認ボタンを押すようにします。
一応、注文が通るまで繰り返しチャレンジするようにしています。


最後に注文内容を確認して頂き、表示されたメッセージボックスのOKボタンを押すと注文が実行されます。
注文内容を修正したい場合はページ上の「戻る」ボタンをクリックし、注文内容を修正してください。
修正完了後はページ上の「確認画面へ」ボタンをクリックしてから、メッセージボックスのOKボタンを押すと注文が実行されます。
そして、注文実行後はエクセルの注文表A列に「発注済み」と記入されていきます。



とまあ、こんな感じなんです。

が、


まだ不便な部分が多々ありまして、いくつか挙げてみます。

■プログラムの停止ボタンを押しても、すぐには止まらない。
現在、停止ボタンを押しても一定の動作が完了してから停止するようになっております。
すぐにプログラムが止まらないので、かなり不安。。。

対策→ キーボードのESCキーを使ってください。


■プログラムを実行する前にブラウザを準備する必要がある。
このプログラムを実行しても、ログイン状態だと認識されず、すぐには注文をすることができません。

対策→ 一度、手動でマネパにログインし、会員専用サイト→パートナーズFX nanoまで開いてください。
その際、IEブラウザが2つ立ち上がっていたら、パートナーズFX nanoのページを閉じて、会員専用サイトのみ立ち上がっている状態にしてください。
IEのバージョンによってはタグで開く場合がありますが、動作チェックしていないので分かりません(報告をお願いします)

一応、対策の準備は進めていたのですが、かなり時間がかかりそうなので先延ばしにしました^^;


■ページの読み込みが間に合わない場合
フレームを使っているせいか、稀にページが完全に読み込めていないのにプログラムが進んでしまう場合があります。ご自分の環境によって変更することをオススメいたします。

対策→スリープの時間を長くする。デフォルトでは1秒になっております。


■最後のメッセージボックスは必要か?
動作確認のため、注文を実行する前にメッセージボックスを表示するようにしました。
邪魔になるかと思いますので動作確認が出来ましたら、修正されたほうが便利になると思います。

対策→ 過去の記事などを見ていただければ、対応できるかと思います。頑張ってください。


今回、作ったプログラムのファイルは下記からダウンロードできます。
→ 「マネーパートナーズFXnanoで一括注文に挑戦!」

メインのソースはこちらになります。

-------------------- ここから --------------------

'2011/07/10 第10回 自動売買用プログラム - for ExcelVBA
'本日の課題:「マネーパートナーズFXnanoで一括注文に挑戦!」

Sub MP_auto_order()

'プログラム停止用
fStop = False

'IE起動
Dim objIE As Object 'IE用の変数を定義します。
Set objIE = CreateObject("InternetExplorer.Application") 'IE用のオブジェクトを作成します。
objIE.Visible = True 'IEのウィンドウをTrueで可視状態にします。 Falseなら見えません。

'目的のページのURLを指定し、開きます。
objIE.Navigate "https://trade2.moneypartners.co.jp/fxcwebpresen/MainFrame.do"

'ページの表示完了を待ちます。
Call IE_Wait2(objIE)

'フレーム処理に使うドキュメント類
Dim objFRAME As FramesCollection
Dim objDOC As HTMLDocument

Set objFRAME = objIE.document.frames

'一括注文表を読み取り、注文を実行していく処理。
Dim yCNT As Integer 'セルの行数
Dim objFDOC As Object

Worksheets("一括注文表").Activate 'シートをアクティブにする


For yCNT = 11 To 310 '注文表の行数を設定
If Trim(Cells(yCNT, 1)) = "発注予定" Then '状況が発注予定となっている注文のみ処理を行う

Set objDOC = objFRAME("main").document
Do Until InStr(objDOC.URL, "doIfDoneOrder") > 0 'IF-DONE注文のページになるまで処理を続ける

'IF-DONEのページへ移動する。
Set objFDOC = objIE.document.frames("menu").document

'取引注文
For n = 0 To objFDOC.links.Length - 1
If objFDOC.links(n).href = "javascript:changeMenu(1)" Then
objFDOC.links(n).Click
Call IE_Wait2(objIE)
Exit For
End If
Next n

'新規/決済注文
For n = 0 To objFDOC.links.Length - 1
If InStr(objFDOC.links(n).href, "EnterStreamingNettingOrder.do") > 0 Then
objFDOC.links(n).Click
Call IE_Wait2(objIE)
Exit For
End If
Next n

'IF-DONE(新規 / 決済注文【リーブオーダー】)
Set objFDOC = objIE.document.frames("main").document
For n = 0 To objFDOC.links.Length - 1
If InStr(objFDOC.links(n).href, "doIfDoneOrder") > 0 Then
objFDOC.links(n).Click
Call IE_Wait2(objIE)
Exit For
End If
Next n
Set objDOC = objFRAME("main").document

Loop

DoEvents
If fStop = True Then
MsgBox "処理が中断されました"
Exit For
End If

'IF-DONE1次注文

'通貨ペア
objDOC.forms("LeaveOrderForm").Item("productId1").Value = "SPOT_" & Cells(yCNT, "C")

'注文区分
If Trim(Cells(yCNT, "D")) = "新規" Then
objDOC.forms("LeaveOrderForm").Item("closeOrder1").Value = "false"
ElseIf Trim(Cells(yCNT, "E")) = "決済" Then
objDOC.forms("LeaveOrderForm").Item("closeOrder1").Value = "true"
Else
MsgBox "注文区分を選択してください"
End If

'売買
If Trim(Cells(yCNT, "E")) = "売" Then
objDOC.forms("LeaveOrderForm").Item("buySellType1").Value = "SELL"
ElseIf Trim(Cells(yCNT, "E")) = "買" Then
objDOC.forms("LeaveOrderForm").Item("buySellType1").Value = "BUY"
Else
MsgBox "売買を選択してください"
End If

'数量
objDOC.forms("LeaveOrderForm").Item("orderAmount1").Value = Cells(yCNT, "F")

'執行区分
If Trim(Cells(yCNT, "G")) = "指値" Then
objDOC.forms("LeaveOrderForm").Item("orderType1").Value = "LIMIT"
ElseIf Trim(Cells(yCNT, "G")) = "逆指値" Then
objDOC.forms("LeaveOrderForm").Item("orderType1").Value = "STOP"
Else
MsgBox "執行区分を選択してください"
End If

'注文レート
objDOC.forms("LeaveOrderForm").Item("orderPrice1").Value = Cells(yCNT, "H")

'有効期限
If Trim(Cells(yCNT, "I")) = "DAY" Then
objDOC.forms("LeaveOrderForm").Item("expirationType").Value = "DAY"
ElseIf Trim(Cells(yCNT, "I")) = "WEEK" Then
objDOC.forms("LeaveOrderForm").Item("expirationType").Value = "WEEK"
ElseIf Trim(Cells(yCNT, "I")) = "GTC" Then
objDOC.forms("LeaveOrderForm").Item("expirationType").Value = "GTC"
Else
MsgBox "有効期限を選択してください"
End If

'スクリプトを有効にする
objDOC.forms("LeaveOrderForm").Item("productId1").onchange
objDOC.forms("LeaveOrderForm").Item("closeOrder1").onchange
objDOC.forms("LeaveOrderForm").Item("buySellType1").onchange
objDOC.forms("LeaveOrderForm").Item("expirationType").onchange

'2次注文簡易入力ボタンをクリック
objDOC.forms("LeaveOrderForm").Item("autoSecondaryOrderBtn").Click
Call IE_Wait2(objIE)


'IF-DONE2次注文

'執行区分
If Trim(Cells(yCNT, "N")) = "指値" Then
objDOC.forms("LeaveOrderForm").Item("orderType2").Value = "LIMIT"
ElseIf Trim(Cells(yCNT, "N")) = "逆指値" Then
objDOC.forms("LeaveOrderForm").Item("orderType2").Value = "STOP"
Else
MsgBox "執行区分を選択してください"
End If

'注文レート
objDOC.forms("LeaveOrderForm").Item("orderPrice2").Value = Cells(yCNT, "O")

'有効期限
If Trim(Cells(yCNT, "P")) = "DAY" Then
objDOC.forms("LeaveOrderForm").Item("expirationType2").Value = "DAY"
ElseIf Trim(Cells(yCNT, "P")) = "WEEK" Then
objDOC.forms("LeaveOrderForm").Item("expirationType2").Value = "WEEK"
ElseIf Trim(Cells(yCNT, "P")) = "GTC" Then
objDOC.forms("LeaveOrderForm").Item("expirationType2").Value = "GTC"
Else
MsgBox "有効期限を選択してください"
End If

'確認画面ボタンを押す
objDOC.forms("LeaveOrderForm").Item("confirmButton").Click
Call IE_Wait2(objIE)

DoEvents
If fStop = True Then
MsgBox "処理が中断されました"
Exit For
End If

'執行区分エラーのため、内容を変更する。
Dim strTEXT As String
strTEXT = objDOC.body.innerText '変数に代入高い注文レートを入れる

Do Until InStr(strTEXT, "現在レートチェック") = 0 '執行区分エラーがなくなるまで処理を続ける
If InStr(strTEXT, "IF-DONE1次注文") > 0 Then

If objDOC.forms("LeaveOrderForm").Item("orderType1").Value = "STOP" Then
objDOC.forms("LeaveOrderForm").Item("orderType1").Value = "LIMIT"
ElseIf objDOC.forms("LeaveOrderForm").Item("orderType1").Value = "LIMIT" Then
objDOC.forms("LeaveOrderForm").Item("orderType1").Value = "STOP"
End If

objDOC.forms("LeaveOrderForm").Item("confirmButton").Click
Call IE_Wait2(objIE)
strTEXT = objDOC.body.innerText


ElseIf InStr(strTEXT, "IF-DONE2次注文") > 0 Then

If objDOC.forms("LeaveOrderForm").Item("orderType1").Value = "STOP" Then
objDOC.forms("LeaveOrderForm").Item("orderType1").Value = "LIMIT"
ElseIf objDOC.forms("LeaveOrderForm").Item("orderType1").Value = "LIMIT" Then
objDOC.forms("LeaveOrderForm").Item("orderType1").Value = "STOP"
End If

objDOC.forms("LeaveOrderForm").Item("confirmButton").Click
Call IE_Wait2(objIE)
strTEXT = objDOC.body.innerText


End If

Sleep (1000)

Loop


'注文を実行する処理
MsgBox "注文内容を確認の上、OKボタンを押してください。" & vbCrLf & "修正が必要な場合はページ上の「戻る」ボタンをクリックし、注文内容を修正してください。" & vbCrLf & "修正完了後はページ上の「確認画面へ」ボタンをクリックしてから、このメッセージボックスのOKボタンを押すと注文が実行されます。"
objDOC.forms("LeaveOrderForm").Item("orderButton").Click
Call IE_Wait2(objIE)

'注文完了後の処理(一括注文表A列にコメントを入力する)
If InStr(objDOC.body.innerText, "ご注文を受付けました。") Then
Cells(yCNT, 1) = "発注済み"
Else
MsgBox "注文が正しく処理されませんでした。"
End If


End If
Next yCNT



End Sub

-------------------- ここまで --------------------



以上です。


そういえば、大事なことを忘れていました。
注文は状況(A列)に「発注予定」と入ったものしか行いませんので、手入力で入れてあげてください。
20110710-vba3


それでは、この辺で失礼します。
お疲れ様でした☆




スポンサーサイト

コメント

おはようございます
夜にじっくり見させていただきます

こういうの苦手なんですけどね

あと、マネパの口座開設もしなくちゃ・・・
もちろん、このブログからマネパにとびます

2011-07-11 08:26 yunyunugugu #O7xVy9HA URL [ 編集 ]

Re: タイトルなし

コメントありがとうございます。

うまく動作するといいのですが・・・。
エラーが出たらコメントくださいね。
2011-07-13 19:07 ヒゲ☆坊主 #mQop/nM. URL [ 編集 ]

こんばんは。大作おつかれさまでした^^

なかなか時間が取れないので週末に試してみたいと思ってます!どきどきしますね・・
2011-07-13 23:32 ねもどん #- URL [ 編集 ]

Re: タイトルなし

ありがとうございます。
何か不具合があればお知らせください。
2011-07-15 20:09 ヒゲ☆坊主 #mQop/nM. URL編集 ]

コメントの投稿



管理者にだけ表示を許可する


トラックバック

http://fxbouz2011.blog67.fc2.com/tb.php/42-38c661c8

 | ホーム | 


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。