//+------------------------------------------------------------------+ //| RSI_MA.mq4 | //| Copyright © 2008, AEliseev k800elik@gmail.com | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ #property copyright "Copyright © 2008, Andrey E. k800elik@gmail.com" #property link "http://www.metaquotes.net" //---- input parameters extern int CCI_Per=14; extern int MA_Per=9; extern int CCI_close_Per=14; extern double TakeProfit=50; extern double StopLoss=40; extern double Lots=0.1; extern int Deposit=1000; extern bool MM=false; extern int _MagicNumber = 13131313; extern int _Sleep=5000; int LotA=1, Err=0; int j=0, var2,var1; int counter=0; int ticket; bool var3; bool order=false; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { Comment("CCI_MA v1.5 © 2008, Andrey E. k800elik@gmail.com"); return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { /* int i, a1, a2; //---- if (OrdersTotal()>0) { for (i=0; i==OrdersTotal(); i++) { OrderSelect(i,SELECT_BY_POS); if (OrderMagicNumber()==131313) { a1=OrderClose(LotA*Lots,Ask,5,Red); //a2=OrderClose(var1,LotA*Lots,Ask,5,Red); } } } */ return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //---- if (isNewBar()) EveryBar(); EveryTick(); //---- return(0); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| Ïðîâåðêà íà ïîÿâëåíèå íîâîãî áàðà | //+------------------------------------------------------------------+ bool isNewBar() { static datetime TimeBar=0; bool flag=false; if(TimeBar!=Time[0]) { TimeBar=Time[0]; flag=true; } return (flag); } //+------------------------------------------------------------------+ //| Âûïîëíÿåì äåéñòâèÿ ïðè ïîÿâëåíèè íîâîãî áàðà | //+------------------------------------------------------------------+ void EveryBar() { // Print("Ïðèøåë ÍÎÂÛÉ ÁÀÐ!"); double MA[100], CCI[100], CCIclose[100], StandDevi[100]; int i,limit=ArraySize(CCI); double SL, TP; Sleep(_Sleep); SL = NormalizeDouble(Ask - StopLoss*Point, Digits); TP = NormalizeDouble(Ask + TakeProfit*Point, Digits); for(i=0; i<limit; i++) { CCI[i]=iCCI(NULL,0,CCI_Per,PRICE_CLOSE,i); CCIclose[i]=iCCI(NULL,0,CCI_close_Per,PRICE_CLOSE,i); MA[i]=iMAOnArray(CCI,0,MA_Per,0,MODE_SMA,i); } // Ïðîâåðÿåì, õâàòàåò ëè äåíåã äëÿ îòêðûòèÿ íîâîãî îðäåðà if(AccountFreeMargin()<(1000*Lots)) { Print("We have no money. Free Margin = ", AccountFreeMargin()); return(0); } //================================================================================= int _GetLastError = 0, _OrdersTotal = OrdersTotal(); //---- ïåðåáèðàåì âñå îòêðûòûå ïîçèöèè for ( int z = _OrdersTotal - 1; z >= 0; z -- ) { //---- åñëè ïðè âûáîðå ïîçèöèè âîçíèêëà îøèáêà, ïåðåõîäèì ê ñëåäóþùåé if ( !OrderSelect( z, SELECT_BY_POS ) ) { _GetLastError = GetLastError(); Print( "OrderSelect( " ,z, ", SELECT_BY_POS ) - Error #", _GetLastError); continue; } // åñëè ïîçèöèÿ îòêðûòà íå ïî òåêóùåìó èíñòðóìåíòó, ïðîïóñêàåì å¸ if ( OrderSymbol() != Symbol() ) continue; // åñëè MagicNumber íå ðàâåí _MagicNumber, ïðîïóñêàåì // ýòó ïîçèöèþ if ( OrderMagicNumber() != _MagicNumber ) continue; //---- åñëè îòêðûòà ÁÀÉ-ïîçèöèÿ, if ( OrderType() == OP_BUY ) { //---- åñëè ÑÑI ïåðåñåêàåò ëèíèþ 100 âíèç if (((CCIclose[2]>100) && (CCIclose[1]<=100)) || (CCI[1]<MA[limit-MA_Per-1]) && (CCI[2]>=MA[limit-MA_Per-2])) { //---- çàêðûâàåì ïîçèöèþ if ( !OrderClose( OrderTicket(), OrderLots(), Bid, 10, Green ) ) { _GetLastError = GetLastError(); Print( "Îøèáêà OrderClose ¹ ", _GetLastError ); Err=1; return(-1); } } // åñëè ñèãíàë íå èçìåíèëñÿ, âûõîäèì - ïîêà ðàíî îòêðûâàòü // íîâóþ ïîçèöèþ else { return(0); } } //---- åñëè îòêðûòà ÑÅËË-ïîçèöèÿ, if ( OrderType() == OP_SELL ) { //---- åñëè ÑÑI ïåðåñåêàåò ëèíèþ -100 ââåðõ, if (((CCIclose[2]<-100) && (CCIclose[1]>=-100)) || ((CCI[1]>MA[limit-MA_Per-1]) && (CCI[2]<=MA[limit-MA_Per-2]))) { //---- çàêðûâàåì ïîçèöèþ if(!OrderClose( OrderTicket(), OrderLots(), Ask, 10, Red ) ) { _GetLastError = GetLastError(); Print( "Îøèáêà OrderClose ¹ ", _GetLastError ); Err=2; return(-1); } } // åñëè ñèãíàë íå èçìåíèëñÿ, âûõîäèì - ïîêà ðàíî îòêðûâàòü // íîâóþ ïîçèöèþ else return(0); } } //+------------------------------------------------------------------+ //| åñëè âûïîëíåíèå äîøëî äî ýòîãî ìåñòà, çíà÷èò îòêðûòîé ïîçèöèè íåò| //| ïðîâåðÿåì, åñòü ëè âîçìîæíîñòü îòêðûòü ïîçèöèþ | //+------------------------------------------------------------------+ Sleep(_Sleep); //---- åñëè ÑÑI ïåðåñ¸ê MACD ñíèçó ââåðõ , SL = NormalizeDouble(Bid - StopLoss*Point, Digits); TP = NormalizeDouble(Bid + TakeProfit*Point, Digits); if ((CCI[1]>MA[limit-MA_Per-1]) && (CCI[2]<MA[limit-MA_Per-2])) { //---- îòêðûâàåì ÁÀÉ ïîçèöèþ if(OrderSend( Symbol(), OP_BUY, LotA*Lots, Ask, 5, SL, TP, "CCI_test_buy", _MagicNumber, 0, Green ) < 0 ) { _GetLastError = GetLastError(); Print( "Îøèáêà OrderSend OP_BUY ¹ ", _GetLastError ); Err=3; return(-1); } return(0); } //---- åñëè ÑÑI ïåðåñ¸ê MACD ñâåðõó âíèç, SL = NormalizeDouble(Ask + StopLoss*Point, Digits); TP = NormalizeDouble(Ask - TakeProfit*Point, Digits); if ((CCI[1]<MA[limit-MA_Per-1]) && (CCI[2]>MA[limit-MA_Per-2])) { //---- îòêðûâàåì ÑÅËË ïîçèöèþ if(OrderSend( Symbol(), OP_SELL, LotA*Lots, Bid, 5, SL, TP, "CCI_test_close", _MagicNumber, 0, Red ) < 0 ) { _GetLastError = GetLastError(); Print( "Îøèáêà OrderSend OP_SELL ¹ ", _GetLastError ); Err=4; return(-1); } return(0); } } //+------------------------------------------------------------------+ //| Âûïîëíÿåì âû÷èñëåíèÿ ïðè êàæäîì èçìåíåíèè öåíû | //+------------------------------------------------------------------+ void EveryTick() { int i; if (MM==true) { if (AccountBalance()>(2*Deposit)) LotA=2; if (AccountBalance()>(3*Deposit)) LotA=3; if (AccountBalance()>(4*Deposit)) LotA=4; if (AccountBalance()>(5*Deposit)) LotA=5; if (AccountBalance()>(6*Deposit)) LotA=6; if (AccountBalance()>(7*Deposit)) LotA=7; if (AccountBalance()>(8*Deposit)) LotA=8; if (AccountBalance()>(9*Deposit)) LotA=9; if (AccountBalance()>(10*Deposit)) LotA=10; if (AccountBalance()>(11*Deposit)) LotA=11; if (AccountBalance()>(12*Deposit)) LotA=12; if (AccountBalance()>(13*Deposit)) LotA=13; if (AccountBalance()>(14*Deposit)) LotA=14; if (AccountBalance()>(15*Deposit)) LotA=15; if (AccountBalance()>(16*Deposit)) LotA=16; if (AccountBalance()>(17*Deposit)) LotA=17; if (AccountBalance()>(18*Deposit)) LotA=18; if (AccountBalance()>(19*Deposit)) LotA=19; if (AccountBalance()>(20*Deposit)) LotA=20; } int _GetLastError = 0, _OrdersTotal = OrdersTotal(); int z; double SL, TP; double MA[100], CCI[100], CCIclose[100], StandDevi[100]; int limit=ArraySize(CCI); for(i=0; i<limit; i++) { CCI[i]=iCCI(NULL,0,CCI_Per,PRICE_CLOSE,i); CCIclose[i]=iCCI(NULL,0,CCI_close_Per,PRICE_CLOSE,i); MA[i]=iMAOnArray(CCI,0,MA_Per,0,MODE_SMA,i); } switch(Err) { case 1: for ( z=_OrdersTotal - 1; z >= 0; z -- ) { if ( !OrderSelect( z, SELECT_BY_POS ) ) { _GetLastError = GetLastError(); Print( "OrderSelect( " ,z, ", SELECT_BY_POS ) - Error #", _GetLastError); continue; } if ( OrderSymbol() != Symbol() ) continue; if ( OrderMagicNumber() != _MagicNumber ) continue; if ( OrderType() == OP_BUY ) { if (((CCIclose[2]>100) && (CCIclose[1]<=100)) || (CCI[1]<MA[limit-MA_Per-1]) && (CCI[2]>=MA[limit-MA_Per-2])) { if ( !OrderClose( OrderTicket(), OrderLots(), Bid, 5, Green ) ) { _GetLastError = GetLastError(); Print( "Îøèáêà CASE OrderClose ¹ ", _GetLastError ); Err=1; return(-1); } else Err=0; } } } break; //============================================================================= case 2: for ( z=_OrdersTotal - 1; z >= 0; z -- ) { if ( !OrderSelect( z, SELECT_BY_POS ) ) { _GetLastError = GetLastError(); Print( "OrderSelect( " ,z, ", SELECT_BY_POS ) - Error #", _GetLastError); continue; } if ( OrderSymbol() != Symbol() ) continue; if ( OrderMagicNumber() != _MagicNumber ) continue; if ( OrderType() == OP_SELL ) { if (((CCIclose[2]<-100) && (CCIclose[1]>=-100)) || ((CCI[1]>MA[limit-MA_Per-1]) && (CCI[2]<=MA[limit-MA_Per-2]))) { if(!OrderClose( OrderTicket(), OrderLots(), Ask, 5, Red ) ) { _GetLastError = GetLastError(); Print( "Îøèáêà CASE OrderClose ¹ ", _GetLastError ); Err=2; return(-1); } else Err=0; } } } break; //============================================================================== case 3: SL = NormalizeDouble(Bid - StopLoss*Point, Digits); TP = NormalizeDouble(Bid + TakeProfit*Point, Digits); if(OrderSend( Symbol(), OP_BUY, LotA*Lots, Ask, 7, SL, TP, "AI_test_buy", _MagicNumber, 0, Green ) < 0 ) { _GetLastError = GetLastError(); Print( "Îøèáêà CASE OrderSend OP_BUY ¹ ", _GetLastError ); Err=3; return(-1); } else Err=0; break; //=================================================================================== case 4: SL = NormalizeDouble(Ask + StopLoss*Point, Digits); TP = NormalizeDouble(Ask - TakeProfit*Point, Digits); if(OrderSend( Symbol(), OP_SELL, LotA*Lots, Bid, 7, SL, TP, "AI_test_close", _MagicNumber, 0, Red ) < 0 ) { _GetLastError = GetLastError(); Print( "Îøèáêà CASE OrderSend OP_SELL ¹ ", _GetLastError ); Err=4; return(-1); } else Err=0; break; } }
Sample
Analysis
Market Information Used:
Series array that contains open time of each bar
Indicator Curves created:
Indicators Used:
Commodity channel index
Moving average indicator
Custom Indicators Used:
Order Management characteristics:
Checks for the total of open orders
It Closes Orders by itself
It automatically opens orders when conditions are reached
Other Features: