//+------------------------------------------------------------------+ //| Tettasi.mq4 | //| Copyright ゥ 2010, MetaQuotes Software Corp. | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ #property copyright "Copyright ゥ 2010, MetaQuotes Software Corp." #property link "http://www.metaquotes.net" /* レート、および、口座残高の条件を満たした場合、 全てのポジションを決済、全ての注文を取り消しするプログラム。 */ extern string CloseRateHighL = "↓決済レート高値"; extern double CloseRateHigh = 86; extern string CloseRateLowL = "↓決済レート安値"; extern double CloseRateLow = 76; extern string TousiGakuL = "↓投資額"; extern int TousiGaku = 200000; extern string RemitGakuL = "↓利確金額"; extern int RemitGaku = 20000; extern string StopGakuL = "↓損切り金額"; extern int StopGaku = -20000; int CloseDelFlg; //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int init() { //---- Alert(""); Alert(WindowExpertName()," START"); Comment(" CloseRateHigh:",CloseRateHigh," CloseRateLow:",CloseRateLow ," RemitGaku:" , RemitGaku," StopGaku:" , StopGaku ); CloseDelFlg = 0; // グローバル変数 EndFlg == 9だったら0に再設定 int EndFlg = GlobalVariableGet("EndFlg"); if ( EndFlg == 9 ) { int SetOK = 0; while ( SetOK == 0 ) { if (GlobalVariableSet("EndFlg",0) > 0) { SetOK = 1; } else { Alert("glbPosiMax NG err:" + GetLastError()); } } } //---- return(0); } //+------------------------------------------------------------------+ //| script "close first market order if it is first in the list" | //+------------------------------------------------------------------+ int start() { // グローバル変数 EndFlg == 9だったら、すでに起動済みなので、処理不要 int EndFlg = GlobalVariableGet("EndFlg"); string MailWord = ""; if ( EndFlg == 9 ) { return(0); } // 全決済を行う条件 // // 1.確定益-含み損が、RemitGaku を上回った場合、StopGaku を下回った場合、 // または、 // 2.決済レート高値を上回った場合、決済レート安値を下回った場合。 // 確定益-含み損が、RemitGaku を上回った場合 if ( AccountBalance() - TousiGaku + AccountProfit() >= RemitGaku ) { MailWord = " Remit OK "; } // 確定益-含み損が、StopGaku を下回った場合、 else if ( AccountBalance() - TousiGaku + AccountProfit() <= StopGaku ) { MailWord = " Stop OK "; } // 決済レート高値を上回った場合、 else if ( Bid > CloseRateHigh) { MailWord = " Rate UP OK "; } // 決済レート安値をした回った場合、 else if (Bid < CloseRateLow ) { MailWord = " Rate DOWN OK "; } if ( MailWord != "") { CloseDel(); mail(MailWord); Alert(WindowExpertName()," END"); Alert("Please Stop EA"); } return(0); } //+------------------------------------------------------------------+ //| 全決済処理、全取り消し処理 //+------------------------------------------------------------------+ void CloseDel() { int cmd,error; double price; // ポジション数を把握 int total = OrdersTotal(); // ポジション数が1以上のときのみ起動する。 if(total > 0) { // ポジション番号、最大値〜0まで繰り返し行う。 for(int ii = total -1; ii >= 0; ii-- ) { // ポジション検索処理 if(OrderSelect(ii,SELECT_BY_POS,MODE_TRADES)) { //---- オーダータイプが、OP_BUY、OP_SELLのとき、決済 cmd=OrderType(); if(cmd==OP_BUY || cmd==OP_SELL) { // 現レートの把握 if(cmd==OP_BUY) { price =MarketInfo(OrderSymbol(),MODE_BID); } else { price =MarketInfo(OrderSymbol(),MODE_ASK); } // 決済処理 if (OrderClose(OrderTicket(),OrderLots(),price,3,CLR_NONE)>0) { Alert("kessai OK TicketNo:" , OrderTicket()); } //エラー処理 else { Alert("kessai NG TicketNo:",OrderTicket()," err:",GetLastError()); mail("kessai NG"); } } // 注文中のものはキャンセル else if(cmd==OP_BUYLIMIT || cmd==OP_BUYSTOP || cmd==OP_SELLLIMIT || cmd==OP_SELLSTOP ) { OrderDelete(OrderTicket()); } } else { Alert( "OrderSelect ng", GetLastError()); mail("OrderSelect NG"); } } //for } //if(total > 0) // 終了フラグをオン int SetOK = 0; while ( SetOK == 0 ) { if (GlobalVariableSet("EndFlg",9) > 0) { SetOK = 1; } else { Alert("EndFlg NG err:" + GetLastError()); mail("GlobalVariableSet NG"); } } //---- return; } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ // メール内容を別メソッド化 //+------------------------------------------------------------------+ // void mail(string word) { SendMail(WindowExpertName(), AccountServer() + "\r\n" + Symbol() + "\r\n" + "Bid:" + Bid + "\r\n" + "Ask:" + Ask + "\r\n" + "kouzazan:" + AccountBalance() + "\r\n" + "word:" + word); //Alert(WindowExpertName(), AccountServer() + Symbol() + " Bid: "+ Bid + " Ask: "+Ask + " kouzazan:" + AccountBalance() + " hukumisoneki:" + AccountProfit() + " word:" + word); return; }