//+------------------------------------------------------------------+ //| Hedge-Sell.mq4 | //| Copyright ゥ 2010, MetaQuotes Software Corp. | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ #property copyright "Copyright ゥ 2010, MetaQuotes Software Corp." #property link "http://www.metaquotes.net" //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ #define MAGIC_HEDGE 222 //マジックナンバーの代入 extern double Stert =0; //スタート価格を代入 extern double Haba =0.07; //幅を入力 extern double Lots =0.03; //一段目のロット数を入力 extern double HedgeLots =0.18; //ヘッジのロット数を入力 double Slippage =0.3; //スリッページを代入 double Stop=0; double Kakaku[5]; //存在するオーダーの価格を代入する変数。6個用意 int Pos =0; //ポジション数を格納する変数 int Pos_Buy =0; //買いを行うためのポジション数を格納する変数 extern int AUD_vs_JP =1; extern int NZD_vs_JP =0; extern int EUR_vs_JP =0; extern int USD_vs_JP =0; int init() { //---- Stert = NormalizeDouble(Bid,Digits); double temp_Stert = NormalizeDouble(Stert,Digits); // OrderSend(Symbol(),OP_SELLLIMIT,Lots,temp_Stert,Slippage,Stop,temp_Stert - NormalizeDouble(Haba,Digits),"",MAGIC_HEDGE,0,Red); //一段目のオーダーを入れる OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,Stop,temp_Stert - NormalizeDouble(Haba,Digits),"",MAGIC_HEDGE,0,Red); //一段目のオーダーを入れる OrderSend(Symbol(),OP_SELLLIMIT,Lots,temp_Stert + NormalizeDouble(Haba,Digits),Slippage,Stop,temp_Stert + NormalizeDouble(Haba,Digits) * 0,"",MAGIC_HEDGE,0,Red); //二段目のオーダーを入れる OrderSend(Symbol(),OP_SELLLIMIT,Lots * 2,temp_Stert + NormalizeDouble(Haba,Digits) * 2,Slippage,Stop,temp_Stert + NormalizeDouble(Haba,Digits) * 1,"",MAGIC_HEDGE,0,Red); //三段目のオーダーを入れる OrderSend(Symbol(),OP_SELLLIMIT,Lots * 4,temp_Stert + NormalizeDouble(Haba,Digits) * 3,Slippage,Stop,temp_Stert + NormalizeDouble(Haba,Digits) * 2,"",MAGIC_HEDGE,0,Red); //四段目のオーダーを入れる //OrderSend("AUDJPYpro",OP_BUYSTOP,Lots * 4,temp_Stert + NormalizeDouble(Haba,3) * 4,Slippage,Stop,0,"",MAGIC_HEDGE,0,Red); //五段目の買いオーダーを入れる //OrderSend("AUDJPYpro",OP_BUYLIMIT,Lots * 4,temp_Stert + NormalizeDouble(Haba,3) * 4,Slippage,Stop,0,"",MAGIC_HEDGE,0,Red); //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //---- double Nedan_Now = Bid; //MarketInfo("EURJPYFXF",MODE_BID); //マーケットの"EURJPYpro"の売りの現在価格を格納 //***************************************** オーダー数が4以下の場合、すべてのオーダーをキャンセル ************************************* Pos=0; //Pos変数の初期化 for(int j = 0; j < OrdersTotal(); j++) { if (OrderSelect(j,SELECT_BY_POS,MODE_TRADES) == true) //オーダーに正常なら以下の命令を実行 OrderSelect(j,SELECT_BY_POS,MODE_TRADES); //j番目のオーダーを選択 if(OrderMagicNumber() == MAGIC_HEDGE) { if(OrderType()==OP_SELL || OrderType()==OP_SELLLIMIT) { Pos = Pos + 1; } } } if(Pos < 4) //オーダー数が4以下なら決済が行われたと判断して、Hedgeプログラムでのオーダーを削除する { for(j = 0; j < OrdersTotal(); j++) { if (OrderSelect(j,SELECT_BY_POS,MODE_TRADES) == true) //オーダーに正常なら以下の命令を実行 OrderSelect(j,SELECT_BY_POS,MODE_TRADES); //j番目のオーダーを選択 if(OrderMagicNumber() == MAGIC_HEDGE) { OrderDelete(OrderTicket()); //選択したオーダーを削除 } } } //************************************************************************************************************************************* //***************************************** 2段目の価格に到達した場合の処理 *********************************************************** if(Bid > NormalizeDouble(Stert,Digits) + NormalizeDouble(Haba,Digits)) //2段目の価格より大きくかつ { if(Bid < NormalizeDouble(Stert,Digits) + NormalizeDouble(Haba,Digits) * 2) //3段目の価格より小さかったらモディファイ { for(j = 0; j < 5; j++) { Kakaku[j] = 0; //再びこの変数をリフレッシュ } for(j = 0; j < OrdersTotal(); j++) { if (OrderSelect(j,SELECT_BY_POS,MODE_TRADES) == false) continue; //オーダーに異常があった場合はこのループから抜ける OrderSelect(j,SELECT_BY_POS,MODE_TRADES); //j番目のオーダーを選択 if(OrderMagicNumber() == MAGIC_HEDGE) //j番目のオーダーのマジックナンバーがこのプログラムのマジックナンバーと同一の場合以下のプログラムを実行 { if(OrderType()==OP_SELL) //約定したオーダーはOP_SELLSTOPやOP_SELLLIMITからOP_SELLに変化する { Kakaku[j] = OrderOpenPrice(); //j番目のオーダーの、オーダー価格を格納 if(Kakaku[j] == NormalizeDouble(Stert,Digits)) //価格jが一段目であるならば { if(OrderTakeProfit() == NormalizeDouble(Stert,Digits) - NormalizeDouble(Haba,Digits)) //利食い値が一段目の1回目の設定値なら { OrderModify(OrderTicket(),OrderOpenPrice(),Stop,NormalizeDouble(Stert,Digits),0,Blue); //モディファイを実行 } } } } } } } //******************************************************************************************************************************************* //***************************************** 3段目の価格に到達した場合の処理 **************************************************************** if(Bid > NormalizeDouble(Stert,Digits) + NormalizeDouble(Haba,Digits) * 2) //3段目の価格より大きくかつ { if(Bid < NormalizeDouble(Stert,Digits) + NormalizeDouble(Haba,Digits) * 3) //4段目の価格より小さかったらモディファイ { for(j = 0; j < 5; j++) { Kakaku[j] = 0; //再びこの変数をリフレッシュ } for(j = 0; j < OrdersTotal(); j++) { if (OrderSelect(j,SELECT_BY_POS,MODE_TRADES) == false) continue; //オーダーに異常があった場合はこのループから抜ける OrderSelect(j,SELECT_BY_POS,MODE_TRADES); //j番目のオーダーを選択 if(OrderMagicNumber() == MAGIC_HEDGE) //j番目のオーダーのマジックナンバーがこのプログラムのマジックナンバーと同一の場合以下のプログラムを実行 { if(OrderType()==OP_SELL) //約定したオーダーはOP_SELLSTOPやOP_SELLLIMITからOP_SELLに変化する { Kakaku[j] = OrderOpenPrice(); //j番目のオーダーの、オーダー価格を格納 if(Kakaku[j] == NormalizeDouble(Stert,Digits)) //価格jが一段目であるならば { if(OrderTakeProfit() == NormalizeDouble(Stert,Digits)) //利食い値が一段目の2回目の設定値なら { OrderModify(OrderTicket(),OrderOpenPrice(),Stop,NormalizeDouble(Stert,Digits) + NormalizeDouble(Haba,Digits),0,Blue); } } else if(Kakaku[j] == NormalizeDouble(Stert,Digits) + NormalizeDouble(Haba,Digits)) //価格jが2段目であるならば { if(OrderTakeProfit() == NormalizeDouble(Stert,Digits)) //利食い値が2段目の1回目の設定値なら { OrderModify(OrderTicket(),OrderOpenPrice(),Stop,NormalizeDouble(Stert,Digits) + NormalizeDouble(Haba,Digits),0,Blue); } } } } } } } //******************************************************************************************************************************************* //***************************************** 4段目の価格に到達した場合の処理 **************************************************************** if(Bid > NormalizeDouble(Stert,Digits) + NormalizeDouble(Haba,Digits) * 3) //4段目の価格より大きくなったらモディファイ { if(Bid < NormalizeDouble(Stert,Digits) + NormalizeDouble(Haba,Digits) * 4) //5段目の価格より小さかったらモディファイ { for(j = 0; j < 5; j++) { Kakaku[j] = 0; //再びこの変数をリフレッシュ } for(j = 0; j < OrdersTotal(); j++) { if (OrderSelect(j,SELECT_BY_POS,MODE_TRADES) == false) continue; //オーダーに異常があった場合はこのループから抜ける OrderSelect(j,SELECT_BY_POS,MODE_TRADES); //j番目のオーダーを選択 if(OrderMagicNumber() == MAGIC_HEDGE) //j番目のオーダーのマジックナンバーがこのプログラムのマジックナンバーと同一の場合以下のプログラムを実行 { if(OrderType()==OP_SELL) //約定したオーダーはOP_SELLSTOPやOP_SELLLIMITからOP_SELLに変化する { Kakaku[j] = OrderOpenPrice(); //j番目のオーダーの、オーダー価格を格納 if(Kakaku[j] == NormalizeDouble(Stert,Digits)) //価格jが一段目であるならば { if(OrderTakeProfit() == NormalizeDouble(Stert,Digits) + NormalizeDouble(Haba,Digits)) //利食い値が一段目の3回目の設定値なら { OrderModify(OrderTicket(),OrderOpenPrice(),Stop,NormalizeDouble(Stert,Digits) + NormalizeDouble(Haba,Digits) * 2,0,Blue); } } else if(Kakaku[j] == NormalizeDouble(Stert,Digits) + NormalizeDouble(Haba,Digits)) //価格jが2段目であるならば { if(OrderTakeProfit() == NormalizeDouble(Stert,Digits) + NormalizeDouble(Haba,Digits)) //利食い値が2段目の2回目の設定値なら { OrderModify(OrderTicket(),OrderOpenPrice(),Stop,NormalizeDouble(Stert,Digits) + NormalizeDouble(Haba,Digits) * 2,Blue); } } else if(Kakaku[j] == NormalizeDouble(Stert,Digits) + NormalizeDouble(Haba,Digits) * 2) //価格jが3段目であるならば { if(OrderTakeProfit() == NormalizeDouble(Stert,Digits) + NormalizeDouble(Haba,Digits)) //利食い値が3段目の1回目の設定値なら { OrderModify(OrderTicket(),OrderOpenPrice(),Stop,NormalizeDouble(Stert,Digits) + NormalizeDouble(Haba,Digits) * 2,0,Blue); } } } } } } } //******************************************************************************************************************************************* //***************************************** 5段目の価格に到達した場合の処理 **************************************************************** if(Bid > NormalizeDouble(Stert,Digits) + NormalizeDouble(Haba,Digits) * 4) //5段目の価格より大きくなったらモディファイ { //if(Bid < NormalizeDouble(Stert,Digits) + NormalizeDouble(Haba,Digits) * 4) //5段目の価格より小さかったらモディファイ //{ for(j = 0; j < 5; j++) { Kakaku[j] = 0; //再びこの変数をリフレッシュ } for(j = 0; j < OrdersTotal(); j++) { if (OrderSelect(j,SELECT_BY_POS,MODE_TRADES) == false) continue; //オーダーに異常があった場合はこのループから抜ける OrderSelect(j,SELECT_BY_POS,MODE_TRADES); //j番目のオーダーを選択 if(OrderMagicNumber() == MAGIC_HEDGE) //j番目のオーダーのマジックナンバーがこのプログラムのマジックナンバーと同一の場合以下のプログラムを実行 { if(OrderType()==OP_SELL) //約定したオーダーはOP_SELLSTOPやOP_SELLLIMITからOP_SELLに変化する { Kakaku[j] = OrderOpenPrice(); //j番目のオーダーの、オーダー価格を格納 if(Kakaku[j] == NormalizeDouble(Stert,Digits)) //価格jが一段目であるならば { if(OrderTakeProfit() == NormalizeDouble(Stert,Digits) + NormalizeDouble(Haba,Digits) * 2) //利食い値が一段目の4回目の設定値なら { OrderModify(OrderTicket(),OrderOpenPrice(),Stop,0,0,Blue); } } else if(Kakaku[j] == NormalizeDouble(Stert,Digits) + NormalizeDouble(Haba,Digits)) //価格jが2段目であるならば { if(OrderTakeProfit() == NormalizeDouble(Stert,Digits) + NormalizeDouble(Haba,Digits) * 2) //利食い値が2段目の3回目の設定値なら { OrderModify(OrderTicket(),OrderOpenPrice(),Stop,0,0,Blue); } } else if(Kakaku[j] == NormalizeDouble(Stert,Digits) + NormalizeDouble(Haba,Digits) * 2) //価格jが3段目であるならば { if(OrderTakeProfit() == NormalizeDouble(Stert,Digits) + NormalizeDouble(Haba,Digits) * 2) //利食い値が3段目の2回目の設定値なら { OrderModify(OrderTicket(),OrderOpenPrice(),Stop,0,0,Blue); } } else if(Kakaku[j] == NormalizeDouble(Stert,Digits) + NormalizeDouble(Haba,Digits) * 3) //価格jが4段目であるならば { if(OrderTakeProfit() == NormalizeDouble(Stert,Digits) + NormalizeDouble(Haba,Digits) * 2) //利食い値が4段目の1回目の設定値なら { OrderModify(OrderTicket(),OrderOpenPrice(),Stop,0,0,Blue); } } } } } //} Pos_Buy =0; //ポジション数を格納する変数を初期化 for(j = 0; j < OrdersTotal(); j++) { OrderSelect(j,SELECT_BY_POS,MODE_TRADES); if(OrderMagicNumber()==333) { Pos_Buy = 1; } } if(Pos_Buy == 0 && Pos == 4) //買いの注文がゼロなら注文を入れる { if(AUD_vs_JP == 1) //オーストラリアドルを買う場合 { OrderSend("AUDJPYFXF",OP_BUY,HedgeLots,Ask,Slippage,Stop,0,"",333,0,Red); //五段目に到達したらAUDに成り行き買い注文 //OrderSend(Symbol(),OP_BUY,Lots * 4,Ask,Slippage,Stop,0,"",333,0,Red); //五段目に到達したらAUDに成り行き買い注文(テスト用) } if(NZD_vs_JP == 1) //ニュージーランドドルを買う場合 { OrderSend("NZDJPYFXF",OP_BUY,HedgeLots * 4,Ask,Slippage,Stop,0,"",333,0,Red); //五段目に到達したらAUDに成り行き買い注文 //OrderSend(Symbol(),OP_BUY,Lots * 4,Ask,Slippage,Stop,0,"",333,0,Red); //五段目に到達したらAUDに成り行き買い注文(テスト用) } if(EUR_vs_JP == 1) //ユーロを買う場合 { OrderSend("EURJPYFXF",OP_BUY,HedgeLots * 4,Ask,Slippage,Stop,0,"",333,0,Red); //五段目に到達したらAUDに成り行き買い注文 //OrderSend(Symbol(),OP_BUY,Lots * 4,Ask,Slippage,Stop,0,"",333,0,Red); //五段目に到達したらAUDに成り行き買い注文(テスト用) } if(USD_vs_JP == 1) //アメリカドルを買う場合 { OrderSend("USDJPYFXF",OP_BUY,HedgeLots * 4,Ask,Slippage,Stop,0,"",333,0,Red); //五段目に到達したらAUDに成り行き買い注文 //OrderSend(Symbol(),OP_BUY,Lots * 4,Ask,Slippage,Stop,0,"",333,0,Red); //五段目に到達したらAUDに成り行き買い注文(テスト用) } } } //---- return(0); } //+------------------------------------------------------------------+