トップ  >  リファレンス  >  取引関数  >  OrderModify
スポンサーリンク
検索
カスタム検索
リファレンスツリー
オススメ

天才数学者のエドワード・オークリー・ソープの物語とジョン・ケリーの公式は必見です。
OrderModify


OrderModify


エントリー中の注文や保留中の注文の変更。

関数書式:
bool  OrderModify(
   int        ticket,      // チケット番号
   double     price,       // 注文価格
   double     stoploss,    // ストップロス価格
   double     takeprofit,  // リミット価格
   datetime   expiration,  // 有効期限
   color      arrow_color  // 色
   );



■引数
引数名 初期値 I/O 詳細
ticket - In 変更する注文のチケット番号
price - In 新しい注文価格(保留中の注文のみ)
stoploss - In 新しいストップロス価格
takeprofit - In 新しいリミット価格
expiration - In 新しい有効期限(保留中の注文のみ)
arrow_color - In stoploss、takeprofit変更の矢印の色。
パラメータを設定しない又はCLR_NONEを設定した場合は描画しません。



■戻り値
成功した場合はtrueを返します。
失敗した場合はfalseを返します。
エラーコードの確認はGetLastError()関数を使用します。


■備考
新しい注文価格と新しい有効期限は、保留中の注文でのみ変更可能です。

引数に渡された値が不変(現在の注文と同じ値)の場合は、エラーコード1(ERR_NO_RESULT)が生成されます。

保留中の注文の有効期限は、トレードサーバーで無効にすることが出来ます。
トレードサーバーで無効にされている場合、新しい有効期限の値が0以外の値を設定すると、エラーコード147(ERR_TRADE_EXPIRATION_DENIED)が生成されます。

サンプルソース
#property strict
#property script_show_confirm


#include <stderror.mqh>
#include <stdlib.mqh>

static bool EntryBool = false;


void OnStart(){

    int order_resend_num;        // エントリー試行回数
    int ea_ticket_res;           // チケットNo
    int errorcode;               // エラーコード
    double ea_order_entry_price; // エントリーレート

    if ( EntryBool == false ) {
        EntryBool = true;
    } else {
        return;
    }


    if ( IsDemo() == false ) {
        MessageBox("実際に新規オーダーするので、デモ口座で動作させて下さい。","エラー",MB_ICONEXCLAMATION);
        return;                // 処理終了
    }

    ea_order_entry_price = Ask; // 現在の買値でエントリー

    for( order_resend_num = 0; order_resend_num < 10; order_resend_num++ ) {    // エントリー試行回数上限:10回
    
        if ( IsDemo() == true ) {
            
            // FXCMでは新規エントリー時にストップ/リミットを設定出来ない。
            ea_ticket_res = OrderSend(   // 新規エントリー注文
                Symbol(),                // 通貨ペア
                OP_BUY,                  // オーダータイプ[OP_BUY / OP_SELL]
                0.01,                     // ロット[0.01単位]
                ea_order_entry_price,     // オーダープライスレート
                20,                       // スリップ上限    (int)[分解能 0.1pips]
                0,                        // ストップレート
                0,                        // リミットレート
                "テストオーダー",         // オーダーコメント
                999,                      // マジックナンバー(識別用)
                0,                        // オーダーリミット時間
                clrRed                   // オーダーアイコンカラー
                );
        }
        
        if ( ea_ticket_res == -1) {            // オーダーエラー
            errorcode = GetLastError();      // エラーコード取得

            if( errorcode != ERR_NO_ERROR) { // エラー発生
                printf("エラーコード:%d , 詳細:%s ",errorcode , ErrorDescription(errorcode));

                if ( errorcode == ERR_TRADE_NOT_ALLOWED ) { // 自動売買が許可されていない
                    MessageBox(ErrorDescription(errorcode),"オーダーエラー",MB_ICONEXCLAMATION);
                    return;
                }
            }

            Sleep(1000);                                           // 1000msec待ち
            RefreshRates();                                        // レート更新
            ea_order_entry_price = Ask;                            // 更新した買値でエントリーレートを再設定
            printf("再エントリー要求回数:%d, 更新エントリーレート:%g",order_resend_num+1 ,ea_order_entry_price);

        } else {    // 注文約定
            Print("新規注文約定。 チケットNo=",ea_ticket_res);
            Sleep(300);                                           // 300msec待ち(オーダー要求頻度が多過ぎるとエラーになる為)
            
            // エントリー中ポジションの注文変更
            LimitStop_Set(ea_ticket_res);
            break;
        }
    }
}


// エントリー中のポジションのリミット・ストップを変更
void LimitStop_Set( int in_ticket_no ) {

    double limit_rate,stop_rate;
    int    modify_resend_num;       // 変更試行回数
    bool   modify_ret;              // 変更判定
    int    errorcode;
    bool   selbool;

    selbool = OrderSelect(in_ticket_no, SELECT_BY_TICKET); // オーダー中のチケット選択(チケットNo指定)

    limit_rate = OrderOpenPrice() + ( 10 * Point() * 10); // リミット価格     = 約定価格 + 10.0pips
    stop_rate  = OrderOpenPrice() - ( 10 * Point() * 10); // ストップロス価格 = 約定価格 - 10.0pips

    limit_rate = NormalizeDouble(limit_rate,Digits);      // リミット価格    を正規化
    stop_rate  = NormalizeDouble(stop_rate ,Digits);      // ストップロス価格を正規化
    

    for( modify_resend_num = 0; modify_resend_num < 20; modify_resend_num++ ) { // 試行回数上限:20
        modify_ret = OrderModify(
                                 OrderTicket(),      // チケットNo
                                 OrderOpenPrice(),  // 注文価格
                                 stop_rate,            // ストップロス価格
                                 limit_rate,           // リミット価格
                                 OrderExpiration(), // 有効期限
                                 clrRed               // 色

                     );

        if ( modify_ret == false ) {             // 注文変更拒否
            Sleep(300);                         // 300msec待ち
            errorcode = GetLastError();        // エラーコード取得
            printf( "%d回目:注文変更拒否。エラーコード:%d , 詳細:%s ",
                                                       modify_resend_num+1, errorcode ,  ErrorDescription(errorcode));
        } else {                                 // 決済注文約定
            Print("注文変更完了。 チケットNo=",in_ticket_no);
            break;
        }
    }
}


結果:
open #15196788 buy 0.01 EURUSD at 1.11952 ok
新規注文約定。 チケットNo=15196788
modify #15196788 buy 0.01 EURUSD at 1.11952 sl: 1.11852 tp: 1.12052 ok
注文変更完了。 チケットNo=15196788







スポンサーリンク



Copyright ©2015 MT4でEA自作しちゃお〜 All Rights Reserved.


Top

inserted by FC2 system