Orders Execution
0
Views
0
Downloads
0
Favorites
Slingshot_2.1
//+----------------------------------------------------------------------------------------------+
//| Slingshot_2.1 EA.mq4 |
//| based on template by Ryan Klefas |
//| http://www.metaquotes.net |
//| originally modified by Orest |
//| olponom@yahoo.com |
//| multiple trade filters and multiple trade options added Feb. 2009 by Gary Hill |
//+----------------------------------------------------------------------------------------------+
extern string basic = "==== Basic Settings ====================";
extern double TakeProfit=0;
extern double Stoploss=0;
extern double Lots=0.1;
extern string manage = "==== Order Management ====================";
extern int BreakEvenAtProfit=0;
extern int BreakEvenShift=0; // Move the breakeven point up or down around the order open price
extern int TrailingStop=0;
extern bool OnlyTrailAfterProfit = false; // Trailing Stop will only trails when order is profitable
extern bool Move_SL_to_Prev_Hi_Lo = true;
extern string account="==== Account Settings ====================";
extern int MinimumEquity=0; // New orders will be disabled if equity drops below minimum
extern int MinimumBalance=0; // New orders will be disabled if balance drops below minimum
extern string activity = "==== EA Activity Settings ====================";
extern int ConcurrentOrdersMax=1;
extern string id = "==== Identity Settings ====================";
extern int ExpertID=999999; // Magic number: for identifying an EA's orders
extern bool TimeSpecific=true; // If true, Time frames are considered in determining
// whether an order belongs to the EA or not
extern string ExpertName="SlingShot "; // Expert name: for aesthetic purposes
extern string Trading_Times = "==== Trading Time Settings ====================";
extern bool TradeSunday = false;
extern int GMT_OffSet = 0; //IBFx = 0, Alpari = +1, ForexMeta = +2, etc...
extern int TimeToTrade1 = 7; // GMT Time - adjust for your broker difference
extern int TimeToTrade2 = 20; // GMT Time - adjust for your broker difference
extern string maxmacd = "==== MACD Colored Parameters ====================";
extern int FastEMA = 12;
extern int SlowEMA = 26;
extern int SignalSMA = 9;
extern int applied_price = 0;
extern string stoch = "==== Stochastic Parameters ================";
extern int KPeriod = 8;
extern int DPeriod = 3;
extern int Slowing = 3;
extern string zzi = "==== ZZi Parameters =======================";
extern int CCIPeriod = 14;
extern string money = "==== Money Management ====================";
extern bool Money_Management = false;
extern double Risk = 0.01;
extern int Max_StopLoss = 100;
extern string trades = "==== Trade Management ===================";
extern string tradedefinitions = "MMF = MaxMacdFilter, SF = StochFilter, ZF = ZZiFilter";
extern string tradesremark1 = "---- One Filter Trades ----";
extern bool TradeUsingMMF = true;
extern bool TradeUsingSF = false;
extern bool TradeUsingZF = false;
extern string tradesremark2 = "---- Two Filter Trades ----";
extern bool TradeUsingMMFandSF = false;
extern bool TradeUsingMMFandZF = false;
extern bool TradeUsingSFandZF = false;
extern string tradesremark3 = "---- Three Filter Trades ----";
extern bool TradeUsingMMFandSFandZF = false;
bool DisableClosingOrders=false; // If true, the order closing section of the EA will not run
bool DisableNewOrders=false; // If true, the order creating section of the EA will not run
bool belowLowPreviousBar = false;
bool aboveClosePreviousBar = false;
bool aboveHighPreviousBar = false;
bool belowClosePreviousBar = false;
datetime barTime=0;
bool BUY_SIGNAL = false;
bool SELL_SIGNAL = false;
int mmacdtrend = 0, strend = 0, ztrend;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
string comment = "";
int total = 0;
int buyOrders=0, sellOrders=0, buyPending=0, sellPending=0;
checkOrderStatus(buyOrders, sellOrders, buyPending, sellPending);
int instantOrders = buyOrders + sellOrders;
int pendingOrders = buyPending + sellPending;
int allOrders = instantOrders + pendingOrders;
advancedStopManager(instantOrders);
if (! IsTimeToTrade()) Comment("Outside trading window");
if (IsTimeToTrade() && instantOrders == 0) Comment("Inside trading window, no open orders");
if (IsTimeToTrade() && instantOrders > 0) Comment("Inside trading window,"," ",instantOrders," open order(s)");
//+------------------------------------------------------------------+
//| variable and indicator declaration |
//+------------------------------------------------------------------+
if( barTime < Time[0] )
{
// we have a new bar opened
barTime = Time[0]; // keep the new bar open time
belowLowPreviousBar = false;
aboveClosePreviousBar = false;
aboveHighPreviousBar = false;
belowClosePreviousBar = false;
BUY_SIGNAL = false;
SELL_SIGNAL = false;
total = OrdersTotal();
if (total > 0 && Move_SL_to_Prev_Hi_Lo) moveStopLosses();
}
//+------------------------------------------------------------------+
//| close existing orders under apprpriate conditions |
//+------------------------------------------------------------------+
if (DisableClosingOrders==false && allOrders>0 && barTime == Time[0])
{
int cnt;
total = OrdersTotal();
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if (orderBelongsToMe() && OrderOpenTime()< Time[0])
{
if (OrderType()==OP_BUY)
{
if (OrderProfit() > 0) // Bid-OrderOpenPrice()>Point*TrailingStop)
{
closeBuyOrder();
}
}
else if (OrderType()==OP_SELL)
{
if (OrderProfit() > 0) //OrderOpenPrice()-Ask>Point*TrailingStop)
{
closeSellOrder();
}
}
}
}
}
//+------------------------------------------------------------------+
//| Checking for Opening new trades |
//+------------------------------------------------------------------+
if (NewBar() == true)
{
MaxMacdTrend(mmacdtrend);
StochTrend(strend);
ZZiTrend(ztrend);
}
if (! IsTimeToTrade())
{
mmacdtrend = 0;
strend = 0;
ztrend = 0;
}
if(TradeUsingMMF == true && mmacdtrend == 1) bool TradeOptionBuy1 = true;
if(TradeUsingSF == true && strend == 2) bool TradeOptionBuy2 = true;
if(TradeUsingZF == true && ztrend == 3) bool TradeOptionBuy3 = true;
if(TradeUsingMMFandSF == true && mmacdtrend == 1 && strend == 2) bool TradeOptionBuy4 = true;
if(TradeUsingMMFandZF == true && mmacdtrend == 1 && ztrend == 3) bool TradeOptionBuy5 = true;
if(TradeUsingSFandZF == true && strend == 2 && ztrend == 3) bool TradeOptionBuy6 = true;
if(TradeUsingMMFandSFandZF == true && mmacdtrend == 1 && strend == 2 && ztrend == 3) bool TradeOptionBuy7 = true;
if(TradeUsingMMF == true && mmacdtrend == -1) bool TradeOptionSell1 = true;
if(TradeUsingSF == true && strend == -2) bool TradeOptionSell2 = true;
if(TradeUsingZF == true && ztrend == -3) bool TradeOptionSell3 = true;
if(TradeUsingMMFandSF == true && mmacdtrend == -1 && strend == -2) bool TradeOptionSell4 = true;
if(TradeUsingMMFandZF == true && mmacdtrend == -1 && ztrend == -3) bool TradeOptionSell5 = true;
if(TradeUsingSFandZF == true && strend == -2 && ztrend == -3) bool TradeOptionSell6 = true;
if(TradeUsingMMFandSFandZF == true && mmacdtrend == -1 && strend == -2 && ztrend == -3) bool TradeOptionSell7 = true;
// if no open orders then start looking for setup
if (instantOrders == 0)
{
if (TradeOptionBuy1 == true && Low[0] < Low[1] && Ask >= NormalizeDouble(Close[1]+1*Point, Digits)) sendBuyOrder();
if (TradeOptionBuy2 == true && Low[0] < Low[1] && Ask >= NormalizeDouble(Close[1]+1*Point, Digits)) sendBuyOrder();
if (TradeOptionBuy3 == true && Low[0] < Low[1] && Ask >= NormalizeDouble(Close[1]+1*Point, Digits)) sendBuyOrder();
if (TradeOptionBuy4 == true && Low[0] < Low[1] && Ask >= NormalizeDouble(Close[1]+1*Point, Digits)) sendBuyOrder();
if (TradeOptionBuy5 == true && Low[0] < Low[1] && Ask >= NormalizeDouble(Close[1]+1*Point, Digits)) sendBuyOrder();
if (TradeOptionBuy6 == true && Low[0] < Low[1] && Ask >= NormalizeDouble(Close[1]+1*Point, Digits)) sendBuyOrder();
if (TradeOptionBuy7 == true && Low[0] < Low[1] && Ask >= NormalizeDouble(Close[1]+1*Point, Digits)) sendBuyOrder();
if (TradeOptionSell1 == true && High[0] > High[1] && Bid <= NormalizeDouble(Close[1]-1*Point, Digits)) sendSellOrder();
if (TradeOptionSell2 == true && High[0] > High[1] && Bid <= NormalizeDouble(Close[1]-1*Point, Digits)) sendSellOrder();
if (TradeOptionSell3 == true && High[0] > High[1] && Bid <= NormalizeDouble(Close[1]-1*Point, Digits)) sendSellOrder();
if (TradeOptionSell4 == true && High[0] > High[1] && Bid <= NormalizeDouble(Close[1]-1*Point, Digits)) sendSellOrder();
if (TradeOptionSell5 == true && High[0] > High[1] && Bid <= NormalizeDouble(Close[1]-1*Point, Digits)) sendSellOrder();
if (TradeOptionSell6 == true && High[0] > High[1] && Bid <= NormalizeDouble(Close[1]-1*Point, Digits)) sendSellOrder();
if (TradeOptionSell7 == true && High[0] > High[1] && Bid <= NormalizeDouble(Close[1]-1*Point, Digits)) sendSellOrder();
}
return(0);
}
//+------------------------------------------------------------------+
//| middle-man modules |
//+------------------------------------------------------------------+
void sendBuyOrder() // Standard Version 1.71
{ versatileOrderTaker(1, Ask); }
//+------------------------------------------------------------------+
void sendSellOrder() // Standard Version 1.71
{ versatileOrderTaker(2, Bid); }
//+------------------------------------------------------------------+
void sendBuyPending(double entryPrice) // Standard Version 1.71
{ versatileOrderTaker(3, entryPrice); }
//+------------------------------------------------------------------+
void sendSellPending(double entryPrice) // Standard Version 1.71
{ versatileOrderTaker(4, entryPrice); }
//+------------------------------------------------------------------+
void closeSellOrder() // Standard Version 1.71
{ versatileOrderCloser(2); }
//+------------------------------------------------------------------+
void closeBuyOrder() // Standard Version 1.71
{ versatileOrderCloser(1); }
//+------------------------------------------------------------------+
void deletePending() // Standard Version 1.71
{ versatileOrderCloser(3); }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| modules and functions |
//+------------------------------------------------------------------+
void trailingStopManager() // Standard Version 1.71
{
int cnt, total = OrdersTotal();
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if (TrailingStop>0 && orderBelongsToMe())
{
if (OrderType()==OP_BUY)
{
if ((Bid-OrderOpenPrice()>Point*TrailingStop) || OnlyTrailAfterProfit==false)
{
if (OrderStopLoss()<Bid-Point*TrailingStop)
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
}
}
else if (OrderType()==OP_SELL)
{
if ((OrderOpenPrice()-Ask>Point*TrailingStop) || OnlyTrailAfterProfit==false)
{
if ((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
}
}
}
}
}
void moveStopLosses()
{
int cnt, total = OrdersTotal();
double dblStop, dblTightestStop;
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
int index = iBarShift(NULL, 0 , OrderOpenTime());
if (index==-1) return;
if (orderBelongsToMe() && OrderProfit() < 0)
{
if (OrderType()==OP_BUY)
{
dblStop = Low[index]-(MarketInfo(Symbol(),MODE_SPREAD)*Point)-1*Point;
dblTightestStop = Bid - MarketInfo(Symbol(),MODE_STOPLEVEL) * Point;
if ( dblStop > dblTightestStop && Stoploss>0)
dblStop = OrderOpenPrice()-Stoploss*Point;
if (dblStop < OrderOpenPrice() && dblStop != OrderStopLoss() && dblStop < dblTightestStop)
OrderModify(OrderTicket(),OrderOpenPrice(),dblStop,OrderTakeProfit(),0,Green);
}
else if (OrderType()==OP_SELL)
{
dblStop = High[index]+(MarketInfo(Symbol(),MODE_SPREAD)*Point)+1*Point; //MarketInfo(Symbol(),MODE_SPREAD)*Point+
dblTightestStop = Ask + MarketInfo(Symbol(),MODE_STOPLEVEL) * Point;
if ( dblStop < dblTightestStop && Stoploss>0)
dblStop = OrderOpenPrice()+Stoploss*Point;
if (dblStop > OrderOpenPrice() && dblStop != OrderStopLoss() && dblStop > dblTightestStop)
OrderModify(OrderTicket(),OrderOpenPrice(),dblStop,OrderTakeProfit(),0,Red);
}
}
}
}
//+------------------------------------------------------------------+
void breakEvenManager() // Standard Version 1.71
{
for(int cnt=0;cnt<OrdersTotal();cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if (BreakEvenAtProfit>0 && orderBelongsToMe())
{
if (OrderType()==OP_BUY)
{
if (Bid-OrderOpenPrice()>=Point*BreakEvenAtProfit)
{
if (OrderStopLoss()!=OrderOpenPrice() + BreakEvenShift*Point)
OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+ BreakEvenShift*Point,OrderTakeProfit(),0,LimeGreen);
}
}
else if (OrderType()==OP_SELL)
{
if (OrderOpenPrice()-Ask>=Point*BreakEvenAtProfit)
{
if (OrderStopLoss()!=OrderOpenPrice() - BreakEvenShift*Point)
OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()- BreakEvenShift*Point,OrderTakeProfit(),0,Tomato);
}
}
}
}
}
//+------------------------------------------------------------------+
// Standard Version 1.71
void checkOrderStatus(int& buyOrders,int& sellOrders,int& buyPending, int& sellPending)
{
for(int cnt=OrdersTotal();cnt>=0;cnt--)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if ( orderBelongsToMe() )
{
if (OrderType()==OP_BUY)
{buyOrders++;}
else if (OrderType()==OP_SELL)
{sellOrders++;}
else if (OrderType()==OP_BUYSTOP || OrderType()==OP_BUYLIMIT)
{buyPending++;}
else if (OrderType()==OP_SELLSTOP || OrderType()==OP_SELLLIMIT)
{sellPending++;}
}
}
}
//+------------------------------------------------------------------+
void advancedStopManager(int instantOrders) // Standard Version 1.71
{
if (instantOrders>=1)
{
if (BreakEvenAtProfit>0)
breakEvenManager();
if (TrailingStop>0)
trailingStopManager();
}
}
//+------------------------------------------------------------------+
bool orderBelongsToMe() // Standard Version 1.71
{
if (OrderSymbol()==Symbol() && OrderMagicNumber()==simpleMagicGenerator() )
return (true);
else
return (false);
}
//+------------------------------------------------------------------+
int simpleMagicGenerator() // Standard Version 1.71
{
int truMagic;
if (TimeSpecific)
truMagic = ExpertID + (Period()*17 + 203);
else
truMagic = ExpertID;
return (truMagic);
}
//+------------------------------------------------------------------+
string commentString() // Standard Version 1.71
{
string tfString, fullComment;
switch (Period())
{
case 1: tfString = "1 Min"; break;
case 5: tfString = "5 Min"; break;
case 15: tfString = "15 Min"; break;
case 30: tfString = "30 Min"; break;
case 60: tfString = "1 Hour"; break;
case 240: tfString = "4 Hour"; break;
case 1440: tfString = "Daily"; break;
case 10080: tfString = "Weekly"; break;
case 40320: tfString = "Monthly"; break;
default: tfString = "Unknown";
}
fullComment=StringConcatenate(ExpertName, ": ", tfString);
return (fullComment);
}
//+------------------------------------------------------------------+
double lotMaker() // Standard Version 1.71 Simplified
{
if (! Money_Management)
return (Lots);
double pipValue = MarketInfo(Symbol(), MODE_TICKVALUE);
double lots = AccountFreeMargin() * Risk / (Max_StopLoss * pipValue);
double lotStep = MarketInfo(Symbol(), MODE_LOTSTEP);
int digits = 0;
if(lotStep <= 0.01)
digits = 2;
else if(lotStep <= 0.1)
digits = 1;
lots = NormalizeDouble(lots, digits);
double minLots = MarketInfo(Symbol(), MODE_MINLOT);
if(lots < minLots)
lots = minLots;
double maxLots = MarketInfo(Symbol(), MODE_MAXLOT);
if(lots > maxLots)
lots = maxLots;
return (lots);
}
//+------------------------------------------------------------------+
bool newOrderPrevention(int allOrders) // Standard Version 1.71
{
if (DisableNewOrders)
{ Comment("New Orders Disabled: User option"); return (true); }
else if (AccountEquity()<MinimumEquity)
{ Comment("New Orders Disabled: Equity too low"); return (true);}
else if (AccountBalance()<MinimumBalance)
{ Comment("New Orders Disabled: Balance too low"); return (true);}
else if (allOrders>=ConcurrentOrdersMax)
{ Comment("New Orders Disabled: Too many existing orders"); return (true);}
else
return (false);
}
//+------------------------------------------------------------------+
void versatileOrderTaker(int simpleType, double entryPrice) // Standard Version 1.71
{
// Variable calculations
double Stopvalue=0, TPvalue=0;
int ticket, oType, slippage=3;
string typeName;
color c_color;
c_color = Green;
switch (simpleType)
{
case 4:
if (entryPrice<Bid) { oType=OP_SELLSTOP; typeName="SELLSTOP"; }
if (entryPrice>Bid) { oType=OP_SELLLIMIT; typeName="SELLLIMIT"; }
if (Stoploss>0) {Stopvalue = entryPrice+Stoploss*Point;}
if (TakeProfit>0) {TPvalue = entryPrice-TakeProfit*Point;}
break;
case 3:
if (entryPrice>Ask) { oType=OP_BUYSTOP; typeName="BUYSTOP"; }
if (entryPrice<Ask) { oType=OP_BUYLIMIT; typeName="BUYLIMIT"; }
if (Stoploss>0) {Stopvalue = entryPrice-Stoploss*Point;}
if (TakeProfit>0) {TPvalue = entryPrice+TakeProfit*Point;}
break;
case 2:
oType=OP_SELL; typeName="SELL";
c_color = Red;
if (Stoploss>0) {Stopvalue = entryPrice+Stoploss*Point;}
if (TakeProfit>0) {TPvalue = entryPrice-TakeProfit*Point;}
break;
case 1:
oType=OP_BUY; typeName="BUY";
if (Stoploss>0) {Stopvalue = entryPrice-Stoploss*Point;}
if (TakeProfit>0) {TPvalue = entryPrice+TakeProfit*Point;}
break;
default:
Print ("versatileOrderTaker has been passed an invalid SimpleType parameter: " + simpleType);
}
// Send Order
ticket=OrderSend(Symbol(),oType,lotMaker(),entryPrice,slippage,Stopvalue,TPvalue,commentString(),simpleMagicGenerator(),0,c_color);
if (ticket>0)
{if (OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print(ExpertName + " " + typeName + " order at ",OrderOpenPrice()); }
else
Print("Error opening " + typeName + " order: ",GetLastError());
}
//+------------------------------------------------------------------+
void versatileOrderCloser(int simpleType) // Standard Version 1.71
{
int cnt, total = OrdersTotal();
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if ( orderBelongsToMe() )
{
switch (simpleType)
{
case 4:
case 3:
if (OrderType()>OP_SELL) OrderDelete(OrderTicket());
break;
case 2:
if (OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(),Ask,3,CLR_NONE);
break;
case 1:
if (OrderType()==OP_BUY) OrderClose(OrderTicket(),OrderLots(),Bid,3,CLR_NONE);
break;
default:
Print ("versatileOrderCloser has been passed an invalid SimpleType parameter: " + simpleType);
}
}
}
}
//+------------------------------------------------------------------+
bool NewBar()
{
static datetime lastbar = 0;
datetime curbar = Time[0];
if(lastbar!=curbar)
{
lastbar=curbar;
return(true);
}
else
{
return(false);
}
}
//+------------------------------------------------------------------+
bool IsTimeToTrade()
{
bool res = false;
if(TradeSunday == false && Hour() >= TimeToTrade1+GMT_OffSet && Hour() <= TimeToTrade2+GMT_OffSet && DayOfWeek()!=0 && DayOfWeek()!=6) res = true;
else if(TradeSunday == true && Hour() >= TimeToTrade1+GMT_OffSet && Hour() <= TimeToTrade2+GMT_OffSet) res = true;
return(res);
}
//+------------------------------------------------------------------+
void StochTrend(int& strend)
{
double s1 = 0.0, s2 = 0.0 ,s3 = 0.0, s4 = 0.0;
double High1 = 0.0, High2 = 0.0, Low1 = 0.0, Low2 = 0.0;
for (int j=1; j<=500; j++)
{
double value1 = iCustom(NULL, 0, "Stochastic",KPeriod,DPeriod,Slowing,0,j);
double value2 = iCustom(NULL, 0, "Stochastic",KPeriod,DPeriod,Slowing,0,j+1);
double value3 = iCustom(NULL, 0, "Stochastic",KPeriod,DPeriod,Slowing,0,j+2);
if(s1 == 0 && s2 == 0 && s3 == 0 && s4 == 0)
{
if(value1 > value2 && value2 < value3) s1 = value2;
if(value1 < value2 && value2 > value3) s1 = value2;
}
else if(s1 != 0 && s2 == 0 && s3 == 0 && s4 == 0)
{
if(value1 > value2 && value2 < value3) s2 = value2;
if(value1 < value2 && value2 > value3) s2 = value2;
}
else if(s1 != 0 && s2 != 0 && s3 == 0 && s4 == 0)
{
if(value1 > value2 && value2 < value3) s3 = value2;
if(value1 < value2 && value2 > value3) s3 = value2;
}
else if(s1 != 0 && s2 != 0 && s3 != 0 && s4 == 0)
{
if(value1 > value2 && value2 < value3) s4 = value2;
if(value1 < value2 && value2 > value3) s4 = value2;
}
else if(s1 != 0 && s2 != 0 && s3 != 0 && s4 != 0) break;
}
if(s1 > s2)
{
High1 = s1;
Low1 = s2;
High2 = s3;
Low2 = s4;
}
if(s1 < s2)
{
Low1 = s1;
High1 = s2;
Low2 = s3;
High2 = s4;
}
double value4 = iCustom(NULL, 0, "Stochastic",KPeriod,DPeriod,Slowing,0,1);
if(s1 == High1)
{
if(value4 < Low1) strend = -2; // = Breakout low = short trade
if(value4 < Low1 && High1 < High2) strend = -2; // = Trade continuation = short trade
}
if(s1 == Low1)
{
if(value4 > High1) strend = 2; // = Breakout high = long trade
if(value4 > High1 && Low1 > Low2) strend = 2; // = Trade continuation = long trade
}
}
//+------------------------------------------------------------------+
void ZZiTrend(int& ztrend)
{
double ss1 = 0.0 ,ss2 = 0.0, ss3 = 0.0, ss4 = 0.0;
double HHigh1 = 0.0, HHigh2 = 0.0, LLow1 = 0.0, LLow2 = 0.0;
for (int ii=1; ii<=500; ii++)
{
double vvalue1 = iCustom(NULL, 0, "Zee Zee i",CCIPeriod,0,ii);
double vvalue2 = iCustom(NULL, 0, "Zee Zee i",CCIPeriod,0,ii+1);
double vvalue3 = iCustom(NULL, 0, "Zee Zee i",CCIPeriod,0,ii+2);
if(ss1 == 0 && ss2 == 0 && ss3 == 0 && ss4 == 0)
{
if(vvalue1 > vvalue2 && vvalue2 < vvalue3) ss1 = vvalue2;
if(vvalue1 < vvalue2 && vvalue2 > vvalue3) ss1 = vvalue2;
}
else if(ss1 != 0 && ss2 == 0 && ss3 == 0 && ss4 == 0)
{
if(vvalue1 > vvalue2 && vvalue2 < vvalue3) ss2 = vvalue2;
if(vvalue1 < vvalue2 && vvalue2 > vvalue3) ss2 = vvalue2;
}
else if(ss1 != 0 && ss2 != 0 && ss3 == 0 && ss4 == 0)
{
if(vvalue1 > vvalue2 && vvalue2 < vvalue3) ss3 = vvalue2;
if(vvalue1 < vvalue2 && vvalue2 > vvalue3) ss3 = vvalue2;
}
else if(ss1 != 0 && ss2 != 0 && ss3 != 0 && ss4 == 0)
{
if(vvalue1 > vvalue2 && vvalue2 < vvalue3) ss4 = vvalue2;
if(vvalue1 < vvalue2 && vvalue2 > vvalue3) ss4 = vvalue2;
}
else if(ss1 != 0 && ss2 != 0 && ss3 != 0 && ss4 != 0) break;
}
if(ss1 > ss2)
{
HHigh1 = ss1;
LLow1 = ss2;
HHigh2 = ss3;
LLow2 = ss4;
}
if(ss1 < ss2)
{
LLow1 = ss1;
HHigh1 = ss2;
LLow2 = ss3;
HHigh2 = ss4;
}
double vvalue4 = iCustom(NULL, 0, "Zee Zee i",CCIPeriod,0,1);
if(ss1 == HHigh1)
{
if(vvalue4 < LLow1) ztrend = -3; // = Breakout low = short trade
if(vvalue4 < LLow1 && HHigh1 < HHigh2) ztrend = -3; // = Trade continuation = short trade
}
if(ss1 == LLow1)
{
if(vvalue4 > HHigh1) ztrend = 3; // = Breakout high = long trade
if(vvalue4 > HHigh1 && LLow1 > LLow2) ztrend = 3; // = Trade continuation = long trade
}
}
//+------------------------------------------------------------------+
void MaxMacdTrend(int& mmacdtrend)
{
int TimeFrame = 0;
int bluemarker1 = 0, bluemarker2 = 0;
int redmarker1 = 0, redmarker2 = 0;
double bluenew = 0.0, blueold = 0.0;
double rednew = 0.0, redold = 0.0;
for (int i=1; i<=500; i++)
{
double macd3 = iCustom(NULL, 0, "MACD_inColor",TimeFrame,FastEMA,SlowEMA,SignalSMA,applied_price,2,i);
double macd33 = iCustom(NULL, 0, "MACD_inColor",TimeFrame,FastEMA,SlowEMA,SignalSMA,applied_price,2,i+1);
double macd4 = iCustom(NULL, 0, "MACD_inColor",TimeFrame,FastEMA,SlowEMA,SignalSMA,applied_price,3,i);
double macd44 = iCustom(NULL, 0, "MACD_inColor",TimeFrame,FastEMA,SlowEMA,SignalSMA,applied_price,3,i+1);
if (bluemarker1 == 0) // testing for first blue set
{
if (macd3 > 0 && macd33 == 0) //ox start of blueset1
{
bluemarker1 = 1;
if (macd3 > bluenew) bluenew = macd3;
}
if (macd3 > 0 && macd33 > 0) // xx values within blueset1
{
if (macd3 >= macd33 && macd3 >= bluenew) bluenew = macd3;
else if (macd33 > bluenew) bluenew = macd33;
}
if (macd3 == 0 && macd33 > 0) // xo end of blueset1
{
if (macd33 > bluenew) bluenew = macd33;
}
}
else if (bluemarker1 == 1) // testing for second blue set
{
if (macd3 > 0 && macd33 == 0) //ox start of blueset2
{
bluemarker2 = 1;
if (macd3 > blueold) blueold = macd3;
}
if (macd3 > 0 && macd33 > 0) // xx values within blueset2
{
if (macd3 >= macd33 && macd3 >= blueold) blueold = macd3;
else if (macd33 > blueold) blueold = macd33;
}
if (macd3 == 0 && macd33 > 0) // xo end of blueset2
{
if (macd33 > blueold) blueold = macd33;
}
}
if (redmarker1 == 0) // testing for first red set
{
if (macd4 < 0 && macd44 == 0) //ox start of redset1
{
redmarker1 = 1;
if (macd4 < rednew) rednew = macd4;
}
if (macd4 < 0 && macd44 < 0) // xx values within redset1
{
if (macd4 <= macd44 && macd4 <= rednew) rednew = macd4;
else if (macd44 < rednew) rednew = macd44;
}
if (macd4 == 0 && macd44 < 0) // xo end of redset1
{
if (macd44 < rednew) rednew = macd44;
}
}
else if (redmarker1 == 1) // testing for second red set
{
if (macd4 < 0 && macd44 == 0) //ox start of redset2
{
redmarker2 = 1;
if (macd4 < redold) redold = macd4;
}
if (macd4 < 0 && macd44 < 0) // xx values within redset2
{
if (macd4 <= macd44 && macd4 <= redold) redold = macd4;
else if (macd44 < redold) redold = macd44;
}
if (macd4 == 0 && macd44 < 0) // xo end of redset2
{
if (macd44 < redold) redold = macd44;
}
}
if (bluemarker1 == 1 && bluemarker2 == 1 && redmarker1 == 1 && redmarker2 ==1) // = 2 sets each of the most recent blue and red bars have been analyzed
{
double macdblue = iCustom(NULL, 0, "MACD_inColor",TimeFrame,FastEMA,SlowEMA,SignalSMA,applied_price,2,1);
double macdred = iCustom(NULL, 0, "MACD_inColor",TimeFrame,FastEMA,SlowEMA,SignalSMA,applied_price,3,1);
if (mmacdtrend == 0 || mmacdtrend == -1 && macdblue > 0 && bluenew > blueold)
{
mmacdtrend = 1;
}
else if (mmacdtrend == 0 || mmacdtrend == 1 && macdred < 0 && rednew < redold)
{
mmacdtrend = -1;
}
break;
}
}
}
//+------------------------------------------------------------------+
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
---