//+------------------------------------------------------------------+ //| MrtnShort.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 CntPosL= "↓ポジション数 初動時は0"; extern int CntPos =0; extern string PosiMaxL= "↓現ポジ内の最高値の建値 初動時は0"; extern double PosiMax=0; extern string StrtRateL = "↓開始レート"; extern double StrtRate =111.0; extern string ticketL= "↓再起動時、必須入力 チケット番号"; extern int ticket1=0; extern int ticket2=0; extern int ticket3=0; extern int ticket4=0; extern string TrapHabaL= "↓トラップ幅"; extern double TrapHaba =0.5; 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; // 注文時の通貨数 double OdrLots =0.01; // 注文のマジックナンバー int MAGICNO = 0; // チケット番号配列 int ticket[4]; // エラー番号 int err; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ //↓初期処理開始 int init() { // 入力したチケット番号を配列に入れなおす。 ticket[0] = ticket1; ticket[1] = ticket2; ticket[2] = ticket3; ticket[3] = ticket4; Comment(" CntPos:",CntPos," PosiMax:",PosiMax," StrtRate:",StrtRate); //---- return(0); } //↑初期処理終了 //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ //↓通常処理開始 int start() { //////////////////////// // 1本目のポジ建て処理 /////////////////////// if(CntPos == 0) { // 開始レートを超えたら1本目の新規建てを行う。 if(Bid >= StrtRate) { // 成り行き注文 double FirstRate = Bid; MAGICNO = FirstRate * 100; ticket[0] = OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,FirstRate - RikakuHaba,"MrtnShort",MAGICNO,0,CLR_NONE); if ( ticket[0] > 0) { Alert("-----MRTN START"); // 1本目成行注文OK PosiMax = FirstRate; CntPos = CntPos + 1; Comment(" CntPos:",CntPos," PosiMax:",PosiMax," StrtRate:",StrtRate); // メール送信 mail("first sinki ok"); } else { err = GetLastError(); mail("first sinki ng err:"+err); // 1本目成行注文NGのとき、メッセージのみ出力。(再度、1本目のポジ建て処理を行う) Alert("-----first nariyuki NG FirstRate:",FirstRate," err:",err); } } } //////////// // 決済処理 //////////// if( Ask <= PosiMax - RikakuHaba ) { Alert("-----MRTN END"); // メール送信 mail("all kessai ok"); //再度1本目のポジ建てへ進む CntPos = 0; PosiMax = 0; ticket[0] = 0; ticket[1] = 0; ticket[2] = 0; ticket[3] = 0; Comment(" CntPos:",CntPos," PosiMax:",PosiMax," StrtRate:",StrtRate); } /////////////////////////// // 2〜4本目までは新規建て ////////////////////////// if( 1 <= CntPos && CntPos < 4) { //Bidが保有ポジ最高値を更新したら新規注文する if(Bid >= PosiMax + TrapHaba) { // ロット数は、1-1-2-4 2-2-4-8 など // 2本目を建てるときは、1倍。 if (CntPos == 1 ) { OdrLots = Lots;} // 3本目を建てるときは、2倍。 else if ( CntPos == 2) { OdrLots = Lots * 2;} // 4本目を建てるときは、4倍。 else if ( CntPos == 3) { OdrLots = Lots * 4;} ////////////////////////////// // 2本目以降の新規成り行き注文 ///////////////////////////// MAGICNO = (PosiMax + TrapHaba) * 100; ticket[CntPos] = OrderSend(Symbol(),OP_SELL,OdrLots,Bid,Slippage,0,PosiMax + TrapHaba - RikakuHaba,"MrtnShort",MAGICNO,0,CLR_NONE); if( ticket[CntPos] > 0) { // 新規約定時の処理 PosiMax = PosiMax + TrapHaba; CntPos = CntPos + 1; Comment(" CntPos:",CntPos," PosiMax:",PosiMax," StrtRate:",StrtRate ); // メール送信 mail("up sinki ok"); ////////////////////////////// // 既存ポジの利確レートを変更 ///////////////////////////// for(int i = 0; i < CntPos-1 ; i++) { // チケット番号から検索 if (OrderSelect(ticket[i],SELECT_BY_TICKET) == true) { // 利確のレートを変更する if (OrderModify(OrderTicket(),OrderOpenPrice(),0,PosiMax - RikakuHaba,0,Blue) > 0 ) { Alert("-----OrderModify OK"); } // OrderModify 失敗 else { err = GetLastError(); mail("OrderModify ng err:" + err); Alert("-----OrderModify NG err:",err); } } // OrderSelect 失敗 else { err = GetLastError(); mail("OrderSelect ng err:" + err); Alert("-----OrderSelect ng err:",err); } } } // OrderSend失敗 else { err = GetLastError(); mail("up sinki ng err:" + err); Alert("-----up sinki NG err:",err); } } } return(0); } //↑通常処理終了 //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ // // 再始動に備えて、終了時にアラーム出力を行う。 int deinit() { //---- Alert(""); Alert("*** stop ***"); Alert("CntPos:",CntPos); Alert("PosiMax:",PosiMax); Alert("StrtRate:",StrtRate); Alert("ticket1:",ticket[0]); Alert("ticket2:",ticket[1]); Alert("ticket3:",ticket[2]); Alert("ticket4:",ticket[3]); //---- return(0); } //+------------------------------------------------------------------+ // メール内容を別メソッド化 //+------------------------------------------------------------------+ // int mail(string word) { //SendMail(WindowExpertName(), AccountServer() + Symbol() + " Bid: "+ Bid + " Ask: "+Ask + " CntPos:" + CntPos + " PosiMax:" + PosiMax + " StrtRate:"+ StrtRate + " word:" + word); return(0); }