チケットを選択する関数OrderSelect()(MQL4)

関数OrderSelect()

書式

通常、数をかぞえる時は1からですが、indexは0から始まります。

bool  OrderSelect(
	int     index,                // チケットを選択
	int     select,               // チケット番号かポジション保有順(昇順)を選択できます。
                                      //ポジション保有順,またの名を”先入れ先出し”とも言う(笑)

	int     pool = MODE_TRADES    // 保有中のポジションか決済履歴を選択できます。(デフォルトは保有中のポジション選択)
	);

引数

保有ポジションを選択したい場合(MODE_TRADES)

int Buy_or_Sell_Ticket;//買チケット又は売チケット

//保有中ポジション且つチケット番号
bool res = OrderSelect(
	Buy_or_Sell_Ticket,   // チケットを選択
	SELECT_BY_TICKET,     // チケット番号を指定
	MODE_TRADES  // 保有中のポジションを指定
	);

//保有中ポジション且つチケット保有順
bool res = OrderSelect(
	Buy_or_Sell_Ticket,   // チケットを指定
	SELECT_BY_POS,     // チケットを保有した順番(index)を指定
	MODE_TRADES  //  保有中のポジションを指定
	);

決済済みポジションを選択したい場合(MODE_HISTORY)

決済済みのポジションを参照する理由として挙げられるのは損益ですね。
決済済みのポジションの損益を参照して勝率とかをだすためですかね、それによってロット数上げるとか、、しらんけど。

int Buy_or_Sell_Ticket;//買チケット又は売チケット

//決済済みポジション且つチケット番号
bool res = OrderSelect(
	Buy_or_Sell_Ticket,   // チケットを選択
	SELECT_BY_TICKET,     // チケット番号を指定
	MODE_HISTORY  // 決済済みのポジションを指定
	);

//決済済みポジション且つチケット保有順
bool res = OrderSelect(
	Buy_or_Sell_Ticket,   // チケットを選択
	SELECT_BY_POS,     // チケットを保有した順番(index)を指定
	MODE_HISTORY  //  決済済みのポジションを指定
	);

戻り値(返り値)

チケットの選択に成功したらtrue
チケットの選択に失敗したらfalseが返ってきます。

if( res == false ){
		Print(GetLastError());//エラー番号を出力
}else{
		Print("選択成功");
}

サンプルコード(コピペOK。動作は確認していますが、、、)

ちょっとわかりにくいかもしれません。。。
後々、改良します、、、

保有中ポジションをチケット番号で選択

( OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES) )
画像の下から
買ポジション約定
ポジションを選択
ポジションを決済
の順番です

//グローバル変数
extern int MagicNumber = 12345;
int sellTicket = 0;
int buyTicket = 0;
bool flag = true;
int slippage = 30;  //30pointを指定:1point=0.1pips換算_Point

void OnTick(){

	//買エントリー	
	if( flag == true ){
		buyTicket = OrderSend(Symbol(),OP_BUY,MarketInfo(Symbol(),MODE_MINLOT),Ask,slippage,0,0,"OP_BUY",MagicNumber,0,clrNONE);							
		if( buyTicket == -1 ){
			Print( "オーダー失敗エラーコードは"+GetLastError()+"です" );  //エラー内容を出力
		}   
		flag = false;
	}

	//買決済
	if( flag == false && buyTicket != 0 ){
		//保有中ポジション且つチケット番号
		if( OrderSelect(buyTicket,SELECT_BY_TICKET,MODE_TRADES) ){
			Print("選択成功:チケット番号は"+buyTicket+"です。");
			bool res = OrderClose(buyTicket,OrderLots(),Ask,slippage,clrNONE);
			if( res == false ){
				Print( "決済失敗:"+GetLastError() );  //エラー内容を出力
			}
		}else{
			Print("選択失敗:"+GetLastError());  //エラー内容を出力
		}
		buyTicket=0;
	}
}

関数MarketInfo()

決済済みポジションをチケット番号で選択

( OrderSelect(Ticket,SELECT_BY_TICKET,MODE_HISTORY) )
画像の下から
買ポジションを約定
ポジションを決済
決済済みのポジションを選択
の順番です。

//グローバル変数
extern int MagicNumber = 12345;
int sellTicket = 0;
int buyTicket = 0;
bool flag = true;
int slippage = 30;  //30pointを指定:1point=0.1pips換算_Point


void OnTick(){

	//買エントリー	
	if( flag == true ){		
		buyTicket = OrderSend(Symbol(),OP_BUY,MarketInfo(Symbol(),MODE_MINLOT),Ask,slippage,0,0,"OP_BUY",MagicNumber,0,clrNONE);						
		if( buyTicket == -1 ){
			Print( "オーダー失敗エラーコードは"+GetLastError()+"です" );  //エラー内容を出力
		}   
		flag = false;
	}
	//買決済
	if( flag == false && buyTicket != 0 ){
		//保有中ポジション且つチケット番号
		if( OrderSelect(buyTicket,SELECT_BY_TICKET,MODE_TRADES) ){
			bool res = OrderClose(buyTicket,OrderLots(),Ask,slippage,clrNONE);
			if( res == false ){
				Print( "決済失敗:"+GetLastError() );  //エラー内容を出力
			}
		}else{
			Print("選択失敗:"+GetLastError());  //エラー内容を出力
		}
		//決済済みポジション且つチケット番号
		if( OrderSelect(buyTicket,SELECT_BY_TICKET,MODE_HISTORY) ){
			Print("決済済みポジション選択:チケット番号は"+buyTicket+"です。");	
		}else{
			Print("選択失敗:"+GetLastError());  //エラー内容を出力
		}
		buyTicket=0;
	}
}

ポジションの保有した順番で選択する時とは?

主に複数のポジションを同時に決済したい時ですね。
例えば、成行注文をだして、同時に指値、逆指値注文をだし、これらを同時に決済したい場合などに使用します。
ポジションは1つしか持たないよって人はチケット番号を指定したほうが良いかもしれません。

保有中のポジションをindex(保有順で)選択のみの場合(未決済)

( OrderSelect(Ticket,SELECT_BY_POS,MODE_TRADES) )
ポジションの保有した順番がわかりやすいようにロット数を変えてエントリーしています。
画像下から
ポジションロット数1エントリー
ポジションロット数2エントリー

コードで最初に2番目のエントリーを出力しているので
ポジションロット数2エントリーを選択
ポジションロット数1エントリーを選択
の順番です。決済処理はしていません。

//グローバル変数
extern int MagicNumber = 12345;
int sellTicket = 0;
int buyTicket = 0;
bool flag = true;
int slippage = 30;  //30pointを指定:1point=0.1pips換算_Point


void OnTick(){
	
	//買エントリー	
	if( flag == true ){
		buyTicket = OrderSend(Symbol(),OP_BUY,MarketInfo(Symbol(),MODE_MINLOT)*1 ,Ask,slippage,0,0,"OP_BUY",MagicNumber,0,clrNONE);
		buyTicket = OrderSend(Symbol(),OP_BUY,MarketInfo(Symbol(),MODE_MINLOT)*2 ,Ask,slippage,0,0,"OP_BUY",MagicNumber,0,clrNONE);
		if( buyTicket == -1 ){
			Print( "オーダー失敗エラーコードは"+GetLastError()+"です" );  //エラー内容を出力
		}   
	}

	if( flag == true ){
				//保有中ポジション且つ保有順番
		if( OrderSelect(1,SELECT_BY_POS,MODE_TRADES) ){
			Print("保有ポジション選択:保有順のindexは1です。ロット数が*2のポジション");
		}
		if( OrderSelect(0,SELECT_BY_POS,MODE_TRADES) ){
			Print("保有ポジション選択:保有順のindexは0です。ロット数が*1のポジション");
		}
		flag = false;
	}
}

ポジションを保有した順番(index)で順繰り決済

( OrderSelect(Ticket,SELECT_BY_POS,MODE_TRADES) )
こちらは決済のみのコードです。
画像下から
ポジションロット数1エントリー
ポジションロット数2エントリー
ポジションロット数1決済
ポジションロット数2決済
の順番です。
一応、決済時にはポジションを選択しないといけないため、OrderSelect()は使用しています。

//グローバル変数
extern int MagicNumber = 12345;
int sellTicket = 0;
int buyTicket = 0;
bool flag = true;
int slippage = 30;  //30pointを指定:1point=0.1pips換算_Point


void OnTick(){
	
	//買エントリー	
	if( flag == true ){
		buyTicket = OrderSend(Symbol(),OP_BUY,MarketInfo(Symbol(),MODE_MINLOT)*1 ,Ask,slippage,0,0,"OP_BUY",MagicNumber,0,clrNONE);
		buyTicket = OrderSend(Symbol(),OP_BUY,MarketInfo(Symbol(),MODE_MINLOT)*2 ,Ask,slippage,0,0,"OP_BUY",MagicNumber,0,clrNONE);
		if( buyTicket == -1 ){
			Print( "オーダー失敗エラーコードは"+GetLastError()+"です" );  //エラー内容を出力
		}   
		flag=false;
	}

	//買決済
	if( flag == false && OrdersTotal() != 0 ){
		//まとめて決済
		for(int icount=0;icount < OrdersTotal();icount++){
			if( OrderSelect(icount,SELECT_BY_POS,MODE_TRADES) ){
				bool res = OrderClose(OrderTicket(),OrderLots(),Bid,slippage,clrNONE);
				if( res == false ){
					Print( "決済失敗:"+GetLastError() );  //エラー内容を出力
				}
			}else{
				Print("選択失敗:"+GetLastError());  //エラー内容を出力
			}
		}
	}
}

関数OrdersTicket(),関数OrderLots()

ポジションを保有した順番で順繰り決済後、決済したポジションをindex(保有順)で選択

( OrderSelect(Ticket,SELECT_BY_POS,MODE_HISTORY) )
画像下から
ポジションロット数1エントリー
ポジションロット数2エントリー
ポジションロット数1決済
ポジションロット数2決済
決済済みポジションロット数1を選択
決済済みポジションロット数2を選択
の順番です。

//グローバル変数
extern int MagicNumber = 12345;
int sellTicket = 0;
int buyTicket = 0;
int flag = 0;
int slippage = 30;  //30pointを指定:1point=0.1pips換算_Point


void OnTick(){
	
	//買エントリー	
	if( flag == 0 ){
		buyTicket = OrderSend(Symbol(),OP_BUY,MarketInfo(Symbol(),MODE_MINLOT)*1 ,Ask,slippage,0,0,"OP_BUY",MagicNumber,0,clrNONE);
		buyTicket = OrderSend(Symbol(),OP_BUY,MarketInfo(Symbol(),MODE_MINLOT)*2 ,Ask,slippage,0,0,"OP_BUY",MagicNumber,0,clrNONE);
		if( buyTicket == -1 ){
			Print( "オーダー失敗エラーコードは"+GetLastError()+"です" );  //エラー内容を出力
		}   
		flag = 1;
	}

	//買まとめて決済
	if( flag == 1 && OrdersTotal() != 0 ){
		for(int icount=0;icount < OrdersTotal();icount++){
			if( OrderSelect(icount,SELECT_BY_POS,MODE_TRADES) ){
				bool res = OrderClose(OrderTicket(),OrderLots(),Bid,slippage,clrNONE);
				if( res == false ){
					Print( "決済失敗:"+GetLastError() );  //エラー内容を出力
				}
			}else{
				Print("選択失敗:"+GetLastError());  //エラー内容を出力
			}
		}
		flag = 2;
	}
	
	if( flag == 2 ){   
		//決済済みポジション且つ保有順
		if( OrderSelect(0,SELECT_BY_POS,MODE_HISTORY) ){
			Print("決済済みポジション選択:index番号は0です。");
		}else{
			Print("選択失敗:"+GetLastError());  //エラー内容を出力
		}
		if( OrderSelect(1,SELECT_BY_POS,MODE_HISTORY) ){
			Print("決済済みポジション選択:index番号は1です。");
		}else{
			Print("選択失敗:"+GetLastError());  //エラー内容を出力
		}
		flag = 3;
	}
}

関数OrdersTotal(),関数OrderClose(),関数OrderSend()

シェアする

  • このエントリーをはてなブックマークに追加

フォローする