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を設定した場合は描画しません。 |
#property strict // 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; } } }
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
// OrderSend error 130:無効なストップロス設定 OrderSend( Symbol() , // 通貨ペア OP_BUY , // 注文タイプ 0.01 , // ロット数 Ask , // 注文価格 20 , // スリップページ Ask , // ストップロス価格 【ストップロス価格がクォート価格に近すぎる】 0 // リミット価格 ); OrderSend( Symbol() , // 通貨ペア OP_BUY , // 注文タイプ 0.01 , // ロット数 Ask , // 注文価格 20 , // スリップページ Ask + ( Point() / 3) , // ストップロス価格 【通貨ペアの価格精度を超過している(買値+0.0000033333333…)】 0 // リミット価格 ); // 現在の通貨ペアの精度に正規化する方法 Print( NormalizeDouble( Ask + ( Point() / 3) , Digits() ) ); // OrderSend error 131: 無効なトレード量(lot数)です OrderSend( Symbol() , // 通貨ペア OP_BUY , // 注文タイプ 0.001 , // ロット数 【FXCMの最小lotは0.01です】 Ask , // 注文価格 20 , // スリップページ 0 , // ストップロス価格 0 // リミット価格 ); OrderSend( Symbol() , // 通貨ペア OP_BUY , // 注文タイプ 501.00 , // ロット数 【FXCMの上限lotは500.00です】 Ask , // 注文価格 20 , // スリップページ 0 , // ストップロス価格 0 // リミット価格 ); //lotの上限・下限を調べる方法 Print( "最大ロット =" , MarketInfo( Symbol() , MODE_MAXLOT ) ); Print( "最小ロット =" , MarketInfo( Symbol() , MODE_MINLOT ) ); // OrderSend error 134:証拠金不足(証拠金が沢山ある場合は発生しません) #define MAX_LOT 500.00 if ( IsDemo() == true) { // このコードをコピペして、うっかりリアル口座で動作させてしまった場合の対策。 OrderSend( Symbol() , // 通貨ペア OP_BUY , // 注文タイプ MAX_LOT , // ロット数 【5千万通貨(500lot)でエントリーするには約2億円程の証拠金が必要です】 Ask , // 注文価格 20 , // スリップページ 0 , // ストップロス価格 0 // リミット価格 ); } // OrderSend error 4051:無効な引数設定 OrderSend( Symbol() , // 通貨ペア 10 , // 注文タイプ 【注文タイプの設定範囲は0~5】 0.01 , // ロット数 Ask , // 注文価格 20 , // スリップページ 0 , // ストップロス価格 0 // リミット価格 );