//+------------------------------------------------------------------+ //| TrapReptLong.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 PosiMaxL= "↓再起動時、必須入力 現ポジ内の最高値の建値"; extern double PosiMax=0; extern string PosiMimL= "↓再起動時、必須入力 現ポジ内の最安値の建値"; extern double PosiMim=0; extern string CntKessaiL= "↓再起動時、必須入力 決済カウンタ"; extern int CntKessai=0; extern string SouteiMaxL= "↓想定する最高値を指定"; extern double SouteiMax =999; extern string SouteiMimL= "↓想定する最安値を指定"; extern double SouteiMim =111.47; 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; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ //↓初期処理開始 int init() { //----開始メッセージ出力 // Alert(""); // Alert("*** start ***"); // Alert("PosiMax:",PosiMax); // Alert("PosiMim:",PosiMim); // Alert("SouteiMax:",SouteiMax); // Alert("SouteiMim:",SouteiMim); // メッセージを複数回ださないためのフラグ MaxMsgFlg = 0; MimMsgFlg = 0; PosMsgFlg = 0; Comment(" PosiMax:",PosiMax," PosiMim:",PosiMim," CntKessai:",CntKessai ); //---- return(0); } //↑初期処理終了 //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ //↓通常処理開始 int start() { //  更新のタイミング // PosiMax : 1.1本目のポジ建て 2.決済時に更新なし 3.上昇注文時にup   4.下降注文時更新なし // PosiMim : 1.1本目のポジ建て 2.決済時にup    3.上昇注文時更新なし 4.下降注文時down // 1本目のポジ建て処理 if(PosiMax == 0) { // Ask が SouteiMim に達したら新規 if ( Ask >= SouteiMim ) { // 新規注文 double FirstRate = Ask; MAGICNO = FirstRate * 100; if(OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,FirstRate + RikakuHaba,"",MAGICNO,0,CLR_NONE) > 0) { // 1本目成行注文OKのとき、PosiMaxとPosiMinを設定 PosiMax = FirstRate; PosiMim = FirstRate; mail("long first ok"); Comment(" PosiMax:",PosiMax," PosiMim:",PosiMim," CntKessai:",CntKessai); // Alert("-----first nariyuki OK FirstRate:",FirstRate); // Alert("PosiMax:",PosiMax); // Alert("PosiMim:",PosiMim); } else { // 1本目成行注文NGのとき、メッセージのみ出力。(再度、1本目のポジ建て処理を行う) err = GetLastError(); Alert(""); Alert("TrpReptLong NG first sinki FirstRate:",FirstRate," err:" ,err); mail("long first ng err" + err); } } } // 1本目のポジ建て完了後、2本目以降の処理 else { //1.最安値ポジが、決済されたら、PosiMimを上げる if(Bid >= PosiMim + RikakuHaba) { if(PosiMax >= PosiMim) { //Alert("-----kessai Bid: ",Bid); //Alert("PosiMax: ",PosiMax); //Alert("PosiMim: ",PosiMim," --> ",PosiMim + TrapHaba); // 決済レートに達成時の処理 CntKessai = CntKessai + 1; mail("kessai ok"); PosiMim = PosiMim + TrapHaba; PosMsgFlg = 0; Comment(" PosiMax:",PosiMax," PosiMim:",PosiMim," CntKessai:",CntKessai); } // 全決済された場合、PosiMax < PosiMim となる。 else { if (PosMsgFlg == 0) { Alert("-----posi zero"); Alert("PosiMax: ",PosiMax); Alert("PosiMim: ",PosiMim); PosMsgFlg = 1; } } } // 2.Askが保有ポジ最高値を更新したら注文する if(Ask >= PosiMax + TrapHaba) { //想定最高値以下なら注文する if(Ask <= SouteiMax) { // 窓明けで上に開いていた場合、PosiMaxを上方修正 //double RateSa = Ask - PosiMax; //double RateSaInt = RateSa * 100; //double TrapHabaInt = TrapHaba * 100; //while(RateSaInt > TrapHabaInt + Slippage) //{ // PosiMax = PosiMax + TrapHaba; //RateSa = Ask - PosiMax; //RateSaInt = RateSa * 100; //} //成行注文の実行 OKのとき、PosiMaxを上げる MAGICNO = (PosiMax + TrapHaba) * 100; if(OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,PosiMax + TrapHaba + RikakuHaba,"",MAGICNO,0,CLR_NONE) > 0) { //Alert("-----up sinki OK Ask: ",Ask); //Alert("PosiMax:",PosiMax," -->> ",PosiMax + TrapHaba); //Alert("PosiMim:",PosiMim); PosiMax = PosiMax + TrapHaba; MaxMsgFlg = 0; Comment(" PosiMax:",PosiMax," PosiMim:",PosiMim," CntKessai:",CntKessai); mail("up sinki ok"); } //成行注文の実行 NGのとき else { Alert(""); Alert("TrpReptLong NG up sinki"); err = GetLastError(); mail("up sinki ng err:" + err); } } //想定最高値を超えていたら、注文しない else { if ( MaxMsgFlg == 0 ) { Alert("-----SouteiMax Ask: ",Ask); Alert("SouteiMax:",SouteiMax); MaxMsgFlg = 1; } } } // 3.Askが保有ポジ最安値を更新したら注文する if(Ask <= PosiMim - TrapHaba) { //想定最安値以上なら注文する if(Ask >= SouteiMim) { //成行注文の実行 OKのとき、PosiMimを下げる MAGICNO = (PosiMim - TrapHaba) * 100; if(OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,PosiMim - TrapHaba + RikakuHaba,"",MAGICNO,0,CLR_NONE) > 0) { //Alert("-----down sinki OK Ask: ",Ask); //Alert("PosiMax: ",PosiMax); //Alert("PosiMim: ",PosiMim," -->> ",PosiMim - TrapHaba); PosiMim = PosiMim - TrapHaba; MimMsgFlg = 0; Comment(" PosiMax:",PosiMax," PosiMim:",PosiMim," CntKessai:",CntKessai); mail("down sinki ok"); } //成行注文の実行 NGのとき else { Alert(""); Alert("TrpReptLong NG down sinki"); err = GetLastError(); mail("down sinki ng err:" + err); } } //想定最安値を下回っていたら、注文しない else { if ( MimMsgFlg == 0 ) { Alert("-----SouteiMim Ask: ",Ask); Alert("SouteiMim:",SouteiMim); MimMsgFlg = 1; } } } } return(0); } //↑通常処理終了 //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ // // 再始動に備えて、終了時にアラーム出力を行う。 int deinit() { //---- Alert(""); Alert("*** stop ***"); Alert("PosiMax:",PosiMax); Alert("PosiMim:",PosiMim); Alert("CntKessai:",CntKessai); //---- return(0); } //+------------------------------------------------------------------+ // メール内容を別メソッド化 //+------------------------------------------------------------------+ // int mail(string word) { SendMail(WindowExpertName(), AccountServer() + Symbol() + " Bid: "+ Bid + " Ask: "+Ask + " PosiMax:" + PosiMax + " PosiMim:"+ PosiMim + " CntKessai:"+ CntKessai + " word:" + word); return(0); }