//+------------------------------------------------------------------+
//|                                                         SWAP.mq4 |
//|                      Copyright © 2009, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
#include       <common.mqh>
#define        MAXORDERS            1000

extern double ProfitExit = 0.5; //% profit exit
extern bool   bUseStopLevelForTS = True;
extern bool   bUseTPLevelFor = True;
extern double    ATRStopPeriod= 14;
extern double    ATRStopRatio = 0.5;
extern double lot           = 0.01;
extern int    MagicNumber    = 777;
extern bool   PolLots        = true;
extern int    MaxOrders      =  1152;



int TrailingStop,TakeProfit,prevtime,InitialSL,ticket;
double curprof;
bool exit,tickvalue,atrstop;


//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
      //----------------------- GENERATE MAGIC NUMBER AND TICKET COMMENT
//----------------------- SOURCE : PENGIE
   MagicNumber    = subGenerateMagicNumber(MagicNumber, Symbol(), Period());
   tickvalue = MarketInfo(Symbol(),MODE_TICKVALUE);

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   updateMoneyManager();
   updateOrderManager();
   CommentMe();


//--------------------------------------------------------------------------------------------------------------  
   
   if(bUseStopLevelForTS)TrailingStop = MarketInfo(Symbol(),MODE_STOPLEVEL);
   if(bUseTPLevelFor)TakeProfit = MarketInfo(Symbol(),MODE_STOPLEVEL);
   exit = (AccountEquity()>=AccountBalance()*(1+ProfitExit/100));
   
    atrstop=iATR(NULL,0,ATRStopPeriod,1);
    InitialSL = atrstop*ATRStopRatio/Point;



   int i=0;
   int total = OrdersTotal();   
   for(i = 0; i <= total; i++) 
     {
      if(TrailingStop>0)  
       {                 
       OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
       if(OrderMagicNumber() == MagicNumber) 
         {
         TrailingStairs(OrderTicket(),TrailingStop);
         }
       }
      }

bool BuyOp=false;
bool SellOp=false;


if (MarketInfo(Symbol(), MODE_SWAPLONG) > 0) BuyOp=true;
if (MarketInfo(Symbol(), MODE_SWAPSHORT) > 0) SellOp=true;

{

}
   if(Time[0] == prevtime) 
       return(0);
   prevtime = Time[0];
   if(!IsTradeAllowed()) 
     {
       prevtime = Time[1];
       return(0);
     }
      if(Volume[0]>1) return;


   if (total < MaxOrders || MaxOrders == 0)
     {   
       if(BuyOp)
        { 
                 if (InitialSL!=0)
          {
          lot = lotsOptimized(TrailingStop*Point);
           ticket=OrderSend(Symbol(),OP_BUY,lot,Ask,3,Bid-(InitialSL*Point),Bid+(exit),"SWAP_Buy",MagicNumber,0,Green);
           Print ("Error: ", GetLastError());
          }
         else
          {
          lot = lotsOptimized(TrailingStop*Point);
           ticket=OrderSend(Symbol(),OP_BUY,lot,Ask,3,0,exit,"SWAP_Buy",MagicNumber,0,Green);
           Print ("Error: ", GetLastError());
          }
        }
       if(SellOp)
        { 
         if (InitialSL!=0)
          {
          lot = lotsOptimized(TrailingStop*Point);
           ticket=OrderSend(Symbol(),OP_SELL,lot,Bid,3,Ask+(InitialSL*Point),Ask-(exit),"SWAP_Sell",MagicNumber,0,Red);
           Print ("Error: ", GetLastError());
          } 
         else 
          {
          lot = lotsOptimized(TrailingStop*Point);
           ticket=OrderSend(Symbol(),OP_SELL,lot,Bid,3,0,exit,"SWAP_Sell",MagicNumber,0,Red);
           Print ("Error: ", GetLastError());
          }
        }
      }
   
//----
   return(0);
 
}

//+------------------------------------------------------------------+
void TrailingStairs(int ticket,int trldistance)
   {
    int Spred=Ask - Bid;
    if (OrderType()==OP_BUY)
      {
       if((Bid-OrderOpenPrice())>(Point*trldistance))
         {
          if(OrderStopLoss()<Bid-Point*trldistance || (OrderStopLoss()==0))
            {
             OrderModify(ticket,OrderOpenPrice(),Bid-Point*trldistance,OrderTakeProfit(),0,Blue);
             if (PolLots)
             if (NormalizeDouble(OrderLots()/2,2)>MarketInfo(Symbol(), MODE_MINLOT))
               {
               OrderClose(ticket,NormalizeDouble(OrderLots()/2,2),Ask,3,Green);
               }
             else
               {
               OrderClose(ticket,OrderLots(),Ask,3,Green);
               }
            }
         }
       }
     else
       {
        if((OrderOpenPrice()-Ask)>(Point*trldistance))
          {
           if((OrderStopLoss()>(Ask+Point*trldistance)) || (OrderStopLoss()==0))
             {
              OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*trldistance,OrderTakeProfit(),0,Red);
             if (PolLots)
             if (NormalizeDouble(OrderLots()/2,2)>MarketInfo(Symbol(), MODE_MINLOT))
               {
               OrderClose(ticket,NormalizeDouble(OrderLots()/2,2),Bid,3,Green);
               }
             else
               {
               OrderClose(ticket,OrderLots(),Bid,3,Green);
               }
             }
          }
        }
    }
//----------------------------------------- COMMENT FUNCTION ----------------------------------------------------

int CommentMe()    //Comments out needed parameters on a chart
{
RefreshRates();
double Eq.CM = AccountEquity();
double Bal.CM = AccountBalance();
double Mar.CM = AccountMargin();
double Prof.CM = AccountProfit();
double Lev.CM = AccountLeverage();
double TV.CM = MarketInfo(Symbol(), MODE_TICKVALUE);
double Sprd.CM = MarketInfo(Symbol(), MODE_SPREAD);
double SWL.CM = MarketInfo(Symbol(), MODE_SWAPLONG);
double SWS.CM = MarketInfo(Symbol(), MODE_SWAPSHORT);
double STP.CM = MarketInfo(Symbol(),MODE_STOPLEVEL);



Comment("Account balance is ",DoubleToStr(Bal.CM,2),"\n",
        "Account equity is ",DoubleToStr(Eq.CM,2),"\n",
        "Account profit is ",DoubleToStr(Prof.CM,2),"\n",
        "Account margin is ",DoubleToStr(Mar.CM,2),"\n",
        "Account Leverage is ",DoubleToStr(Lev.CM,2),"\n",        
        "Tick Value is ",DoubleToStr(TV.CM,4),"\n",
        "Spread is ",DoubleToStr(Sprd.CM,0),"\n",
        "Swap Long is ",DoubleToStr(SWL.CM,4),"\n",
        "Swap Short is ",DoubleToStr(SWS.CM,4),"\n",
        "Trailing Stop is ",DoubleToStr(STP.CM,4),"\n",         
        "Current time is ",TimeToStr(TimeCurrent()));

return(0);
}
    
//----------------------- GENERATE MAGIC NUMBER BASE ON SYMBOL AND TIME FRAME FUNCTION
//----------------------- SOURCE   : PENGIE

int subGenerateMagicNumber(int Magic_Number, string symbol, int timeFrame)
{
   int isymbol = 0;
   if (symbol == "AUDCAD")       isymbol = 1;
   else if (symbol == "AUDCHF")  isymbol = 2;
   else if (symbol == "AUDJPY")  isymbol = 3;
   else if (symbol == "AUDDKK")  isymbol = 4;
   else if (symbol == "AUDNZD")  isymbol = 5;
   else if (symbol == "AUDPLN")  isymbol = 6;
   else if (symbol == "AUDSGD")  isymbol = 7;
   else if (symbol == "AUDUSD")  isymbol = 8;
   else if (symbol == "CADCHF")  isymbol = 9;
   else if (symbol == "CADJPY")  isymbol = 10;
   else if (symbol == "CHFCAD")  isymbol = 11;
   else if (symbol == "CHFJPY")  isymbol = 12;
   else if (symbol == "CHFSGD")  isymbol = 13;
   else if (symbol == "EURAUD")  isymbol = 14;
   else if (symbol == "EURCAD")  isymbol = 15;
   else if (symbol == "EURCHF")  isymbol = 16;
   else if (symbol == "EURDKK")  isymbol = 17;
   else if (symbol == "EURGBP")  isymbol = 18;
   else if (symbol == "EURHKD")  isymbol = 19;
   else if (symbol == "EURHUF")  isymbol = 20;
   else if (symbol == "EURJPY")  isymbol = 21;
   else if (symbol == "EURLVL")  isymbol = 22;
   else if (symbol == "EURNOK")  isymbol = 23;
   else if (symbol == "EURNZD")  isymbol = 24;
   else if (symbol == "EURPLN")  isymbol = 25;
   else if (symbol == "EURSEK")  isymbol = 26;
   else if (symbol == "EURSGD")  isymbol = 27;
   else if (symbol == "EURSKK")  isymbol = 28;
   else if (symbol == "EURUSD")  isymbol = 29;
   else if (symbol == "EURZAR")  isymbol = 30;
   else if (symbol == "GBPAUD")  isymbol = 31;
   else if (symbol == "GBPCAD")  isymbol = 32;
   else if (symbol == "GBPCHF")  isymbol = 33;
   else if (symbol == "GBPDKK")  isymbol = 34;
   else if (symbol == "GBPJPY")  isymbol = 35;
   else if (symbol == "GBPNOK")  isymbol = 36;
   else if (symbol == "GBPNZD")  isymbol = 37;
   else if (symbol == "GBPSEK")  isymbol = 38;
   else if (symbol == "GBPSGD")  isymbol = 39;
   else if (symbol == "GBPUSD")  isymbol = 40;
   else if (symbol == "GBPZAR")  isymbol = 41;
   else if (symbol == "NZDCAD")  isymbol = 42;
   else if (symbol == "NZDCHF")  isymbol = 43;
   else if (symbol == "NZDJPY")  isymbol = 44;
   else if (symbol == "NZDSGD")  isymbol = 45;
   else if (symbol == "NZDUSD")  isymbol = 46;
   else if (symbol == "SGDJPY")  isymbol = 47;
   else if (symbol == "USDCAD")  isymbol = 48;
   else if (symbol == "USDCHF")  isymbol = 49;
   else if (symbol == "USDCCK")  isymbol = 50;
   else if (symbol == "USDDKK")  isymbol = 51;
   else if (symbol == "USDHKD")  isymbol = 52;
   else if (symbol == "USDHRK")  isymbol = 53;
   else if (symbol == "USDHUF")  isymbol = 54;
   else if (symbol == "USDJPY")  isymbol = 55;
   else if (symbol == "USDLVL")  isymbol = 56;
   else if (symbol == "USDLTL")  isymbol = 57;
   else if (symbol == "USDMXN")  isymbol = 58;
   else if (symbol == "USDNOK")  isymbol = 59;
   else if (symbol == "USDPLN")  isymbol = 60;
   else if (symbol == "USDSEK")  isymbol = 61;
   else if (symbol == "USDSGD")  isymbol = 62;
   else if (symbol == "USDSKK")  isymbol = 63;
   else if (symbol == "USDZAR")  isymbol = 64;
   else if (symbol == "#AA")  isymbol = 65;
   else if (symbol == "#AXP")  isymbol = 66;
   else if (symbol == "#BA")  isymbol = 67;
   else if (symbol == "#C")  isymbol = 68;
   else if (symbol == "#DD")  isymbol = 69;
   else if (symbol == "#DIS")  isymbol = 70;
   else if (symbol == "#AIG")  isymbol = 71;
   else if (symbol == "#GE")  isymbol = 72;
   else if (symbol == "#GM")  isymbol = 73;
   else if (symbol == "#HD")  isymbol = 74;
   else if (symbol == "#HON")  isymbol = 75;
   else if (symbol == "#HPQ")  isymbol = 76;
   else if (symbol == "#IBM")  isymbol = 77;
   else if (symbol == "#VZ")  isymbol = 78;
   else if (symbol == "#INTC")  isymbol = 79;
   else if (symbol == "#JNJ")  isymbol = 80;
   else if (symbol == "#JPM")  isymbol = 81;
   else if (symbol == "#KO")  isymbol = 82;
   else if (symbol == "#MCD")  isymbol = 83;
   else if (symbol == "#MMM")  isymbol = 84;
   else if (symbol == "#MO")  isymbol = 85;
   else if (symbol == "#MRK")  isymbol = 86;
   else if (symbol == "#MSFT")  isymbol = 87;
   else if (symbol == "#PG")  isymbol = 88;
   else if (symbol == "#T")  isymbol = 89;
   else if (symbol == "#PFE")  isymbol = 90;
   else if (symbol == "#UTX")  isymbol = 91;
   else if (symbol == "#WMT")  isymbol = 92;
   else if (symbol == "#XOM")  isymbol = 93;
   else if (symbol == "Gold")  isymbol = 94;
   else if (symbol == "Silver")  isymbol = 95;
   else if (symbol == "#EP")  isymbol = 96;
   else if (symbol == "#ENQ")  isymbol = 97;
   else if (symbol == "#YM")  isymbol = 98;
   else if (symbol == "#CL")  isymbol = 99;
   else if (symbol == "#NG")  isymbol = 100;
   else if (symbol == "#W")  isymbol = 101;
   else if (symbol == "#C")  isymbol = 102;
   else if (symbol == "#S")  isymbol = 103;
   else                          isymbol = 104;
   if(isymbol<10) Magic_Number = MagicNumber * 10;
   return (StrToInteger(StringConcatenate(MagicNumber, isymbol, timeFrame)));
   
}
//+------------------------------------------------------------------+    