//+------------------------------------------------------------------+ //| Agent_Fx_v07_XZ_d.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 lots = 0.25; // Âåëè÷èíà òîðãóåìîãî ëîòà extern int SL = 180; // ÑòîïËîñ äëÿ îðäåðà, åñëè SL=0 çíà÷åíèå îïðåäåëÿåòñÿ ïî ïåðâîé ñâå÷å extern int TP = 170; // ÒåéêÏðîôèò äëÿ îðäåðà extern int DistSet = 10; // Äèñòàíöèÿ îò öåíû íà êîòîðóþ âûñòàâëÿåì îòëîæåííûé îðäåð extern int kCCI = 27; // Êîýôôèöèåíò îñíîâíîãî èíäèêàòîðà extern string block_02 = " íàñòðîéêà òðàëà ñòîïîâûõ îðäåðîâ"; extern bool UseTrailS = true; // âêë/âûêë ôóíêöèè òðàëà ñòîïîâûõ îðäåðîâ bool AllStopOrders = false; // Óïðàâëÿòü âñåìè ñòîïîâûìè îðäåðàìè // Åñëè ïîñòàâèòü íà îäèí ñ ïàðàìåòðîì AllSymbols=True, ñîâåòíèê áóäåò òðàëèòü âñå ñòîïîâûå îðäåðà. // Íà íåñêîëüêî ãðàôèêîâ ñîâåòíèê íóæíî ñòàâèòü ñ ïàðàìåòðîì AllSymbols=False, ÷òîáû ðàçíûå êîïèè // ñîâåòíèêîâ íå ìåøàëè äðóã äðóãó extern int TrailingStop = 15; // Ôèêñèðîâàííûé ðàçìåð òðàëà extern int TrailingStep = 6; // Øàã òðàëà extern bool TrailSL = true; extern bool TrailTP = true; bool UseSound = True; // Èñïîëüçîâàòü çâóêîâîé ñèãíàë color clModifyBuy = Aqua; // Öâåò çíà÷êà ìîäèôèêàöèè ïîêóïêè color clModifySell = Tomato; // Öâåò çíà÷êà ìîäèôèêàöèè ïðîäàæè //------- Ãëîáàëüíûå ïåðåìåííûå òðàëà -------------------------------------+ string SoundSuccess = "ok.wav"; // Çâóê óñïåõà string SoundError = "timeout.wav"; // Çâóê îøèáêè int NumberOfTry = 4; // Êîëè÷åñòâî òîðãîâûõ ïîïûòîê //------- Ïîäêëþ÷åíèå âíåøíèõ ìîäóëåé -----------------------------------------+ #include <stdlib.mqh> // Ñòàíäàðòíàÿ áèáëèîòåêà #include <WinUser32.mqh> extern string block_03 = " íàñòðîéêà òðàëà ðûíî÷íûõ îðäåðîâ"; extern bool UseTrailM = true; // âêë/âûêë ôóíêöèè òðàëà ðûíî÷íûõ îðäåðîâ bool SymbolsAll = false; // óïðàâëÿòü ñòîïëîñàìè âñåõ ñèìâîëîâ extern int MinProfit = 6; // ïóíêòîâ ïðîôèòà êîãäà òðåéëèíã íà÷èíàåò ðàáîòó extern int Tr_Stop = 12; // âåëè÷èíà òðàëà extern int Tr_Step = 1; // øàã òðàëà extern string block_04 = " íàñòðîéêà ôóíêöèè óïðàâëåíèÿ êàïèòàëîì"; 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]; datetime LastCheck = 0; int i, total; int order_type; int ticket; int slip = 3; double pAsk; double pBid; double ldStop; double ldTake; string SMB; double PNT; int MinLevel; int init() { SMB=Symbol(); //Ñèìâîë âàëþòíîé ïàðû PNT=MarketInfo(SMB,MODE_POINT); //Ðàçìåð ïóíêòà â âàëþòå êîòèðîâêè, //äëÿ òåêóùåãî èíñòðóìåíòà õðàíèòñÿ â ïðåäîïðåäåëåííîé ïåðåìåííîé Point MinLevel=MarketInfo(SMB,MODE_STOPLEVEL); //Ìèíèìàëüíî äîïóñòèìûé óðîâåíü ñòîï-ëîññà/òåéê-ïðîôèòà â ïóíêòàõ Proverka(); 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_BUYSTOP || OrderType() == OP_SELLSTOP) { if (UseTrailS) Tr_StOrd(); } // âûáèðàåì ðûíî÷íûå îðäåðà è ïåðåõîäèì íà îáðàáîòêó if (OrderType() == OP_BUY || OrderType() == OP_SELL) { if (UseTrailM) Tr_Mrkt(); } } } 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(); // îïðåäåëÿåì ðàçìåð ëîòà äëÿ òîðãîâëè pAsk = Ask + DistSet*Point; if (SL!=0) ldStop=pAsk-SL*Point; if (SL==0) ldStop=Low[1]-7*Point; if (TP!=0) ldTake=pAsk+TP*Point; ticket = OrderSend(Symbol(), OP_BUYSTOP, lots, pAsk, 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(); // îïðåäåëÿåì ðàçìåð ëîòà äëÿ òîðãîâëè pBid=Bid - DistSet*Point; if (SL!=0) ldStop=pBid+SL*Point; if (SL==0) ldStop=High[1]+7*Point; if (TP!=0) ldTake=pBid-TP*Point; ticket = OrderSend(Symbol(), OP_SELLSTOP, lots, pBid, 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 Tr_StOrd() { for (int i=0; i<OrdersTotal(); i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (AllStopOrders || OrderSymbol()==Symbol()) { TrailingOrders(); } } } return; } //+-------------------------------------------------------+ //| Ñîïðîâîæäåíèå îðäåðîâ ïðîñòûì òðàëîì | //+-------------------------------------------------------+ void TrailingOrders() { double di, pa, pb, pp, sl, tp; pp=MarketInfo(OrderSymbol(), MODE_POINT); if (OrderType()==OP_BUYSTOP) { pa=MarketInfo(OrderSymbol(), MODE_ASK); if (OrderOpenPrice()-pa>(TrailingStop+TrailingStep-1)*pp) { di=OrderOpenPrice()-pa-TrailingStop*pp; if (TrailSL==true && OrderStopLoss() >0) sl=OrderStopLoss() -di; else sl=ldStop; if (TrailTP==true && OrderTakeProfit()>0) tp=OrderTakeProfit()-di; else tp=ldTake; ModifyOrder(pa+TrailingStop*pp, sl, tp); } } if (OrderType()==OP_SELLSTOP) { pb=MarketInfo(OrderSymbol(), MODE_BID); if (pb-OrderOpenPrice()>(TrailingStop+TrailingStep-1)*pp) { di=pb-OrderOpenPrice()-TrailingStop*pp; if (TrailSL==true && OrderStopLoss() >0) sl=OrderStopLoss() +di; else sl=ldStop; if (TrailTP==true && OrderTakeProfit()>0) tp=OrderTakeProfit()+di; else tp=ldTake; ModifyOrder(pb-TrailingStop*pp, sl, tp); } } return; } //+-------------------------------------------------------+ //| Îïèñàíèå : Âîçâðàùàåò îäíî èç äâóõ | //| çíà÷åíèé âçàâèñèìîñòè îò óñëîâèÿ. | //+-------------------------------------------------------+ color IIFc(bool condition, color ifTrue, color ifFalse) { if (condition) return(ifTrue); else return(ifFalse); } //+-------------------------------------------------------+ //| Îïèñàíèå : Ìîäèôèêàöèÿ îäíîãî | //| ïðåäâàðèòåëüíî âûáðàííîãî îðäåðà. | //+-------------------------------------------------------+ //| Ïàðàìåòðû: | //| pp - öåíà óñòàíîâêè îðäåðà | //| sl - öåíîâîé óðîâåíü ñòîïà | //| tp - öåíîâîé óðîâåíü òåéêà | //| ex - äàòà èñòå÷åíèÿ | //+-------------------------------------------------------+ void ModifyOrder(double pp=-1, double sl=0, double tp=0, datetime ex=0) { bool fm; color cl=IIFc(OrderType()==OP_BUYSTOP, clModifyBuy, clModifySell); double op, pa, pb, os, ot; int dg=MarketInfo(OrderSymbol(), MODE_DIGITS), er, it; if (pp<=0) pp=OrderOpenPrice(); if (sl<0 ) sl=OrderStopLoss(); if (tp<0 ) tp=OrderTakeProfit(); pp=NormalizeDouble(pp, dg); sl=NormalizeDouble(sl, dg); tp=NormalizeDouble(tp, dg); op=NormalizeDouble(OrderOpenPrice() , dg); os=NormalizeDouble(OrderStopLoss() , dg); ot=NormalizeDouble(OrderTakeProfit(), dg); if (pp!=op || sl!=os || tp!=ot) { for (it=1; it<=NumberOfTry; it++) { RefreshRates(); fm=OrderModify(OrderTicket(), pp, sl, tp, ex, cl); if (fm) { if (UseSound) PlaySound(SoundSuccess); break; } else { er=GetLastError(); if (UseSound) PlaySound(SoundError); pa=MarketInfo(OrderSymbol(), MODE_ASK); pb=MarketInfo(OrderSymbol(), MODE_BID); Print("Error(",er,") modifying order: ",ErrorDescription(er),", try ",it); Print("Ask=",pa," Bid=",pb," sy=",OrderSymbol(), " op="+GetNameOP(OrderType())," pp=",pp," sl=",sl," tp=",tp); Sleep(1000*10); } } } return; } //+-------------------------------------------------------+ //| Îïèñàíèå : Âîçâðàùàåò íàèìåíîâàíèå òîðãîâîé îïåðàöèè | //+-------------------------------------------------------+ //| Ïàðàìåòðû: | //| op - èäåíòèôèêàòîð òîðãîâîé îïåðàöèè | //+-------------------------------------------------------+ string GetNameOP(int op) { switch (op) { case OP_BUYSTOP : return("BuyStop"); case OP_SELLSTOP : return("SellStop"); default : return("Unknown Operation"); } return; } // ======================================================== // =============== ÒÐÀË ÐÛÍÎ×ÍÛÕ ÎÐÄÅÐΠ================== // ======================================================== void Tr_Mrkt() { for (int i=0; i<OrdersTotal(); i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (SymbolsAll || OrderSymbol()==Symbol()) { TrailPositions(); } } } return; } void TrailPositions() { int cnt = OrdersTotal(); for (int i=0; i<cnt; i++) { if (!(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))) continue; if (OrderSymbol() != Symbol()) continue; if (OrderType() == OP_BUY) { Comment("\n"," == ñîâåòíèê ÐÀÁÎÒÀÅÒ ==", "\n"," ======================", "\n"," ñïðåä = ", MarketInfo(Symbol(),MODE_SPREAD), "\n"," óðîâåíü ñòîï = ", MarketInfo(Symbol(),MODE_STOPLEVEL), "\n"," ======================", "\n"," Òðàëèì ÐÛÍÎ×ÍÛÉ îðäåð <<ÊÓÏÈÒÜ>>"); if (Bid-OrderOpenPrice() > MinProfit*Point) { if (OrderStopLoss() < Bid-(Tr_Stop+Tr_Step-1)*Point) { OrderModify(OrderTicket(), OrderOpenPrice(), Bid-Tr_Stop*Point, OrderTakeProfit(), 0, Blue); } } } if (OrderType() == OP_SELL) { Comment("\n"," == ñîâåòíèê ÐÀÁÎÒÀÅÒ ==", "\n"," ======================", "\n"," ñïðåä = ", MarketInfo(Symbol(),MODE_SPREAD), "\n"," óðîâåíü ñòîï = ", MarketInfo(Symbol(),MODE_STOPLEVEL), "\n"," ======================", "\n"," Òðàëèì ÐÛÍÎ×ÍÛÉ îðäåð <<ÏÐÎÄÀÒÜ>>"); if (OrderOpenPrice()-Ask > MinProfit*Point) { if (OrderStopLoss() > Ask+(Tr_Stop+Tr_Step-1)*Point || OrderStopLoss() == 0) { OrderModify(OrderTicket(), OrderOpenPrice(), Ask+Tr_Stop*Point, OrderTakeProfit(), 0, Blue); } } } } return; } // ======================================================== // ============ ÔÓÍÊÖÈß ÓÏÐÀÂËÅÍÈß ÊÀÏÈÒÀËÎÌ ============== // ======================================================== double GetLots() { 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); //Alert(" ÔÓÍÊÖÈß óïðàâëåíèÿ êàïèòàëîì "); 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(Tr_Stop<MinLevel && Tr_Stop!=0) {Comment("Îøèáêà! ÒðåéëèíãÑòîï ðûíî÷íûõ îðäåðîâ íå ìîæåò áûòü ìåíåå ",MinLevel); Print("Îøèáêà! ÒðåéëèíãÑòîï ðûíî÷íûõ îðäåðîâ íå ìîæåò áûòü ìåíåå ",MinLevel); Alert("Îøèáêà! ÒðåéëèíãÑòîï ðûíî÷íûõ îðäåðîâ íå ìîæåò áûòü ìåíåå ",MinLevel); return(0);} if(Tr_Step>=MinLevel && Tr_Step==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);} if(DistSet<MinLevel && DistSet!=0) {Comment("Îøèáêà! DistSet íå ìîæåò áûòü ìåíåå ",MinLevel); Print("Îøèáêà! DistSet íå ìîæåò áûòü ìåíåå ",MinLevel); Alert("Îøèáêà! DistSet íå ìîæåò áûòü ìåíåå ",MinLevel); return(0);} 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);} } // ============================================================================================================================
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
Other Features:
It issuies visual alerts to the screen
It plays sound alerts