/*
Created by Alejandro Galindo http://www.ealcactus.com 
And Kalenzo http://www.fxservice.eu
And modified by Cocoracas
*/
extern   int      MaxTrades = 20;
extern   int      Pips = 5;
extern   double   TakeProfit = 40;
extern   double   TrailingStop = 20;
extern   double   InitialStop = 250;
extern string Note1 = "TF 1M";
extern int   MACDTimeFrame = 0;
int      SecureProfit = 10;
int      AccountProtection = 1;
int      OrdersToProtect = 19;
int      ReverseCondition = 0;
double   FirstOrderLots=0.1;
int      OrdersOpened = 0;
int      cnt = 0;
double   lots = 0.1;
int      slippage = 5;
double   stoploss = 0;
double   takeprofit = 0;
double   bprice = 0;
double   sprice = 0;
double   lotsi = 0;
int      type = 0;
int      state = 0;
bool     EnableTrading = true;
double   openprice = 0;
int      PreviousOrders = 0;
double   Profit = 0;
int      LastTicket = 0;
int      LastType = 0;
double   LastClosePrice = 0;
double   LastLots = 0;
double   PipValue = 0;
string   text2 = "";
string   text = "";
double   lotstmp;
double trade;
double trade1;
int trendtype;
//---- input parameters
extern int RSIOMA          = 14;
extern int RSIOMA_MODE     = MODE_EMA;
extern int RSIOMA_PRICE    = PRICE_CLOSE;
extern int Ma_RSIOMA       = 21,
           Ma_RSIOMA_MODE  = MODE_EMA;
extern int BuyTrigger      = 80;
extern int SellTrigger     = 20;
extern int MainTrendLong   = 50;
extern int MainTrendShort  = 50;
double RSIBuffer[];
double PosBuffer[];
double NegBuffer[];
double bdn[],bup[];
double sdn[],sup[];
double marsioma[];
//---- buffers
string short_name;
double rel,rel1,negative,positive;
int i;
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
int init()
{
 
  return(0);
}
//+------------------------------------------------------------------+
int deinit()
{
  return(0);
}
//+------------------------------------------------------------------+
int start()
{
  int    counted_bars=IndicatorCounted();
   double rel,rel1,negative,positive;
   
//----
   if(Bars<=RSIOMA) return(0);
//---- initial zero
   if(counted_bars<1)
      for(i=1;i<=RSIOMA;i++) RSIBuffer[Bars-i]=0.0;
//----
   i=Bars-RSIOMA-1;
   int ma = i;
   if(counted_bars>=RSIOMA) i=Bars-counted_bars-1;
   while(i>=0)
     {
      double sumn=0.0,sump=0.0;
      if(i==Bars-RSIOMA-1)
        {
         int k=Bars-2;
         //---- initial accumulation
         while(k>=i)
           {
            
            double cma = iMA(Symbol(),0,RSIOMA,0,RSIOMA_MODE,RSIOMA_PRICE,k);
            double pma = iMA(Symbol(),0,RSIOMA,0,RSIOMA_MODE,RSIOMA_PRICE,k+1);
            
            rel=cma-pma;
            
            if(rel>0) sump+=rel;
            else      sumn-=rel;
            k--;
           }
         positive=sump/RSIOMA;
         negative=sumn/RSIOMA;
        }
      else
        {
         //---- smoothed moving average
         double ccma = iMA(Symbol(),0,RSIOMA,0,RSIOMA_MODE,RSIOMA_PRICE,i);
         double ppma = iMA(Symbol(),0,RSIOMA,0,RSIOMA_MODE,RSIOMA_PRICE,i+1);
            
         rel=ccma-ppma;
         
         if(rel>0) sump=rel;
         else      sumn=-rel;
         positive=(PosBuffer[i+1]*(RSIOMA-1)+sump)/RSIOMA;
         negative=(NegBuffer[i+1]*(RSIOMA-1)+sumn)/RSIOMA;
        }
         //    Comment(rel);
      PosBuffer[i]=positive;
      NegBuffer[i]=negative;
      if(negative==0.0) RSIBuffer[i]=0.0;
      else
      {
          RSIBuffer[i]=100.0-100.0/(1+positive/negative);
          
          bdn[i] = 0;
          bup[i] = 0;
          sdn[i] = 0;
          sup[i] = 0;
          
          if(RSIBuffer[i]>MainTrendLong)
          bup[i] = -10;
          
          if(RSIBuffer[i]<MainTrendShort)
          bdn[i] = -10;
          
          if(RSIBuffer[i]<20 && RSIBuffer[i]>RSIBuffer[i+1])
          sup[i] = -10;
          
          if(RSIBuffer[i]>80 && RSIBuffer[i]<RSIBuffer[i+1])
          sdn[i] = -10;
            
          
      }    
      i--;
     }
     
     while(ma>=0)
     {
         marsioma[ma] = iMAOnArray(RSIBuffer,0,Ma_RSIOMA,0,Ma_RSIOMA_MODE,ma); 
         ma--;
     }    
//Comment(rel);
FirstOrderLots = AccountBalance()/1000;
lotsi = FirstOrderLots;
if (lotsi > 100.0) lotsi = 100;
if (lotsi<0.01) lotsi=0.1;
string tripo;
if (rel > 0) tripo = "compra";
if (rel < 0) tripo = "vende";
OrdersOpened = 0;
Comment("Tipo de Operación = ",tripo,"\nSi haces las operaciones manualmente, no inviertas en la primera operación más de ; ",AccountBalance()/4000,"  Lotes");
for (cnt = 0; cnt < OrdersTotal(); cnt++)
{
 OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
 if (OrderSymbol() == Symbol()) OrdersOpened++;
}
PipValue=MarketInfo(Symbol(),MODE_TICKVALUE); 
if (PipValue == 0.0) PipValue = 5;
if (PreviousOrders > OrdersOpened)
   {
   for (cnt = OrdersTotal(); cnt >= 0; cnt--)
      {
      OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
      type = OrderType();
      if (OrderSymbol() == Symbol())
         {
       //  if (type == OP_BUY)  OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),slippage,Blue);
       //  if (type == OP_SELL) OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),slippage,Red);
         //return(0);
         }
      }
   }
PreviousOrders = OrdersOpened;
if (OrdersOpened >= MaxTrades) EnableTrading = false; else EnableTrading = true;
if (openprice == 0.0)
   {
   for (cnt = 0; cnt < OrdersTotal(); cnt++)
      {
      OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
      type = OrderType();
      if (OrderSymbol() == Symbol())
         {
         openprice = OrderOpenPrice();
         if (type == OP_BUY)  state = 2;
         if (type == OP_SELL) state = 1;
         }
      }
   }
//double ma34 = iMA(NULL,PERIOD_M1,2,0,MODE_EMA,PRICE_CLOSE,0);
//double ma89 = iMA(NULL,PERIOD_M1,5,0,MODE_EMA,PRICE_CLOSE,0);
//double sarCurrent          = iSAR(NULL,PERIOD_M5,0.009,0.2,0);
//double sarPrevious         = iSAR(NULL,PERIOD_M5,0.009,0.2,1);
double macd = iMACD(NULL,0,5,13,1,PRICE_CLOSE,MODE_MAIN,0);
if (OrdersOpened < 1)
   {
   state = 3;
   if (rel > 0) state = 2;
   if (rel < 0) state = 1;
   if (ReverseCondition == 1)
      {
      if (state == 1)
         {
         state = 2;
         }
            else
         {
         if (state == 2)
            {
            state = 1;
            }
         }
      }
   }
for (cnt = OrdersTotal(); cnt >= 0; cnt--)
   {
   OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
   if (OrderSymbol() == Symbol())
      {
      if (OrderType() == OP_SELL)
         {
         if (TrailingStop > 0.0)
            {
            if (OrderOpenPrice() - Ask >= (TrailingStop + Pips) * Point)
               {
               if (OrderStopLoss() > Ask + Point * TrailingStop)
                  {
                  OrderModify(OrderTicket(),OrderOpenPrice(),Ask + Point * TrailingStop,OrderClosePrice() - TakeProfit * Point - TrailingStop * Point,800,Purple);
                  return(0);
                  }
               }
            }
         }
      if (OrderType() == OP_BUY)
         {
         if (TrailingStop > 0.0)
            {
            if (Bid - OrderOpenPrice() >= (TrailingStop + Pips) * Point)
               {
               if (OrderStopLoss() < Bid - Point * TrailingStop)
                  {
                  OrderModify(OrderTicket(),OrderOpenPrice(),Bid - Point * TrailingStop,OrderClosePrice() + TakeProfit * Point + TrailingStop * Point,800,Yellow);
                  return(0);
                  }
               }
            }
         }
      }
   }
Profit = 0;
LastTicket = 0;
LastType = 0;
LastClosePrice = 0;
LastLots = 0;
for (cnt = 0; cnt < OrdersTotal(); cnt++)
   {
   OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
   if (OrderSymbol() == Symbol())
      {
      LastTicket = OrderTicket();
      if (OrderType() == OP_BUY)  LastType = 0;
      if (OrderType() == OP_SELL) LastType = 1;
      LastClosePrice = OrderClosePrice();
      LastLots = OrderLots();
      if (LastType == 0)
         {
         if (OrderClosePrice() < OrderOpenPrice()) Profit -= (OrderOpenPrice() - OrderClosePrice()) * OrderLots() / Point;
         if (OrderClosePrice() > OrderOpenPrice()) Profit += (OrderClosePrice() - OrderOpenPrice()) * OrderLots() / Point;
         }
      if (LastType == 1)
         {
         if (OrderClosePrice() > OrderOpenPrice()) Profit -= (OrderClosePrice() - OrderOpenPrice()) * OrderLots() / Point;
         if (OrderClosePrice() < OrderOpenPrice()) Profit += (OrderOpenPrice() - OrderClosePrice()) * OrderLots() / Point;
         }
      }
   }
Profit = Profit * PipValue;
text = "Profit: $" + DoubleToStr(Profit,2) + " +/-";
/*
   if (LastType == 0 && state == 1)
      {
      OrderClose(LastTicket,LastLots,LastClosePrice,slippage,Yellow);
      EnableTrading = false;
      return(0);
      }
   if (LastType == 1 && state == 2)
      {
      OrderClose(LastTicket,LastLots,LastClosePrice,slippage,Yellow);
      EnableTrading = false;
      return(0);
      }
*/
/*
if (AccountEquity()/AccountBalance()<=0.60)
      {
      OrderClose(LastTicket,LastLots,LastClosePrice,slippage,Yellow);
      EnableTrading = false;
      return(0);
      }
*/
//if ((OrdersOpened >= MaxTrades - OrdersToProtect) && (AccountProtection == 1))
//   {
   //if (Profit >= SecureProfit)
 if (OrdersTotal()>=8)
    {
   for (cnt = OrdersTotal(); cnt >= 0; cnt--)
      {
      OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
      type = OrderType();
      if (OrderSymbol() == Symbol())
         {
         if (type == OP_BUY)  OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),slippage,Blue);
         if (type == OP_SELL) OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),slippage,Red);
         //return(0);
         }
      }
   }
if (!IsTesting())
   {
   if (state == 3)
      text2 = "No conditions to open trades";
         else
      text2 = "                         ";
   }
if ((state == 1) && EnableTrading)
   {
   if ((Bid - openprice >= Pips * Point) || (OrdersOpened < 1))
      {
      sprice = Bid;
      openprice = 0;
      if (TakeProfit == 0.0)
         takeprofit = 0;
            else
         takeprofit = sprice - TakeProfit * Point;
      if (InitialStop == 0.0)
         stoploss = 0;
            else
         stoploss = sprice + InitialStop * Point;
      if (OrdersOpened != 0)
       {
         lots = lotsi;
         for (cnt = 1; cnt <= OrdersOpened; cnt++)
         {
          if (MaxTrades>12) { lots=NormalizeDouble(lots*1.5,2); }
			 else { lots=NormalizeDouble(lots*2,2); }
         }
       }
      else
       {
         lots = lotsi;
       }
      if (lots > 100.0) lots = 100;
      OrderSend(Symbol(),OP_SELL,lots,sprice,slippage,stoploss,takeprofit,0,0,0,Red);
      return(0);
      }
   }
if ((state == 2) && EnableTrading)
   {
   if ((openprice - Ask >= Pips * Point) || (OrdersOpened < 1))
      {
      bprice = Ask;
      openprice = 0;
      if (TakeProfit == 0.0) takeprofit = 0; else takeprofit = bprice + TakeProfit * Point;
      if (InitialStop == 0.0) stoploss = 0; else stoploss = bprice - InitialStop * Point;
      if (OrdersOpened != 0)
         {
         lots = lotsi;
         for (cnt = 1; cnt <= OrdersOpened; cnt++)
            {
          if (MaxTrades>12) { lots=NormalizeDouble(lots*1.5,2); }
			 else { lots=NormalizeDouble(lots*2,2); }
            }
         }
            else
         {
         lots = lotsi;
         }
      if (lots > 100.0) lots = 100;
      OrderSend(Symbol(),OP_BUY,lots,bprice,slippage,stoploss,takeprofit,0,0,0,Blue);
      return(0);
      }
   }
return(0);
}
             
            
Comments