2 strategy,1 expert advisor?

 

can i put 2 diferent strategy in only 1 expert advisor?

i try to compile this 2 expert togeter,but doesn't work why?

exemple: MA and MACD

//+------------------------------------------------------------------+

//| Moving Average.mq4 |

//| Copyright © 2005, MetaQuotes Software Corp. |

//| http://www.metaquotes.net/ |

//+------------------------------------------------------------------+

#define MAGICMA 20050610


extern double Lots = 0.1;

extern double MaximumRisk = 0.02;

extern double DecreaseFactor = 3;

extern double MovingPeriod = 12;

extern double MovingShift = 6;

//+------------------------------------------------------------------+

//| Calculate open positions |

//+------------------------------------------------------------------+

int CalculateCurrentOrders(string symbol)

{

int buys=0,sells=0;

//----

for(int i=0;i<OrdersTotal();i++)

{

if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;

if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)

{

if(OrderType()==OP_BUY) buys++;

if(OrderType()==OP_SELL) sells++;

}

}

//---- return orders volume

if(buys>0) return(buys);

else return(-sells);

}

//+------------------------------------------------------------------+

//| Calculate optimal lot size |

//+------------------------------------------------------------------+

double LotsOptimized()

{

double lot=Lots;

int orders=HistoryTotal(); // history orders total

int losses=0; // number of losses orders without a break

//---- select lot size

lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,1);

//---- calcuulate number of losses orders without a break

if(DecreaseFactor>0)

{

for(int i=orders-1;i>=0;i--)

{

if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }

if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;

//----

if(OrderProfit()>0) break;

if(OrderProfit()<0) losses++;

}

if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);

}

//---- return lot size

if(lot<0.1) lot=0.1;

return(lot);

}

//+------------------------------------------------------------------+

//| Check for open order conditions |

//+------------------------------------------------------------------+

void CheckForOpen()

{

double ma;

int res;

//---- go trading only for first tiks of new bar

if(Volume[0]>1) return;

//---- get Moving Average

ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);

//---- sell conditions

if(Open[1]>ma && Close[1]<ma)

{

res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red);

return;

}

//---- buy conditions

if(Open[1]<ma && Close[1]>ma)

{

res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue);

return;

}

//----

}

//+------------------------------------------------------------------+

//| Check for close order conditions |

//+------------------------------------------------------------------+

void CheckForClose()

{

double ma;

//---- go trading only for first tiks of new bar

if(Volume[0]>1) return;

//---- get Moving Average

ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);

//----

for(int i=0;i<OrdersTotal();i++)

{

if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;

if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;

//---- check order type

if(OrderType()==OP_BUY)

{

if(Open[1]>ma && Close[1]<ma) OrderClose(OrderTicket(),OrderLots(),Bid,3,White);

break;

}

if(OrderType()==OP_SELL)

{

if(Open[1]<ma && Close[1]>ma) OrderClose(OrderTicket(),OrderLots(),Ask,3,White);

break;

}

}

//----

}

//+------------------------------------------------------------------+

//| Start function |

//+------------------------------------------------------------------+

void start()

{

//---- check for history and trading

if(Bars<100 || IsTradeAllowed()==false) return;

//---- calculate open orders by current symbol

if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();

else CheckForClose();

//----

}

//+------------------------------------------------------------------+

//+------------------------------------------------------------------+

//| MACD Sample.mq4 |

//| Copyright © 2005, MetaQuotes Software Corp. |

//| http://www.metaquotes.net/ |

//+------------------------------------------------------------------+


extern double TakeProfit = 50;

extern double Lots = 0.1;

extern double TrailingStop = 30;

extern double MACDOpenLevel=3;

extern double MACDCloseLevel=2;

extern double MATrendPeriod=26;


//+------------------------------------------------------------------+

//| |

//+------------------------------------------------------------------+

int start()

{

double MacdCurrent, MacdPrevious, SignalCurrent;

double SignalPrevious, MaCurrent, MaPrevious;

int cnt, ticket, total;

// initial data checks

// it is important to make sure that the expert works with a normal

// chart and the user did not make any mistakes setting external

// variables (Lots, StopLoss, TakeProfit,

// TrailingStop) in our case, we check TakeProfit

// on a chart of less than 100 bars

if(Bars<100)

{

Print("bars less than 100");

return(0);

}

if(TakeProfit<10)

{

Print("TakeProfit less than 10");

return(0); // check TakeProfit

}

// to simplify the coding and speed up access

// data are put into internal variables

MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);

MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);

SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);

SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);

MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0);

MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1);


total=OrdersTotal();

if(total<1)

{

// no opened orders identified

if(AccountFreeMargin()<(1000*Lots))

{

Print("We have no money. Free Margin = ", AccountFreeMargin());

return(0);

}

// check for long position (BUY) possibility

if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious &&

MathAbs(MacdCurrent)>(MACDOpenLevel*Point) && MaCurrent>MaPrevious)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());

}

else Print("Error opening BUY order : ",GetLastError());

return(0);

}

// check for short position (SELL) possibility

if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious &&

MacdCurrent>(MACDOpenLevel*Point) && MaCurrent<MaPrevious)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"macd sample",16384,0,Red);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());

}

else Print("Error opening SELL order : ",GetLastError());

return(0);

}

return(0);

}

// it is important to enter the market correctly,

// but it is more important to exit it correctly...

for(cnt=0;cnt<total;cnt++)

{

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

if(OrderType()<=OP_SELL && // check for opened position

OrderSymbol()==Symbol()) // check for symbol

{

if(OrderType()==OP_BUY) // long position is opened

{

// should it be closed?

if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious &&

MacdCurrent>(MACDCloseLevel*Point))

{

OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // close position

return(0); // exit

}

// check for trailing stop

if(TrailingStop>0)

{

if(Bid-OrderOpenPrice()>Point*TrailingStop)

{

if(OrderStopLoss()<Bid-Point*TrailingStop)

{

OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);

return(0);

}

}

}

}

else // go to short position

{

// should it be closed?

if(MacdCurrent<0 && MacdCurrent>SignalCurrent &&

MacdPrevious<SignalPrevious && MathAbs(MacdCurrent)>(MACDCloseLevel*Point))

{

OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // close position

return(0); // exit

}

// check for trailing stop

if(TrailingStop>0)

{

if((OrderOpenPrice()-Ask)>(Point*TrailingStop))

{

if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))

{

OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);

return(0);

}

}

}

}

}

}

return(0);

}

// the end.

 

Please use this to post code . . . it makes it easier to read.

 

first

second u can't run twice the start()

u have to do both of your strategies on 1 start()

something like this

int start()
  {
  //----

   first strategy
   bla bla bla
   
   second strategy
   bla bla bla

   return(0);
  }
 

i try to build a market making expert advisor

ok,but the problem is the OrdersTotal() function is conflicting betwen the two strategy

the second strategy i want to insert in the expert is the same of this one below exept for the price of BOTTOMLINE & TOPLINE

//+------------------------------------------------------------------+
//| EA_E-mail.mq4 |
//| triadinvest@yahoo.fr|
//| 
//+------------------------------------------------------------------+
#property copyright "triadinvest@yahoo.fr"
#property link "itriad"
//---- input parameters
int TIMEINTERVAL=      1;// X minutes to send the order
int LOTSIZE     =    0.01;// Amount
int TOPLINE     = 1.3685;// sell side order
int BOTTOMLINE  = 1.3680;// buy side order
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
     int start()
     {
     while(OrdersTotal()<1&&MarketInfo("EURUSD",MODE_BID)>=TOPLINE)
     {
     OrderSend(Symbol(), OP_SELL,LOTSIZE,Bid,5,0,BOTTOMLINE);     //GO SHORT 
     }
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////     
     {
     while(OrdersTotal()<1&&MarketInfo("EURUSD",MODE_ASK)<=BOTTOMLINE)
     {
     OrderSend(Symbol(), OP_BUY,LOTSIZE,Ask,5,0,TOPLINE);       //GO LONG 
     }
     }
//----
return(0);
}
//+------------------------------------------------------------------+
 
itriad:

can i put 2 diferent strategy in only 1 expert advisor?

i try to compile this 2 expert togeter,but doesn't work why?

What are you trying to achieve by doing this ? what is the point ?

Why not just put each EA on their own chart . . . ?

 

here is the point,if i put the expert on its own chart i need 50 chart!

int TOPLINE     = 1.3685;// sell side order
int BOTTOMLINE  = 1.3680;// buy side order
int TOPLINE1     = 1.3675;// sell side order
int BOTTOMLINE1  = 1.3670;// buy side order
int TOPLINE2     = 1.3665;// sell side order
int BOTTOMLINE2  = 1.3660;// buy side order
int TOPLINE3     = 1.3655;// sell side order
int BOTTOMLINE3  = 1.3650;// buy side order
ect....

you understand? thanks

 
itriad:

you understand? thanks

No, I don't . . .