OrderModify 関数
注文番号で選択した注文(ポジション または オーダー)の内容を変更します。変更出来る内容は引数②~⑥の 5項目になります。
相場の状況によっては変更が出来ない場合もあります。例えば、オーダーで買い指値価格 100円設定の時、相場が 110円の時は、買い指値価格を 120円に変更しようとしても出来ません。この場合、110円より低い買い指値価格に設定する必要があります。
データ型と構成・戻り値
bool OrderModify(①,②,③,④,⑤,⑥);
戻り値は、選択したオーダー内容の変更が出来た時は true または 1、出来なかった時は false または -1 が取得されます。又、変更前と変更後で同じだった場合は false または -1になります。
発生するエラーについては、GetLastError関数で取得することが出来ます。
引数 [6]
OrderModify関数は 6個の引数で構成されます。
番 号 | 引数名 | データ型 | 単位 | 初期値 | 説明 |
---|---|---|---|---|---|
① | ticket | int | - | - | 変更対象になる注文の注文番号。 |
② | price | double | 選択した注文の通貨単位 | - | 変更する新しい注文価格。 (オーダーのみ変更可能) |
③ | stoploss | double | 選択した注文の通貨単位 | - | 変更する新しい損切り価格。 |
④ | takeprofit | double | 選択した注文の通貨単位 | - | 変更する新しい決済価格。 |
⑤ | expiration | datetime | 秒 | - | 変更する新しい注文(指値注文)の有効期限。 (オーダーのみ変更可能) 有効期限を設定しない場合は「0」を入力。有効期限を設定する場合は TimeCurrent関数に経過秒数を足す。※2 |
⑥ | arrow_color | color | - | clrNONE | 変更した注文位置の矢印の色。設定しない場合は「clrNONE」を入力すると矢印が表示されません。 Webカラーの種類はこちら。 |
※2 例)1時間後を有効期限として約定しなかったら注文取り下げする時「TimeCurrent() + 3600」と入力。業者にもよりますが、600~660秒以上(10~11分以上)に設定しないと注文が成立しません。
使用例
OrderModify関数による注文の変更
最初にOrderSend関数を使って 1つ目は成行買い注文、2つ目は指値買い注文をします。
1つ目の成行買い注文は約定後、損切価格と決済価格の 2つを変更します。
2つ目の指値買い注文はオーダー後、指値価格、損切価格、決済価格、注文の有効期限の 4つを変更します。
※業者によっては、EAで連続する注文が出来ないところもあります。(スキャルピングを禁止しているFX会社は出来ないことがあります)
コード
// OrderModify 関数による注文の変更
#property strict
void OnInit() {
int ticket1; // 注文番号1
int ticket2; // 注文番号2
bool tf, tf1; // true or false の判定
ticket1 = OrderSend(Symbol(), OP_BUY, 0.01, Ask, 30, 0, 0, "①買い成行注文", 1001, 0, clrNONE); // ①買い成行注文
ticket2 = OrderSend(Symbol(), OP_BUYLIMIT, 0.01, 50, 30, 30, 80, "②買い指値注文", 2001, 0, clrNONE); // ②買い指値注文
tf1 = OrderSelect(ticket1, SELECT_BY_TICKET);
double t1_a1 = OrderOpenPrice();
double t1_b1 = OrderStopLoss();
double t1_c1 = OrderTakeProfit();
datetime t1_d1 = OrderExpiration();
tf = OrderModify(ticket1, OrderOpenPrice(), 90, 360, OrderExpiration()); // ①のポジションの内容を変更
tf1 = OrderSelect(ticket1, SELECT_BY_TICKET);
double t1_a2 = OrderOpenPrice();
double t1_b2 = OrderStopLoss();
double t1_c2 = OrderTakeProfit();
datetime t1_d2 = OrderExpiration();
if (tf == true) {
Print("①注文番号",ticket1,"-取引価格:", t1_a1, " → ", t1_a2,"、損切価格:", t1_b1, " → ", t1_b2,"、決済価格:", t1_c1, " → ", t1_c2,"、取引期間:", t1_d1, " → ", t1_d2, " 変更完了");
} else {
Print("①注文番号",ticket1,"注文ポジションの変更が出来ません");
}
tf1 = OrderSelect(ticket2, SELECT_BY_TICKET);
double t2_a1 = OrderOpenPrice();
double t2_b1 = OrderStopLoss();
double t2_c1 = OrderTakeProfit();
datetime t2_d1 = OrderExpiration();
tf = OrderModify(ticket2, 80, 60, 100, TimeCurrent()+3600); // ②のオーダーの内容を変更
tf1 = OrderSelect(ticket2, SELECT_BY_TICKET);
double t2_a2 = OrderOpenPrice();
double t2_b2 = OrderStopLoss();
double t2_c2 = OrderTakeProfit();
datetime t2_d2 = OrderExpiration();
if (tf == true) {
Print("②注文番号",ticket2,"-取引価格:", t2_a1, " → ", t2_a2,"、損切価格:", t2_b1, " → ", t2_b2,"、決済価格:", t2_c1, " → ", t2_c2,"、取引期間:", t2_d1, " → ", t2_d2, " 変更完了");
} else {
Print("②注文番号",ticket2,"オーダーの変更が出来ません");
}
}
このコードをコンパイルして実行するのに、自動売買を許可しておく必要があります。
自動売買を許可する方法はこちら、コードをコンパイルして実行する方法はこちらを参考にしてください。(デモ口座でお試しください)