Price Data Components
Orders Execution
Indicators Used
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 Formatting Guide
# H1
## H2
### H3
**bold text**
*italicized text*
[title](https://www.example.com)

`code`
```
code block
```
> blockquote
- Item 1
- Item 2
1. First item
2. Second item
---