OrderSend

現在アカウントの口座残高を返します。

OrderSend

関数書式

int  OrderSend(
   string   symbol,               // 通貨ペア名
   int      cmd,                  // 注文タイプ
   double   volume,               // ロット数
   double   price,                // 注文価格
   int      slippage,             // スリップページ
   double   stoploss,             // ストップロス価格
   double   takeprofit,           // リミット価格
   string   comment     = NULL,   // コメント
   int      magic       = 0,      // マジックナンバー(識別用)
   datetime expiration  = 0,      // 有効期限
   color    arrow_color = clrNONE // 色
   );

  • 引数
引数名初期値I/O詳細
symbol-IN取引する通貨ペア名
cmd-IN注文タイプ。
オーダータイプ列挙の値を指定します
volume-INロット数
price-IN注文価格
slippage-IN許容するスリップページ
(Instant Execution用、注文執行方式は業者によって異なります。
Market Executionの場合はスリップページ設定は効きません)
stoploss-INストップロス価格
takeprofit-INリミット価格
commentNULLIN注文コメント。
コメントの末尾は取引サーバーによって変更されます。
magic0INマジックナンバー。
ユーザーがEAを識別する為に使用します。
expiration0IN注文の有効期限(指値注文のみ)
arrow_colorclrNONEINチャート上の注文矢印の色。
パラメータを設定しない又はCLR_NONEを設定した場合は描画しません。
  • 戻り値

取引サーバーによって割り当てられたチケット番号を返します。
エラーの場合は-1を返します。
エラーコードの確認はGetLastError()関数を使用します。

  • その他

成行き注文(cmd= OP_SELL,OP_BUY )では、注文価格(price)にBid(売値)とAsk(買値)のみ使用します。

もし現在と異なる有価証券で実行する場合、
その有価証券の最新クォートを取得する為に、MarketInfo()関数でMODE_BID,MODE_ASKプロパティの値を取得する必要があります。

算出した価格が正規化されていない場合、その価格は適用する事が出来ません。
通貨ペアの小数点以下の桁数に応じた価格を適用していない場合、エラー129(ERR_INVALID_PRICE)が生成されます。

注文価格の期限が切れてしまっている場合はエラー138(ERR_REQUOTE)が生成されます。
注文価格が古くなっているが、スレッド内に注文が残っている場合、
市場提示クォートがスリップページ(slippage)で設定した範囲内(price±slippage)にある場合のみ、その注文価格で約定されます。

ストップロス価格(stoploss)とリミット価格(takeprofit)は市場提示レートに近い値を設定出来ません。
ストップロスとの距離の許容範囲はMarketInfo()関数でMODE_STOPLEVELプロパティで調べる事が出来ます。
正規化されていない価格を設定した場合はエラー130(ERR_INVALID_STOPS)が生成されます。

指値注文の場合、市場が提示しているクォートに近い注文価格を設定する事は出来ません。
指値の注文価格との距離の許容範囲はMarketInfo()関数でMODE_STOPLEVELプロパティで調べる事が出来ます。
正規化されていない価格を設定した場合はエラー130(ERR_INVALID_STOPS)が生成されます。

指値注文の有効期限は取引サーバー側で無効にする事が出来ます。
取引サーバーによって無効にされている場合に、有効期限に0以外の値を設定した場合は
エラー147(ERR_TRADE_EXPIRATION_DENIED)が生成されます。

取引サーバー側でエントリー中の注文と保留中の注文合計を制限する事が出来ます。
この制限に達した場合、新規注文は出来ません。
新規注文を行った場合エラー148(ERR_TRADE_TOO_MANY_ORDERS)が生成されます。

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


#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;
        }
    }
}

Twitterでフォローしよう

おすすめの記事