//------------------------------------------------------------------
#property copyright "www.forex-station.com"
#property link      "www.forex-station.com"
#property strict
//------------------------------------------------------------------
enum enPrices
{
   pr_close,      // Close
   pr_open,       // Open
   pr_high,       // High
   pr_low,        // Low
   pr_median,     // Median
   pr_typical,    // Typical
   pr_weighted,   // Weighted
   pr_average,    // Average (high+low+open+close)/4
   pr_medianb,    // Average median body (open+close)/2
   pr_tbiased,    // Trend biased price
   pr_tbiased2,   // Trend biased (extreme) price
   pr_haclose,    // Heiken ashi close
   pr_haopen ,    // Heiken ashi open
   pr_hahigh,     // Heiken ashi high
   pr_halow,      // Heiken ashi low
   pr_hamedian,   // Heiken ashi median
   pr_hatypical,  // Heiken ashi typical
   pr_haweighted, // Heiken ashi weighted
   pr_haaverage,  // Heiken ashi average
   pr_hamedianb,  // Heiken ashi median body
   pr_hatbiased,  // Heiken ashi trend biased price
   pr_hatbiased2  // Heiken ashi trend biased (extreme) price
};
enum enCalcType
{
   st_atr, // Use atr
   st_std, // Use standard deviation
   st_ste, // Use standard error
   st_sam, // Custom strandard deviation - with sample correction
   st_nos  // Custom strandard deviation - without sample correction
};
enum enMaTypes
{
   ma_adxvma,  // Adxvma
   ma_ahr,     // Ahrens moving average
   ma_alxma,   // Alexander moving average - ALXMA
   ma_dema,    // Double exponential moving average - DEMA
   ma_dsema,   // Double smoothed exponential moving average - DSEMA
   ma_emas,    // Ema derivative - EMAD
   ma_ema,     // Exponential moving average - EMA
   ma_hull,    // Hull moving average - HMA
   ma_ie2,     // IE/2
   ma_ilinr,   // Integral of linear regression slope
   ma_itl,     // Instantaneous trendline
   ma_lagg,    // Laguerre filter
   ma_lead,    // Leader exponential moving average
   ma_linr,    // Linear regression value - LSMA
   ma_lwma,    // Linear weighted moving average - LWMA
   ma_mcg,     // McGinley Dynamic
   ma_mcma,    // McNicholl ema
   ma_nlma,    // Non lag moving average
   ma_pwma,    // Parabolic weighted moving average - PWMA
   ma_rmta,    // Recursive moving trendline - RMTA
   ma_sma,     // Simple moving average - SMA
   ma_sid,     // Simple decycler - SDEC
   ma_sine,    // Sine weighted moving average
   ma_smma,    // Smoothed moving average - SMMA
   ma_smoo,    // Smoother
   ma_ssm,     // Super smoother
   ma_b3p,     // Three pole Ehlers Butterworth
   ma_s3p,     // Three pole Ehlers smoother
   ma_tma,     // Triangular moving average - TMA
   ma_tema,    // Tripple exponential moving average - TEMA
   ma_b2p,     // Two pole Ehlers Butterworth
   ma_s2p,     // Two pole Ehlers smoother
   ma_vema,    // Volume weighted ema - VEMA
   ma_vwma,    // Volume weighted moving average - VWMA
   ma_zldema,  // Zero lag dema
   ma_zlma,    // Zero lag moving average
   ma_zltema   // Zero lag tema
};
enum enTimeFrames
{
   tf_cu  = 0,              // Current time frame
   tf_m1  = PERIOD_M1,      // 1 minute
   tf_m5  = PERIOD_M5,      // 5 minutes
   tf_m15 = PERIOD_M15,     // 15 minutes
   tf_m30 = PERIOD_M30,     // 30 minutes
   tf_h1  = PERIOD_H1,      // 1 hour
   tf_h4  = PERIOD_H4,      // 4 hours
   tf_d1  = PERIOD_D1,      // Daily
   tf_w1  = PERIOD_W1,      // Weekly
   tf_mb1 = PERIOD_MN1,     // Monthly
   tf_cus = 12345678        // Custom time frame
};
enum enIterpolation
{
   int_noint, // No interpolation
   int_line,  // Linear interpolation
   int_quad   // Quadratic interpolation
};



input double MaxLot = 2;              //Maximum lots to risk
input double LotsPer15K = 1;           //Lots per $15K in account

extern string dummy1     = "";      // . 
extern double TakeProfit  = 500;     // Initial take profit (in pips)
extern double StopLoss    = 500;     // Initial stop loss (in pips)
extern string dummy2      = "";      // Settings for indicators

extern int            avgPeriod       = 10;        // Average period
extern enMaTypes      avgMethod       = ma_zlma ;    // Average method    
extern enPrices       appliedPrice    = pr_open; // Price to use
extern enCalcType     Type            = st_ste;    // Calculate using :

extern int            atrPeriod       = 13;        // Atr/err/dev period
extern double         atrMultiplier   = 3.236;       // Atr/err/dev multplier

extern enTimeFrames   TimeFrame       = tf_cu;     // Time frame
extern int            TimeFrameCustom = 0;         // Custom time frame to use (if custom time frame used)
extern string dummy3     = "";      // 
extern int    MagicNumber = 123456;  // Magic number to use for the EA
extern bool   EcnBroker   = true;   // Is your broker ECN/STP type of broker?
extern bool   MulOnSame   = false;   // Allow multiple opened and closed orders on a same bar?


extern string dummy4     = "";      // General settings
extern bool   DisplayInfo = true;    // Dislay info
extern int    Slippage    = 5;       // Slipage to use when opening new orders
extern int    BarToUse    = 1;       // Bar to test (0, for still opened, 1 for first closed, and so on)
extern enIterpolation Interpolate     =int_noint ;  // Interpolating method when using multi time frame mode
bool dummyResult;
//------------------------------------------------------------------
//
//------------------------------------------------------------------
//
//
//
//
//

int init()   { return(0); }
int deinit() { return(0); }

//------------------------------------------------------------------
//
//------------------------------------------------------------------
//
//
 double MM_Size() //Calculate position sizing
  {
   double lots = ((AccountEquity() / 15000)*LotsPer15K); //calculate the lot size according to how many lots input per 15K in "LotsPer15K"
   if(lots > MaxLot) lots = MaxLot;  //if greater than max set it to the maxlot size
   return(lots);
  }

//
//
//
//
#define _doNothing 0
#define _doBuy     1
#define _doSell    2
int start()
{
   int doWhat = _doNothing;
      double supertrend_trend_current  = iCustom(NULL,0,"!SuperTrend - averages new format (mtf + arrows + alerts + candles).ex4",tf_cu,0,avgPeriod ,avgMethod,appliedPrice ,Type, atrPeriod,atrMultiplier,Interpolate,16,BarToUse);
      double supertrend_trend_previous = iCustom(NULL,0,"!SuperTrend - averages new format (mtf + arrows + alerts + candles).ex4",tf_cu,0,avgPeriod ,avgMethod,appliedPrice ,Type, atrPeriod,atrMultiplier,Interpolate,16,BarToUse+1);
     
     if (supertrend_trend_current!=supertrend_trend_previous)
         if (supertrend_trend_current==1)
               doWhat = _doBuy;
         else  doWhat = _doSell;
         if (doWhat==_doNothing && !DisplayInfo) return(0);
         
   //
   //
   //
   //
   //
   
   int    openedBuys    = 0;
   int    openedSells   = 0;
   double currentProfit = 0;
  
   
   
   
   
   for (int i = OrdersTotal()-1; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
      if (OrderSymbol()      != Symbol())            continue;
      if (OrderMagicNumber() != MagicNumber)         continue;

      //
      //
      //
      //
      //
      
      if (DisplayInfo) currentProfit += OrderProfit()+OrderCommission()+OrderSwap();
         
         //
         //
         //
         //
         //
         
         if (OrderType()==OP_BUY)
            if (doWhat==_doSell)
                  { RefreshRates(); if (!OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,CLR_NONE)) openedBuys++; }
            else  openedBuys++;
         if (OrderType()==OP_SELL)
            if (doWhat==_doBuy)
                  { RefreshRates(); if (!OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,CLR_NONE)) openedSells++; }
            else  openedSells++;            
   }
   if (DisplayInfo) Comment("Current profit : "+DoubleToStr(currentProfit,2)+" "+AccountCurrency()); if (doWhat==_doNothing) return(0);

   //
   //
   //
   //
   //

   if (doWhat==_doBuy && openedBuys==0)
      {
         RefreshRates();
         double stopLossBuy   = 0; if (StopLoss>0)   stopLossBuy   = Ask-StopLoss*Point*MathPow(10,Digits%2);
         double takeProfitBuy = 0; if (TakeProfit>0) takeProfitBuy = Ask+TakeProfit*Point*MathPow(10,Digits%2);
         if (EcnBroker)
         {
            int ticketb = OrderSend(Symbol(),OP_BUY, MM_Size(),Ask,Slippage,0,0,"",MagicNumber,0,CLR_NONE);
            if (ticketb>-1)
              dummyResult = OrderModify(ticketb,OrderOpenPrice(),stopLossBuy,takeProfitBuy,0,CLR_NONE);
         }
         else dummyResult = OrderSend(Symbol(),OP_BUY, MM_Size(),Ask,Slippage,stopLossBuy,takeProfitBuy,"",MagicNumber,0,CLR_NONE);
      }
   if (doWhat==_doSell && openedSells==0)
      {
         RefreshRates();
         double stopLossSell   = 0; if (StopLoss>0)   stopLossSell   = Bid+StopLoss*Point*MathPow(10,Digits%2);
         double takeProfitSell = 0; if (TakeProfit>0) takeProfitSell = Bid-TakeProfit*Point*MathPow(10,Digits%2);
         if (EcnBroker)
         {
            int tickets = OrderSend(Symbol(),OP_SELL, MM_Size(),Bid,Slippage,0,0,"",MagicNumber,0,CLR_NONE);
            if (tickets>-1)
              dummyResult = OrderModify(tickets,OrderOpenPrice(),stopLossSell,takeProfitSell,0,CLR_NONE);
         }
         else dummyResult = OrderSend(Symbol(),OP_SELL, MM_Size(),Bid,Slippage,stopLossSell,takeProfitSell,"",MagicNumber,0,CLR_NONE);
      }
   return(0);
}
//------------------------------------------------------------------
//
//------------------------------------------------------------------