//+------------------------------------------------------------------+ //| TrpRptShort.mq4 | //| Copyright ゥ 2011, MetaQuotes Software Corp. | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ #property copyright "Copyright ゥ 2011, MetaQuotes Software Corp." #property link "http://www.metaquotes.net" ////////// // USDHKD ////////// // 修正履歴 // 2011.02.15 mailの内容に口座残高と、含み損益を追加 // 2011.01.24 OrderSend のグリーンを CLR_NONEに変更。 //      メール機能をメソッド化 // 複利の処理を3パターン化(複利種類、ロスカットチケット番号を追加。) // Symbol()の把握方法を変更 // 2011.03.08 複利ロングを別EAに移動 // 2011.03.10 グローバル関数 EndFlg ==9のとき起動しない // 2011.03.18 int() にグローバル変数EndFlg = 9のメッセージを追加 // ポジションのコメントに、スリップなしのレートを設定 // メール内容変更 // 2011.04.13 複利ロング削除、1本目新規コメント化 Symbol()の把握をコメント化、窓明け対応コメント化 //      下降新規の場合、トラップ幅を半分にする。 // グローバル変数 EndFlg == 9だったら0に再設定 // 2011.08.09 下降新規の場合、トラップ幅を0.1円にする。 // 2011.08.10 下降新規の場合、err=133は、メール送信しない。 // 2011.08.26 成り行き新規のリミット指定不能対応 // 2011.10.06 下降新規のトラップ幅の項目を、externに変更 // 2011.10.11 エラー処理をメソッド化(err=134対応) //       ポジションコメントのレート桁数を4に // 2011.10.17 新規時のメール2件を1件に変更 // 2011.11.11 エラー時のメールは、同じエラーコードの場合、1件のみ送信する メッセージも付加 #include // パラメータ入力 extern string PosiMaxL= "↓再起動時、必須入力 現ポジ内の最高値の建値"; extern double PosiMax=7.775; extern string PosiMimL= "↓再起動時、必須入力 現ポジ内の最安値の建値"; extern double PosiMim=7.770; extern string SouteiMaxL= "↓想定する最高値を指定"; extern double SouteiMax =7.819; extern string SouteiMimL= "↓想定する最安値を指定"; extern double SouteiMim =7.770; extern string TrapHabaL= "↓上昇時トラップ幅"; extern double TrapHaba =0.001; extern string TrapHabaHalfL= "↓下降時トラップ幅"; extern double TrapHabaHalf =0.001; extern string RikakuHabaL= "↓利確幅"; extern double RikakuHaba =0.006; extern string LotsL= "↓ロット数(1=10万通貨)"; extern double Lots =0.1; extern string SlippageL= "↓スリッページ"; extern double Slippage =10; extern string TousiGakuL= "↓投資額(開始時の金額)"; extern int TousiGaku =500000; // //↓マジックナンバーには、建値を設定する(スリップを含まない値) int MAGICNO; //↓Alarm用のフラグ int MaxMsgFlg = 0; int MimMsgFlg = 0; int PosMsgFlg = 0; int err; //Symbol()の下桁を把握(fxf.または、FXF) /* string strSymbol; int strSymbolLen; string strSymbolFot; string strSymbolAUDJPY; */ // ポジションのコメント string PosCom; // 成り行き新規リミット指定不可対応 int MdfyTcktNo = 0; double RmtRate = 0; string MailMsg=""; //メール用メッセージ int LastErr=0; // 直前のエラーを退避 //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ //↓初期処理開始 int init() { // メッセージを複数回ださないためのフラグ MaxMsgFlg = 0; MimMsgFlg = 0; PosMsgFlg = 0; /* strSymbol = Symbol(); strSymbolLen = StringLen(strSymbol); strSymbolFot = StringSubstr(strSymbol,6,strSymbolLen-1); strSymbolAUDJPY = "AUDJPY" + strSymbolFot; */ Comment(" PosiMax:",PosiMax," PosiMim:",PosiMim); // グローバル変数 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); } //↑初期処理終了 //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ //↓通常処理開始 int start() { // グローバル変数 EndFlg == 9だったら抜ける int EndFlg = GlobalVariableGet("EndFlg"); if ( EndFlg == 9 ) { return(0); } //  更新のタイミング // PosiMax : 1.1本目のポジ建て 2.決済時にdown  3.上昇注文時にup   4.下降注文時更新なし // PosiMim : 1.1本目のポジ建て 2.決済時更新なし 3.上昇注文時更新なし 4.下降注文時down if(PosiMax == 0) { Alert("NG PosiMax == 0"); } else { ///////////////////// // 1.決済処理 ///////////////////// //最高値ポジが、決済されたら、PosiMaxを下げる if(Ask <= PosiMax - RikakuHaba) { if(PosiMax >= PosiMim) { // 決済レートに達成時の処理 PosiMax = PosiMax - TrapHaba; PosMsgFlg = 0; mail("kessai OK"); Comment(" PosiMax:",PosiMax," PosiMim:",PosiMim ); } // 全決済された場合、PosiMax < PosiMim となる。 else { // 何度も同じメッセージを出さないように、フラグで判定。 if (PosMsgFlg == 0) { Alert("-----posi zero"); Alert("PosiMax: ",PosiMax); Alert("PosiMim: ",PosiMim); PosMsgFlg = 1; } } } ////////////////////////// // 2.上昇時ショート新規 ////////////////////////// if(Bid >= PosiMax + TrapHaba) { //想定最高値以下なら注文する if(Bid <= SouteiMax) { //成行注文の実行 OKのとき、PosiMaxを上げる MAGICNO = (PosiMax + TrapHaba) * 100; PosCom = "Rate = " + DoubleToStr(PosiMax + TrapHaba,4); //if(OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,PosiMax + TrapHaba - RikakuHaba,PosCom,MAGICNO,0,CLR_NONE) > 0) // 成り行き新規リミット指定不可対応 MdfyTcktNo = OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,PosCom,MAGICNO,0,CLR_NONE); RmtRate = PosiMax + TrapHaba - RikakuHaba; if(MdfyTcktNo > 0) { // 新規約定時の処理 PosiMax = PosiMax + TrapHaba; MaxMsgFlg = 0; Comment(" PosiMax:",PosiMax," PosiMim:",PosiMim ); MailMsg = "up sinki"; //mail("up sinki OK"); } //成行注文の実行 NGのとき else { err("Up Sinki NG"); } } //想定最高値を超えていたら、注文しない else { // 何度も同じメッセージを出さないように、フラグで判定。 if ( MaxMsgFlg == 0 ) { Alert("-----SouteiMax Bid: ",Bid); Alert("SouteiMax:",SouteiMax); MaxMsgFlg = 1; } } } //////////////////////////// // 3.下降時のショート新規 //////////////////////////// if(Bid <= PosiMim - TrapHabaHalf) { //想定最安値以上なら注文する if(Bid >= SouteiMim) { /*/ 窓明けで下に開いていた場合、PosiMimを下方修正 double RateSa = PosiMim - Bid; double RateSaInt = RateSa * 100; double TrapHabaInt = TrapHaba * 100; while(RateSaInt > TrapHabaInt + Slippage) { PosiMim = PosiMim - TrapHaba; RateSa = PosiMim - Bid; RateSaInt = RateSa * 100; } */ //成行注文の実行 OKのとき、PosiMimを下げる MAGICNO = (PosiMim - TrapHabaHalf) * 100; PosCom = "Rate = " + DoubleToStr(PosiMim - TrapHabaHalf,4); // 成り行き新規リミット指定不可対応 //if(OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,PosiMim - TrapHabaHalf - RikakuHaba,PosCom,MAGICNO,0,CLR_NONE) > 0) MdfyTcktNo = OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,PosCom,MAGICNO,0,CLR_NONE); RmtRate = PosiMim - TrapHabaHalf - RikakuHaba; if(MdfyTcktNo > 0) { // 新規約定時の処理 PosiMim = PosiMim - TrapHabaHalf; MimMsgFlg = 0; Comment(" PosiMax:",PosiMax," PosiMim:",PosiMim ); //mail("down sinki OK"); MailMsg = "down sinki"; } //成行注文の実行 NGのとき else { err("Down Sinki NG"); } } //想定最安値を下回っていたら、注文しない else { // 何度も同じメッセージを出さないように、フラグで判定。 if ( MimMsgFlg == 0 ) { Alert("-----SouteiMim Bid: ",Bid); Alert("SouteiMim:",SouteiMim); MimMsgFlg = 1; } } } // 下降新規処理終了 ///////////////////// // 4.リミット値指定処理 ///////////////////// // 成り行き新規がなされた場合、リミット値を指定する。 if ( MdfyTcktNo > 0) { if (OrderSelect(MdfyTcktNo,SELECT_BY_TICKET) == true) { // リミット値変更 if (OrderModify(OrderTicket(),OrderOpenPrice(),0,RmtRate,0,CLR_NONE) > 0 ) { //mail("OrderModify OK"); MailMsg = MailMsg + " Modify OK"; mail(MailMsg); MdfyTcktNo = 0; } else { err("OrderModify NG"); } } else { err("OrderSelect NG"); } } // リミット指定処理 終了 } return(0); } //↑通常処理終了 //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ // // 再始動に備えて、終了時にアラーム出力を行う。 int deinit() { //---- Alert(""); Alert("*** stop ***"); Alert("PosiMax:",PosiMax); Alert("PosiMim:",PosiMim); //---- return(0); } //+------------------------------------------------------------------+ // メール送信 //+------------------------------------------------------------------+ // int mail(string word) { int KakuteiSoneki = AccountBalance() - TousiGaku; SendMail(WindowExpertName(), AccountServer() + "\r\n" + Symbol() + "\r\n" + " Bid: " + Bid + "\r\n" + " Ask: " + Ask + "\r\n" + " PosiMax:" + PosiMax + "\r\n" + " PosiMim:" + PosiMim + "\r\n" + " kouzazan:" + AccountBalance() + "\r\n" + " KakuteiSoneki:" + KakuteiSoneki + "\r\n" + " hukumisoneki:" + AccountProfit() + "\r\n" + " word:" + word ); return(0); } //+------------------------------------------------------------------+ //| エラー処理 //+------------------------------------------------------------------+ // // int err(string msg) { //---- int ErrCode = GetLastError(); // 134 資金不足。 のときは、グローバル変数を9(終了)に。 if (ErrCode == 134 ) { int SetOK = 0; while ( SetOK == 0 ) { if (GlobalVariableSet("EndFlg",9) > 0) { SetOK = 1; } else { Alert("GlobalVariableSet NG err:" + GetLastError()); } } } if ( LastErr != ErrCode ) { mail(msg + " err=" + ErrCode + "\r\n" + " " + ErrorDescription(ErrCode)); Alert(msg + " err=" + ErrCode); LastErr = ErrCode; } //---- return(0); }