![OrderSend](https://celebpanda.com/wp/wp-content/uploads/2021/08/OrderSend.jpg)
現在アカウントの口座残高を返します。
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 | リミット価格 |
comment | NULL | IN | 注文コメント。 コメントの末尾は取引サーバーによって変更されます。 |
magic | 0 | IN | マジックナンバー。 ユーザーがEAを識別する為に使用します。 |
expiration | 0 | IN | 注文の有効期限(指値注文のみ) |
arrow_color | clrNONE | IN | チャート上の注文矢印の色。 パラメータを設定しない又は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;
}
}
}