Price Data Components
Orders Execution
Indicators Used
0
Views
0
Downloads
0
Favorites
TrailingFuncLib
//+------------------------------------------------------------------+
//| TrailingAll.mq4 |
//| I_D |
//| Ñîôò äëÿ óïðàâëåíèÿ êàïèòàëîì: http://www.mymmk.com/ |
//+------------------------------------------------------------------+
#property copyright "I_D / Þðèé Äçþáàí"
#property link "http://www.mymmk.com/ Ñîôò äëÿ óïðàâëåíèÿ êàïèòàëîì"
#property library
static datetime sdtPrevtime = 0;
//+------------------------------------------------------------------+
//| ÒÐÅÉËÈÍÃ ÏÎ ÔÐÀÊÒÀËÀÌ |
//| Ôóíêöèè ïåðåäà¸òñÿ òèêåò ïîçèöèè, êîëè÷åñòâî áàðîâ â ôðàêòàëå, |
//| è îòñòóï (ïóíêòîâ) - ðàññòîÿíèå îò ìàêñ. (ìèí.) ñâå÷è, íà |
//| êîòîðîå ïåðåíîñèòñÿ ñòîïëîññ (îò 0), trlinloss - òðàëèòü ëè â |
//| çîíå óáûòêîâ |
//+------------------------------------------------------------------+
void TrailingByFractals(int ticket,int tmfrm,int frktl_bars,int indent,bool trlinloss)
{
int i, z; // counters
int extr_n; // íîìåð áëèæàéøåãî ýêñòðåìóìà frktl_bars-áàðíîãî ôðàêòàëà
double temp; // ñëóæåáíàÿ ïåðåìåííàÿ
int after_x, be4_x; // ñâå÷åé ïîñëå è äî ïèêà ñîîòâåòñòâåííî
int ok_be4, ok_after; // ôëàãè ñîîòâåòñòâèÿ óñëîâèþ (1 - íåïðàâèëüíî, 0 - ïðàâèëüíî)
int sell_peak_n, buy_peak_n; // íîìåðà ýêñòðåìóìîâ áëèæàéøèõ ôðàêòàëîâ íà ïðîäàæó (äëÿ ïîäæàòèÿ äë.ïîç.) è ïîêóïêó ñîîòâåòñâåííî
// ïðîâåðÿåì ïåðåäàííûå çíà÷åíèÿ
if ((frktl_bars<=3) || (indent<0) || (ticket==0) || ((tmfrm!=1) && (tmfrm!=5) && (tmfrm!=15) && (tmfrm!=30) && (tmfrm!=60) && (tmfrm!=240) && (tmfrm!=1440) && (tmfrm!=10080) && (tmfrm!=43200)) || (!OrderSelect(ticket,SELECT_BY_TICKET)))
{
Print("Òðåéëèíã ôóíêöèåé TrailingByFractals() íåâîçìîæåí èç-çà íåêîððåêòíîñòè çíà÷åíèé ïåðåäàííûõ åé àðãóìåíòîâ.");
return(0);
}
temp = frktl_bars;
if (MathMod(frktl_bars,2)==0)
extr_n = temp/2;
else
extr_n = MathRound(temp/2);
// áàðîâ äî è ïîñëå ýêñòðåìóìà ôðàêòàëà
after_x = frktl_bars - extr_n;
if (MathMod(frktl_bars,2)!=0)
be4_x = frktl_bars - extr_n;
else
be4_x = frktl_bars - extr_n - 1;
// åñëè äëèííàÿ ïîçèöèÿ (OP_BUY), íàõîäèì áëèæàéøèé ôðàêòàë íà ïðîäàæó (ò.å. ýêñòðåìóì "âíèç")
if (OrderType()==OP_BUY)
{
// íàõîäèì ïîñëåäíèé ôðàêòàë íà ïðîäàæó
for (i=extr_n;i<iBars(Symbol(),tmfrm);i++)
{
ok_be4 = 0; ok_after = 0;
for (z=1;z<=be4_x;z++)
{
if (iLow(Symbol(),tmfrm,i)>=iLow(Symbol(),tmfrm,i-z))
{
ok_be4 = 1;
break;
}
}
for (z=1;z<=after_x;z++)
{
if (iLow(Symbol(),tmfrm,i)>iLow(Symbol(),tmfrm,i+z))
{
ok_after = 1;
break;
}
}
if ((ok_be4==0) && (ok_after==0))
{
sell_peak_n = i;
break;
}
}
// åñëè òðàëèòü â óáûòêå
if (trlinloss==true)
{
// åñëè íîâûé ñòîïëîññ ëó÷øå èìåþùåãîñÿ (â ò.÷. åñëè ñòîïëîññ == 0, íå âûñòàâëåí)
// à òàêæå åñëè êóðñ íå ñëèøêîì áëèçêî, íó è åñëè ñòîïëîññ óæå íå áûë ïåðåìåùåí íà ðàññìàòðèâàåìûé óðîâåíü
if ((iLow(Symbol(),tmfrm,sell_peak_n)-indent*Point>OrderStopLoss()) && (iLow(Symbol(),tmfrm,sell_peak_n)-indent*Point<Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
{
if (!OrderModify(ticket,OrderOpenPrice(),iLow(Symbol(),tmfrm,sell_peak_n)-indent*Point,OrderTakeProfit(),OrderExpiration()))
Print("Íå óäàëîñü ìîäèôèöèðîâàòü ñòîïëîññ îðäåðà ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
}
}
// åñëè òðàëèòü òîëüêî â ïðîôèòå, òî
else
{
// åñëè íîâûé ñòîïëîññ ëó÷øå èìåþùåãîñÿ È êóðñà îòêðûòèÿ, à òàêæå íå ñëèøêîì áëèçêî ê òåêóùåìó êóðñó
if ((iLow(Symbol(),tmfrm,sell_peak_n)-indent*Point>OrderStopLoss()) && (iLow(Symbol(),tmfrm,sell_peak_n)-indent*Point>OrderOpenPrice()) && (iLow(Symbol(),tmfrm,sell_peak_n)-indent*Point<Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
{
if (!OrderModify(ticket,OrderOpenPrice(),iLow(Symbol(),tmfrm,sell_peak_n)-indent*Point,OrderTakeProfit(),OrderExpiration()))
Print("Íå óäàëîñü ìîäèôèöèðîâàòü ñòîïëîññ îðäåðà ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
}
}
}
// åñëè êîðîòêàÿ ïîçèöèÿ (OP_SELL), íàõîäèì áëèæàéøèé ôðàêòàë íà ïîêóïêó (ò.å. ýêñòðåìóì "ââåðõ")
if (OrderType()==OP_SELL)
{
// íàõîäèì ïîñëåäíèé ôðàêòàë íà ïðîäàæó
for (i=extr_n;i<iBars(Symbol(),tmfrm);i++)
{
ok_be4 = 0; ok_after = 0;
for (z=1;z<=be4_x;z++)
{
if (iHigh(Symbol(),tmfrm,i)<=iHigh(Symbol(),tmfrm,i-z))
{
ok_be4 = 1;
break;
}
}
for (z=1;z<=after_x;z++)
{
if (iHigh(Symbol(),tmfrm,i)<iHigh(Symbol(),tmfrm,i+z))
{
ok_after = 1;
break;
}
}
if ((ok_be4==0) && (ok_after==0))
{
buy_peak_n = i;
break;
}
}
// åñëè òðàëèòü â óáûòêå
if (trlinloss==true)
{
if (((iHigh(Symbol(),tmfrm,buy_peak_n)+(indent+MarketInfo(Symbol(),MODE_SPREAD))*Point<OrderStopLoss()) || (OrderStopLoss()==0)) && (iHigh(Symbol(),tmfrm,buy_peak_n)+(indent+MarketInfo(Symbol(),MODE_SPREAD))*Point>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
{
if (!OrderModify(ticket,OrderOpenPrice(),iHigh(Symbol(),tmfrm,buy_peak_n)+(indent+MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration()))
Print("Íå óäàëîñü ìîäèôèöèðîâàòü ñòîïëîññ îðäåðà ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
}
}
// åñëè òðàëèòü òîëüêî â ïðîôèòå, òî
else
{
// åñëè íîâûé ñòîïëîññ ëó÷øå èìåþùåãîñÿ È êóðñà îòêðûòèÿ
if ((((iHigh(Symbol(),tmfrm,buy_peak_n)+(indent+MarketInfo(Symbol(),MODE_SPREAD))*Point<OrderStopLoss()) || (OrderStopLoss()==0))) && (iHigh(Symbol(),tmfrm,buy_peak_n)+(indent+MarketInfo(Symbol(),MODE_SPREAD))*Point<OrderOpenPrice()) && (iHigh(Symbol(),tmfrm,buy_peak_n)+(indent+MarketInfo(Symbol(),MODE_SPREAD))*Point>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
{
if (!OrderModify(ticket,OrderOpenPrice(),iHigh(Symbol(),tmfrm,buy_peak_n)+(indent+MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration()))
Print("Íå óäàëîñü ìîäèôèöèðîâàòü ñòîïëîññ îðäåðà ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
}
}
}
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| ÒÐÅÉËÈÍà ÏÎ ÒÅÍßÌ N ÑÂÅ×ÅÉ |
//| Ôóíêöèè ïåðåäà¸òñÿ òèêåò ïîçèöèè, êîëè÷åñòâî áàðîâ, ïî òåíÿì |
//| êîòîðûõ íåîáõîäèìî òðåéëèíãîâàòü (îò 1 è áîëüøå) è îòñòóï |
//| (ïóíêòîâ) - ðàññòîÿíèå îò ìàêñ. (ìèí.) ñâå÷è, íà êîòîðîå |
//| ïåðåíîñèòñÿ ñòîïëîññ (îò 0), trlinloss - òðàëèòü ëè â ëîññå |
//+------------------------------------------------------------------+
void TrailingByShadows(int ticket,int tmfrm,int bars_n, int indent,bool trlinloss)
{
int i; // counter
double new_extremum;
// ïðîâåðÿåì ïåðåäàííûå çíà÷åíèÿ
if ((bars_n<1) || (indent<0) || (ticket==0) || ((tmfrm!=1) && (tmfrm!=5) && (tmfrm!=15) && (tmfrm!=30) && (tmfrm!=60) && (tmfrm!=240) && (tmfrm!=1440) && (tmfrm!=10080) && (tmfrm!=43200)) || (!OrderSelect(ticket,SELECT_BY_TICKET)))
{
Print("Òðåéëèíã ôóíêöèåé TrailingByShadows() íåâîçìîæåí èç-çà íåêîððåêòíîñòè çíà÷åíèé ïåðåäàííûõ åé àðãóìåíòîâ.");
return(0);
}
// åñëè äëèííàÿ ïîçèöèÿ (OP_BUY), íàõîäèì ìèíèìóì bars_n ñâå÷åé
if (OrderType()==OP_BUY)
{
for(i=1;i<=bars_n;i++)
{
if (i==1) new_extremum = iLow(Symbol(),tmfrm,i);
else
if (new_extremum>iLow(Symbol(),tmfrm,i)) new_extremum = iLow(Symbol(),tmfrm,i);
}
// åñëè òðàëèì è â çîíå óáûòêîâ
if (trlinloss==true)
{
// åñëè íàéäåííîå çíà÷åíèå "ëó÷øå" òåêóùåãî ñòîïëîññà ïîçèöèè, ïåðåíîñèì
if ((((new_extremum - indent*Point)>OrderStopLoss()) || (OrderStopLoss()==0)) && (new_extremum - indent*Point<Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
if (!OrderModify(ticket,OrderOpenPrice(),new_extremum - indent*Point,OrderTakeProfit(),OrderExpiration()))
Print("Íå óäàëîñü ìîäèôèöèðîâàòü îðäåð ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
}
else
{
// åñëè íîâûé ñòîïëîññ íå òîëüêî ëó÷øå ïðåäûäóùåãî, íî è êóðñà îòêðûòèÿ ïîçèöèè
if ((((new_extremum - indent*Point)>OrderStopLoss()) || (OrderStopLoss()==0)) && ((new_extremum - indent*Point)>OrderOpenPrice()) && (new_extremum - indent*Point<Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
if (!OrderModify(ticket,OrderOpenPrice(),new_extremum-indent*Point,OrderTakeProfit(),OrderExpiration()))
Print("Íå óäàëîñü ìîäèôèöèðîâàòü îðäåð ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
}
}
// åñëè êîðîòêàÿ ïîçèöèÿ (OP_SELL), íàõîäèì ìèíèìóì bars_n ñâå÷åé
if (OrderType()==OP_SELL)
{
for(i=1;i<=bars_n;i++)
{
if (i==1) new_extremum = iHigh(Symbol(),tmfrm,i);
else
if (new_extremum<iHigh(Symbol(),tmfrm,i)) new_extremum = iHigh(Symbol(),tmfrm,i);
}
// åñëè òðàëèì è â çîíå óáûòêîâ
if (trlinloss==true)
{
// åñëè íàéäåííîå çíà÷åíèå "ëó÷øå" òåêóùåãî ñòîïëîññà ïîçèöèè, ïåðåíîñèì
if ((((new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point)<OrderStopLoss()) || (OrderStopLoss()==0)) && (new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
if (!OrderModify(ticket,OrderOpenPrice(),new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration()))
Print("Íå óäàëîñü ìîäèôèöèðîâàòü îðäåð ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
}
else
{
// åñëè íîâûé ñòîïëîññ íå òîëüêî ëó÷øå ïðåäûäóùåãî, íî è êóðñà îòêðûòèÿ ïîçèöèè
if ((((new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point)<OrderStopLoss()) || (OrderStopLoss()==0)) && ((new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point)<OrderOpenPrice()) && (new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
if (!OrderModify(ticket,OrderOpenPrice(),new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration()))
Print("Íå óäàëîñü ìîäèôèöèðîâàòü îðäåð ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
}
}
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| ÒÐÅÉËÈÍà ÑÒÀÍÄÀÐÒÍÛÉ-ÑÒÓÏÅÍ×ÀÑÒÛÉ |
//| Ôóíêöèè ïåðåäà¸òñÿ òèêåò ïîçèöèè, ðàññòîÿíèå îò êóðñà îòêðûòèÿ, |
//| íà êîòîðîì òðåéëèíã çàïóñêàåòñÿ (ïóíêòîâ) è "øàã", ñ êîòîðûì îí |
//| ïåðåíîñèòñÿ (ïóíêòîâ) |
//| Ïðèìåð: ïðè +30 ñòîï íà +10, ïðè +40 - ñòîï íà +20 è ò.ä. |
//+------------------------------------------------------------------+
void TrailingStairs(int ticket,int trldistance,int trlstep)
{
double nextstair; // áëèæàéøåå çíà÷åíèå êóðñà, ïðè êîòîðîì áóäåì ìåíÿòü ñòîïëîññ
// ïðîâåðÿåì ïåðåäàííûå çíà÷åíèÿ
if ((trldistance<MarketInfo(Symbol(),MODE_STOPLEVEL)) || (trlstep<1) || (trldistance<trlstep) || (ticket==0) || (!OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)))
{
Print("Òðåéëèíã ôóíêöèåé TrailingStairs() íåâîçìîæåí èç-çà íåêîððåêòíîñòè çíà÷åíèé ïåðåäàííûõ åé àðãóìåíòîâ.");
return(0);
}
// åñëè äëèííàÿ ïîçèöèÿ (OP_BUY)
if (OrderType()==OP_BUY)
{
// ðàñ÷èòûâàåì, ïðè êàêîì çíà÷åíèè êóðñà ñëåäóåò ñêîððåêòèðîâàòü ñòîïëîññ
// åñëè ñòîïëîññ íèæå îòêðûòèÿ èëè ðàâåí 0 (íå âûñòàâëåí), òî áëèæàéøèé óðîâåíü = êóðñ îòêðûòèÿ + trldistance + ñïðýä
if ((OrderStopLoss()==0) || (OrderStopLoss()<OrderOpenPrice()))
nextstair = OrderOpenPrice() + trldistance*Point;
// èíà÷å áëèæàéøèé óðîâåíü = òåêóùèé ñòîïëîññ + trldistance + trlstep + ñïðýä
else
nextstair = OrderStopLoss() + trldistance*Point;
// åñëè òåêóùèé êóðñ (Bid) >= nextstair è íîâûé ñòîïëîññ òî÷íî ëó÷øå òåêóùåãî, êîððåêòèðóåì ïîñëåäíèé
if (Bid>=nextstair)
{
if ((OrderStopLoss()==0) || (OrderStopLoss()<OrderOpenPrice()) && (OrderOpenPrice() + trlstep*Point<Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
{
if (!OrderModify(ticket,OrderOpenPrice(),OrderOpenPrice() + trlstep*Point,OrderTakeProfit(),OrderExpiration()))
Print("Íå óäàëîñü ìîäèôèöèðîâàòü ñòîïëîññ îðäåðà ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
}
}
else
{
if (!OrderModify(ticket,OrderOpenPrice(),OrderStopLoss() + trlstep*Point,OrderTakeProfit(),OrderExpiration()))
Print("Íå óäàëîñü ìîäèôèöèðîâàòü ñòîïëîññ îðäåðà ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
}
}
// åñëè êîðîòêàÿ ïîçèöèÿ (OP_SELL)
if (OrderType()==OP_SELL)
{
// ðàñ÷èòûâàåì, ïðè êàêîì çíà÷åíèè êóðñà ñëåäóåò ñêîððåêòèðîâàòü ñòîïëîññ
// åñëè ñòîïëîññ íèæå îòêðûòèÿ èëè ðàâåí 0 (íå âûñòàâëåí), òî áëèæàéøèé óðîâåíü = êóðñ îòêðûòèÿ + trldistance + ñïðýä
if ((OrderStopLoss()==0) || (OrderStopLoss()>OrderOpenPrice()))
nextstair = OrderOpenPrice() - (trldistance + MarketInfo(Symbol(),MODE_SPREAD))*Point;
// èíà÷å áëèæàéøèé óðîâåíü = òåêóùèé ñòîïëîññ + trldistance + trlstep + ñïðýä
else
nextstair = OrderStopLoss() - (trldistance + MarketInfo(Symbol(),MODE_SPREAD))*Point;
// åñëè òåêóùèé êóðñ (Àñê) >= nextstair è íîâûé ñòîïëîññ òî÷íî ëó÷øå òåêóùåãî, êîððåêòèðóåì ïîñëåäíèé
if (Ask<=nextstair)
{
if ((OrderStopLoss()==0) || (OrderStopLoss()>OrderOpenPrice()) && (OrderOpenPrice() - (trlstep + MarketInfo(Symbol(),MODE_SPREAD))*Point>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
{
if (!OrderModify(ticket,OrderOpenPrice(),OrderOpenPrice() - (trlstep + MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration()))
Print("Íå óäàëîñü ìîäèôèöèðîâàòü ñòîïëîññ îðäåðà ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
}
}
else
{
if (!OrderModify(ticket,OrderOpenPrice(),OrderStopLoss()- (trlstep + MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration()))
Print("Íå óäàëîñü ìîäèôèöèðîâàòü ñòîïëîññ îðäåðà ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
}
}
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| ÒÐÅÉËÈÍà ÑÒÀÍÄÀÐÒÍÛÉ-ÇÀÒßÃÈÂÀÞÙÈÉÑß |
//| Ôóíêöèè ïåðåäà¸òñÿ òèêåò ïîçèöèè, èñõîäíûé òðåéëèíã (ïóíêòîâ) è |
//| 2 "óðîâíÿ" (çíà÷åíèÿ ïðîôèòà, ïóíêòîâ), ïðè êîòîðûõ òðåéëèíã |
//| ñîêðàùàåì, è ñîîòâåòñòâóþùèå çíà÷åíèÿ òðåéëèíãà (ïóíêòîâ) |
//| Ïðèìåð: èñõîäíûé òðåéëèíã 30 ï., ïðè +50 - 20 ï., +80 è áîëüøå - |
//| íà ðàññòîÿíèè â 10 ïóíêòîâ. |
//+------------------------------------------------------------------+
void TrailingUdavka(int ticket,int trl_dist_1,int level_1,int trl_dist_2,int level_2,int trl_dist_3)
{
double newstop = 0; // íîâûé ñòîïëîññ
double trldist; // ðàññòîÿíèå òðåéëèíãà (â çàâèñèìîñòè îò "ïðîéäåííîãî" ìîæåò = trl_dist_1, trl_dist_2 èëè trl_dist_3)
// ïðîâåðÿåì ïåðåäàííûå çíà÷åíèÿ
if ((trl_dist_1<MarketInfo(Symbol(),MODE_STOPLEVEL)) || (trl_dist_2<MarketInfo(Symbol(),MODE_STOPLEVEL)) || (trl_dist_3<MarketInfo(Symbol(),MODE_STOPLEVEL)) ||
(level_1<=trl_dist_1) || (level_2<=trl_dist_1) || (level_2<=level_1) || (ticket==0) || (!OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)))
{
Print("Òðåéëèíã ôóíêöèåé TrailingUdavka() íåâîçìîæåí èç-çà íåêîððåêòíîñòè çíà÷åíèé ïåðåäàííûõ åé àðãóìåíòîâ.");
return(0);
}
// åñëè äëèííàÿ ïîçèöèÿ (OP_BUY)
if (OrderType()==OP_BUY)
{
// åñëè ïðîôèò <=trl_dist_1, òî trldist=trl_dist_1, åñëè ïðîôèò>trl_dist_1 && ïðîôèò<=level_1*Point ...
if ((Bid-OrderOpenPrice())<=level_1*Point) trldist = trl_dist_1;
if (((Bid-OrderOpenPrice())>level_1*Point) && ((Bid-OrderOpenPrice())<=level_2*Point)) trldist = trl_dist_2;
if ((Bid-OrderOpenPrice())>level_2*Point) trldist = trl_dist_3;
// åñëè ñòîïëîññ = 0 èëè ìåíüøå êóðñà îòêðûòèÿ, òî åñëè òåê.öåíà (Bid) áîëüøå/ðàâíà äèñòàíöèè êóðñ_îòêðûòèÿ+ðàññò.òðåéëèíãà
if ((OrderStopLoss()==0) || (OrderStopLoss()<OrderOpenPrice()))
{
if (Bid>(OrderOpenPrice() + trldist*Point))
newstop = Bid - trldist*Point;
}
// èíà÷å: åñëè òåêóùàÿ öåíà (Bid) áîëüøå/ðàâíà äèñòàíöèè òåêóùèé_ñòîïëîññ+ðàññòîÿíèå òðåéëèíãà,
else
{
if (Bid>(OrderStopLoss() + trldist*Point))
newstop = Bid - trldist*Point;
}
// ìîäèôèöèðóåì ñòîïëîññ
if ((newstop>OrderStopLoss()) && (newstop<Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
{
if (!OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration()))
Print("Íå óäàëîñü ìîäèôèöèðîâàòü ñòîïëîññ îðäåðà ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
}
}
// åñëè êîðîòêàÿ ïîçèöèÿ (OP_SELL)
if (OrderType()==OP_SELL)
{
// åñëè ïðîôèò <=trl_dist_1, òî trldist=trl_dist_1, åñëè ïðîôèò>trl_dist_1 && ïðîôèò<=level_1*Point ...
if ((OrderOpenPrice()-(Ask + MarketInfo(Symbol(),MODE_SPREAD)*Point))<=level_1*Point) trldist = trl_dist_1;
if (((OrderOpenPrice()-(Ask + MarketInfo(Symbol(),MODE_SPREAD)*Point))>level_1*Point) && ((OrderOpenPrice()-(Ask + MarketInfo(Symbol(),MODE_SPREAD)*Point))<=level_2*Point)) trldist = trl_dist_2;
if ((OrderOpenPrice()-(Ask + MarketInfo(Symbol(),MODE_SPREAD)*Point))>level_2*Point) trldist = trl_dist_3;
// åñëè ñòîïëîññ = 0 èëè ìåíüøå êóðñà îòêðûòèÿ, òî åñëè òåê.öåíà (Ask) áîëüøå/ðàâíà äèñòàíöèè êóðñ_îòêðûòèÿ+ðàññò.òðåéëèíãà
if ((OrderStopLoss()==0) || (OrderStopLoss()>OrderOpenPrice()))
{
if (Ask<(OrderOpenPrice() - (trldist + MarketInfo(Symbol(),MODE_SPREAD))*Point))
newstop = Ask + trldist*Point;
}
// èíà÷å: åñëè òåêóùàÿ öåíà (Bid) áîëüøå/ðàâíà äèñòàíöèè òåêóùèé_ñòîïëîññ+ðàññòîÿíèå òðåéëèíãà,
else
{
if (Ask<(OrderStopLoss() - (trldist + MarketInfo(Symbol(),MODE_SPREAD))*Point))
newstop = Ask + trldist*Point;
}
// ìîäèôèöèðóåì ñòîïëîññ
if (newstop>0)
{
if (((OrderStopLoss()==0) || (OrderStopLoss()>OrderOpenPrice())) && (newstop>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
{
if (!OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration()))
Print("Íå óäàëîñü ìîäèôèöèðîâàòü ñòîïëîññ îðäåðà ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
}
else
{
if ((newstop<OrderStopLoss()) && (newstop>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
{
if (!OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration()))
Print("Íå óäàëîñü ìîäèôèöèðîâàòü ñòîïëîññ îðäåðà ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
}
}
}
}
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| ÒÐÅÉËÈÍÃ ÏÎ ÂÐÅÌÅÍÈ |
//| Ôóíêöèè ïåðåäà¸òñÿ òèêåò ïîçèöèè, èíòåðâàë (ìèíóò), ñ êîòîðûì, |
//| ïåðåäâèãàåòñÿ ñòîïëîññ è øàã òðåéëèíãà (íà ñêîëüêî ïóíêòîâ |
//| ïåðåìåùàåòñÿ ñòîïëîññ, trlinloss - òðàëèì ëè â óáûòêå |
//| (ò.å. ñ îïðåäåë¸ííûì èíòåðâàëîì ïîäòÿãèâàåì ñòîï äî êóðñà |
//| îòêðûòèÿ, à ïîòîì è â ïðîôèòå, ëèáî òîëüêî â ïðîôèòå) |
//+------------------------------------------------------------------+
void TrailingByTime(int ticket,int interval,int trlstep,bool trlinloss)
{
// ïðîâåðÿåì ïåðåäàííûå çíà÷åíèÿ
if ((ticket==0) || (interval<1) || (trlstep<1) || !OrderSelect(ticket,SELECT_BY_TICKET))
{
Print("Òðåéëèíã ôóíêöèåé TrailingByTime() íåâîçìîæåí èç-çà íåêîððåêòíîñòè çíà÷åíèé ïåðåäàííûõ åé àðãóìåíòîâ.");
return(0);
}
double minpast; // êîë-âî ïîëíûõ ìèíóò îò îòêðûòèÿ ïîçèöèè äî òåêóùåãî ìîìåíòà
double times2change; // êîë-âî èíòåðâàëîâ interval ñ ìîìåíòà îòêðûòèÿ ïîçèöèè (ò.å. ñêîëüêî ðàç äîëæåí áûë áûòü ïåðåìåùåí ñòîïëîññ)
double newstop; // íîâîå çíà÷åíèå ñòîïëîññà (ó÷èòûâàÿ êîë-âî ïåðåíîñîâ, êîòîðûå äîëæíû áûëè èìåòü ìåñòî)
// îïðåäåëÿåì, ñêîëüêî âðåìåíè ïðîøëî ñ ìîìåíòà îòêðûòèÿ ïîçèöèè
minpast = (TimeCurrent() - OrderOpenTime()) / 60;
// ñêîëüêî ðàç íóæíî áûëî ïåðåäâèíóòü ñòîïëîññ
times2change = MathFloor(minpast / interval);
// åñëè äëèííàÿ ïîçèöèÿ (OP_BUY)
if (OrderType()==OP_BUY)
{
// åñëè òðàëèì â óáûòêå, òî îòñòóïàåì îò ñòîïëîññà (åñëè îí íå 0, åñëè 0 - îò îòêðûòèÿ)
if (trlinloss==true)
{
if (OrderStopLoss()==0) newstop = OrderOpenPrice() + times2change*(trlstep*Point);
else newstop = OrderStopLoss() + times2change*(trlstep*Point);
}
else
// èíà÷å - îò êóðñà îòêðûòèÿ ïîçèöèè
newstop = OrderOpenPrice() + times2change*(trlstep*Point);
if (times2change>0)
{
if ((newstop>OrderStopLoss()) && (newstop<Bid- MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
{
if (!OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration()))
Print("Íå óäàëîñü ìîäèôèöèðîâàòü ñòîïëîññ îðäåðà ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
}
}
}
// åñëè êîðîòêàÿ ïîçèöèÿ (OP_SELL)
if (OrderType()==OP_SELL)
{
// åñëè òðàëèì â óáûòêå, òî îòñòóïàåì îò ñòîïëîññà (åñëè îí íå 0, åñëè 0 - îò îòêðûòèÿ)
if (trlinloss==true)
{
if (OrderStopLoss()==0) newstop = OrderOpenPrice() - times2change*(trlstep*Point) - MarketInfo(Symbol(),MODE_SPREAD)*Point;
else newstop = OrderStopLoss() - times2change*(trlstep*Point) - MarketInfo(Symbol(),MODE_SPREAD)*Point;
}
else
newstop = OrderOpenPrice() - times2change*(trlstep*Point) - MarketInfo(Symbol(),MODE_SPREAD)*Point;
if (times2change>0)
{
if (((OrderStopLoss()==0) || (OrderStopLoss()<OrderOpenPrice())) && (newstop>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
{
if (!OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration()))
Print("Íå óäàëîñü ìîäèôèöèðîâàòü ñòîïëîññ îðäåðà ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
}
else
if ((newstop<OrderStopLoss()) && (newstop>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
{
if (!OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration()))
Print("Íå óäàëîñü ìîäèôèöèðîâàòü ñòîïëîññ îðäåðà ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
}
}
}
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| ÒÐÅÉËÈÍÃ ÏÎ ATR (Average True Range, Ñðåäíèé èñòèííûé äèàïàçîí) |
//| Ôóíêöèè ïåðåäà¸òñÿ òèêåò ïîçèöèè, ïåðèîä ÀÒR è êîýôôèöèåíò, íà |
//| êîòîðûé óìíîæàåòñÿ ATR. Ò.î. ñòîïëîññ "òÿíåòñÿ" íà ðàññòîÿíèè |
//| ATR õ N îò òåêóùåãî êóðñà; ïåðåíîñ - íà íîâîì áàðå (ò.å. îò öåíû |
//| îòêðûòèÿ î÷åðåäíîãî áàðà) |
//+------------------------------------------------------------------+
void TrailingByATR(int ticket,int atr_timeframe,int atr1_period,int atr1_shift,int atr2_period,int atr2_shift,double coeff,bool trlinloss)
{
// ïðîâåðÿåì ïåðåäàííûå çíà÷åíèÿ
if ((ticket==0) || (atr1_period<1) || (atr2_period<1) || (coeff<=0) || (!OrderSelect(ticket,SELECT_BY_TICKET)) ||
((atr_timeframe!=1) && (atr_timeframe!=5) && (atr_timeframe!=15) && (atr_timeframe!=30) && (atr_timeframe!=60) &&
(atr_timeframe!=240) && (atr_timeframe!=1440) && (atr_timeframe!=10080) && (atr_timeframe!=43200)) || (atr1_shift<0) || (atr2_shift<0))
{
Print("Òðåéëèíã ôóíêöèåé TrailingByATR() íåâîçìîæåí èç-çà íåêîððåêòíîñòè çíà÷åíèé ïåðåäàííûõ åé àðãóìåíòîâ.");
return(0);
}
double curr_atr1; // òåêóùåå çíà÷åíèå ATR - 1
double curr_atr2; // òåêóùåå çíà÷åíèå ATR - 2
double best_atr; // áîëüøåå èç çíà÷åíèé ATR
double atrXcoeff; // ðåçóëüòàò óìíîæåíèÿ áîëüøåãî èç ATR íà êîýôôèöèåíò
double newstop; // íîâûé ñòîïëîññ
// òåêóùåå çíà÷åíèå ATR-1, ATR-2
curr_atr1 = iATR(Symbol(),atr_timeframe,atr1_period,atr1_shift);
curr_atr2 = iATR(Symbol(),atr_timeframe,atr2_period,atr2_shift);
// áîëüøåå èç çíà÷åíèé
best_atr = MathMax(curr_atr1,curr_atr2);
// ïîñëå óìíîæåíèÿ íà êîýôôèöèåíò
atrXcoeff = best_atr * coeff;
// åñëè äëèííàÿ ïîçèöèÿ (OP_BUY)
if (OrderType()==OP_BUY)
{
// îòêëàäûâàåì îò òåêóùåãî êóðñà (íîâûé ñòîïëîññ)
newstop = Bid - atrXcoeff;
// åñëè trlinloss==true (ò.å. ñëåäóåò òðàëèòü â çîíå ëîññîâ), òî
if (trlinloss==true)
{
// åñëè ñòîïëîññ íåîïðåäåëåí, òî òðàëèì â ëþáîì ñëó÷àå
if ((OrderStopLoss()==0) && (newstop<Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
{
if (!OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration()))
Print("Íå óäàëîñü ìîäèôèöèðîâàòü îðäåð ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
}
// èíà÷å òðàëèì òîëüêî åñëè íîâûé ñòîï ëó÷øå ñòàðîãî
else
{
if ((newstop>OrderStopLoss()) && (newstop<Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
if (!OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration()))
Print("Íå óäàëîñü ìîäèôèöèðîâàòü îðäåð ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
}
}
else
{
// åñëè ñòîïëîññ íåîïðåäåëåí, òî òðàëèì, åñëè ñòîï ëó÷øå îòêðûòèÿ
if ((OrderStopLoss()==0) && (newstop>OrderOpenPrice()) && (newstop<Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
{
if (!OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration()))
Print("Íå óäàëîñü ìîäèôèöèðîâàòü îðäåð ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
}
// åñëè ñòîï íå ðàâåí 0, òî ìåíÿåì åãî, åñëè îí ëó÷øå ïðåäûäóùåãî è êóðñà îòêðûòèÿ
else
{
if ((newstop>OrderStopLoss()) && (newstop>OrderOpenPrice()) && (newstop<Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
if (!OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration()))
Print("Íå óäàëîñü ìîäèôèöèðîâàòü îðäåð ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
}
}
}
// åñëè êîðîòêàÿ ïîçèöèÿ (OP_SELL)
if (OrderType()==OP_SELL)
{
// îòêëàäûâàåì îò òåêóùåãî êóðñà (íîâûé ñòîïëîññ)
newstop = Ask + atrXcoeff;
// åñëè trlinloss==true (ò.å. ñëåäóåò òðàëèòü â çîíå ëîññîâ), òî
if (trlinloss==true)
{
// åñëè ñòîïëîññ íåîïðåäåëåí, òî òðàëèì â ëþáîì ñëó÷àå
if ((OrderStopLoss()==0) && (newstop>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
{
if (!OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration()))
Print("Íå óäàëîñü ìîäèôèöèðîâàòü îðäåð ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
}
// èíà÷å òðàëèì òîëüêî åñëè íîâûé ñòîï ëó÷øå ñòàðîãî
else
{
if ((newstop<OrderStopLoss()) && (newstop>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
if (!OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration()))
Print("Íå óäàëîñü ìîäèôèöèðîâàòü îðäåð ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
}
}
else
{
// åñëè ñòîïëîññ íåîïðåäåëåí, òî òðàëèì, åñëè ñòîï ëó÷øå îòêðûòèÿ
if ((OrderStopLoss()==0) && (newstop<OrderOpenPrice()) && (newstop>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
{
if (!OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration()))
Print("Íå óäàëîñü ìîäèôèöèðîâàòü îðäåð ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
}
// åñëè ñòîï íå ðàâåí 0, òî ìåíÿåì åãî, åñëè îí ëó÷øå ïðåäûäóùåãî è êóðñà îòêðûòèÿ
else
{
if ((newstop<OrderStopLoss()) && (newstop<OrderOpenPrice()) && (newstop>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
if (!OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration()))
Print("Íå óäàëîñü ìîäèôèöèðîâàòü îðäåð ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
}
}
}
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| ÒÐÅÉËÈÍÃ RATCHET ÁÀÐÈØÏÎËÜÖÀ |
//| Ïðè äîñòèæåíèè ïðîôèòîì óðîâíÿ 1 ñòîïëîññ - â +1, ïðè äîñòèæåíèè |
//| ïðîôèòîì óðîâíÿ 2 ïðîôèòà - ñòîïëîññ - íà óðîâåíü 1, êîãäà |
//| ïðîôèò äîñòèãàåò óðîâíÿ 3 ïðîôèòà, ñòîïëîññ - íà óðîâåíü 2 |
//| (äàëüøå ìîæíî òðåéëèòü äðóãèìè ìåòîäàìè) |
//| ïðè ðàáîòå â ëîññîâîì ó÷àñòêå - òîæå 3 óðîâíÿ, íî ñõåìà ðàáîòû |
//| ñ íèìè íåñêîëüêî èíàÿ, à èìåííî: åñëè ìû îïóñòèëèñü íèæå óðîâíÿ, |
//| à ïîòîì ïîäíÿëèñü âûøå íåãî (ïðèìåð äëÿ ïîêóïêè), òî ñòîïëîññ |
//| ñòàâèì íà ñëåäóþùèé, áîëåå ãëóáîêèé óðîâåíü (íàïðèìåð, óðîâíè |
//| -5, -10 è -25, ñòîïëîññ -40; åñëè îïóñòèëèñü íèæå -10, à ïîòîì |
//| ïîäíÿëèñü âûøå -10, òî ñòîïëîññ - íà -25, åñëè ïîäíèìåìñÿ âûùå |
//| -5, òî ñòîïëîññ ïåðåíåñåì íà -10, ïðè -2 (ñïðýä) ñòîï íà -5 |
//| ðàáîòàåì òîëüêî ñ îäíîé ïîçèöèåé îäíîâðåìåííî |
//+------------------------------------------------------------------+
void TrailingRatchetB(int ticket,int pf_level_1,int pf_level_2,int pf_level_3,int ls_level_1,int ls_level_2,int ls_level_3,bool trlinloss)
{
// ïðîâåðÿåì ïåðåäàííûå çíà÷åíèÿ
if ((ticket==0) || (!OrderSelect(ticket,SELECT_BY_TICKET)) || (pf_level_2<=pf_level_1) || (pf_level_3<=pf_level_2) ||
(pf_level_3<=pf_level_1) || (pf_level_2-pf_level_1<=MarketInfo(Symbol(),MODE_STOPLEVEL)*Point) || (pf_level_3-pf_level_2<=MarketInfo(Symbol(),MODE_STOPLEVEL)*Point) ||
(pf_level_1<=MarketInfo(Symbol(),MODE_STOPLEVEL)))
{
Print("Òðåéëèíã ôóíêöèåé TrailingRatchetB() íåâîçìîæåí èç-çà íåêîððåêòíîñòè çíà÷åíèé ïåðåäàííûõ åé àðãóìåíòîâ.");
return(0);
}
// åñëè äëèííàÿ ïîçèöèÿ (OP_BUY)
if (OrderType()==OP_BUY)
{
double dBid = MarketInfo(Symbol(),MODE_BID);
// Ðàáîòàåì íà ó÷àñòêå ïðîôèòîâ
// åñëè ðàçíèöà "òåêóùèé_êóðñ-êóðñ_îòêðûòèÿ" áîëüøå ÷åì "pf_level_3+ñïðýä", ñòîïëîññ ïåðåíîñèì â "pf_level_2+ñïðýä"
if ((dBid-OrderOpenPrice())>=pf_level_3*Point)
{
if ((OrderStopLoss()==0) || (OrderStopLoss()<OrderOpenPrice() + pf_level_2 *Point))
OrderModify(ticket,OrderOpenPrice(),OrderOpenPrice() + pf_level_2*Point,OrderTakeProfit(),OrderExpiration());
}
else
// åñëè ðàçíèöà "òåêóùèé_êóðñ-êóðñ_îòêðûòèÿ" áîëüøå ÷åì "pf_level_2+ñïðýä", ñòîïëîññ ïåðåíîñèì â "pf_level_1+ñïðýä"
if ((dBid-OrderOpenPrice())>=pf_level_2*Point)
{
if ((OrderStopLoss()==0) || (OrderStopLoss()<OrderOpenPrice() + pf_level_1*Point))
OrderModify(ticket,OrderOpenPrice(),OrderOpenPrice() + pf_level_1*Point,OrderTakeProfit(),OrderExpiration());
}
else
// åñëè ðàçíèöà "òåêóùèé_êóðñ-êóðñ_îòêðûòèÿ" áîëüøå ÷åì "pf_level_1+ñïðýä", ñòîïëîññ ïåðåíîñèì â +1 ("îòêðûòèå + ñïðýä")
if ((dBid-OrderOpenPrice())>=pf_level_1*Point)
// åñëè ñòîïëîññ íå îïðåäåëåí èëè õóæå ÷åì "îòêðûòèå+1"
{
if ((OrderStopLoss()==0) || (OrderStopLoss()<OrderOpenPrice() + 1*Point))
OrderModify(ticket,OrderOpenPrice(),OrderOpenPrice() + 1*Point,OrderTakeProfit(),OrderExpiration());
}
// Ðàáîòàåì íà ó÷àñòêå ëîññîâ
if (trlinloss==true)
{
// Ãëîáàëüíàÿ ïåðåìåííàÿ òåðìèíàëà ñîäåðæèò çíà÷åíèå ñàìîãî óðîâíÿ óáûòêà (ls_level_n), íèæå êîòîðîãî îïóñêàëñÿ êóðñ
// (åñëè îí ïîñëå ýòîãî ïîäíèìàåòñÿ âûøå, óñòàíàâëèâàåì ñòîïëîññ íà áëèæàéøåì áîëåå ãëóáîêîì óðîâíå óáûòêà (åñëè ýòî íå íà÷àëüíûé ñòîïëîññ ïîçèöèè)
// Ñîçäà¸ì ãëîáàëüíóþ ïåðåìåííóþ (îäèí ðàç)
if(!GlobalVariableCheck("zeticket"))
{
GlobalVariableSet("zeticket",ticket);
// ïðè ñîçäàíèè ïðèñâîèì åé "0"
GlobalVariableSet("dpstlslvl",0);
}
// åñëè ðàáîòàåì ñ íîâîé ñäåëêîé (íîâûé òèêåò), çàòèðàåì çíà÷åíèå dpstlslvl
if (GlobalVariableGet("zeticket")!=ticket)
{
GlobalVariableSet("dpstlslvl",0);
GlobalVariableSet("zeticket",ticket);
}
// óáûòî÷íûì ñ÷èòàåì ó÷àñòîê íèæå êóðñà îòêðûòèÿ è äî ïåðâîãî óðîâíÿ ïðîôèòà
if ((dBid-OrderOpenPrice())<pf_level_1*Point)
{
// åñëè (òåêóùèé_êóðñ ëó÷øå/ðàâíî îòêðûòèå) è (dpstlslvl>=ls_level_1), ñòîïëîññ - íà ls_level_1
if (dBid>=OrderOpenPrice())
if ((OrderStopLoss()==0) || (OrderStopLoss()<(OrderOpenPrice()-ls_level_1*Point)))
OrderModify(ticket,OrderOpenPrice(),OrderOpenPrice()-ls_level_1*Point,OrderTakeProfit(),OrderExpiration());
// åñëè (òåêóùèé_êóðñ ëó÷øå óðîâíÿ_óáûòêà_1) è (dpstlslvl>=ls_level_1), ñòîïëîññ - íà ls_level_2
if ((dBid>=OrderOpenPrice()-ls_level_1*Point) && (GlobalVariableGet("dpstlslvl")>=ls_level_1))
if ((OrderStopLoss()==0) || (OrderStopLoss()<(OrderOpenPrice()-ls_level_2*Point)))
OrderModify(ticket,OrderOpenPrice(),OrderOpenPrice()-ls_level_2*Point,OrderTakeProfit(),OrderExpiration());
// åñëè (òåêóùèé_êóðñ ëó÷øå óðîâíÿ_óáûòêà_2) è (dpstlslvl>=ls_level_2), ñòîïëîññ - íà ls_level_3
if ((dBid>=OrderOpenPrice()-ls_level_2*Point) && (GlobalVariableGet("dpstlslvl")>=ls_level_2))
if ((OrderStopLoss()==0) || (OrderStopLoss()<(OrderOpenPrice()-ls_level_3*Point)))
OrderModify(ticket,OrderOpenPrice(),OrderOpenPrice()-ls_level_3*Point,OrderTakeProfit(),OrderExpiration());
// ïðîâåðèì/îáíîâèì çíà÷åíèå íàèáîëåå ãëóáîêîé "âçÿòîé" ëîññîâîé "ñòóïåíüêè"
// åñëè "òåêóùèé_êóðñ-êóðñ îòêðûòèÿ+ñïðýä" ìåíüøå 0,
if ((dBid-OrderOpenPrice()+MarketInfo(Symbol(),MODE_SPREAD)*Point)<0)
// ïðîâåðèì, íå ìåíüøå ëè îí òîãî èëè èíîãî óðîâíÿ óáûòêà
{
if (dBid<=OrderOpenPrice()-ls_level_3*Point)
if (GlobalVariableGet("dpstlslvl")<ls_level_3)
GlobalVariableSet("dpstlslvl",ls_level_3);
else
if (dBid<=OrderOpenPrice()-ls_level_2*Point)
if (GlobalVariableGet("dpstlslvl")<ls_level_2)
GlobalVariableSet("dpstlslvl",ls_level_2);
else
if (dBid<=OrderOpenPrice()-ls_level_1*Point)
if (GlobalVariableGet("dpstlslvl")<ls_level_1)
GlobalVariableSet("dpstlslvl",ls_level_1);
}
} // end of "if ((dBid-OrderOpenPrice())<pf_level_1*Point)"
} // end of "if (trlinloss==true)"
}
// åñëè êîðîòêàÿ ïîçèöèÿ (OP_SELL)
if (OrderType()==OP_SELL)
{
double dAsk = MarketInfo(Symbol(),MODE_ASK);
// Ðàáîòàåì íà ó÷àñòêå ïðîôèòîâ
// åñëè ðàçíèöà "òåêóùèé_êóðñ-êóðñ_îòêðûòèÿ" áîëüøå ÷åì "pf_level_3+ñïðýä", ñòîïëîññ ïåðåíîñèì â "pf_level_2+ñïðýä"
if ((OrderOpenPrice()-dAsk)>=pf_level_3*Point)
{
if ((OrderStopLoss()==0) || (OrderStopLoss()>OrderOpenPrice() - (pf_level_2 + MarketInfo(Symbol(),MODE_SPREAD))*Point))
OrderModify(ticket,OrderOpenPrice(),OrderOpenPrice() - (pf_level_2 + MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration());
}
else
// åñëè ðàçíèöà "òåêóùèé_êóðñ-êóðñ_îòêðûòèÿ" áîëüøå ÷åì "pf_level_2+ñïðýä", ñòîïëîññ ïåðåíîñèì â "pf_level_1+ñïðýä"
if ((OrderOpenPrice()-dAsk)>=pf_level_2*Point)
{
if ((OrderStopLoss()==0) || (OrderStopLoss()>OrderOpenPrice() - (pf_level_1 + MarketInfo(Symbol(),MODE_SPREAD))*Point))
OrderModify(ticket,OrderOpenPrice(),OrderOpenPrice() - (pf_level_1 + MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration());
}
else
// åñëè ðàçíèöà "òåêóùèé_êóðñ-êóðñ_îòêðûòèÿ" áîëüøå ÷åì "pf_level_1+ñïðýä", ñòîïëîññ ïåðåíîñèì â +1 ("îòêðûòèå + ñïðýä")
if ((OrderOpenPrice()-dAsk)>=pf_level_1*Point)
// åñëè ñòîïëîññ íå îïðåäåëåí èëè õóæå ÷åì "îòêðûòèå+1"
{
if ((OrderStopLoss()==0) || (OrderStopLoss()>OrderOpenPrice() - (1 + MarketInfo(Symbol(),MODE_SPREAD))*Point))
OrderModify(ticket,OrderOpenPrice(),OrderOpenPrice() - (1 + MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration());
}
// Ðàáîòàåì íà ó÷àñòêå ëîññîâ
if (trlinloss==true)
{
// Ãëîáàëüíàÿ ïåðåìåííàÿ òåðìèíàëà ñîäåðæèò çíà÷åíèå ñàìîãî óðîâíÿ óáûòêà (ls_level_n), íèæå êîòîðîãî îïóñêàëñÿ êóðñ
// (åñëè îí ïîñëå ýòîãî ïîäíèìàåòñÿ âûøå, óñòàíàâëèâàåì ñòîïëîññ íà áëèæàéøåì áîëåå ãëóáîêîì óðîâíå óáûòêà (åñëè ýòî íå íà÷àëüíûé ñòîïëîññ ïîçèöèè)
// Ñîçäà¸ì ãëîáàëüíóþ ïåðåìåííóþ (îäèí ðàç)
if(!GlobalVariableCheck("zeticket"))
{
GlobalVariableSet("zeticket",ticket);
// ïðè ñîçäàíèè ïðèñâîèì åé "0"
GlobalVariableSet("dpstlslvl",0);
}
// åñëè ðàáîòàåì ñ íîâîé ñäåëêîé (íîâûé òèêåò), çàòèðàåì çíà÷åíèå dpstlslvl
if (GlobalVariableGet("zeticket")!=ticket)
{
GlobalVariableSet("dpstlslvl",0);
GlobalVariableSet("zeticket",ticket);
}
// óáûòî÷íûì ñ÷èòàåì ó÷àñòîê íèæå êóðñà îòêðûòèÿ è äî ïåðâîãî óðîâíÿ ïðîôèòà
if ((OrderOpenPrice()-dAsk)<pf_level_1*Point)
{
// åñëè (òåêóùèé_êóðñ ëó÷øå/ðàâíî îòêðûòèå) è (dpstlslvl>=ls_level_1), ñòîïëîññ - íà ls_level_1
if (dAsk<=OrderOpenPrice())
if ((OrderStopLoss()==0) || (OrderStopLoss()>(OrderOpenPrice() + (ls_level_1 + MarketInfo(Symbol(),MODE_SPREAD))*Point)))
OrderModify(ticket,OrderOpenPrice(),OrderOpenPrice() + (ls_level_1 + MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration());
// åñëè (òåêóùèé_êóðñ ëó÷øå óðîâíÿ_óáûòêà_1) è (dpstlslvl>=ls_level_1), ñòîïëîññ - íà ls_level_2
if ((dAsk<=OrderOpenPrice() + (ls_level_1 + MarketInfo(Symbol(),MODE_SPREAD))*Point) && (GlobalVariableGet("dpstlslvl")>=ls_level_1))
if ((OrderStopLoss()==0) || (OrderStopLoss()>(OrderOpenPrice() + (ls_level_2 + MarketInfo(Symbol(),MODE_SPREAD))*Point)))
OrderModify(ticket,OrderOpenPrice(),OrderOpenPrice() + (ls_level_2 + MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration());
// åñëè (òåêóùèé_êóðñ ëó÷øå óðîâíÿ_óáûòêà_2) è (dpstlslvl>=ls_level_2), ñòîïëîññ - íà ls_level_3
if ((dAsk<=OrderOpenPrice() + (ls_level_2 + MarketInfo(Symbol(),MODE_SPREAD))*Point) && (GlobalVariableGet("dpstlslvl")>=ls_level_2))
if ((OrderStopLoss()==0) || (OrderStopLoss()>(OrderOpenPrice() + (ls_level_3 + MarketInfo(Symbol(),MODE_SPREAD))*Point)))
OrderModify(ticket,OrderOpenPrice(),OrderOpenPrice() + (ls_level_3 + MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration());
// ïðîâåðèì/îáíîâèì çíà÷åíèå íàèáîëåå ãëóáîêîé "âçÿòîé" ëîññîâîé "ñòóïåíüêè"
// åñëè "òåêóùèé_êóðñ-êóðñ îòêðûòèÿ+ñïðýä" ìåíüøå 0,
if ((OrderOpenPrice()-dAsk+MarketInfo(Symbol(),MODE_SPREAD)*Point)<0)
// ïðîâåðèì, íå ìåíüøå ëè îí òîãî èëè èíîãî óðîâíÿ óáûòêà
{
if (dAsk>=OrderOpenPrice()+(ls_level_3+MarketInfo(Symbol(),MODE_SPREAD))*Point)
if (GlobalVariableGet("dpstlslvl")<ls_level_3)
GlobalVariableSet("dpstlslvl",ls_level_3);
else
if (dAsk>=OrderOpenPrice()+(ls_level_2+MarketInfo(Symbol(),MODE_SPREAD))*Point)
if (GlobalVariableGet("dpstlslvl")<ls_level_2)
GlobalVariableSet("dpstlslvl",ls_level_2);
else
if (dAsk>=OrderOpenPrice()+(ls_level_1+MarketInfo(Symbol(),MODE_SPREAD))*Point)
if (GlobalVariableGet("dpstlslvl")<ls_level_1)
GlobalVariableSet("dpstlslvl",ls_level_1);
}
} // end of "if ((dBid-OrderOpenPrice())<pf_level_1*Point)"
} // end of "if (trlinloss==true)"
}
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| ÒÐÅÉËÈÍÃ ÏÎ ÖÅÍÂÎÌÓ ÊÀÍÀËÓ |
//| Ôóíêöèè ïåðåäà¸òñÿ òèêåò ïîçèöèè, ïåðèîä (êîë-âî áàðîâ) äëÿ |
//| ðàññ÷åòà âåðõíåé è íèæíåé ãðàíèö êàíàëà, îòñòóï (ïóíêòîâ), íà |
//| êîòîðîì ðàçìåùàåòñÿ ñòîïëîññ îò ãðàíèöû êàíàëà |
//| Òðåéëèíã ïî çàêðûâøèìñÿ áàðàì. |
//+------------------------------------------------------------------+
void TrailingByPriceChannel(int iTicket,int iBars_n,int iIndent)
{
// ïðîâåðÿåì ïåðåäàííûå çíà÷åíèÿ
if ((iBars_n<1) || (iIndent<0) || (iTicket==0) || (!OrderSelect(iTicket,SELECT_BY_TICKET)))
{
Print("Òðåéëèíã ôóíêöèåé TrailingByPriceChannel() íåâîçìîæåí èç-çà íåêîððåêòíîñòè çíà÷åíèé ïåðåäàííûõ åé àðãóìåíòîâ.");
return(0);
}
double dChnl_max; // âåðõíÿÿ ãðàíèöà êàíàëà
double dChnl_min; // íèæíÿÿ ãðàíèöà êàíàëà
// îïðåäåëÿåì ìàêñ.õàé è ìèí.ëîó çà iBars_n áàðîâ íà÷èíàÿ ñ [1] (= âåðõíÿÿ è íèæíÿÿ ãðàíèöû öåíîâîãî êàíàëà)
dChnl_max = High[iHighest(Symbol(),0,2,iBars_n,1)] + (iIndent+MarketInfo(Symbol(),MODE_SPREAD))*Point;
dChnl_min = Low[iLowest(Symbol(),0,1,iBars_n,1)] - iIndent*Point;
// åñëè äëèííàÿ ïîçèöèÿ, è å¸ ñòîïëîññ õóæå (íèæå íèæíåé ãðàíèöû êàíàëà ëèáî íå îïðåäåëåí, ==0), ìîäèôèöèðóåì åãî
if (OrderType()==OP_BUY)
{
if ((OrderStopLoss()<dChnl_min) && (dChnl_min<Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
{
if (!OrderModify(iTicket,OrderOpenPrice(),dChnl_min,OrderTakeProfit(),OrderExpiration()))
Print("Íå óäàëîñü ìîäèôèöèðîâàòü ñòîïëîññ îðäåðà ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
}
}
// åñëè ïîçèöèÿ - êîðîòêàÿ, è å¸ ñòîïëîññ õóæå (âûøå âåðõíåé ãðàíèöû êàíàëà èëè íå îïðåäåë¸í, ==0), ìîäèôèöèðóåì åãî
if (OrderType()==OP_SELL)
{
if (((OrderStopLoss()==0) || (OrderStopLoss()>dChnl_max)) && (dChnl_min>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
{
if (!OrderModify(iTicket,OrderOpenPrice(),dChnl_max,OrderTakeProfit(),OrderExpiration()))
Print("Íå óäàëîñü ìîäèôèöèðîâàòü ñòîïëîññ îðäåðà ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
}
}
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| ÒÐÅÉËÈÍÃ ÏÎ ÑÊÎËÜÇßÙÅÌÓ ÑÐÅÄÍÅÌÓ |
//| Ôóíêöèè ïåðåäà¸òñÿ òèêåò ïîçèöèè è ïàðàìåòðû ñðåäíåé (òàéìôðåéì, |
//| ïåðèîä, òèï, ñäâèã îòíîñèòåëüíî ãðàôèêà, ìåòîä ñãëàæèâàíèÿ, |
//| ñîñòàâëÿþùàÿ OHCL äëÿ ïîñòðîåíèÿ, ¹ áàðà, íà êîòîðîì áåðåòñÿ |
//| çíà÷åíèå ñðåäíåé. |
//+------------------------------------------------------------------+
// Äîïóñòèìûå âàðèàíòû ââîäà:
// iTmFrme: 1 (M1), 5 (M5), 15 (M15), 30 (M30), 60 (H1), 240 (H4), 1440 (D), 10080 (W), 43200 (MN);
// iMAPeriod: 2-infinity, öåëûå ÷èñëà;
// iMAShift: öåëûå ïîëîæèòåëüíûå èëè îòðèöàòåëüíûå ÷èñëà, à òàêæå 0;
// MAMethod: 0 (MODE_SMA), 1 (MODE_EMA), 2 (MODE_SMMA), 3 (MODE_LWMA);
// iApplPrice: 0 (PRICE_CLOSE), 1 (PRICE_OPEN), 2 (PRICE_HIGH), 3 (PRICE_LOW), 4 (PRICE_MEDIAN), 5 (PRICE_TYPICAL), 6 (PRICE_WEIGHTED)
// iShift: 0-Bars, öåëûå ÷èñëà;
// iIndent: 0-infinity, öåëûå ÷èñëà;
void TrailingByMA(int iTicket,int iTmFrme,int iMAPeriod,int iMAShift,int MAMethod,int iApplPrice,int iShift,int iIndent)
{
// ïðîâåðÿåì ïåðåäàííûå çíà÷åíèÿ
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)) ||
(iMAPeriod<2) || (MAMethod<0) || (MAMethod>3) || (iApplPrice<0) || (iApplPrice>6) || (iShift<0) || (iIndent<0))
{
Print("Òðåéëèíã ôóíêöèåé TrailingByMA() íåâîçìîæåí èç-çà íåêîððåêòíîñòè çíà÷åíèé ïåðåäàííûõ åé àðãóìåíòîâ.");
return(0);
}
double dMA; // çíà÷åíèå ñêîëüçÿùåãî ñðåäíåãî ñ ïåðåäàííûìè ïàðàìåòðàìè
// îïðåäåëèì çíà÷åíèå ÌÀ ñ ïåðåäàííûìè ôóíêöèè ïàðàìåòðàìè
dMA = iMA(Symbol(),iTmFrme,iMAPeriod,iMAShift,MAMethod,iApplPrice,iShift);
// åñëè äëèííàÿ ïîçèöèÿ, è å¸ ñòîïëîññ õóæå çíà÷åíèÿ ñðåäíåãî ñ îòñòóïîì â iIndent ïóíêòîâ, ìîäèôèöèðóåì åãî
if (OrderType()==OP_BUY)
{
if ((OrderStopLoss()<dMA-iIndent*Point) && (dMA-iIndent*Point<Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
{
if (!OrderModify(iTicket,OrderOpenPrice(),dMA-iIndent*Point,OrderTakeProfit(),OrderExpiration()))
Print("Íå óäàëîñü ìîäèôèöèðîâàòü ñòîïëîññ îðäåðà ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
}
}
// åñëè ïîçèöèÿ - êîðîòêàÿ, è å¸ ñòîïëîññ õóæå (âûøå âåðõíåé ãðàíèöû êàíàëà èëè íå îïðåäåë¸í, ==0), ìîäèôèöèðóåì åãî
if (OrderType()==OP_SELL)
{
if (((OrderStopLoss()==0) || (OrderStopLoss()>dMA+(MarketInfo(Symbol(),MODE_SPREAD)+iIndent)*Point)) && (dMA+(MarketInfo(Symbol(),MODE_SPREAD)+iIndent)*Point>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
{
if (!OrderModify(iTicket,OrderOpenPrice(),dMA+(MarketInfo(Symbol(),MODE_SPREAD)+iIndent)*Point,OrderTakeProfit(),OrderExpiration()))
Print("Íå óäàëîñü ìîäèôèöèðîâàòü ñòîïëîññ îðäåðà ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
}
}
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| ÒÐÅÉËÈÍÃ "ÏÎËÎÂÈÍßÙÈÉ" |
//| Ïî çàêðûòèè î÷åðåäíîãî ïåðèîäà (áàðà) ïîäòÿãèâàåì ñòîïëîññ íà |
//| ïîëîâèíó (íî ìîæíî è ëþáîé èíîé êîýôôèöèåíò) äèñòàíöèè, ïðîé- |
//| äåííîé êóðñîì (ò.å., íàïðèìåð, ïî çàêðûòèè ñóòîê ïðîôèò +55 ï. - |
//| ñòîïëîññ ïåðåíîñèì â 55/2=27 ï. Åñëè ïî çàêðûòèè ñëåä. |
//| ñóòîê ïðîôèò äîñòèã, äîïóñòèì, +80 ï., òî ñòîïëîññ ïåðåíîñèì íà |
//| ïîëîâèíó (íàïð.) ðàññòîÿíèÿ ìåæäó òåê. ñòîïëîññîì è êóðñîì íà |
//| çàêðûòèè áàðà - 27 + (80-27)/2 = 27 + 53/2 = 27 + 26 = 53 ï. |
//| iTicket - òèêåò ïîçèöèè; iTmFrme - òàéìôðåéì (â ìèíóòàõ, öèôðàìè |
//| dCoeff - "êîýôôèöèåíò ïîäæàòèÿ", â % îò 0.01 äî 1 (â ïîñëåäíåì |
//| ñëó÷àå ñòîïëîññ áóäåò ïåðåíåñåí (åñëè ïîëó÷èòñÿ) âïëîòíóþ ê òåê. |
//| êóðñó è ïîçèöèÿ, ñêîðåå âñåãî, ñðàçó æå çàêðîåòñÿ) |
//| bTrlinloss - ñòîèò ëè òðàëèòü íà ëîññîâîì ó÷àñòêå - åñëè äà, òî |
//| ïî çàêðûòèþ î÷åðåäíîãî áàðà ðàññòîÿíèå ìåæäó ñòîïëîññîì (â ò.÷. |
//| "äî" áåçóáûòêà) è òåêóùèì êóðñîì áóäåò ñîêðàùàòüñÿ â dCoeff ðàç |
//| ÷òîáû ïîñë. âàðèàíò ðàáîòàë, îáÿçàòåëüíî äîëæåí áûòü îïðåäåë¸í |
//| ñòîïëîññ (íå ðàâåí 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());
}
}
}
}
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| ÒÐÅÉËÈÍÃ KillLoss |
//| Ïðèìåíÿåòñÿ íà ó÷àñòêå ëîññîâ. Ñóòü: ñòîïëîññ äâèæåòñÿ íàâñòðå÷ó |
//| êóðñó ñî ñêîðîñòüþ äâèæåíèÿ êóðñà õ êîýôôèöèåíò (dSpeedCoeff). |
//| Ïðè ýòîì êîýôôèöèåíò ìîæíî "ïðèâÿçàòü" ê ñêîðîñòè óâåëè÷åíèÿ |
//| óáûòêà - òàê, ÷òîáû ïðè áûñòðîì ðîñòå ëîññà ïîòåðÿòü ìåíüøå. Ïðè |
//| êîýôôèöèåíòå = 1 ñòîïëîññ ñðàáîòàåò ðîâíî ïîñðåäèíå ìåæäó óðîâ- |
//| íåì ñòîïëîññà è êóðñîì íà ìîìåíò çàïóñêà ôóíêöèè, ïðè êîýôô.>1 |
//| òî÷êà âñòðå÷è êóðñà è ñòîïëîññà áóäåò ñìåùåíà â ñòîðîíó èñõîä- |
//| íîãî ïîëîæåíèÿ êóðñà, ïðè êîýôô.<1 - íàîáîðîò, áëèæå ê èñõîäíî- |
//| ìó ñòîïëîññó. |
//+------------------------------------------------------------------+
void KillLoss(int iTicket,double dSpeedCoeff)
{
// ïðîâåðÿåì ïåðåäàííûå çíà÷åíèÿ
if ((iTicket==0) || (!OrderSelect(iTicket,SELECT_BY_TICKET)) || (dSpeedCoeff<0.1))
{
Print("Òðåéëèíã ôóíêöèåé KillLoss() íåâîçìîæåí èç-çà íåêîððåêòíîñòè çíà÷åíèé ïåðåäàííûõ åé àðãóìåíòîâ.");
return(0);
}
double dStopPriceDiff; // ðàññòîÿíèå (ïóíêòîâ) ìåæäó êóðñîì è ñòîïëîññîì
double dToMove; // êîë-âî ïóíêòîâ, íà êîòîðîå ñëåäóåò ïåðåìåñòèòü ñòîïëîññ
// òåêóùèé êóðñ
double dBid = MarketInfo(OrderSymbol(),MODE_BID);
double dAsk = MarketInfo(OrderSymbol(),MODE_ASK);
// òåêóùåå ðàññòîÿíèå ìåæäó êóðñîì è ñòîïëîññîì
if (OrderType()==OP_BUY) dStopPriceDiff = dBid - OrderStopLoss();
if (OrderType()==OP_SELL) dStopPriceDiff = (OrderStopLoss() + MarketInfo(OrderSymbol(),MODE_SPREAD)*MarketInfo(OrderSymbol(),MODE_POINT)) - dAsk;
// ïðîâåðÿåì, åñëè òèêåò != òèêåòó, ñ êîòîðûì ðàáîòàëè ðàíüøå, çàïîìèíàåì òåêóùåå ðàññòîÿíèå ìåæäó êóðñîì è ñòîïëîññîì
if (GlobalVariableGet("zeticket")!=iTicket)
{
GlobalVariableSet("sldiff",dStopPriceDiff);
GlobalVariableSet("zeticket",iTicket);
}
else
{
// èòàê, ó íàñ åñòü êîýôôèöèåíò óñêîðåíèÿ èçìåíåíèÿ êóðñà
// íà êàæäûé ïóíêò, êîòîðûé ïðîõîäèò êóðñ â ñòîðîíó ëîññà,
// ìû äîëæíû ïåðåìåñòèòü ñòîïëîññ åìó íà âñòðå÷ó íà dSpeedCoeff ðàç ïóíêòîâ
// (íàïðèìåð, åñëè ëîññ óâåëè÷èëñÿ íà 3 ïóíêòà çà òèê, dSpeedCoeff = 1.5, òî
// ñòîïëîññ ïîäòÿãèâàåì íà 3 õ 1.5 = 4.5, îêðóãëÿåì - 5 ï. Åñëè ïîäòÿíóòü íå
// óäà¸òñÿ (ñëèøêîì áëèçêî), íè÷åãî íå äåëàåì.
// êîë-âî ïóíêòîâ, íà êîòîðîå ïðèáëèçèëñÿ êóðñ ê ñòîïëîññó ñ ìîìåíòà ïðåäûäóùåé ïðîâåðêè (òèêà, ïî èäåå)
dToMove = (GlobalVariableGet("sldiff") - dStopPriceDiff) / MarketInfo(OrderSymbol(),MODE_POINT);
// çàïèñûâàåì íîâîå çíà÷åíèå, íî òîëüêî åñëè îíî óìåíüøèëîñü
if (dStopPriceDiff<GlobalVariableGet("sldiff"))
GlobalVariableSet("sldiff",dStopPriceDiff);
// äàëüøå äåéñòâèÿ íà ñëó÷àé, åñëè ðàññòîÿíèå óìåíüøèëîñü (ò.å. êóðñ ïðèáëèçèëñÿ ê ñòîïëîññó, óáûòîê ðàñòåò)
if (dToMove>0)
{
// ñòîïëîññ, ñîîòâåòñòâåííî, íóæíî òàêæå ïåðåäâèíóòü íà òàêîå æå ðàññòîÿíèå, íî ñ ó÷åòîì êîýôô. óñêîðåíèÿ
dToMove = MathRound(dToMove * dSpeedCoeff) * MarketInfo(OrderSymbol(),MODE_POINT);
// òåïåðü ïðîâåðèì, ìîæåì ëè ìû ïîäòÿíóòü ñòîïëîññ íà òàêîå ðàññòîÿíèå
if (OrderType()==OP_BUY)
{
if (dBid - (OrderStopLoss() + dToMove)>MarketInfo(OrderSymbol(),MODE_STOPLEVEL)* MarketInfo(OrderSymbol(),MODE_POINT))
OrderModify(iTicket,OrderOpenPrice(),OrderStopLoss() + dToMove,OrderTakeProfit(),OrderExpiration());
}
if (OrderType()==OP_SELL)
{
if ((OrderStopLoss() - dToMove) - dAsk>MarketInfo(OrderSymbol(),MODE_STOPLEVEL) * MarketInfo(OrderSymbol(),MODE_POINT))
OrderModify(iTicket,OrderOpenPrice(),OrderStopLoss() - dToMove,OrderTakeProfit(),OrderExpiration());
}
}
}
}
//+------------------------------------------------------------------+
Comments
Markdown Formatting Guide
# H1
## H2
### H3
**bold text**
*italicized text*
[title](https://www.example.com)

`code`
```
code block
```
> blockquote
- Item 1
- Item 2
1. First item
2. Second item
---