ポジションエントリーからクローズまでの流れ【自作EA】(MQL4)

エントリー処理を記述してみよう

まず余計な処理のことは気にせず、買又は売、どちらかのポジションの流れを作ってしまいましょう。
今回は買ポジションを建てることから始めます。まずはOrderSend()関数を使って注文を送信します。
詳しくは、EAで注文を送信するOrderSend()関数の使い方(MQL4)をご覧ください。
まずやり方としてはとりあえず先に動くものを確実に作るってことです。
動くものを作った後に外部変数に変えたりしてどこが間違っているのかをわかるようにします。
とりあえず動くっていうのが下記のサンプルです。下記をOnTick()内にコピーすればポジションは建てられます。

int Ticket = OrderSend(
	   	Symbol(), //開いているチャート且つ選択している通貨ペアのポジションを建てる
	   	OP_BUY,   //成行買い
	   	MarketInfo(Symbol(),MODE_MINLOT), //業者の最小のロットで注文
	   	Ask,       //現在の買値で注文
	   	30,  //30pointの許容スリッページ
	   	0,   //損切り価格を指定しない
	   	0,   //利益確定価格を指定しない
	   	NULL,      //コメントなし
	   	12345,     //EAの識別番号
	   	0,         //有効期限なし
	   	clrNONE    //チャート上にエントリーを示す矢印の色
	   );
	
	//-1が返ってきたらエラー。注文失敗
	if( Ticket == -1 ){
   		Print( GetLastError() );  //エラー内容を出力
	}else{
		Print( "注文完了" );
	}

で動作することを確認できたら前回やった外部変数、グローバル変数の初期化のやり方(MQL4)
の外部変数を初期化した値を1つずつ注文にいれて行きエラーが出ないか確認しながらやっていきます。
で関数化してやると下記のようになります。

int BuyEntry(){
		//注文する損切り価格を算出
		double StopLossPrice=0;
		if(rateStopLoss != 0){
			StopLossPrice = getAsk(Symbol())-rateStopLoss;
		}
		//注文する利食い価格を算出
		double TakeProfitPrice=0;
		if(rateTakeProfit != 0){
			TakeProfitPrice = getAsk(Symbol())+rateTakeProfit;
		}          
	int ticket = OrderSend(Symbol(),OP_BUY,OrderLotSize,
							getAsk(Symbol()),OrderSlippage,
							StopLossPrice,TakeProfitPrice,
							"sample",MagicNumber,0,Green);
	if(ticket==-1){
		ticket = 0;
		Print(GetLastError());
	}
	return ticket;
}
double getAsk(string symbol){
	return MarketInfo(symbol,MODE_ASK);
}

クローズ処理を記述してみよう

このサンプルでは基本的にポジションは1つしか所持しませんので決済処理も1つのポジションの決済のみです。
複数のポジションを持っている場合は複数同時に決済する必要があります。
決済に必要なのは決済するポジションのチケット番号の指定です。
決済するポジションを指定するのはOrderSelect()関数です。詳しくはチケットを選択する関数OrderSelect()(MQL4)をご覧下さい。
でこのOrderSelect()関数で選択したポジションを決済するわけです。
OrderSelect(決済するチケット番号、チケット番号を選択、保有中のポジションを選択);
上記で選択した後、OrderClose()関数で決済をしてやります。
詳しくはポジションを決済してくれるOrderClose()関数(MQL4)
関数化した処理が下記のサンプルです。

int BuySettlement(int ticket, int slippage){
	if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)){
		bool res = OrderClose(ticket,OrderLots(),getBid(Symbol()),slippage,clrNONE);
		if( res == false ){
			Print( GetLastError() );  //エラー内容を出力
		}
	}else{
		Print( GetLastError() );  //エラー内容を出力
	}
	ticket = 0;
	return ticket;
}
double getBid(string symbol){
	return MarketInfo(symbol,MODE_BID);
}

まとめ

上記の関数化したエントリー処理とクローズ処理をOnTick()内で呼び出してやると注文~決済の流れが完成します。

	//iRSIを定義
	double previewRSI = iRSI(Symbol(),PERIOD_CURRENT,14,PRICE_CLOSE,1);//ローソク足1本前のRSIの値を取得
	double currentRSI = iRSI(Symbol(),PERIOD_CURRENT,14,PRICE_CLOSE,0);//現在のRSIの値を取得
        //1本前のRSIが30以下で現在のRSIが30以上の時
        if( previewRSI<30 && currentRSI>30 && BuyTicket == 0 ){
		//買エントリー
		BuyTicket = BuyEntry();
	}
	//1本前のRSIが70以上で現在のRSIが70以下の時
	if( previewRSI>70 && currentRSI<70 ){ 
		//買決済
		BuyTicket  = BuySettlement(BuyTicket, OrderSlippage);

	}

今回は以上となります。お読み頂きありがとうございます。

シェアする

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

フォローする