Rabbit-EA_v1

Author: Original Turtles System - Based on Richard Dennis & Willliam Eckhardt Turtle Trading System (55 days)
Price Data Components
Series array that contains the highest prices of each barSeries array that contains the lowest prices of each barSeries array that contains close prices for each bar
Orders Execution
Checks for the total of open ordersIt Closes Orders by itself It can change open orders parameters, due to possible stepping strategyIt automatically opens orders when conditions are reached
Indicators Used
Moving average indicator
0 Views
0 Downloads
0 Favorites
Rabbit-EA_v1
//+------------------------------------------------------------------+
//|                                                  TurtlesEA_v1.mq4|
//|                                             Done by investor_me. |
//|                                            investor.me@gmail.com |
//|                                                     and Aaragorn |
//|                   http://www.forex-tsd.com/members/aaragorn.html |                  
//+------------------------------------------------------------------+

/// Should be used on DAILY CHART based on original trading system's default

#property copyright "Original Turtles System - Based on Richard Dennis & Willliam Eckhardt Turtle Trading System (55 days)"
#property link      "Coded by investor_me. investor.me@gmail.com"
#property link "and Coded by Aaragorn @ utahbodyworker@sisna.com"

int days_spanned=55; //In System2: 55 days
int sl_period=20; //In System2: 20 days
extern int Take_Profit=100; //optional
extern int MaxLongTrades=4;
extern int MaxShortTrades=4;
extern double MaxLotsPerTrade=1;
double MinLotsPerTrade=0.1;
extern int MAGIC=1001;
extern double HH_LLAvePeriodEnt = 5;//48
extern double          InsideSlope = 0.0005;

double PDN, last_highest, last_lowest, last_long_price, last_short_price=0;
int last_day=-1, pending_long, pending_short;
bool N_needed=true;

int init()  { return (0); }

int deinit(){ return(0); }

double GetLotSize()
 {
    double lots=(0.01*AccountBalance()) / (N()*MarketInfo(Symbol(),MODE_TICKVALUE)/Point) ;
    lots=MathRound(lots*10)/10;
    if (lots*(1000*Ask)>AccountBalance()) { lots=AccountBalance()/(1000*Ask); lots=MathFloor(lots*10)/10; } 
    if (lots>MaxLotsPerTrade) lots=MaxLotsPerTrade;
    if (lots<MinLotsPerTrade) lots=MinLotsPerTrade;
    return (lots);
 }
 
double TR()
 { 
   return(MathMax(MathMax(iHigh(Symbol(),0,0)-iLow(Symbol(),0,0),iHigh(Symbol(),0,0)-iClose(Symbol(),0,1)),iClose(Symbol(),0,1)-iLow(Symbol(),0,0)));
 } 

double N()
 {
   double temp_N=1;
/*   if (DayOfWeek()==1 && N_needed)
    {   */
      if (PDN==0) 
       {
         for (int i=0; i<days_spanned; i++) PDN=MathMax(MathMax(iHigh(Symbol(),0,i)-iLow(Symbol(),0,i),iHigh(Symbol(),0,i)-iClose(Symbol(),0,i+1)),iClose(Symbol(),0,i+1)-iLow(Symbol(),0,i));
         PDN=(PDN/days_spanned);
       }

      temp_N=( (days_spanned-1)*PDN +TR() )/days_spanned;
      PDN=temp_N;
      if (DayOfWeek()==1) N_needed=false;
//      Print ("This monday's N value:",DoubleToStr(temp_N*10000,10));
      return (temp_N*10000);
//    }
   if (DayOfWeek()!=1) N_needed=true;     
   return (PDN*10000);
 } 


double TakeProfit(double tp,int type)
{ 
  if (type==1 && tp>7) return (Ask+0.6*N()*Point);
  if (type==2 && tp>7) return (Bid-0.6*N()*Point);
  
  return (0); 
}

double StopLoss(double type)
{ 
  if (type==1)//buy
   {
   return (Ask-2*(N())*Point); 
   }
  if (type==2)//sell
   {
   return (Bid+2*(N())*Point);
   }
  return (0); 
}

void ClosePending()
 { 
      for(int i=0;i<=OrdersTotal(); i++)  
      {
         OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
         if(OrderSymbol()==Symbol() && OrderComment()=="Turtles" && OrderMagicNumber()==MAGIC) 
           {
          if(OrderType()==OP_BUY) OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);
          else if (OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);
        }
      }  
 }

double highest(int spanned_days)
 { 
   double highest_value=0;
//   if (DayOfWeek()==last_day && last_highest>0) return (last_highest);
   for (int i=0; i<spanned_days; i++) 
      if (iHigh(Symbol(),0,i)>highest_value) highest_value=iHigh(Symbol(),0,i);
   last_highest=highest_value;
   return (highest_value);
 }

double lowest(int spanned_days)
 { 
   double lowest_value=10000;
//   if (DayOfWeek()==last_day && last_lowest>0) return (last_lowest);
   for (int i=0; i<spanned_days; i++) 
      if (iLow(Symbol(),0,i)<lowest_value) lowest_value=iLow(Symbol(),0,i);
   last_lowest=lowest_value;
   return (lowest_value);
 }

void PendingOrders()  
  {
   pending_long=0; pending_short=0;
   for(int i=0;i<=OrdersTotal(); i++)  
      {
         OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
         if(OrderSymbol()==Symbol() && OrderComment()=="Turtles" && OrderMagicNumber()==MAGIC) 
            {   
              if (OrderType()==OP_BUY)
                {
                  pending_long++;
                  if (OrderOpenPrice()-iClose(Symbol(),1,1)>2*N()) ClosePending(); 
                  else if (iLow(Symbol(),1,0)<lowest(sl_period)) ClosePending(); 
                }     
              if (OrderType()==OP_SELL)
                {
                  pending_short++;
                  if (iClose(Symbol(),1,1)-OrderOpenPrice()>2*N()) ClosePending(); 
                  else if (iHigh(Symbol(),1,0)>highest(sl_period)) ClosePending(); 
                }  
            }
      }   
   }

void adjust_stops(int type)
 {   int ticket;
     for(int i=0;i<OrdersTotal(); i++)  
        {
         OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
         if(OrderSymbol()==Symbol() && OrderComment()=="Turtles" && OrderMagicNumber()==MAGIC) 
            {   
              if (OrderType()==OP_BUY && type==1)
                 ticket=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss()+0.5*N(),OrderTakeProfit(),0,Green); 
              if (OrderType()==OP_SELL && type==2)
                 /* ObjectDelete("adjust");
                  ObjectCreate("adjust", OBJ_TEXT, 0, Time[30], High[0]+(20*Point));
                  ObjectSetText("adjust","modify to sl@=  "+DoubleToStr(OrderStopLoss()-0.5*N()/10000,4),48,"Arial",White); 
               */  ticket=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderStopLoss()-0.5*N()/10000,4),OrderTakeProfit(),0,Green); 
            }
        }    
     if(ticket<0) Print("OrderSend failed with error #",GetLastError());   
 }

void OpenOrder(int type) 
  {
  int ticket;
  double MAS=0;
    MAS= iMA(Symbol(), 0, HH_LLAvePeriodEnt, 0 , MODE_EMA, PRICE_CLOSE, 0) - 
      iMA(Symbol(), 0, HH_LLAvePeriodEnt, 0 , MODE_EMA, PRICE_CLOSE, 2); //{BlockBuy=false; BlockSell=true;}
        double MAS2=0;
    MAS2= iMA(Symbol(), 0, HH_LLAvePeriodEnt, 0 , MODE_EMA, PRICE_CLOSE, 2) - 
      iMA(Symbol(), 0, HH_LLAvePeriodEnt, 0 , MODE_EMA, PRICE_CLOSE, 4); //{BlockBuy=false; BlockSell=true;}
   ObjectDelete("MAS");
   ObjectCreate("MAS", OBJ_TEXT, 0, Time[20], High[0]+(30*Point));
   ObjectSetText("MAS","-0.0005>MA slope "+DoubleToStr(MAS,5),14,"Arial",White); 
   ObjectDelete("MAS2");
   ObjectCreate("MAS2", OBJ_TEXT, 0, Time[20], High[0]+(0*Point));
   ObjectSetText("MAS2","-0.0005>MA2 slope "+DoubleToStr(MAS2,5),14,"Arial",White);    
   if (type==1)
     { 
      double LLclearance=0;
      LLclearance = Low[Lowest(NULL,0,MODE_LOW,2,1)];
      
       if(Ask > LLclearance+(2*Point) || MAS<0.0003 || MAS2<0.0003)
       {
        return(0);
       }
 
      
       ticket=OrderSend(Symbol(),OP_BUY,GetLotSize(),Ask,2,StopLoss(1),TakeProfit(Take_Profit,1),"Turtles",MAGIC,0,Green); 
       if(ticket>0)
         {
         OrderSelect(ticket,SELECT_BY_TICKET);
         last_long_price=OrderOpenPrice();
        // last_short_price=0;
         }
     }//if type 1   
   else if (type==2)
     {
      double HHclearance=0;
      HHclearance = High[Highest(NULL,0,MODE_HIGH,2,1)];
       
       if(Bid < HHclearance-(2*Point) || MAS>-0.0005 || MAS2>-0.0005)
       {
        return(0);
       }
 
       ticket=OrderSend(Symbol(),OP_SELL,GetLotSize(),Bid,2,StopLoss(2),TakeProfit(Take_Profit,2),"Turtles",MAGIC,0,Red); 
       if(ticket>0)
         {
         OrderSelect(ticket,SELECT_BY_TICKET);   
         last_short_price=OrderOpenPrice();
  /* ObjectDelete("dodo");
   ObjectCreate("dodo", OBJ_TEXT, 0, Time[30], High[0]+(20*Point));
   ObjectSetText("dodo","ticket=  "+DoubleToStr(ticket,4),18,"Arial",White);
   ObjectDelete("dodo1");
   ObjectCreate("dodo1", OBJ_TEXT, 0, Time[30], High[0]+(0*Point));
   ObjectSetText("dodo1","last_short_price=  "+DoubleToStr(last_short_price,4),18,"Arial",White);  */       
         //last_long_price=0;
         }//if ticket>0   
     }//if type 2  
   if(ticket<0) Print("OrderSend failed with error #",GetLastError());   
  }

void do_orders()
 {
   PendingOrders();
   if (pending_long==0 && iHigh(Symbol(),1,0)>highest(days_spanned)) OpenOrder(1); //long
   if (pending_short==0 && iLow(Symbol(),1,0)<lowest(days_spanned))  OpenOrder(2); //short
   if (pending_long>0 && pending_long<MaxLongTrades && Ask-last_long_price>=0.5*N()) { OpenOrder(1); adjust_stops(1); }
   if (pending_short>0 && pending_short<MaxShortTrades && last_short_price-Bid>=0.5*N()/10000) 
   {
 /*  ObjectDelete("dood");
   ObjectCreate("dood", OBJ_TEXT, 0, Time[0], High[0]+(20*Point));
   ObjectSetText("dood","Modify and Add Shorts @:  "+DoubleToStr(Bid,4),18,"Arial",White); */
   OpenOrder(2); 
   adjust_stops(2); 
   }
 /*  ObjectDelete("doo");
   ObjectCreate("doo", OBJ_TEXT, 0, Time[0], High[0]+(20*Point));
   ObjectSetText("doo","last_short_price=  "+DoubleToStr(last_short_price,4),8,"Arial",White);
   ObjectDelete("doo1");
   ObjectCreate("doo1", OBJ_TEXT, 0, Time[0], High[0]+(10*Point));
   ObjectSetText("doo1","Bid=  "+DoubleToStr(Bid,4),8,"Arial",White);
   ObjectDelete("doo2");
   ObjectCreate("doo2", OBJ_TEXT, 0, Time[0], High[0]+(0*Point));
   ObjectSetText("doo2","last_short_price-Bid=  "+DoubleToStr(last_short_price-Bid,4),8,"Arial",White);   
   ObjectDelete("doo3");
   ObjectCreate("doo3", OBJ_TEXT, 0, Time[0], High[0]+(-10*Point));
   ObjectSetText("doo3","...is > 0.5*N()/10000=  "+DoubleToStr(0.5*N()/10000,4),8,"Arial",White);    
   ObjectDelete("doo4");
   ObjectCreate("doo4", OBJ_TEXT, 0, Time[0], High[0]+(-20*Point));
   ObjectSetText("doo4","pending_short=  "+pending_short,8,"Arial",White);    */
 }
 
void equitylock()
   {
     double lastmax=0,maxintrade =0;
     double lastmax1=0,maxintrade1 =0;
     
     for(int i=0;i<OrdersTotal(); i++)  
        {
         OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
         if(OrderSymbol()==Symbol() && OrderComment()=="Turtles" && OrderMagicNumber()==MAGIC) 
            {   
              if (OrderType()==OP_BUY)
                 {
                 if(Bid>OrderOpenPrice())
                  {
                  double maxp = Bid-OrderOpenPrice();
                  if(lastmax>maxp)
                     {
                     maxintrade = lastmax;
                     }
                     else
                     {
                     maxintrade = maxp;
                     }
                  lastmax = maxp;
                  }
                  if(maxp<=maxintrade-(0.8*maxintrade))
                     {
                     ClosePending();
                     }
                 }//buy
              if (OrderType()==OP_SELL)
                  {
                  if(Ask<OrderOpenPrice())
                   {
                  double maxp1 = OrderOpenPrice()-Ask; 
                  if(lastmax1>maxp1)
                     {
                     maxintrade1 = lastmax1;
                     }
                     else
                     {
                     maxintrade1 = maxp1;
                     }
                  lastmax1 = maxp1;
                  } 
                 }//sell
                 if(maxp1<=maxintrade1-(0.8*maxintrade1))
                     {
                     ObjectDelete("1eql");
                     ObjectCreate("1eql", OBJ_TEXT, 0, Time[10], Low[0]+(-5*Point));
                     ObjectSetText("1eql","EQL CLOSE Short",10,"Arial",Red);
                    // ClosePending();
                     } 
            }//select
       }//for 
       if(OrdersTotal()==0) 
       {
       ObjectDelete("1eql");
       maxintrade=0;
       maxp1=0;
       maxp=0;
       }
 /*  ObjectDelete("eql");
   ObjectCreate("eql", OBJ_TEXT, 0, Time[40], High[0]+(30*Point));
   ObjectSetText("eql","maxintrade1 "+DoubleToStr(maxintrade1,5),12,"Arial",Red);
   ObjectDelete("eql2");
   ObjectCreate("eql2", OBJ_TEXT, 0, Time[40], High[0]+(0*Point));
   ObjectSetText("eql2","maxp1  "+DoubleToStr(maxp1,5),12,"Arial",Red);  
   ObjectDelete("eql3");
   ObjectCreate("eql3", OBJ_TEXT, 0, Time[40], High[0]+(-30*Point));
   ObjectSetText("eql3","maxintrade1-(0.01*maxintrade1)  "+DoubleToStr(maxintrade1-(0.01*maxintrade1),5),12,"Arial",Red);*/
   }//equitylock
   
int start()
  {
   if(!IsTesting() && !IsDemo()) return (0);
    double MAS=0;
    MAS= iMA(Symbol(), 0, HH_LLAvePeriodEnt, 0 , MODE_EMA, PRICE_CLOSE, 0) - 
      iMA(Symbol(), 0, HH_LLAvePeriodEnt, 0 , MODE_EMA, PRICE_CLOSE, 2); //{BlockBuy=false; BlockSell=true;}
   // if(iMA(Symbol(), 0, HH_LLAvePeriodEnt, 0 , MODE_EMA, PRICE_CLOSE, 0) < 
    //  iMA(Symbol(), 0, HH_LLAvePeriodEnt, 0 , MODE_EMA, PRICE_CLOSE, 2))// {BlockBuy=true;  BlockSell=false;} 
   
   ObjectDelete("Cmmt10");
   ObjectCreate("Cmmt10", OBJ_TEXT, 0, Time[80], High[0]+(30*Point));
   ObjectSetText("Cmmt10","MA slope "+DoubleToStr(MAS,5),18,"Arial",White);   
  if(MAS < (-(InsideSlope)) || MAS > InsideSlope )
   {
   ObjectDelete("Cmmt10");
   ObjectCreate("Cmmt10", OBJ_TEXT, 0, Time[80], High[0]+(30*Point));
   ObjectSetText("Cmmt10","MA slope "+DoubleToStr(MAS,5),18,"Arial",Red);
   ObjectDelete("Cmmt10a");
   ObjectCreate("Cmmt10a", OBJ_TEXT, 0, Time[80], High[0]+(0*Point));
   ObjectSetText("Cmmt10a","SLOPE BLOCKED",18,"Arial",Red);  
   ObjectDelete("Cmmt10b");
   ObjectCreate("Cmmt10b", OBJ_TEXT, 0, Time[80], High[0]+(-30*Point));
   ObjectSetText("Cmmt10b","+ - "+DoubleToStr(InsideSlope,5),18,"Arial",Red); 
  /* ObjectDelete("Cmmt10c");
   ObjectCreate("Cmmt10c", OBJ_TEXT, 0, Time[20], High[0]+(30*Point));
   ObjectSetText("Cmmt10c","Trend Acceleration Range",12,"Arial",Yellow);*/
   if(MAS < (-(InsideSlope)))
      {
      OpenOrder(2);
      }
   if(MAS > InsideSlope)
      {
      //OpenOrder(1);
      }   
   }
   else
   {
   ObjectDelete("Cmmt10a");
   ObjectDelete("Cmmt10b");
   ObjectDelete("Cmmt10c");
   }
   do_orders();
   last_day=DayOfWeek();
   equitylock();
   return (0);
  }
     
     

Comments

Markdown supported. Formatting help

Markdown Formatting Guide

Element Markdown Syntax
Heading # H1
## H2
### H3
Bold **bold text**
Italic *italicized text*
Link [title](https://www.example.com)
Image ![alt text](image.jpg)
Code `code`
Code Block ```
code block
```
Quote > blockquote
Unordered List - Item 1
- Item 2
Ordered List 1. First item
2. Second item
Horizontal Rule ---