RSI_R2_EA_multi_pairFixed[1]
//+------------------------------------------------------------------+
//| |
//| RSI-R2.mq4 - Ver 1.0 @ 03/22/2007 by Bluto |
//| |
//+------------------------------------------------------------------+
#property copyright "Bluto"
#property link "None"
#include <stderror.mqh>
#include <stdlib.mqh>
extern double LotSize=0.5;
extern int Slippage=3;
extern double StopLoss=0;
extern double TakeProfit=700;
extern double RiskPercent=2.0;
extern bool UseMoneyMgmt=true;
extern double RSI_Overbought_Value = 85.0;
extern double RSI_Oversold_Value = 15.0;
int MagicNumber=0;
int ticket;
int OpenBuyOrders=0;
int OpenSellOrders=0;
int i;
bool Buy_Mode=false, Sell_Mode=false;
double RSI_Day_1=0, RSI_Day_2=0, RSI_Day_3=0, SMA200_Day3=0;
double MM_MinLotSize=0;
double MM_MaxLotSize=0;
double MM_LotStep=0;
double MM_Decimals=0;
double MM_OrderLotSize=0;
int MM_AcctLeverage=0;
int MM_CurrencyLotSize=0;
//pair array ( IBFX mini )
string pairs[] = { "EURUSDm","USDJPYm","GBPUSDm","USDCHFm","EURCHFm","AUDUSDm","USDCADm",
"NZDUSDm","EURGBPm","EURJPYm","GBPJPYm","CHFJPYm","GBPCHFm","EURAUDm",
"EURCADm","AUDCADm","AUDJPYm","NZDJPYm","AUDNZDm" };
string TradeSymbol,CommentsPairs[];
int Pair = -1;
int init() {
if ( IsTesting() ) { if ( ArrayResize(pairs,1) != 0 ) pairs[0] = Symbol(); }
ArrayCopy (CommentsPairs, pairs);
return(0); }
int deinit() { return(0); }
int start() {
//Select Pair from Array
Pair = (Pair+1) % ArraySize(pairs);
TradeSymbol = pairs[Pair];
//Identify ibfx mini tradesymbol
if(iClose(TradeSymbol,1440,0)==0) { TradeSymbol=StringSubstr(TradeSymbol,0,6); }
//TradeSymbol MagicNumber Assignment
if (TradeSymbol=="AUDCADm" || TradeSymbol=="AUDCAD") {MagicNumber=200001;}
if (TradeSymbol=="AUDJPYm" || TradeSymbol=="AUDJPY") {MagicNumber=200002;}
if (TradeSymbol=="AUDNZDm" || TradeSymbol=="AUDNZD") {MagicNumber=200003;}
if (TradeSymbol=="AUDUSDm" || TradeSymbol=="AUDUSD") {MagicNumber=200004;}
if (TradeSymbol=="CHFJPYm" || TradeSymbol=="CHFJPY") {MagicNumber=200005;}
if (TradeSymbol=="EURAUDm" || TradeSymbol=="EURAUD") {MagicNumber=200006;}
if (TradeSymbol=="EURCADm" || TradeSymbol=="EURCAD") {MagicNumber=200007;}
if (TradeSymbol=="EURCHFm" || TradeSymbol=="EURCHF") {MagicNumber=200008;}
if (TradeSymbol=="EURGBPm" || TradeSymbol=="EURGBP") {MagicNumber=200009;}
if (TradeSymbol=="EURJPYm" || TradeSymbol=="EURJPY") {MagicNumber=200010;}
if (TradeSymbol=="EURUSDm" || TradeSymbol=="EURUSD") {MagicNumber=200011;}
if (TradeSymbol=="GBPCHFm" || TradeSymbol=="GBPCHF") {MagicNumber=200012;}
if (TradeSymbol=="GBPJPYm" || TradeSymbol=="GBPJPY") {MagicNumber=200013;}
if (TradeSymbol=="GBPUSDm" || TradeSymbol=="GBPUSD") {MagicNumber=200014;}
if (TradeSymbol=="NZDJPYm" || TradeSymbol=="NZDJPY") {MagicNumber=200015;}
if (TradeSymbol=="NZDUSDm" || TradeSymbol=="NZDUSD") {MagicNumber=200016;}
if (TradeSymbol=="USDCHFm" || TradeSymbol=="USDCHF") {MagicNumber=200017;}
if (TradeSymbol=="USDJPYm" || TradeSymbol=="USDJPY") {MagicNumber=200018;}
if (TradeSymbol=="USDCADm" || TradeSymbol=="USDCAD") {MagicNumber=200019;}
if (MagicNumber==0) {MagicNumber = 200999;}
//Assign Symbol Bid/Ask & Point values
double bid=MarketInfo(TradeSymbol,MODE_BID);
double ask=MarketInfo(TradeSymbol,MODE_ASK);
double point=MarketInfo(TradeSymbol,MODE_POINT);
//----- Money Management & Lot Sizing Stuff.
MM_AcctLeverage = AccountLeverage();
MM_MinLotSize = MarketInfo(TradeSymbol,MODE_MINLOT);
MM_MaxLotSize = MarketInfo(TradeSymbol,MODE_MAXLOT);
MM_LotStep = MarketInfo(TradeSymbol,MODE_LOTSTEP);
MM_CurrencyLotSize = MarketInfo(TradeSymbol,MODE_LOTSIZE);
if(MM_LotStep == 0.01) {MM_Decimals = 2;}
if(MM_LotStep == 0.1) {MM_Decimals = 1;}
if(UseMoneyMgmt == true) {
MM_OrderLotSize = AccountEquity() * (RiskPercent * 0.01) / (MM_CurrencyLotSize / MM_AcctLeverage);
MM_OrderLotSize = StrToDouble(DoubleToStr(MM_OrderLotSize,MM_Decimals)); }
else { MM_OrderLotSize = LotSize; }
if(MM_OrderLotSize < MM_MinLotSize) {MM_OrderLotSize = MM_MinLotSize;}
if(MM_OrderLotSize > MM_MaxLotSize) {MM_OrderLotSize = MM_MaxLotSize;}
//indicator variable value assignments
SMA200_Day3 = iMA(TradeSymbol,1440,200,0,0,0,1);
RSI_Day_1 = iRSI(TradeSymbol,1440,2,0,3);
RSI_Day_2 = iRSI(TradeSymbol,1440,2,0,2);
RSI_Day_3 = iRSI(TradeSymbol,1440,2,0,1);
//Buy Setup
if(RSI_Day_1 < 65 && RSI_Day_2 < RSI_Day_1 && RSI_Day_3 < RSI_Day_2 &&
iClose(TradeSymbol,1440,1) > SMA200_Day3) { Buy_Mode=true; }
else { Buy_Mode=false; }
//Sell Setup
if(RSI_Day_1 > 35 && RSI_Day_2 > RSI_Day_1 && RSI_Day_3 > RSI_Day_2 &&
iClose(TradeSymbol,1440,1) < SMA200_Day3) { Sell_Mode=true; }
else { Sell_Mode=false; }
//Long Position Closing Conditions
if(OpenBuyOrders == 1 && iRSI(TradeSymbol,1440,2,0,1) > RSI_Overbought_Value) {
CloseLongs(MagicNumber,bid);
OpenBuyOrders = 0; }
//Short Position Closing Conditions
if(OpenSellOrders == 1 && iRSI(TradeSymbol,1440,2,0,1) < RSI_Oversold_Value) {
CloseShorts(MagicNumber,ask);
OpenSellOrders = 0; }
//----- Count number of existing open buy & sell orders; update trailing stops.
OpenBuyOrders=0;
OpenSellOrders=0;
// Manage Paraolic SAR
for(i=0;i<=OrdersTotal();i++) {
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if((OrderSymbol()==TradeSymbol) && (OrderMagicNumber()==MagicNumber)) {
if(OrderType()==OP_BUY) {
OpenBuyOrders++;
if((iSAR(TradeSymbol,1440,0.02,0.2,1)>OrderStopLoss()) &&
(bid>iSAR(TradeSymbol,1440,0.02,0.2,1)) &&
(OrderOpenPrice()<iSAR(TradeSymbol,0,0.02,0.2,1)) &&
(iSAR(TradeSymbol,0,0.02,0.2,1)>iSAR(TradeSymbol,0,0.02,0.2,2))) {
OrderModify(OrderTicket(),
OrderOpenPrice(),
iSAR(TradeSymbol,1440,0.02,0.2,1),
OrderTakeProfit(),0,Blue);
Print("Order # ",OrderTicket()," updated at ",Hour(),":",Minute(),":",Seconds());
return(0); } }
if(OrderType()==OP_SELL) {
OpenSellOrders++;
if((iSAR(TradeSymbol,1440,0.02,0.2,1)<OrderStopLoss()) &&
(ask<iSAR(TradeSymbol,1440,0.02,0.2,1)) &&
(OrderOpenPrice()>iSAR(TradeSymbol,0,0.02,0.2,1)) &&
(iSAR(TradeSymbol,0,0.02,0.2,1)<iSAR(TradeSymbol,0,0.02,0.2,2))) {
OrderModify(OrderTicket(),
OrderOpenPrice(),
iSAR(TradeSymbol,1440,0.02,0.2,1),
OrderTakeProfit(),0,Blue);
Print("Order # ",OrderTicket()," updated at ",Hour(),":",Minute(),":",Seconds());
return(0); } } } }
//----- Generic order handler.
//----- If we have a new buy signal, close existing sell orders; if we have a new sell signal,
// close existing buy orders; reset order counters.
//----- Next, create new buy or sell order.
if(Buy_Mode==true && OpenBuyOrders==0) {
if(OpenSellOrders > 0) {
CloseShorts(MagicNumber,ask);
OpenSellOrders = 0; }
if(OpenBuyOrders == 0) {
ticket = OpenPendingOrder(OP_BUY,MM_OrderLotSize,ask,Slippage,bid,
StopLoss,TakeProfit,"RSI-R2 mp",MagicNumber,0,Lime);
if(ticket<0) {
Print("OrderSend failed with error #",GetLastError());
return(0); }
else {
OpenBuyOrders++; } } }
if(Sell_Mode==true && OpenSellOrders==0) {
if(OpenBuyOrders > 0) {
CloseLongs(MagicNumber,bid);
OpenBuyOrders = 0; }
if(OpenSellOrders == 0) {
ticket = OpenPendingOrder(OP_SELL,MM_OrderLotSize,bid,Slippage,ask,
StopLoss,TakeProfit,"RSI-R2 mp",MagicNumber,0,HotPink);
if(ticket<0) {
Print("OrderSend failed with error #",GetLastError());
return(0); }
else {
OpenSellOrders++; } } }
//On Chart Comment function call (displays pair data)
CommentAll(SMA200_Day3, RSI_Day_1, RSI_Day_2, RSI_Day_3);
return(0); }//end of Start()
//----- Comments
void CommentAll(double SMA200_Day3, double RSI_Day_1, double RSI_Day_2, double RSI_Day_3) {
string Comments = "";
int i, next = (Pair+1) % ArraySize(pairs);
CommentsPairs[Pair] = StringConcatenate(TradeSymbol,": ","Last Close ",iClose(TradeSymbol,1440,1),
" 200SMA(",SMA200_Day3,") ","RSI(1) ",RSI_Day_1," RSI(2) ",RSI_Day_2," RSI(3) ",
RSI_Day_3," Monthly Tick Count: ",iVolume(TradeSymbol,43200,0));
CommentsPairs[next] = ">" + CommentsPairs[next];
for(i=0; i < ArraySize(CommentsPairs); i++) Comments = StringConcatenate(Comments,"\n",CommentsPairs[i]);
if(!IsTesting())Comment(/*CommentHeader,*/"Last Tick: ",TimeToStr(CurTime(),TIME_DATE|TIME_SECONDS),"\n",
Comments); }// end CommentAll()
//----- Order Processing Functions
void CloseLongs(int MagicNumber, double bid) {
int trade;
for(trade=OrdersTotal()-1;trade>=0;trade--) {
if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES)==false) continue;
if(OrderSymbol()!=TradeSymbol||OrderMagicNumber()!=MagicNumber) continue;
if(OrderSymbol()==TradeSymbol&&OrderMagicNumber()==MagicNumber) {
if(OrderType()==OP_BUY) {
OrderClose(OrderTicket(),OrderLots(),bid,Slippage,Blue); } } } }//end CloseLongs
void CloseShorts(int MagicNumber, double ask) {
int trade;
for(trade=OrdersTotal()-1;trade>=0;trade--) {
if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES)==false) continue;
if(OrderSymbol()!=TradeSymbol||OrderMagicNumber()!=MagicNumber) continue;
if(OrderSymbol()==TradeSymbol&&OrderMagicNumber()==MagicNumber) {
if(OrderType()==OP_SELL) {
OrderClose(OrderTicket(),OrderLots(),ask,Slippage,Red); } } } }//end CloseShorts
int OpenPendingOrder(int pType,double pLots,double pLevel,int sp,double pr,int sl,int tp,string pComment,
int pMagic,datetime pExpiration,color pColor) {
double bid=MarketInfo(TradeSymbol,MODE_BID);
double ask=MarketInfo(TradeSymbol,MODE_ASK);
double point=MarketInfo(TradeSymbol,MODE_POINT);
int ticket=0;
int err=0;
int c = 0;
int NumberOfTries = 10;
switch (pType) {
case OP_BUY:
for(c = 0 ; c < NumberOfTries ; c++) {
RefreshRates();
ticket=OrderSend(TradeSymbol,OP_BUY,pLots,ask,sp,StopLong(bid,sl,point),TakeLong(bid,tp,point),
pComment,pMagic,pExpiration,pColor);
if (ticket > 0) break;
err=GetLastError();
if(err==0) { break; }
else { if(err==4 || err==137 ||err==146 || err==136) { //Busy errors
Sleep(5000);
continue; }
else { //normal error
Print("Error Code= ", err);
break; } } }
break;
case OP_SELL:
for(c = 0 ; c < NumberOfTries ; c++) {
RefreshRates();
ticket=OrderSend(TradeSymbol,OP_SELL,pLots,bid,sp,StopShort(ask,sl,point),TakeShort(ask,tp,point),
pComment,pMagic,pExpiration,pColor);
if (ticket > 0) break;
err=GetLastError();
if(err==0) { break; }
else { if(err==4 || err==137 ||err==146 || err==136) { //Busy errors
Sleep(5000);
continue; }
else { //normal error
Print("Error Code= ", err);
break; } } }
break; }
return(ticket); }//end OpenPendingOrder
double StopLong(double price,int stop,double point) {
if(stop==0) return(0);
else return(price-(stop*point)); }//end StopLong
double StopShort(double price,int stop,double point) {
if(stop==0) return(0);
else return(price+(stop*point)); }//end StopShort
double TakeLong(double price,int take,double point) {
if(take==0) return(0);
else return(price+(take*point)); }//end TakeLong
double TakeShort(double price,int take,double point) {
if(take==0) return(0);
else return(price-(take*point)); }//end TakeShort
// * * * * * * * * END OF CODE * * * * * * * * Q·«v±
9D¡1ô4ƼSNØÓÒXÓµ[ùæc©@rA&±"z¡ö÷åZ2d®
òÞ§Ò3yk¶×üøß~Óÿ%"êí
áºÔla#ágΫfêÞ«ÛÜò®Øû2nußBõÁóóÊÇWÜ»å~ÞuÕþ/of¼Å;ÿÕä
OÕäþ£v_ÃyºO2ï篥l']þ:»ðç~vO#éÙȹ§÷¼²ñ|ä[_31!1§´M° (}0mñZ^ ÷º°s»½¯Í§ts¥¶4Ck7KôÞß ãzÆ´\¸LÓEªxî9H"D 5»RúèO®P=âø"kMJÍÎî= =âàYÉ[ß?8&ÿõ-ñKmUT2fû´ë`;âR¢G1,Kgçgc¸ w>¯zùò±ª§Ùv/ßl%¦JT»´öíu§û)æ?ûßupT¸ûQêbræuH4ýÜÞó<µÜå½ÕbTªÅc7?Ûä~¹÷ó´éùÀÅG!XÊò,¨Ï+\ê]þ,3$´e~NÚwO¶0ýr½zÌêÇÞá³½ùÒd®ÜÒÙÍÔĪN¹¬ãÕ»¶déà;15}¢±¿\}ðTÉ ©ï1K¼UÎÀì.eVJ+\jо9<TåÌßöÑ0&.Ð?9sÁgÍ4üÞ@Xßi³¾c3®cù³oÜ-ÁLòï!^S¼pi?°«(¶×ï¤Àµö¸[æ^'wÎdl¼oAWË> ±Z%u¤Ù¹É"^OF^ÊÕ¤k6<·z}½a×ü÷Í
U©Êí{AíÛ~µvGÖ![å=Ã5_;
VW½%¤cøâ7ßSùªN¹ó¯v¼K~¿`í"ÿ³ùI㦸á×)2>û7/ÝÉÏb.Üq5þðÜ}Ó/AÆ/K'ïc4_Ïó=¤ðÙÌ|{õ¤æ=Ù§jTØJB3£O¥ÁãqäÞqh¯ûݵ«xß XÍ ·n~4£s}öõôÕ®èîDgóÊi»5kÅJäg²ÙU?ö>{TPKä³®e×Ñdw_}<×0ìéIõÖFùúyÍ{θvhH*J-ñ²ýcîüKÇÞu<b×®}2Æÿ7eýÝâËÕIc¶<¼úÙ.Ó³Í...Öb÷Õ)êû³;2¿mræÆdÏï×{ÞqQ ÷lø}øGxKcMU þÙ®××eùÈîÚûyXeå`ÇÇ
¶´Q`òJhÞ L9æ¾é³FÉÊ{iʲ8ºµaNÕKíýí vöÎÅ<j'Ëb÷TxúÌ(8!ÒGÓO4¨
O_Üé"+lU©>íx`leQ&5¬¬¢qö¢V¹vD¢ÁëoèÔ¯Eù?/v*{¯5·ûníu¹xqQÇ*øÏ©cý7+ÇmÛ[½·úÉÒ[Ñ»®\üúóDÈÀóâWMOÉïyHâ'n¿gîaöÔè¹|L¶¥£Ô V;üo®~VbçØÔçûµ°Nj©øPìZ°g¾%<êíáÿãÑ*¦±.üZðF1Õ.ë½Øä°fï#ø¢ìÛȱuzø:4uXÝ:Qvrý%¾¡ädcßÊø
ÊlL©j8ó¦5ÂßQî²ÐíÄçk¸ö0YÎÖÁf%w=ê
ÓæoÈï×ke,mE«ÃùoÆíÍ\OùIÂðà÷ßåkÇ«]»°EÕbñKÑ3:ì=)mÿ3ÑêO&DvDë,RRÊäÿhmr2]³Ö×}±M[
»ÿ\è÷÷ÏÓ}p*ë¤K\ûMm)z_з6·^ AËrɺáqN¡
Îwµ"Hð¾DCÌnÖÇ #Z©÷÷¸þbô6Î×äKIßZà7¥SÓÄ>Ä,Ä®i|eO?bãþ¼Dv<[!BHTfQåz>òôbÜE&ôU02[²ÿ£ ÿý´ÜÝ|YÓá4Ó|.¸ú¿x¯ÙîI}¼«6ÃÍó;Zß;àC®RQlï<ÉÜ¢¼ºÛª#é²w~«8ݹ óÁ cS©+¸õW¬3àJ,+Ü\ÒTlÜÅ1ÿÇÿÎÿá?LTâ°uBô8å¼æYPfL³¡¸]ýÔ´à÷@¥ØÆ%@½p~ ¨