//+------------------------------------------------------------------+
//|                                         Aki0307_GBPJPY14_004.mq4 |
//|                                        Copyright ｩ 2009, Aki0307 |
//|                                  http://aki0307.blog.shinobi.jp/ |
//+------------------------------------------------------------------+
#property copyright "Copyright ｩ 2009, Aki0307"
#property link      "http://aki0307.blog.shinobi.jp/"

//エントリーする時分
extern int iEntryHH=14;
extern int iEntryMM=0;

//クローズする時分
extern int iCloseHH=4;
extern int iCloseMM=0;

//エントリーするPip
extern int iEntryPip=20;

//リミットとストップ値
extern int iLimit=20;
extern int iStop=20;

//スリップページ
extern int iSlip=3;

//ロット数
extern double dLots=0.1;

// トレーリングストップ用フラグ
extern bool bTrailingStop = false;

// マジックNo
extern int iMagicNo = 307004;

//マネーマネージメント用
extern bool bMM = false;
extern int iRisk = 1;
extern double dVs_Usd = 0.01;
extern double dMax_Lots = 50.0;
extern double dMin_Lots = 0.1;

// 時間足用
datetime dtTimeFrame = 0;

//エントリーするPip(実態)
double dEntryPip=0.0;

//リミットとストップ値(実態)
double dLimit=0.0;
double dStop=0.0;

//ロット数(実態)
double dEntry_Lots=0.1;

// 注文とポジションのクローズ
int Ordclose(){
    int iTotal = OrdersTotal();
    if(iTotal > 0){
        for(int i = iTotal -1; i >= 0; i-- ){
            bool bSelected = OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
            if(bSelected == true && OrderMagicNumber() == iMagicNo){
                int iType = OrderType();
                switch(iType){
                   case OP_BUY:
                       OrderClose(OrderTicket(), OrderLots(), Bid, iSlip, CLR_NONE);
                       break;
                   case OP_SELL:
                      OrderClose(OrderTicket(), OrderLots(), Ask, iSlip, CLR_NONE);
                      break;
                   case OP_BUYLIMIT:
                   case OP_BUYSTOP:
                   case OP_SELLLIMIT:
                   case OP_SELLSTOP:
                      OrderDelete(OrderTicket());
                      break;
                }
            }
        }
    }
}

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   dEntryPip = iEntryPip * Point;
   dLimit = iLimit * Point;
   dStop = iStop * Point;
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----

    double dLimitOrder = 0;
    double dStopOrder = 0;

    if(bTrailingStop){
        TralStop();
    }

    // 今の時間を取得時間足に変化があると中に入る
    if(dtTimeFrame<iTime(NULL,0,0)) {
        dtTimeFrame=iTime(NULL,0,0);

        //現在の時間を取得
        int iNowHH=TimeHour(TimeCurrent());
        int iNowMM=TimeMinute(TimeCurrent());

        // 時間がクローズと等しい場合は、手仕舞いを行う
        if((iCloseHH == iNowHH) && (iCloseMM == iNowMM)){
            Ordclose();
        }

        // 時間がエントリーと等しい場合は、発注処理をする
        if((iEntryHH == iNowHH) && (iEntryMM == iNowMM)){
            //ロット数の計算
            MM();

            // リミットの計算
            if(dLimit != 0){
                dLimitOrder = Ask + dEntryPip + dLimit;
            }else{
                dLimitOrder = 0;
            }

            // ストップの計算
            if(dStop != 0){
                dStopOrder = Ask + dEntryPip - dStop;
            }else{
                dStopOrder = 0;
            }
            OrderSend(Symbol(), OP_BUYSTOP, dEntry_Lots, Ask + dEntryPip, iSlip, dStopOrder, dLimitOrder, "売り注文", iMagicNo, 0, CLR_NONE);

            // リミットの計算
            if(dLimit != 0){
                dLimitOrder = Bid - dEntryPip - dLimit;
            }else{
                dLimitOrder = 0;
            }

            // ストップの計算
            if(dStop != 0){
                dStopOrder = Bid - dEntryPip + dStop;
            }else{
                dStopOrder = 0;
            }
            OrderSend(Symbol(), OP_SELLSTOP, dEntry_Lots, Bid - dEntryPip, iSlip, dStopOrder, dLimitOrder, "買い注文", iMagicNo, 0, CLR_NONE);
        }
    }

//----
   return(0);
  }
//+------------------------------------------------------------------+

   int TralStop(){
    double dOpenPrice = 0;
    double dStopPrice = 0;
    int iTotal = OrdersTotal();
    if(iTotal > 0){
        for(int i = iTotal -1; i >= 0; i-- ){
            bool bSelected = OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
            if(bSelected == true && OrderMagicNumber() == iMagicNo){
               int iType = OrderType();
               switch(iType){
                   case OP_BUY:
                       dOpenPrice = OrderOpenPrice();
                       dStopPrice = OrderStopLoss();
                       if(Bid > dOpenPrice){
                           if(Bid-dStopPrice > dStop){
                               OrderModify(OrderTicket(), dOpenPrice, Bid-dStop, OrderTakeProfit(), 0,CLR_NONE);
                           }
                       }
                       break;
                   case OP_SELL:
                       dOpenPrice = OrderOpenPrice();
                       dStopPrice = OrderStopLoss();
                       if(Ask < dOpenPrice){
                           if(dStopPrice-Ask > dStop){
                               OrderModify(OrderTicket(), dOpenPrice, Ask+dStop, OrderTakeProfit(), 0,CLR_NONE);
                           }
                       }
                       break;
                }
            }
        }
    }
    return (0);
}


double MM(){
    if(bMM == true){
        dEntry_Lots = AccountEquity()*dVs_Usd/100000*iRisk;
        dEntry_Lots = MathMin(dMax_Lots,MathMax(dMin_Lots,dEntry_Lots));
        dEntry_Lots = NormalizeDouble(dEntry_Lots,1);
    }else{
        dEntry_Lots = dLots;
    }

    return(dEntry_Lots);
}