忍者ブログ
FXやその他投資についてのつれづれです
[1] [2] [3]
×

[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
前回の記事で、OrderSend関数を調査しました。
これによって売買注文を出すことが可能になったわけです

でも、これだけだと、指値で利確や損切り注文もつけないと
結局その注文やポジションを持ち続けちゃいますね

そんなときに役に立つのがこのOrderDelete関数とOrderClose関数です。

では、細かい仕様でも(・∀・)

bool OrderDelete( int ticket, color Color=CLR_NONE)
復帰値は、成功したかどうかですね。
成功ならtrueが、失敗ならfalseが戻ってきます
パラメータは
int ticket:OrderDeleteをしたいチケット番号
OrderSendの復帰値で帰ってきたticketを指定します
color Color=CLR_NONE:チャート上の矢印の色
調べてないから相変わらず意味不明(´Д`;)ヾ

bool OrderClose( int ticket, double lots, double price, int slippage, color Color=CLR_NONE)
これも復帰値は成功したかどうかです
成功ならtrueが、失敗ならfalseが戻ってきます
パラメータは
int ticket:OrderDeleteをしたいチケット番号
OrderSendの復帰値で帰ってきたticketを指定します
double lots:ロット数
クローズしたいロット数です。さすがにOrderSendで指定したロット数以上は指定できないと思うけど
そのあたりは機会があれば調べますね。今回はOrderSendと同じ値を指定しておきます
double price:クローズ価格
ポジションを閉じる場合の価格です。売買の種類によってBidやAskを指定するよよいでしょう
int slippage:スリップページ
OrderSend関数と同じで、スリップの許容量です
color Color=CLR_NONE:チャート上の矢印の色
・・・気にしたら負けだ!

では、まずはOrderClose->OrderDeleteの順番でやってみたらどうなりますかね。
前回の実験用のEAを改良してやって見ましょう
EAのソースはこちら→ダウンロード(mq4)
結果を編集したのはこちら→ダウンロード(csv)

結果を見てみると。
ポジションを持った状態だと、OrderCloseは有効で、注文中な状態だとOrderDeleteが有効みたいですね
また、OrderCloseが成功した注文に対してOrderDeleteをやっても無意味なようです
IFDONE注文で、現在ポジションを持っていても、そのままOrderCloseは通るんですね
面白いことにOrderDeleteをすると、クローズ日時やコメントが変わるんですね(・∀・)

最初のOrderSendが完結してもOrderCloseが成功してもOrderDeleteしてもクローズ日時が入るなら・・・
これ設定されてれば、この注文は終了ですね!

念のためOrderDelete->OrderCloseの順序もやってみました
EAのソース→ダウンロード(mq4)
結果の編集→ダウンロード(csv)
まあ、単純に順序を逆にしただけなので、あまり面白い結果じゃないですね。

次回はポジションと注文の取り消しについて、OrderSelectをつかってもう少しスマートな方法を考えますよ(*'-')
このブログの目的のひとつである自分でEAを作るに向けての、MQL研究です。
ちょこちょこツール用のEAを作っていましたけど、実はMQLのことがさっぱりなのです(*'-')
何から調べようかなぁ・・・と考えて、とりあえずトレード関数から調べてみようと思い立ちました

EA上で売買注文を出す関数は決まっていて
OrderSend()
というので出す模様です

関数の細かい仕様を見てみましょうか
復帰値:成功の場合はチケット番号 失敗の場合は-1
つまり、0以上なら、オーダーは成功というわけですね(・∀・)

パラメータ
string symbol:売買する通貨ペア
これはEAを稼動しているときに使ってる通貨が一般的でしょうからSymbol()関数を使えばよさそうです
int cmd:取引タイプ
成行注文とか、指値注文とかを指定するみたいです。
どんなものを指定するのかは、検証用のEA作ったのでその中でw
double
volume:ロット数
説明するまでもないですかね。ちなみにMQLでは0.1ロットで1万通貨になります
double price:オープン価格
売買するときの値段です。成行ではBidやAskなどの固定変数を使えます
int slippage:スリップページ
FX会社で売買するときと同じですね。スリップを許すPipを指定です
double stoploss:ストップロス値
損切りするときの値段です
double takeprofit:リミット値
利確するときの値段です。上のストップロス値と組み合わせれば Ifdone注文やif-OCO注文が可能になりますね
string comment=NULL:コメント
注文を出すときに、コメントがつけられます
int magic=0:マジックナンバー
複数のEAで注文を出したときに、どのEAからを区別するための値です。今回は気にしない方向でw
datetime expiration:有効期限
注文の有効期限らしいですが、datetime型と面倒な型なので私は見なかったことにしておきますww
必要になりそうなら、そのときに調べるということでw
color Color=CLR_NONE:チャート上の矢印の色
これも意味不明(´Д`;)ヾ

さてさて、関数を調べたら、とりあえず実験してみましょうか
今回の実験EAはこれ→ダウンロード(mq4)
で、実験結果を編集したのがこれ→ダウンロード(csv)

動きとしては、
1.開始直後に成行、指値、逆指値で注文をだす→注文の状態を表示
2.指値、逆指値が通ったくらいのタイミングで注文の状態を表示
3.EAが終わるくらいで指値や逆指値で利確や損切りされた注文の状態を表示
の3点です(*'-')

結果のCSVでは、注文順に並んでおります。注文番号#1では成行の売り注文ですがそれを1.2.3.の順番で並べました

ざっと結果を見てみると
注文番号#4では指値の買い注文でしたが、オープン日時とトレードタイプが変更されています。つまり注文を出した時点と注文が約定されたときで値が変わるわけですね。つまり成行以外の注文を出した場合、トレードタイプが変化したら、注文が通ったとみなしてよさそうです

注文番号#7は成行注文で利確の注文も同時に出したやつですが、利確のときにクローズ日時が入っています。つまりここに値が入ればこの注文は完結してると見てよさそうです

注文番号#11は上記#4と#7が見事に組み合わさっていますね。

出した注文がどうなってるかというのをEA上で知りたいときは
新規注文:トレードタイプがSellやBuyになっているか
決済注文:クローズ日時が入っているか
という感じでしょうか

とりあえず、今日はここまででw
次は、OrderCloseとかの組み合わせで調べたいと思います(*'-')


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