//+------------------------------------------------------------------+ //| Agent_Fx_v07_XZ_d_ss.mq4 | //| Voloshin Yuri | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ #property copyright "Voloshin Yuri" #property link "http://www.metaquotes.net" #define Magic 3017 extern string block_01 = " îñíîâíûå ïàðàìåòðû äëÿ èíäèêàòîðîâ"; extern double LotSize = 1.0; // Âåëè÷èíà òîðãóåìîãî ëîòà extern bool MM = true; // èñïîëüçîâàòü ëè ìàðòèíãåéë extern double LotExponent = 7; // íà ñêîëüêî óìíîæàòü óáûòî÷íûé ëîò extern int LotExponentStart = 1; // ïîñëå êàêîé ïî ñ÷¸òó óáûòî÷íîé ñäåëêè âêëþ÷àòü ìàðòèíãåéë extern int LotExponentMax = 3; // ñêîëüêî ðàç óìíîæàòü ëîò extern int SL = 200; // ÑòîïËîñ äëÿ îðäåðà, åñëè SL=0 çíà÷åíèå îïðåäåëÿåòñÿ ïî ïåðâîé ñâå÷å extern int TP = 41; // ÒåéêÏðîôèò äëÿ îðäåðà extern int kCCI = 27; // Êîýôôèöèåíò îñíîâíîãî èíäèêàòîðà extern string block_02 = " îñíîâíûå ïàðàìåòðû äëÿ áåçóáûòêà"; extern bool AllPositions = False; // Óïðàâëÿòü âñåìè ïîçèöèÿìè extern bool ProfitTrailing = True; // Òðàëèòü òîëüêî ïðîôèò extern int TrailingStop = 30; // Ôèêñèðîâàííûé ðàçìåð òðàëà extern int TrailingStep = 8; // Øàã òðàëà extern bool UseSound = True; // Èñïîëüçîâàòü çâóêîâîé ñèãíàë string NameFileSound = "expert.wav"; // Íàèìåíîâàíèå çâóêîâîãî ôàéëà // Ïîääåðæèâàåò äâà âèäà òðàëà: ïðîñòîé (ïàðàìåòð ProfitTrailing=False), ò.å. ñðàçó æå ïîñëå îòêðûòèÿ ïîçèöèè // ïîäòÿãèâàåòñÿ ñòîï íà ðàçìåð òðàëà è ïðîôèò-òðýéëèíã (ïàðàìåòð ProfitTrailing=True), ïðè êîòîðîì ñòîïû // äâèãàþòñÿ òîëüêî ïîñëå ïðåâûøåíèÿ ïðîôèòà ïîçû íàä ðàçìåðîì òðàëà. Âåøàòü íóæíî òîëüêî íà îäèí ëþáîé ãðàôèê, // à ñòîïû áóäóò äâèãàòüñÿ ó âñåõ îòêðûòûõ ïîçèöèé (ïàðàìåòð AllPositions=True). extern string block_03 = " íàñòðîéêà ôóíêöèè óïðàâëåíèÿ êàïèòàëîì"; extern bool uplot = true; // âêë/âûêë èçìåíåíèå âåëè÷èíû ëîòà extern double lotmin = 0.1; // íà÷àëüíîå çíà÷åíèå extern double lotmax = 0.7; // ïîòîëîê extern double lotstep = 0.1; // ïðèðàùåíèå ëîòà extern int lastprofit = 1; // ïðèíèìàåò çíà÷åíèÿ -1/1. // -1 - óâåëè÷åíèå ëîòà ïîñëå ìèíóñîâîé ñäåëêè äî ïåðâîé ïëþñîâîé. // 1 - óâåëè÷åíèå ëîòà ïîñëå ïëþñîâîé ñäåëêè äî ïåðâîé ìèíóñîâîé. //------- Ãëîáàëüíûå ïåðåìåííûå ñîâåòíèêà -------------------------------------+ double cci[10]; int i, total; int ticket; int slip = 3; double ldStop; double ldTake; string SMB; double PNT; int MinLevel; double lot, lots; int init() { SMB=Symbol(); //Ñèìâîë âàëþòíîé ïàðû PNT=MarketInfo(SMB,MODE_POINT); //Ðàçìåð ïóíêòà â âàëþòå êîòèðîâêè, //äëÿ òåêóùåãî èíñòðóìåíòà õðàíèòñÿ â ïðåäîïðåäåëåííîé ïåðåìåííîé Point MinLevel=MarketInfo(SMB,MODE_STOPLEVEL); //Ìèíèìàëüíî äîïóñòèìûé óðîâåíü ñòîï-ëîññà/òåéê-ïðîôèòà â ïóíêòàõ Proverka(); lot = LotSize; lots = LotSize; return(0); } int deinit() { //---- //---- return(0); } // ======================================================== // =================== ÍÀ×ÈÍÀÅÌ ÐÀÁÎÒÓ ==================== // ======================================================== int start() { RefreshRates(); // îïðåäåëÿåì íàëè÷èå äîñòàòî÷íûõ ñðåäñòâ íà äåïîçèòå if(AccountFreeMargin()<(1000*lots)) { Print("We have no money. Free Margin = ", AccountFreeMargin()); Alert("We have no money. Free Margin = ", AccountFreeMargin()); } // îïðåäåëÿåì âðåìÿ äëÿ ðàñ÷åòîâ è ðàáîòû ýêñïåðòà if(DayOfWeek()!=0 || DayOfWeek()!=6) // íå ðàáîòàåò â âûõîäíûå äíè. { double j, swo_L, swo_Y, swo_R; int m,s,k; m=Time[0]+Period()*60-CurTime(); // îïðåäåëÿåì âðåìÿ íà ñâå÷å j=m/60.0; s=m%60; m=(m-m%60)/60; if (m == 00 && s < 20) order(); // óñëîâèå äëÿ ïðèíÿòèÿ ðåøåíèÿ â êîíöå êàæäîé ñâå÷è } return(0); } // ======================================================== // =============== ÔÓÍÊÖÈß ÏÐÎÂÅÐÊÈ ÎÐÄÅÐΠ=============== // ======================================================== void order() { total=OrdersTotal(); // ôóíêöèÿ ïðîâåðÿåò íàëè÷èå îòêðûòûõ îðäåðîâ // åñëè îðäåðîâ íåò, èùåì âîçìîæíîñòü îòêðûòèÿ if(total<1) { // ôîðìèðóåì ìàñèâû èíäèêàòîðîâ è îïðåäåëÿåì òðåíä for(i=0; i<10; i++) { cci[i] = iCCI(NULL, 0, kCCI, PRICE_TYPICAL, i); } raschet(); } for (int i=0; i<OrdersTotal(); i++) // åñëè îòêðûòûå îðäåðà èìåþòñÿ { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { // âûáèðàåì ðûíî÷íûå îðäåðà è ïåðåõîäèì íà îáðàáîòêó if (OrderType() == OP_BUY || OrderType() == OP_SELL) BBU(); } } return; } // ======================================================== // ============ ÈÙÅÌ ÂÎÇÌÎÆÍÎÑÒÜ ÎÒÊÐÛÒÜ ÎÐÄÅÐ ============ // ======================================================== void raschet() { Comment("\n"," == ñîâåòíèê ÐÀÁÎÒÀÅÒ ==", "\n"," ======================", "\n"," ñïðåä = ", MarketInfo(Symbol(),MODE_SPREAD), "\n"," óðîâåíü ñòîï = ", MarketInfo(Symbol(),MODE_STOPLEVEL), "\n"," ======================", "\n"," Àíàëèçèðóþ ÈÍÄÈÊÀÒÎÐÛ "); // óñëîâèå ïîêóïêè íà íèæíåé âåðøèíå if(cci[1]<5 && cci[2]<cci[3] && cci[1]<cci[2] && cci[0]>cci[1] && Open[2]>Close[2] && Open[1]>Close[1] && Open[0]<Close[0] && Open[1]<Close[0]) pokypka(); // óñëîâèå ïðîäàæè íà âåðõíåé âåðøèíå if(cci[1]>-5 && cci[2]>cci[3] && cci[1]>cci[2] && cci[0]<cci[1] && Open[2]<Close[2] && Open[1]<Close[1] && Open[0]>Close[0] && Open[1]>Close[0]) prodaza(); return; } // ======================================================== // =================== ÎÒÊÐÛÂÀÅÌ ÎÐÄÅÐÀ =================== // ======================================================== void pokypka() { // îòêðûâàåì îðäåð "ÊÓÏÈÒÜ" GetLots(); // îïðåäåëÿåì ðàçìåð ëîòà äëÿ òîðãîâëè if (SL!=0) ldStop=Ask-SL*Point; if (SL==0) ldStop=Low[1]-7*Point; if (TP!=0) ldTake=Ask+TP*Point; ticket = OrderSend(Symbol(), OP_BUY, NormalizeDouble(lots,2), Ask, slip, ldStop, ldTake, NULL, Magic, 0, RoyalBlue); if (GetLastError()>0) Alert("îøèáêà ïîêóïêè = ", GetLastError()); if (ticket>0) { Comment("\n"," == ñîâåòíèê ÐÀÁÎÒÀÅÒ ==", "\n"," ======================", "\n"," ñïðåä = ", MarketInfo(Symbol(),MODE_SPREAD), "\n"," óðîâåíü ñòîï = ", MarketInfo(Symbol(),MODE_STOPLEVEL), "\n"," ======================", "\n"," ÎÒÊÐÛË îðäåð <<ÊÓÏÈÒÜ>>"); } return; } void prodaza() { // îòêðûâàåì îðäåð "ÏÐÎÄÀÒÜ" GetLots(); // îïðåäåëÿåì ðàçìåð ëîòà äëÿ òîðãîâëè if (SL!=0) ldStop=Bid+SL*Point; if (SL==0) ldStop=High[1]+7*Point; if (TP!=0) ldTake=Bid-TP*Point; ticket = OrderSend(Symbol(), OP_SELL, NormalizeDouble(lots,2), Bid, slip, ldStop, ldTake, NULL, Magic, 0, DeepPink); if (GetLastError()>0) Alert("îøèáêà ïðîäàæè = ", GetLastError()); if (ticket>0) { Comment("\n"," == ñîâåòíèê ÐÀÁÎÒÀÅÒ ==", "\n"," ======================", "\n"," ñïðåä = ", MarketInfo(Symbol(),MODE_SPREAD), "\n"," óðîâåíü ñòîï = ", MarketInfo(Symbol(),MODE_STOPLEVEL), "\n"," ======================", "\n"," ÎÒÊÐÛË îðäåð <<ÏÐÎÄÀÒÜ>>"); } return; } // ======================================================== // ============ ÐÀÁÎÒÀ Ñ ÐÛÍÎ×ÍÛÌÈ ÎÐÄÅÐÀÌÈ =============== // ======================================================== void BBU() { for (int i=0; i<OrdersTotal(); i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (AllPositions || OrderSymbol()==Symbol()) { TrailingPositions(); } } } } void TrailingPositions() { double pBid, pAsk, pp; pp = MarketInfo(OrderSymbol(), MODE_POINT); if (OrderType()==OP_BUY) { pBid = MarketInfo(OrderSymbol(), MODE_BID); if (!ProfitTrailing || (pBid-OrderOpenPrice())>TrailingStop*pp) { if (OrderStopLoss()<pBid-(TrailingStop+TrailingStep-1)*pp) { ModifyStopLoss(pBid-TrailingStop*pp); return; } } } if (OrderType()==OP_SELL) { pAsk = MarketInfo(OrderSymbol(), MODE_ASK); if (!ProfitTrailing || OrderOpenPrice()-pAsk>TrailingStop*pp) { if (OrderStopLoss()>pAsk+(TrailingStop+TrailingStep-1)*pp || OrderStopLoss()==0) { ModifyStopLoss(pAsk+TrailingStop*pp); return; } } } } void ModifyStopLoss(double ldStopLoss) { bool fm; fm=OrderModify(OrderTicket(),OrderOpenPrice(),ldStopLoss,OrderTakeProfit(),0,CLR_NONE); if (fm && UseSound) PlaySound(NameFileSound); } // ======================================================== // ============ ÔÓÍÊÖÈß ÓÏÐÀÂËÅÍÈß ÊÀÏÈÒÀËÎÌ ============== // ======================================================== double GetLots() { if (MM) { lots = LotSize; int ct = 0; for (int c=1;c<=OrdersTotal();c++) { OrderSelect(OrdersTotal()-c,SELECT_BY_POS,MODE_TRADES); if (OrderMagicNumber() != Magic) continue; ct+=1; break; } if (ct == 0) { int clt = 0; for (int co=1;co<=OrdersHistoryTotal();co++) { OrderSelect(OrdersHistoryTotal()-co,SELECT_BY_POS,MODE_HISTORY); if (OrderMagicNumber() != Magic) continue; if (OrderProfit() < 0) { clt+=1; if (clt < LotExponentStart+LotExponentMax) { lot = OrderLots(); } } else break; } if (clt >= LotExponentStart && LotExponentMax != 0) { clt = 0; int mult = 0; for (int co2=1;co2<=OrdersHistoryTotal();co2++) { OrderSelect(OrdersHistoryTotal()-co2,SELECT_BY_POS,MODE_HISTORY); if (OrderMagicNumber() != Magic) continue; if (OrderProfit() < 0) { clt+=1; if (clt >= LotExponentStart) { lot*=LotExponent; mult+=1; } } if (OrderProfit() >= 0) break; } if (mult <= LotExponentMax) lots = lot; } } } else { lots = lots; if (!uplot) return (lots); int ticket = GetLastOrderHist(); if (ticket == -1) return (lots); if (!OrderSelect(ticket, SELECT_BY_TICKET, MODE_HISTORY)) return (lots); if (OrderProfit()*lastprofit < 0) return (lots); lots = MathMin(OrderLots() + lotstep, lotmax); } return(lots); } int GetLastOrderHist(int type = -1) { int ticket = -1; datetime dt = 0; int cnt = HistoryTotal(); for (int i=0; i < cnt; i++) { if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue; //Îïöèîíàëüíî if (OrderSymbol() != Symbol()) continue; //Îïöèîíàëüíî if (OrderMagicNumber() != Magic) continue; if (type != -1 && OrderType() != type) continue; if (OrderCloseTime() > dt) { dt = OrderCloseTime(); ticket = OrderTicket(); } } return (ticket); } // ======================= Ïðîâåðêà êîððåêòíîñòè ïîëüçîâàòåëüñêèõ óñòàíîâîê ============================================= void Proverka() { if(TrailingStop<MinLevel && TrailingStop!=0) {Comment("Îøèáêà! ÒðåéëèíãÑòîï ðûíî÷íûõ îðäåðîâ íå ìîæåò áûòü ìåíåå ",MinLevel); Print("Îøèáêà! ÒðåéëèíãÑòîï ðûíî÷íûõ îðäåðîâ íå ìîæåò áûòü ìåíåå ",MinLevel); Alert("Îøèáêà! ÒðåéëèíãÑòîï ðûíî÷íûõ îðäåðîâ íå ìîæåò áûòü ìåíåå ",MinLevel); return(0);} if(TrailingStep>=MinLevel && TrailingStep==0) {Comment("Îøèáêà! Øàã òðåéëèíãà ðûíî÷íûõ îðäåðîâ íå ìîæåò áûòü ìåíåå 1"); Print("Îøèáêà! Øàã òðåéëèíãà ðûíî÷íûõ îðäåðîâ íå ìîæåò áûòü ìåíåå 1"); Alert("Îøèáêà! Øàã òðåéëèíãà ðûíî÷íûõ îðäåðîâ íå ìîæåò áûòü ìåíåå 1"); return(0);} if(TP<MinLevel && TP!=0) {Comment("Îøèáêà! TP íå ìîæåò áûòü ìåíåå ",MinLevel); Print("Îøèáêà! TP íå ìîæåò áûòü ìåíåå ",MinLevel); Alert("Îøèáêà! TP íå ìîæåò áûòü ìåíåå ",MinLevel); return(0);} if(SL<MinLevel && SL!=0) {Comment("Îøèáêà! SL íå ìîæåò áûòü ìåíåå ",MinLevel); Print("Îøèáêà! SL íå ìîæåò áûòü ìåíåå ",MinLevel); Alert("Îøèáêà! SL íå ìîæåò áûòü ìåíåå ",MinLevel); return(0);} } // ============================================================================================================================
Sample
Analysis
Market Information Used:
Series array that contains open time of each bar
Series array that contains close prices for each bar
Series array that contains open prices of each bar
Series array that contains the lowest prices of each bar
Series array that contains the highest prices of each bar
Indicator Curves created:
Indicators Used:
Commodity channel index
Custom Indicators Used:
Order Management characteristics:
Checks for the total of open orders
It automatically opens orders when conditions are reached
It can change open orders parameters, due to possible stepping strategy
Checks for the total of closed orders
Other Features:
It issuies visual alerts to the screen
It plays sound alerts