//+------------------------------------------------------------------+ //| TrapReptShort.mq4 | //| Copyright ゥ 2010, MetaQuotes Software Corp. | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ #property copyright "Copyright ゥ 2010, MetaQuotes Software Corp." #property link "http://www.metaquotes.net" // 修正履歴 // 2011.01.24 OrderSend のグリーンを CLR_NONEに変更。 //      メール機能をメソッド化 // 複利の処理を3パターン化(複利種類、ロスカットチケット番号を追加。) // Symbol()の把握方法を変更 // パラメータ入力 extern string PosiMaxL= "↓再起動時、必須入力 現ポジ内の最高値の建値"; extern double PosiMax=111.94; extern string PosiMimL= "↓再起動時、必須入力 現ポジ内の最安値の建値"; extern double PosiMim=106.94; extern string CntKessaiL= "↓再起動時、必須入力 決済カウンタ"; extern int CntKessai=5; extern string HkrGoCntKessaiL= "↓複利ロングを起動する決済カウンタ"; extern int HkrGoCntKessai=20; extern string HkrKindL= "↓複利種類(0:起動なし 1:EURJPYロング 2:AUDJPYロング 3:EURJPY損切り)"; extern int HkrKind=3; extern string HkrCutTicketL= "↓複利種類3のときのみ損切りするチケットナンバー"; extern int HkrCutTicket=14956964; extern string SouteiMaxL= "↓想定する最高値を指定"; extern double SouteiMax =999; extern string SouteiMimL= "↓想定する最安値を指定"; extern double SouteiMim =0; extern string TrapHabaL= "↓トラップ幅"; extern double TrapHaba =0.1; extern string RikakuHabaL= "↓利確幅"; extern double RikakuHaba =0.5; extern string LotsL= "↓ロット数(1=10万通貨)"; extern double Lots =0.01; extern string SlippageL= "↓スリッページ"; extern double Slippage =10; //↓マジックナンバーには、建値を設定する(スリップを含まない値) 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; //+------------------------------------------------------------------+ //| 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," CntKessai:",CntKessai," HkrGoCntKessai:",HkrGoCntKessai ); //---- return(0); } //↑初期処理終了 //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ //↓通常処理開始 int start() { //  更新のタイミング // PosiMax : 1.1本目のポジ建て 2.決済時にdown  3.上昇注文時にup   4.下降注文時更新なし // PosiMim : 1.1本目のポジ建て 2.決済時更新なし 3.上昇注文時更新なし 4.下降注文時down //////////////////////////////// // 1本目のポジ建て処理 /////////////////////////////// if(PosiMax == 0) { // 新規注文(現在のBid値で)。 double FirstRate = Bid; MAGICNO = FirstRate * 100; if(OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,FirstRate - RikakuHaba,"",MAGICNO,0,CLR_NONE) > 0) { // 1本目成行注文OKのとき、PosiMaxとPosiMinを設定 PosiMax = FirstRate; PosiMim = FirstRate; } else { // 1本目成行注文NGのとき、メッセージのみ出力。(再度、1本目のポジ建て処理を行う) Alert("-----first nariyuki NG FirstRate:",FirstRate); } } ///////////////////////////////////////////// // 1本目のポジ建て完了後、2本目以降の処理 ///////////////////////////////////////////// else { ///////////////////// // 1.決済処理 ///////////////////// //最高値ポジが、決済されたら、PosiMaxを下げる if(Ask <= PosiMax - RikakuHaba) { if(PosiMax >= PosiMim) { // 決済レートに達成時の処理 CntKessai = CntKessai + 1; mail("kessai OK"); //SendMail("MT4 Kessai","kessai PosiMax: " + PosiMax + "==> Ask: " + Ask + " CntKessai:" + CntKessai ); PosiMax = PosiMax - TrapHaba; PosMsgFlg = 0; Comment(" PosiMax:",PosiMax," PosiMim:",PosiMim," CntKessai:",CntKessai," HkrGoCntKessai:",HkrGoCntKessai); } // 全決済された場合、PosiMax < PosiMim となる。 else { // 何度も同じメッセージを出さないように、フラグで判定。 if (PosMsgFlg == 0) { Alert("-----posi zero"); Alert("PosiMax: ",PosiMax); Alert("PosiMim: ",PosiMim); PosMsgFlg = 1; } } } ////////////////////// // 2.複利ロング ////////////////////// // 決済の回数が、指定したHkrGoCntKessaiを超えた場合、複利処理を起動する。 if ( HkrGoCntKessai <= CntKessai ) { // HkrKind== 1 のとき、EURJPY ロングを注文 if ( HkrKind == 1) { if(OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"Hukuri Sinki",0,0,CLR_NONE) > 0) { // CntKessaiのクリア CntKessai = 0; // メール mail("hukuri EURJPY sinki OK"); //SendMail("MT4 hukuri sinki", "hukuri sinki Ask: " + Ask); Comment(" PosiMax:",PosiMax," PosiMim:",PosiMim," CntKessai:",CntKessai," HkrGoCntKessai:",HkrGoCntKessai); } else { err=GetLastError(); mail("hukuri EURJPY sinki NG err:" + err); } } // HkrKind== 2 のとき、AUDJPY ロングを注文 else if ( HkrKind == 2) { double AUDJPYask =MarketInfo(strSymbolAUDJPY,MODE_ASK); MAGICNO = AUDJPYask * 100; if(OrderSend(strSymbolAUDJPY,OP_BUY,Lots,AUDJPYask,Slippage,0,0,"Hukuri Sinki",MAGICNO,0,CLR_NONE)>0) { CntKessai = 0; mail("hukuri AUDJPY sinki OK"); Comment(" PosiMax:",PosiMax," PosiMim:",PosiMim," CntKessai:",CntKessai," HkrGoCntKessai:",HkrGoCntKessai); } else { err=GetLastError(); mail("hukuri AUDJPY sinki NG err:" + err); } } // HkrKind== 3 のとき、EURJPY ショートを損切り else if (HkrKind == 3) { if(OrderSelect(HkrCutTicket,SELECT_BY_TICKET) > 0) { if (OrderClose(OrderTicket(),OrderLots(),Ask,3,CLR_NONE)>0) { CntKessai = 0; HkrKind = 0; HkrCutTicket =0; //PosiMim = PosiMim + TrapHaba; mail("hukuri EURJPY songirki OK"); Comment(" PosiMax:",PosiMax," PosiMim:",PosiMim," CntKessai:",CntKessai," HkrGoCntKessai:",HkrGoCntKessai); } else { err=GetLastError(); mail("hukuri EURJPY songirki NG err:" + err); } } else { err=GetLastError(); mail("hukuri EURJPY OrderSelect NG err:" + err); } } } ////////////////////////// // 3.上昇時ショート新規 ////////////////////////// if(Bid >= PosiMax + TrapHaba) { //想定最高値以下なら注文する if(Bid <= SouteiMax) { //成行注文の実行 OKのとき、PosiMaxを上げる MAGICNO = (PosiMax + TrapHaba) * 100; if(OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,PosiMax + TrapHaba - RikakuHaba,"",MAGICNO,0,CLR_NONE) > 0) { // 新規約定時の処理 PosiMax = PosiMax + TrapHaba; MaxMsgFlg = 0; Comment(" PosiMax:",PosiMax," PosiMim:",PosiMim," CntKessai:",CntKessai," HkrGoCntKessai:",HkrGoCntKessai); mail("up sinki OK"); //SendMail("MT4 up sinki", "up sinki PosiMax:" + PosiMax+" bid: "+Bid); } //成行注文の実行 NGのとき else { err=GetLastError(); mail("up sinki NG err:" + err); //SendMail("MT4 UP SINKI NG", "err:" + err); Alert("-----up sinki NG"); } } //想定最高値を超えていたら、注文しない else { // 何度も同じメッセージを出さないように、フラグで判定。 if ( MaxMsgFlg == 0 ) { Alert("-----SouteiMax Bid: ",Bid); Alert("SouteiMax:",SouteiMax); MaxMsgFlg = 1; } } } //////////////////////////// // 4.下降時のショート新規 //////////////////////////// if(Bid <= PosiMim - TrapHaba) { //想定最安値以上なら注文する 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 - TrapHaba) * 100; if(OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,PosiMim - TrapHaba - RikakuHaba,"",MAGICNO,0,CLR_NONE) > 0) { // 新規約定時の処理 PosiMim = PosiMim - TrapHaba; MimMsgFlg = 0; Comment(" PosiMax:",PosiMax," PosiMim:",PosiMim," CntKessai:",CntKessai," HkrGoCntKessai:",HkrGoCntKessai); mail("down sinki OK"); //SendMail("MT4 down sinki", "down sinki PosiMim:" + PosiMim+" bid: "+Bid); } //成行注文の実行 NGのとき else { err=GetLastError(); mail("down sinki NG err:" + err); //SendMail("MT4 DOWN SINKI NG", "err:" + err); Alert("-----down sinki NG"); } } //想定最安値を下回っていたら、注文しない else { // 何度も同じメッセージを出さないように、フラグで判定。 if ( MimMsgFlg == 0 ) { Alert("-----SouteiMim Bid: ",Bid); Alert("SouteiMim:",SouteiMim); MimMsgFlg = 1; } } } } return(0); } //↑通常処理終了 //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ // // 再始動に備えて、終了時にアラーム出力を行う。 int deinit() { //---- Alert(""); Alert("*** stop ***"); Alert("PosiMax:",PosiMax); Alert("PosiMim:",PosiMim); Alert("CntKessai:",CntKessai); Alert("HkrGoCntKessai:",HkrGoCntKessai); //---- return(0); } //+------------------------------------------------------------------+ // メール内容を別メソッド化 //+------------------------------------------------------------------+ // int mail(string word) { SendMail(WindowExpertName(), AccountServer() + Symbol() + " Bid: "+ Bid + " Ask: "+Ask + " PosiMax:" + PosiMax + " PosiMim:"+ PosiMim + " CntKessai:"+ CntKessai + " HkrGoCntKessai:" + HkrGoCntKessai + " HkrKind:" + HkrKind + " word:" + word); return(0); }