忍者ブログ
FXやその他投資についてのつれづれです
[14] [13] [12] [11] [10] [9] [8] [7] [6] [5] [4]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

こんばんは(*'-')

少し間が空きましたが、今回はポジション解消と注文の取り消しについて、少しスマートなロジック
を調べてみます

ネットでMT4のことを調べていたら、こんなロジックを見つけたんですよ(・∀・)
-----------------------------------------------------------------------------------------------
int total = OrdersTotal();
if(total > 0){
    for(int i = total -1; i >= 0; i-- ){
        bool selected = OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
        if(selected){
            int type = OrderType();
            switch(type){
                case OP_BUY:
                    OrderClose(OrderTicket(), OrderLots(), Bid, 3, CLR_NONE);
                    break;
                case OP_SELL:
                    OrderClose(OrderTicket(), OrderLots(), Ask, 3, CLR_NONE);
                    break;
                case OP_BUYLIMIT:
                case OP_BUYSTOP:
                case OP_SELLLIMIT:
                case OP_SELLSTOP:
                    OrderDelete(OrderTicket());
                    break;
            }
            OrderPrint();
        }
    }
}
-----------------------------------------------------------------------------------------------
このロジック、何をしているかって言うと
まず
int total = OrdersTotal();
で、現在のポジションと注文中の数を調べています。これが1以上であれば
何かしらの注文やポジションが残っていることになります
3行目のfor分では、totalの数だけループするんですが、ここで0からではなく
totalのところからiをはじめているのがポイントですね(・∀・)
次にOrderSelectでポジションなり注文を特定します。ここではi番目のオーダーを
とってきています(iの値は例えば10から始まって9、8、7と減っていきます)
次に
int type = OrderType();
で注文のタイプを取得します。(OP_BUYとかが返ります)
switch分でこのtypeを判定してOP_BUYならクローズをするなどを並べてるんですね。
ちなみに、現在有効な注文やポジションが特定できるので、いちいちクローズを判定
する必要がありません。こいつは楽ですね(・∀・)
今までの検証用EAでは、いちいちチケット番号を使ってオーダーを特定していましたが
今あるオーダーを無条件にクローズや注文取消しをするにはこれだけで十分になります
というわけで、このロジックを組み込んだ検証用EAがこちら→ダウンロード(mq4)
編集した実行結果はこちら→ダウンロード(csv)
になります。結構シンプルなソースになりましたね。
途中にPrintをはさんで状況を表示していますが、#7や#13のオーダーは決済されている
ので、あのロジックでは処理されないことがわかりますね。
また成行注文を出したオーダーや途中で指値が通った注文はクローズで決済されて
指値が通っていないオーダーには注文が取り消されていますね(・∀・)
for分のiをtotalから使っているので、番号の大きい順から処理されているのもわかります
(まあ、クローズした注文に対してPrintした情報にクローズ時間が入らないのは納得できませんが)

すでに決済されている注文とかはEA上で扱えないのかな?と調べてみたら
こんな関数と指定値を見つけました
int OrdersHistoryTotal( )
MODE_HISTORY
これらは、注文履歴から情報を取得するための関数らしいです
これを最後に組み込んだ検証用EAがこちら→ダウンロード(mq4)
編集した実行結果がこちら→ダウンロード(csv)
ちゃんと終了した注文がすべて出てきてますね(・∀・)
きっと、12月2日のところでも同じロジックを組み込んでいたら決済された#7や#13の
注文が出てきたんでしょう(´ー`)

今回の現象をわかりやすくするとこんな感じですね(・∀・)
20090104_001.JPG






Selectした後の関数の仕様はあんまり好みなつくりになっていませんねぇ
(C言語的な意味で)

今回はここまで。次は簡単に売買を行えるEAを作って、そこからいろいろを機能を
追加してみたいと思います(*'-')
PR

コメント


コメントフォーム
お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード
  Vodafone絵文字 i-mode絵文字 Ezweb絵文字


トラックバック
この記事にトラックバックする:


忍者ブログ [PR]
カレンダー
04 2024/05 06
S M T W T F S
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
カウンター
プロフィール
投資は自己責任・自己判断で実施するようお願いいたします。 ここの情報を見て損失が発生しても責任は負えませんのでご注意してください
HN:
Aki
性別:
男性
最新コメント
[06/06 fxjol]
[02/18 FXに人生を賭ける男]
[01/01 Aki]
[01/01 Aki]
[12/31 FXに人生を賭ける男]
ブログ内検索
最新トラックバック
アクセス解析