#property copyright "Copyright © 2009, Victor Chebotariov" #property link "http://www.chebotariov.com" #define magic 1052009 #define MAGICNUM 14052009 //+------------------------------------------------------------------+ //| SU.mq4 | //| Copyright © 2009, murnail | //| mailto:murnail@yandex.ru | //+------------------------------------------------------------------+ #property copyright "Copyright © 2009, murnail" #property link "mailto:murnail@yandex.ru" //Ïîïûòêà îáúåäåíèòü ÑÑI_TRADER è ñâîé ïåðâûé âàðèàíò, ãäå Ñåëë è Áàé îòä. ñîâåòíèêè... //---- input parameters extern double OpenT = 50; extern double Lot = 0.6; extern double Lot2 = 0.5; extern double TakeProfit = 410; extern int StopLoss = 150; extern int N_MaxBar = 1000; extern double Delta = 50000; extern string t="Íàñòðîéêè èíäèêàòîðîâ"; extern int period = 580; extern int L1 = 100; extern int L2 = 240; extern int L3 = 300; extern int L4 = 250; extern int L5 = 270; extern int L6 = 280; extern int slippage=3; //extern int TakeProfit_L = 70; // Óðîâåíü òåéêïðîôèò â ïóíêòàõ //extern int StopLoss_L = 147; // óðîâåíü ñòîïëîññ â ïóíêòàõ //extern int TakeProfit_S = 50; // Óðîâåíü òåéêïðîôèò â ïóíêòàõ //extern int StopLoss_S = 257; // óðîâåíü ñòîïëîññ â ïóíêòàõ //+------------------------------------------------------------------+ //| CCI_TRADER expert start function | //+------------------------------------------------------------------+ //******************** //ïîäñ÷åò òåêóùåãî êîëè÷åñòâà îòêðûòûõ ïîçèöèé íà ïîêóïêó int CalcNumLongs() { int nLongs = 0; for (int i = 0; i < OrdersTotal(); i++) { int resL = OrderSelect(i, SELECT_BY_POS, MODE_TRADES); if (resL == 0) { Print ("Îøèáêà ïðè âûáîðå îðäåðà: ", GetLastError()); return; } if (OrderSymbol() == Symbol() && OrderMagicNumber() == MAGICNUM && OrderType() == OP_BUY) nLongs++; } return (nLongs); } //ïîäñ÷åò òåêóùåãî êîëè÷åñòâà îòêðûòûõ ïîçèöèé íà ïðîäàæó int CalcNumShorts() { int nShorts = 0; for (int iS = 0; iS < OrdersTotal(); iS++) { int resS = OrderSelect(iS, SELECT_BY_POS, MODE_TRADES); if (resS == 0) { Print ("Îøèáêà ïðè âûáîðå îðäåðà: ", GetLastError()); return; } if (OrderSymbol() == Symbol() && OrderMagicNumber() == MAGICNUM && OrderType() == OP_SELL) nShorts++; } return (nShorts); } //ïîïûòêà îòêðûòü íîâûé îðäåð void CheckForOpen() { bool found = false; //ïîèñê ïîñëåäíåãî îòêðûòîãî îðäåðà íà ïîêóïêó for (int i = OrdersTotal() - 1; i >= 0; i--) { int res = OrderSelect(i, SELECT_BY_POS, MODE_TRADES); if (res == 0) { Print ("Îøèáêà ïðè âûáîðå îðäåðà: ", GetLastError()); return; } if (OrderMagicNumber() == MAGICNUM && OrderSymbol() == Symbol() && OrderType() == OP_BUY) { found = true; //...íàøëè ïîñëåäíèé îòêðûòûé îðäåð íà ïîêóïêó break; //ïîèñê ïîñëåäíåãî îòêðûòîãî îðäåðà íà ïðîäàæó } if (OrderMagicNumber() == MAGICNUM && OrderSymbol() == Symbol() && OrderType() == OP_SELL) { found = true; //...íàøëè ïîñëåäíèé îòêðûòûé îðäåð íà ïðîäàæó break; } if (!found) { Print ("Îøèáêà: íå ñìîãëè íàéòè îæèäàåìîãî îòêðûòîãî îðäåðà íà ïîêóïêó: ", GetLastError()); return; } //åñëè óáûòîê ïðåâûøàåò çíà÷åíèå ïåðåìåííîé OpenT, îòêðûâàåì îðäåð íà ïîêóïêó if (OrderProfit() <= OpenT) Print ("Óáûòîê ïðåâûñèë çíà÷åíèå, îòêðûâàåì íîâûé îðäåð"); { double Min = Close[ArrayMinimum(Close, N_MaxBar, 1)]; Print (Bid, " ", Min - Delta * Point); res = OrderSend (Symbol(), OP_BUY, Lot, Ask, 3, Min - Delta * Point, Ask + TakeProfit * Point, "", MAGICNUM, 0, Blue); if (res == 0) { Print ("Îøèáêà îòêðûòèÿ îðäåðà íà ïîêóïêó: ",GetLastError()); return; } if (!found) { Print ("Îøèáêà: íå ñìîãëè íàéòè îæèäàåìîãî îòêðûòîãî îðäåðà íà ïðîäàæó: ", GetLastError()); return; } } } //åñëè óáûòîê ïðåâûøàåò çíà÷åíèå ïåðåìåííîé OpenT, îòêðûâàåì îðäåð íà ïðîäàæó if (OrderProfit() <= OpenT) { Print (OrderProfit()); double Max = Close[ArrayMaximum(Close, N_MaxBar, 1)]; Print (Bid, " ", Max + Delta * Point); res = OrderSend (Symbol(), OP_SELL, Lot, Bid, 3, Max + Delta * Point, Bid - TakeProfit * Point, "", MAGICNUM, 0, Red); if (res == 0) { Print ("Îøèáêà îòêðûòèÿ îðäåðà íà ïðîäàæó: ",GetLastError()); return; } if (!found) { Print ("Îøèáêà: íå ñìîãëè íàéòè îæèäàåìîãî îòêðûòîãî îðäåðà íà ïîêóïêó: ", GetLastError()); return; } } } //******************** //ÍÀ×ÀËÎ ÐÀÁÎÒÛ int start() { //---- double val = iCCI(NULL ,0,period,PRICE_TYPICAL,0); int ticket, cnt, total=OrdersTotal(); if(total<1) { if(val>L1) { ticket=OrderSend(Symbol(),OP_BUY,Lot2,Ask,slippage,Ask-StopLoss*Point, Ask+TakeProfit*Point,"CCI_TRADER",magic,0,Green); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice()); //***************** { //ïðîâåðêà íåîáõîäèìûõ óñëîâèé äëÿ òîðãîâëè if (Bars < N_MaxBar || IsTradeAllowed() == false) return; Print ("Îòêðûòûõ îðäåðîâ Áàé íåò "); //åñëè íåò îòêðûòûõ ïîçèöèé, îòêðûâààåì ïîçèöèþ íà ïîêóïêó if (CalcNumLongs() == 0) { double Min = Close[ArrayMinimum(Close, N_MaxBar, 1)]; Print (Bid, " ", Min - Delta * Point); int resL = OrderSend (Symbol(), OP_BUY, Lot, Ask, 3, Min - Delta * Point, Ask + TakeProfit * Point, "", MAGICNUM, 0, Blue); Print ("Îòêðûëè îðäåð Ñåëë"); if (resL == 0) { Print ("Îøèáêà îòêðûòèÿ îðäåðà íà ïîêóïêó: ",GetLastError()); return; } } else CheckForOpen(); return; } //***************** } else { Print("Error opening BUY order : ",GetLastError()); return(0); } } else if(val<-L2) { ticket=OrderSend(Symbol(),OP_SELL,Lot2,Bid,slippage,Bid+StopLoss*Point, Bid-TakeProfit*Point,"CCI_TRADER",magic,0,Red); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice()); //************* { //ïðîâåðêà íåîáõîäèìûõ óñëîâèé äëÿ òîðãîâëè if (Bars < N_MaxBar || IsTradeAllowed() == false) return; Print ("Îòêðûòûõ îðäåðîâ Ñåëë íåò "); //åñëè íåò îòêðûòûõ ïîçèöèé, îòêðûâààåì ïîçèöèþ íà ïðîäàæó if (CalcNumShorts() == 0) { double Max = Close[ArrayMaximum(Close, N_MaxBar, 1)]; Print (Bid, " ", Max + Delta * Point); int resS = OrderSend (Symbol(), OP_SELL, Lot, Bid, 3, Max + Delta * Point, Bid - TakeProfit * Point, "", MAGICNUM, 0, Red); Print ("Îòêðûëè îðäåð Ñåëë"); if (resS == 0) { Print ("Îøèáêà îòêðûòèÿ îðäåðà íà ïðîäàæó: ",GetLastError()); return; } } else CheckForOpen(); return; } //************* } else { Print("Error opening SELL order : ",GetLastError()); return(0); } } } if (OrderMagicNumber()==magic) { 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(val<-L3) { OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // close position return(0); // exit } } else // go to short position { // should it be closed? if(val>L4) { OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // close position return(0); // exit } } } } 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(val<-L5) { OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // close position return(0); // exit } } else // go to short position { // should it be closed? if(val>L6) { OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // close position return(0); // exit } } } } //---- return(0); } //+------------------------------------------------------------------+
Sample
Analysis
Market Information Used:
Series array that contains close prices for each bar
Indicator Curves created:
Indicators Used:
Commodity channel index
Custom Indicators Used:
Order Management characteristics:
Checks for the total of open orders
It Closes Orders by itself
Other Features: