//+------------------------------------------------------------------+ //| TrailingFiftyFifty.mq4 | //| I_D | //| http://www.mymmk.com/ | //+------------------------------------------------------------------+ #property copyright "I_D" #property link "http://www.mymmk.com/ Ñîôò äëÿ óïðàâëåíèÿ êàïèòàëîì" extern int iTicket; // óíèêàëüíûé íîìåð (òèêåò) îòêðûòîé ïîçèöèè extern int iTmFrme = 60; // ïåðèîä ÷àðòà, ïî áàðàì êîòîðîãî ïðîèñõîäèò ïîäæàòèå extern double dCoeff = 0.5; // "êîýôôèöèåíò ïîäæàòèÿ", â % îò 0.01 äî 1 extern bool bTrlinloss = false; // ñëåäóåò ëè òðàëèòü íà ó÷àñòêå ëîññîâ (ìåæäó êóðñîì ñòîïëîññà è îòêðûòèÿ) static datetime sdtPrevtime = 0; //+------------------------------------------------------------------+ //| ÒÐÅÉËÈÍà "ÏÎËÎÂÈÍßÙÈÉ" | //| Ïî çàêðûòèè î÷åðåäíîãî ïåðèîäà (áàðà) ïîäòÿãèâàåì ñòîïëîññ íà | //| ïîëîâèíó (íî ìîæíî è ëþáîé èíîé êîýôôèöèåíò) äèñòàíöèè, ïðîé- | //| äåííîé êóðñîì (ò.å., íàïðèìåð, ïî çàêðûòèè ñóòîê ïðîôèò +55 ï. - | //| ñòîïëîññ ïåðåíîñèì â 55/2=27 ï. Åñëè ïî çàêðûòèè ñëåä. | //| ñóòîê ïðîôèò äîñòèã, äîïóñòèì, +80 ï., òî ñòîïëîññ ïåðåíîñèì íà | //| ïîëîâèíó (íàïð.) ðàññòîÿíèÿ ìåæäó òåê. ñòîïëîññîì è êóðñîì íà | //| çàêðûòèè áàðà - 27 + (80-27)/2 = 27 + 53/2 = 27 + 26 = 53 ï. | //| Ïðè çàïóñêå ýêñïåðòà åìó íåîáõîäèìî óêàçàòü óíèêàëüíûé íîìåð | //| (òèêåò) îòêðûòîé ïîçèöèè (iTicket); iTmFrme - òàéìôðåéì (â | //| ìèíóòàõ, öèôðàìè dCoeff - "êîýôôèöèåíò ïîäæàòèÿ", â % îò 0.01 äî | //| 1 (â ïîñëåäíåì ñëó÷àå ñòîïëîññ áóäåò ïåðåíåñåí (åñëè ïîëó÷èòñÿ) | //| âïëîòíóþ ê òåê. êóðñó è ïîçèöèÿ, ñêîðåå âñåãî, ñðàçó æå | //| çàêðîåòñÿ) bTrlinloss - ñòîèò ëè òðàëèòü íà ëîññîâîì ó÷àñòêå - | //| åñëè äà, òî ïî çàêðûòèþ î÷åðåäíîãî áàðà ðàññòîÿíèå ìåæäó | //| ñòîïëîññîì (â ò.÷. "äî" áåçóáûòêà) è òåêóùèì êóðñîì áóäåò | //| ñîêðàùàòüñÿ â dCoeff ðàç ÷òîáû ïîñë. âàðèàíò ðàáîòàë, îáÿçàòåëüíî| //| äîëæåí áûòü îïðåäåë¸í còîïëîññ (íå ðàâåí 0) | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { TrailingFiftyFifty(iTicket,iTmFrme,dCoeff,bTrlinloss); return(0); } //+------------------------------------------------------------------+ void TrailingFiftyFifty(int iTicket,int iTmFrme,double dCoeff,bool bTrlinloss) { // àêòèâèðóåì òðåéëèíã òîëüêî ïî çàêðûòèè áàðà if (sdtPrevtime == iTime(Symbol(),iTmFrme,0)) return(0); else { sdtPrevtime = iTime(Symbol(),iTmFrme,0); // ïðîâåðÿåì ïåðåäàííûå çíà÷åíèÿ if ((iTicket==0) || (!OrderSelect(iTicket,SELECT_BY_TICKET)) || ((iTmFrme!=1) && (iTmFrme!=5) && (iTmFrme!=15) && (iTmFrme!=30) && (iTmFrme!=60) && (iTmFrme!=240) && (iTmFrme!=1440) && (iTmFrme!=10080) && (iTmFrme!=43200)) || (dCoeff<0.01) || (dCoeff>1.0)) { Print("Òðåéëèíã ôóíêöèåé TrailingFiftyFifty() íåâîçìîæåí èç-çà íåêîððåêòíîñòè çíà÷åíèé ïåðåäàííûõ åé àðãóìåíòîâ."); return(0); } // íà÷èíàåì òðàëèòü - ñ ïåðâîãî áàðà ïîñëå îòêðûâàþùåãî (èíà÷å ïðè bTrlinloss ñðàçó æå ïîñëå îòêðûòèÿ // ïîçèöèè ñòîïëîññ áóäåò ïåðåíåñåí íà ïîëîâèíó ðàññòîÿíèÿ ìåæäó ñòîïëîññîì è êóðñîì îòêðûòèÿ) // ò.å. ðàáîòàåì òîëüêî ïðè óñëîâèè, ÷òî ñ ìîìåíòà OrderOpenTime() ïðîøëî íå ìåíåå iTmFrme ìèíóò if (iTime(Symbol(),iTmFrme,0)>OrderOpenTime()) { double dBid = MarketInfo(Symbol(),MODE_BID); double dAsk = MarketInfo(Symbol(),MODE_ASK); double dNewSl; double dNexMove; // äëÿ äëèííîé ïîçèöèè ïåðåíîñèì ñòîïëîññ íà dCoeff äèñòàíöèè îò êóðñà îòêðûòèÿ äî Bid íà ìîìåíò îòêðûòèÿ áàðà // (åñëè òàêîé ñòîïëîññ ëó÷øå èìåþùåãîñÿ è èçìåíÿåò ñòîïëîññ â ñòîðîíó ïðîôèòà) if (OrderType()==OP_BUY) { if ((bTrlinloss) && (OrderStopLoss()!=0)) { dNexMove = NormalizeDouble(dCoeff*(dBid-OrderStopLoss()),Digits); dNewSl = NormalizeDouble(OrderStopLoss()+dNexMove,Digits); } else { // åñëè ñòîïëîññ íèæå êóðñà îòêðûòèÿ, òî òðàëèì "îò êóðñà îòêðûòèÿ" if (OrderOpenPrice()>OrderStopLoss()) { dNexMove = NormalizeDouble(dCoeff*(dBid-OrderOpenPrice()),Digits); //Print("dNexMove = ",dCoeff,"*(",dBid,"-",OrderOpenPrice(),")"); dNewSl = NormalizeDouble(OrderOpenPrice()+dNexMove,Digits); //Print("dNewSl = ",OrderOpenPrice(),"+",dNexMove); } // åñëè ñòîïëîññ âûøå êóðñà îòêðûòèÿ, òðàëèì îò ñòîïëîññà if (OrderStopLoss()>=OrderOpenPrice()) { dNexMove = NormalizeDouble(dCoeff*(dBid-OrderStopLoss()),Digits); dNewSl = NormalizeDouble(OrderStopLoss()+dNexMove,Digits); } } // ñòîïëîññ ïåðåìåùàåì òîëüêî â ñëó÷àå, åñëè íîâûé ñòîïëîññ ëó÷øå òåêóùåãî è åñëè ñìåùåíèå - â ñòîðîíó ïðîôèòà // (ïðè ïåðâîì ïîäæàòèè, îò êóðñà îòêðûòèÿ, íîâûé ñòîïëîññ ìîæåò áûòü ëó÷øå èìåþùåãîñÿ, è â òî æå âðåìÿ íèæå // êóðñà îòêðûòèÿ (åñëè dBid íèæå ïîñëåäíåãî) if ((dNewSl>OrderStopLoss()) && (dNexMove>0) && ((dNewSl<Bid- MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))) { if (!OrderModify(OrderTicket(),OrderOpenPrice(),dNewSl,OrderTakeProfit(),OrderExpiration(),Red)) Print("Íå óäàëîñü ìîäèôèöèðîâàòü ñòîïëîññ îðäåðà ¹",OrderTicket(),". Îøèáêà: ",GetLastError()); } } // äåéñòâèÿ äëÿ êîðîòêîé ïîçèöèè if (OrderType()==OP_SELL) { if ((bTrlinloss) && (OrderStopLoss()!=0)) { dNexMove = NormalizeDouble(dCoeff*(OrderStopLoss()-(dAsk+MarketInfo(Symbol(),MODE_SPREAD)*Point)),Digits); dNewSl = NormalizeDouble(OrderStopLoss()-dNexMove,Digits); } else { // åñëè ñòîïëîññ âûøå êóðñà îòêðûòèÿ, òî òðàëèì "îò êóðñà îòêðûòèÿ" if (OrderOpenPrice()<OrderStopLoss()) { dNexMove = NormalizeDouble(dCoeff*(OrderOpenPrice()-(dAsk+MarketInfo(Symbol(),MODE_SPREAD)*Point)),Digits); dNewSl = NormalizeDouble(OrderOpenPrice()-dNexMove,Digits); } // åñëè ñòîïëîññ íèæó êóðñà îòêðûòèÿ, òðàëèì îò ñòîïëîññà if (OrderStopLoss()<=OrderOpenPrice()) { dNexMove = NormalizeDouble(dCoeff*(OrderStopLoss()-(dAsk+MarketInfo(Symbol(),MODE_SPREAD)*Point)),Digits); dNewSl = NormalizeDouble(OrderStopLoss()-dNexMove,Digits); } } // ñòîïëîññ ïåðåìåùàåì òîëüêî â ñëó÷àå, åñëè íîâûé ñòîïëîññ ëó÷øå òåêóùåãî è åñëè ñìåùåíèå - â ñòîðîíó ïðîôèòà if ((dNewSl<OrderStopLoss()) && (dNexMove>0) && (dNewSl>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point)) { if (!OrderModify(OrderTicket(),OrderOpenPrice(),dNewSl,OrderTakeProfit(),OrderExpiration(),Blue)) Print("Íå óäàëîñü ìîäèôèöèðîâàòü ñòîïëîññ îðäåðà ¹",OrderTicket(),". Îøèáêà: ",GetLastError()); } } } } } //+------------------------------------------------------------------+
Sample
Analysis
Market Information Used:
Indicator Curves created:
Indicators Used:
Custom Indicators Used:
Order Management characteristics:
It can change open orders parameters, due to possible stepping strategy
Other Features: