Price Data Components
Orders Execution
Indicators Used
0
Views
0
Downloads
0
Favorites
TrailingAll
//+------------------------------------------------------------------+
//| 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 - òðàëèòü ëè â |
//| çîíå óáûòêîâ
//| Ôóíêöèÿ òðàëèò ñòîïëîññ ïî ýêñòðåìóìàì ôðàêòàëîâ çàäàíîãî ðàçìåðà
//| (ò.å. êîë-âà áàðîâ â ñîñòàâå ôðàêòàëà) íà çàäàííîì òàéìôðåéìå.
//| Ôðàêòàë, êàê èçâåñòíî, â "êëàññè÷åñêîì" âèäå (Âèëüÿìñà, åñëè íå îøèáàþñü) -
//| ýòî êîìáèíàöèÿ èç 5 áàðîâ, íî ìíå ïîäóìàëîñü, à ïî÷åìó áû íå èñïîëüçîâàòü è äðóãèå "ðàçìåðû" -
//| íà÷èíàÿ îò 3 áàðîâ è âûøå, âêëþ÷àÿ ïàðíûå êîë-âà áàðîâ (â ïîñëåäíåì ñëó÷àå êîë-âî áàðîâ ïîñëå ýêñòðåìóìà,
//| ïî ìåðå äâèæåíèÿ "â ïðîøëîå", áóäåò áîëüøå, ÷åì äî ýêñòðåìóìà).
//+------------------------------------------------------------------+
//| Ïàðàìåòðû:
//| ticket - óíèêàëüíûé ïîðÿäêîâûé íîìåð îðäåðà(âûáðàííûé ïåðåä âûçîâîì ôóíêöèè ñ ïîìîùüþ OrderSelect());
//| tmfrm - òàéìôðåéì, ïî áàðàì êîòîðîãî îñóùåñòâëÿåòñÿ òðåéëèíã (âàðèàíòû - 1, 5, 15, 30, 60, 240, 1440, 10080, 43200);
//| bars_n - êîëè÷åñòâî áàðîâ â ñîñòàâå ôðàêòàëà (íå ìåíüøå 3);
//| indent - îòñòóï (ïóíêòîâ) îò ýêñòðåìóìà ïîñëåäíåãî ôðàêòàëà, íà êîòîðîì áóäåò ðàçìåùåí ñòîïëîññ (íå ìåíüøå 0);
//| trlinloss - óêàçàòåëü òîãî, ñëåäóåò ëè ïåðåäâèãàòü ñòîïëîññ íà "ëîññîâîì" ó÷àñòêå, ò.å. â èíòåðâàëå ìåæäó
//| íà÷àëüíûì ñòîïëîññîì è êóðñîì îòêðûòèÿ (true - òðàëèì, false - òðåéëèíã íà÷èíàåòñÿ òîëüêî ïðè óñëîâèè,
//| ÷òî íîâûé ñòîïëîññ "ëó÷øå" êóðñà îòêðûòèÿ, "â ïðîôèòå").
//+------------------------------------------------------------------+
//| Íå ðàç âñòðå÷àë íà íåñêîëüêèõ èç îñíîâíûõ ðóíåòîâñêèõ ôîðóìîâ Ôîðåêñ-òåìàòèêè óòâåðæäåíèÿ îòíîñèòåëüíî òîãî,
//| ÷òî "õîðîø òðåéëèíã ïî ôðàêòàëàì íà áîëåå íèçêîì òàéìôðåéìå".
//| Ïîñêîëüêó ôðàêòàëû, ïî ñóòè, îáîçíà÷àþò ëîêàëüíûå ýêñòðåìóìû, òðåéëèíã ïî íèì, òàêæå, â ïðèíöèïå,
//| ìîæíî íàçâàòü òðåéëèíãîì ïî ëîêàëüíûì ýêñòðåìóìàì. Èäåÿ íå íîâàÿ è âïîëíå çäðàâàÿ,
//| èñïîëüçîâàâøàÿñÿ ìíîãèìè èçâåòíûìè òðåéäåðàìè (òåì æå Âèëüÿìñîì, åñëè íå îøèáàþñü).
//| Ïîçâîëÿåò ïåðåæèâàòü îòêàòû è íåïëîõî "âûáèðàòü" çàìåòíûå äâèæåíèÿ, íåâàæíî (ïî ëè÷íîìó îïûòó) ðàáîòàåò âî ôëýòå.
//| Ïîäîáíî ïðåäûäóùåé, äàííàÿ ôóíêöèÿ "òðàëèò" ïî ñôîðìèðîâàâøèìñÿ áàðàì. Ïðè æåëàíèè ìîæíî äèíàìè÷åñêè
//| (â ïðåäåëàõ "æèçíè" ïîçèöèè) èçìåíÿòü ïàðàìåòðû, íàïðèìåð, ïðè áûñòðîì "ïðèðîñòå" ïðîôèòå (íàïðèìåð, ïðè ñèëüíîì òðåíäå),
//| "çàãðóáëÿòü" å¸ ÷óâñòâèòåëüíîñòü, ïåðåõîäÿ íà áîëåå êðóïíûé òàéìôðåéì èëè óâåëè÷èâàÿ êîë-âî áàðîâ âî ôðàêòàëå,
//| èëè, íàîáîðîò, ïðè ñïàäàõ âîëàòèëüíîñòè ïîâûøàòü ÷óâñòâèòåëüíîñòü, ïåðåõîäÿ íà áîëåå ìåëêèé òàéìôðåéì èëè óìåíüøàÿ
//| êîë-âî áàðîâ âî ôðàêòàëå. Âîçìîæíû è äðóãèå âàðèàíòû.
//+------------------------------------------------------------------+
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())
OrderModify(ticket,OrderOpenPrice(),iLow(Symbol(),tmfrm,sell_peak_n)-indent*Point,OrderTakeProfit(),OrderExpiration());
}
// åñëè òðàëèòü òîëüêî â ïðîôèòå, òî
else
// åñëè íîâûé ñòîïëîññ ëó÷øå èìåþùåãîñÿ È êóðñà îòêðûòèÿ
if ((iLow(Symbol(),tmfrm,sell_peak_n)-indent*Point>OrderStopLoss()) && (iLow(Symbol(),tmfrm,sell_peak_n)-indent*Point>OrderOpenPrice()))
OrderModify(ticket,OrderOpenPrice(),iLow(Symbol(),tmfrm,sell_peak_n)-indent*Point,OrderTakeProfit(),OrderExpiration());
}
// åñëè êîðîòêàÿ ïîçèöèÿ (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))
OrderModify(ticket,OrderOpenPrice(),iHigh(Symbol(),tmfrm,buy_peak_n)+(indent+MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration());
}
// åñëè òðàëèòü òîëüêî â ïðîôèòå, òî
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()))
OrderModify(ticket,OrderOpenPrice(),iHigh(Symbol(),tmfrm,buy_peak_n)+(indent+MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration());
}
}
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| ÒÐÅÉËÈÍà ÏÎ ÒÅÍßÌ N ÑÂÅ×ÅÉ |
//| Ôóíêöèè ïåðåäà¸òñÿ òèêåò ïîçèöèè, êîëè÷åñòâî áàðîâ, ïî òåíÿì |
//| êîòîðûõ íåîáõîäèìî òðåéëèíãîâàòü (îò 1 è áîëüøå) è îòñòóï |
//| (ïóíêòîâ) - ðàññòîÿíèå îò ìàêñ. (ìèí.) ñâå÷è, íà êîòîðîå |
//| ïåðåíîñèòñÿ ñòîïëîññ (îò 0), trlinloss - òðàëèòü ëè â ëîññå |
//----Ôóíêöèÿ ðåàëèçóåò ïîäòÿãèâàíèå ñòîïëîññà ïî ìèíèìàëüíîìó èç low (äëÿ äëèííûõ ïîçèöèé) èëè ìàêñèìàëüíîìó high
//(äëÿ êîðîòêèõ) çàäàííîãî êîëè÷åñòâà áàðîâ, íà òåêóùåì èëè îòëè÷íîì îò òåêóùåãî òàéìôðåéìå.
//----------------------------------------------------------------------------------------------------------------------
//Ïàðàìåòðû:
//ticket - óíèêàëüíûé ïîðÿäêîâûé íîìåð îðäåðà (âûáðàííûé ïåðåä âûçîâîì ôóíêöèè ñ ïîìîùüþ OrderSelect());
//tmfrm - òàéìôðåéì, ïî áàðàì êîòîðîãî îñóùåñòâëÿåòñÿ òðåéëèíã (âàðèàíòû - 1, 5, 15, 30, 60, 240, 1440, 10080, 43200);
//bars_n - êîëè÷åñòâî áàðîâ, êîòîðûå èñïîëüçóþòñÿ äëÿ îïðåäåëåíèÿ óðîâíÿ ñòîïëîññà (íå ìåíüøå 1);
//indent - îòñòóï (ïóíêòîâ) îò âûáðàííîãî high/low, íà êîòîðîì áóäåò ðàçìåùåí ñòîïëîññ (íå ìåíüøå 0);
//trlinloss - óêàçàòåëü òîãî, ñëåäóåò ëè ïåðåäâèãàòü ñòîïëîññ íà "ëîññîâîì" ó÷àñòêå, ò.å.
//â èíòåðâàëå ìåæäó íà÷àëüíûì ñòîïëîññîì è êóðñîì îòêðûòèÿ (true - òðàëèì, false - òðåéëèíã íà÷èíàåòñÿ òîëüêî ïðè óñëîâèè,
//÷òî íîâûé ñòîïëîññ "ëó÷øå" êóðñà îòêðûòèÿ, "â ïðîôèòå").
//----------------------------------------------------------------------------------------------------------------------
//Äàííûé âèä òðåéëèíãà áûë âïåðâûå âñòðå÷åí ìíîé â îïèñàíèè òàêòèêè Â. Áàðèøïîëüöà "Ïðîáîé ñðåäíåé íà äíåâêàõ", â êîòîðîé ïðåäëàãàëîñü òðåéëèíãîâàòü ñòîïëîññ ïî ëîó (äëÿ ïîêóïîê) èëè õàé (ïðîäàæ) ïîñëåäíèõ 2 áàðîâ (ñâå÷åé) íà äíåâíîì òàéìôðåéìå. Òðàëèò äàííûé àëãîðèòì èíîãäà íà óäèâëåíèå "êðàñèâî" (ïîïðîáóéòå "ïðîéòèñü" ïî ãðàôèêó "ãëàçàìè"), ïîçâîëÿåò ïåðåæèâàòü îòêàòû (ãëóáèíà çàâèñèò îò çàäàííîãî êîëè÷åñòâà áàðîâ, bars_n) è ïåðèîäû îñëàáëåíèÿ âîëàòèëüíîñòè. (Ïî îïðåäåëåíèþ) ñðàáàòûâàåò ïî çàêðûòèþ î÷åðåäíîãî áàðà, äàæå åñëè âû èñïîëüçóåòå åãî íà êàæäîì òèêå. ß èñïîëüçóþ åãî ïðåèìóùåñòâåííî íà äíåâêàõ, òðàëþ ïî 2-4 (íàèáîëåå ÷àñòî) ïîñëåäíèì áàðàì.
//+------------------------------------------------------------------+
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))
OrderModify(ticket,OrderOpenPrice(),new_extremum - indent*Point,OrderTakeProfit(),OrderExpiration());
}
else
{
// åñëè íîâûé ñòîïëîññ íå òîëüêî ëó÷øå ïðåäûäóùåãî, íî è êóðñà îòêðûòèÿ ïîçèöèè
if ((((new_extremum - indent*Point)>OrderStopLoss()) || (OrderStopLoss()==0)) && ((new_extremum - indent*Point)>OrderOpenPrice()))
OrderModify(ticket,OrderOpenPrice(),new_extremum-indent*Point,OrderTakeProfit(),OrderExpiration());
}
}
// åñëè êîðîòêàÿ ïîçèöèÿ (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))
OrderModify(ticket,OrderOpenPrice(),new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration());
}
else
{
// åñëè íîâûé ñòîïëîññ íå òîëüêî ëó÷øå ïðåäûäóùåãî, íî è êóðñà îòêðûòèÿ ïîçèöèè
if ((((new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point)<OrderStopLoss()) || (OrderStopLoss()==0)) && ((new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point)<OrderOpenPrice()))
OrderModify(ticket,OrderOpenPrice(),new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration());
}
}
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| ÒÐÅÉËÈÍà ÑÒÀÍÄÀÐÒÍÛÉ-ÑÒÓÏÅÍ×ÀÑÒÛÉ |
//| Ôóíêöèè ïåðåäà¸òñÿ òèêåò ïîçèöèè, ðàññòîÿíèå îò êóðñà îòêðûòèÿ, |
//| íà êîòîðîì òðåéëèíã çàïóñêàåòñÿ (ïóíêòîâ) è "øàã", ñ êîòîðûì îí |
//| ïåðåíîñèòñÿ (ïóíêòîâ) |
//| Ïðèìåð: ïðè +30 ñòîï íà +10, ïðè +40 - ñòîï íà +20 è ò.ä. |
//+------------------------------------------------------------------+
//| Äàííûé âèä òðåéëèíãà ÿâëÿåòñÿ äîðàáîòêîé ñòàíäàðòíîãî. Åñëè íå îøèáàþñü, â ñâî¸ âðåìÿ ïîõîæèé áûë íàïèñàí KimIV'îì
//| (íî ïîñêîëüêó "ñâîå - ðîäíåå",... :) Îòëè÷àåòñÿ îò ñòàíäàðòíîãî òðåéëèíãà òåì, ÷òî ïåðåíîñ ñòîïëîññà îñóùåñòâëÿåòñÿ íå
//| "ïîïóíêòîâî" (íàïðèìåð, ïðè òðåéëèíãå íà ðàññòîÿíèè 30 ïóíêòîâ ïðè +31 ñòîïëîññ áóäåò ïåíåìåùåí íà +1, ïðè +32 - íà +2
//| è ò.ä.), à "øàãàìè" çàäàííîé äëèíû (íàïðèìåð, ïðè òðåéëèíãå íà ðàññòîÿíèè â 40 ïóíêòîâ è "øàãå" â 10 ïðè äîñòèæåíèè +40
//| ñòîïëîññ áóäåò ïåðåìåùåí íà +10, äàëüøå äî ìîìåíòà äîñòèæåíèÿ ïðîôèòîì +50 (40 ï. + øàã) íè÷åãî íå ïîìåíÿåòñÿ (ò.î. ìû
//| äà¸ì öåíå îïðåäåë¸ííóþ ñâîáîäó, â ÷åì, ñîáñòâåííî, è ñóòü äàííîãî àëãîðèòìà), è òîëüêî ïðè +50 ñòîïëîññ ñ +10 áóäåò
//| ïåðåíåñåí íà øàã - ñ +10 íà +20, ïðè +60 - íà +30 ï. è ò.ä.
//+------------------------------------------------------------------+
//| Ïàðàìåòðû:
//| ticket - óíèêàëüíûé ïîðÿäêîâûé íîìåð îðäåðà (âûáðàííûé ïåðåä âûçîâîì ôóíêöèè ñ ïîìîùüþ OrderSelect());
//| trldistance - ðàññòîÿíèå îò òåêóùåãî êóðñà (ïóíêòîâ), íà êîòîðîì "òðàëèì" (íå ìåíüøå MarketInfo(Symbol(),MODE_STOPLEVEL));
//| trlstep - "øàã" èçìåíåíèÿ ñòîïëîññà (ïóíêòîâ) (íå ìåíüøå 1).
//+------------------------------------------------------------------+
//| Ïðè trlstep=1 äàííàÿ ôóíêöèÿ íå áóäåò îòëè÷àòüñÿ îò ñòàíäàðòíîãî òðåéëèíãà. Îñíîâíàÿ "ôèøêà" äàííîãî àëãîðèòìà,
//| ïîâòîðþñü, â ïðåäîñòàâëåíèè êóðñó íåêîòîðîé "ñâîáîäû äâèæåíèé" - ñòîïëîññ ïîäòÿãèâàåòñÿ òîëüêî ïîñëå òîãî, êàê öåíà
//| "ïîáðîäèâ, îïðåäåëèëàñü". Äàííûé àëãîðèòì òðåéëèíãà ÿ âïåðâûå âñòðåòèë â îïèñàíèè ïðàâèë òàêòèêè "Ñêîëüçÿùèå êàíàëû"
//| óæå óïîìèíàâøåãîñÿ Â.Áàðèøïîëüöà.
//+------------------------------------------------------------------+
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()))
OrderModify(ticket,OrderOpenPrice(),OrderOpenPrice() + trlstep*Point,OrderTakeProfit(),OrderExpiration());
else
OrderModify(ticket,OrderOpenPrice(),OrderStopLoss() + trlstep*Point,OrderTakeProfit(),OrderExpiration());
}
// åñëè êîðîòêàÿ ïîçèöèÿ (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()))
OrderModify(ticket,OrderOpenPrice(),OrderOpenPrice() - (trlstep + MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration());
else
OrderModify(ticket,OrderOpenPrice(),OrderStopLoss()- (trlstep + MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration());
}
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| ÒÐÅÉËÈÍÃ ÑÒÀÍÄÀÐÒÍÛÉ-"ÓÄÀÂÊÀ" |
//| Ôóíêöèè ïåðåäà¸òñÿ òèêåò ïîçèöèè, èñõîäíûé òðåéëèíã (ïóíêòîâ) è |
//| 2 "óðîâíÿ" (çíà÷åíèÿ ïðîôèòà, ïóíêòîâ), ïðè êîòîðûõ òðåéëèíã |
//| ñîêðàùàåì, è ñîîòâåòñòâóþùèå çíà÷åíèÿ òðåéëèíãà (ïóíêòîâ) |
//| Ïðèìåð: èñõîäíûé òðåéëèíã 30 ï., ïðè +50 - 20 ï., +80 è áîëüøå - |
//| íà ðàññòîÿíèè â 10 ïóíêòîâ. |
//+------------------------------------------------------------------+
//| Áåçîòêàòíûõ äâèæåíèé íåîãðàíè÷åííîé äëèíû, êàê èçâåñòíî, íå áûâàåò (ýõ...). È ñîâåðøèâ îïðåäåë¸ííûé "ðûâîê"
//| (ñðåäíåå çíà÷åíèå êîòîðîãî ìîæíî ïîïûòàòüñÿ îïðåäåëèòü, íàïðèìåð, ñòàòèñòè÷åñêè), êóðñ, êàê ïðàâèëî, ôîðìèðóåò
//| êîíñîëèäàöèþ èëè îòêàò. Èäåÿ äàííîãî àëãîðèòìà ñîïðîâîæäåíèÿ - ïî ìåðå óâåëè÷åíèÿ ïðîôèòà ñîêðàùàòü äèñòàíöèþ
//| òðåéëèíãà òàêèì îáðàçîì, ÷òîáû ïîäõîäÿ ê ó÷àñòêó âåðîÿòíîãî ðàçâîðîòà/êîíñîëèäàöèè "çàñòîëáèòü" ïîáîëüøå ïðîôèòà.
//| Ïîìèìî ðàáîòû íà óïîìÿíóòûõ âûøå "ðûâêàõ" (êîòîðûå îáû÷íî èìåþò ìåñòî íà íîâîñòÿõ èëè ïðè ïðîáîå èñòîðè÷åñêèõ óðîâíåé),
//| ôóíêöèþ òàêæå ìîæíî èñïîëüçîâàòü ïðè ðàáîòå â êàíàëàõ, ñîêðàùàÿ äèñòàíöèþ òðåéëèíãà ïðè ïîäõîäå ê ïðîòèâîïîëîæíîé
//| (îòíîñèòåëüíî îòêðûòèÿ) ãðàíèöå êàíàëà.
//+------------------------------------------------------------------+
//| Ïàðàìåòðû:
//| ticket - óíèêàëüíûé ïîðÿäêîâûé íîìåð îðäåðà (âûáðàííûé ïåðåä âûçîâîì ôóíêöèè ñ ïîìîùüþ OrderSelect());
//| trl_dist_1 - èñõîäíîå ðàññòîÿíèå òðåéëèíãà (ïóíêòîâ) (íå ìåíüøå MarketInfo(Symbol(),MODE_STOPLEVEL),
//| áîëüøå trl_dist_2 è trl_dist_3);
//| level_1 - óðîâåíü ïðîôèòà (ïóíêòîâ), ïðè äîñòèæåíèè êîòîðîãî äèñòàíöèÿ òðåéëèíãà áóäåò ñîêðàùåíà
//| ñ trl_dist_1 äî trl_dist_2 (ìåíüøå level_2; áîëüøå trl_dist_1);
//| trl dist_2 - ðàññòîÿíèå òðåéëèíãà (ïóíêòîâ) ïîñëå äîñòèæåíèÿ êóðñîì óðîâíÿ ïðîôèòà â level_1 ïóíêòîâ
//| (íå ìåíüøå MarketInfo(Symbol(),MODE_STOPLEVEL));
//| level_2 - óðîâåíü ïðîôèòà (ïóíêòîâ), ïðè äîñòèæåíèè êîòîðîãî äèñòàíöèÿ òðåéëèíãà áóäåò ñîêðàùåíà
//| ñ trl_dist_2 äî trl_dist_3 ïóíêòîâ (áîëüøå trl_dist_1 è áîëüøå level_1);
//| trl dist_3 - ðàññòîÿíèå òðåéëèíãà (ïóíêòîâ) ïîñëå äîñòèæåíèÿ êóðñîì óðîâíÿ ïðîôèòà â level_2 ïóíêòîâ (
//| íå ìåíüøå MarketInfo(Symbol(),MODE_STOPLEVEL)).
//+------------------------------------------------------------------+
//| Ê ïðèìåðó, ïðè ïàðàìåòðàõ "ticket#, 30, 50, 20, 70, 10" ìû èñõîäíî òðàëèì íà ðàññòîÿíèè â 30 ïóíêòîâ, êàê òîëüêî êóðñ
//| îòîéäåò îò êóðñà îòêðûòèÿ íà 50 ïóíêòîâ, íà÷èíàåì òðàëèòü "ïëîòíåå" - íà ðàññòîÿíèè â 20 ï., à åñëè åìó óäàëîñü
//| ïðåîäîëåòü 70 ï. â íàïðàâëåíèè óâåëè÷åíèÿ ïðîôèòà, "çàòÿãèâàåì" (îòêóäà è íàçâàíèå) ðàññòîÿíèå òðàëà äî 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())
OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration());
}
// åñëè êîðîòêàÿ ïîçèöèÿ (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()))
OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration());
else
{
if (newstop<OrderStopLoss())
OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration());
}
}
}
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| ÒÐÅÉËÈÍÃ ÏÎ ÂÐÅÌÅÍÈ |
//| Ôóíêöèè ïåðåäà¸òñÿ òèêåò ïîçèöèè, èíòåðâàë (ìèíóò), ñ êîòîðûì, |
//| ïåðåäâèãàåòñÿ ñòîïëîññ è øàã òðåéëèíãà (íà ñêîëüêî ïóíêòîâ |
//| ïåðåìåùàåòñÿ ñòîïëîññ, trlinloss - òðàëèì ëè â óáûòêå |
//| (ò.å. ñ îïðåäåë¸ííûì èíòåðâàëîì ïîäòÿãèâàåì ñòîï äî êóðñà |
//| îòêðûòèÿ, à ïîòîì è â ïðîôèòå, ëèáî òîëüêî â ïðîôèòå) |
//+------------------------------------------------------------------+
//| Òðàëèì ïî âðåìåíè, áåçîòíîñèòåëüíî ê òåêóùåìó ðåçóëüòàòó ïî ïîçèöèè è ðàñêëàäó íà ðûíêå.
//| ×åðåç çàäàííûå èíòåðâàëû âðåìåíè (öåëûõ ìèíóò) ïûòàåìñÿ (ïî âîçìîæíîñòè) ïåðåìåñòèòü ñòîïëîññ íà çàäàííûé øàã.
//| Èñïîëüçîâàíèå äàííîãî òðåéëèíãà îòäåëüíî íå áûëî (äëÿ ìåíÿ, ïî êðàéíåé ìåðå, âîçìîæíî, äëÿ êîãî-òî îêàæåòñÿ èíà÷å)
//| îñîáî óñïåøíûì, îäíàêî â êîìáèíàöèè ñ äðóãèìè âèäàìè òðàëà èëè ïðè âêëþ÷åíèè ïî îïðåäåë¸ííîìó óñëîâèþ, âîçìîæíî,
//| îí ìîæåò áûòü ïîëåçåí.
//+------------------------------------------------------------------+
//| Ïàðàìåòðû:
//| ticket - óíèêàëüíûé ïîðÿäêîâûé íîìåð îðäåðà (âûáðàííûé ïåðåä âûçîâîì ôóíêöèè ñ ïîìîùüþ OrderSelect());
//| interval - êîëè÷åñòâî öåëûõ ìèíóò ñ ìîìåíòà îòêðûòèÿ ïîçèöèè, ïî èñòå÷åíèþ êîòîðûõ ïûòàåìñÿ ïåðåìåñòèòü ñòîïëîññ
//| íà øàã trlstep ïóíêòîâ;
//| trlstep - øàã (ïóíêòîâ), íà êîòîðûé ïûòàåìñÿ ïåðåìåùàòü ñòîïëîññ ÷åðåç êàæäûå interval ìèíóò;
//| trlinloss - â äàííîì ñëó÷àå åñëè trlinloss==true, òî òðàëèì îò ñòîïëîññà, èíà÷å îò êóðñà îòêðûòèÿ
//| (åñëè ñòîïëîññ íå áûë óñòàíîâëåí, ==0, òðàëèì âñåãäà îò êóðñà îòêðûòèÿ).
//+------------------------------------------------------------------+
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()) && (Bid>=(newstop + MarketInfo(Symbol(),MODE_STOPLEVEL)*Point)))
OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration());
}
}
// åñëè êîðîòêàÿ ïîçèöèÿ (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())) && (Ask<=(newstop - MarketInfo(Symbol(),MODE_STOPLEVEL)*Point)))
OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration());
else
if ((newstop<OrderStopLoss()) && (Ask<=(newstop - MarketInfo(Symbol(),MODE_STOPLEVEL)*Point)))
OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration());
}
}
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| ÒÐÅÉËÈÍÃ ÏÎ ATR (Average True Range, Ñðåäíèé èñòèííûé äèàïàçîí) |
//| Ôóíêöèè ïåðåäà¸òñÿ òèêåò ïîçèöèè, ïåðèîä ÀÒR è êîýôôèöèåíò, íà |
//| êîòîðûé óìíîæàåòñÿ ATR. Ò.î. ñòîïëîññ "òÿíåòñÿ" íà ðàññòîÿíèè |
//| ATR õ N îò òåêóùåãî êóðñà; ïåðåíîñ - íà íîâîì áàðå (ò.å. îò öåíû |
//| îòêðûòèÿ î÷åðåäíîãî áàðà) |
//| ATR - (Average True Range, Ñðåäíèé Èñòèííûé Äèàïàçîí) - îäèí èç èíäèêàòîðîâ âîëàòèëüíîñòè;
//| ÷åì áîëüøå çíà÷åíèå, òåì, ñîîòâåòñòâåííî, âûøå ñðåäíÿÿ âîëàòèëüíîñòü çà çàäàííûé ïåðèîä (èíäèêàòîðà) âðåìåíè;
//| èçìåðÿòåñÿ â ïóíêòàõ. Òðåéëèíã ïî ATR â áîëüøèíñòâå ñëó÷àåâ ïîçâîëÿåò èçìåíÿòü ñòîïëîññ ñîîòâåòñòâåííî
//| ("àäåêâàòíî", "àäàïòèâíî") õàðàêòåðó ïîâåäåíèÿ êóðñà - ïðè âûñîêîé âîëàòèëüíîñòè (âûðàæåííûõ ðûâêàõ) êóðñ "îòïóñêàåì",
//| ïðè "òîïòàíèè íà ìåñòå" ïîäæèìàåì áîëåå "ïëîòíî".  òðåéëèíãå èñïîëüçóåòñÿ 2 ATR, êîòîðûì ïðåäëàãàåòñÿ çàäàâàòü îòëè÷íûå
//| ïåðèîäû - îäèí êîðîòêèé (íàïð., 5), äðóãîé - äëèííûé (íàïð., 20). Äëÿ ðàñ÷åòà ñòîïëîññà èñïîëüçóåòñÿ âñåãäà áîëüøåå
//| èç çíà÷åíèé 2 ATR - ýòî ñäåëàíî äëÿ òîãî, ÷òîáû íåñêîëüêî íèçêîâîëàòèëüíûõ áàðîâ ïîäðÿä (íàïðèìåð, ïåðåä âûõîäîì íîâîñòåé)
//| íå ñäåëàëè íàø ñòîïëîññ ñëèøêîì áëèçêèì ê òåêóùåìó êóðñó.
//| Ïàðàìåòðû:
//| ticket - óíèêàëüíûé ïîðÿäêîâûé íîìåð îðäåðà (âûáðàííûé ïåðåä âûçîâîì ôóíêöèè ñ ïîìîùüþ OrderSelect());
//| atr_timeframe - òàéìôðåéì, íà êîòîðîì ðàññ÷èòûâàåì çíà÷åíèå ATR (âàðèàíòû - 1, 5, 15, 30, 60, 240, 1440, 10080, 43200);
//| atr1_period - ïåðèîä ïåðâîãî ATR (áîëüøå 0; ìîæåò áûòü ðàâåí atr2_period, íî ëó÷øå îòëè÷åí îò ïîñëåäíåãî, ïî÷åìó - ñì. âûøå);
//| atr1_shift - äëÿ ïåðâîãî ATR ñäâèã "îêíà", â êîòîðîì ðàññ÷èòûâàåòñÿ çíà÷åíèå ATR, îòíîñèòåëüíî òåêóùåãî áàðà íà óêàçàííîå
//| êîëè÷åñòâî áàðîâ íàçàä (íåîòðèöàòåëüíîå öåëîå ÷èñëî);
//| atr2_period - ïåðèîä âòîðîãî ATR (áîëüøå 0);
//| atr2_shift - äëÿ âòîðîãî ATR ñäâèã "îêíà", â êîòîðîì ðàññ÷èòûâàåòñÿ çíà÷åíèå ATR, îòíîñèòåëüíî òåêóùåãî áàðà íà óêàçàííîå
//| êîëè÷åñòâî áàðîâ íàçàä (íåîòðèöàòåëüíîå öåëîå ÷èñëî);
//| coeff - ñòîïëîññ ñ÷èòàåì êàê ATR*coeff, ò.å. ýòî êîýôôèöèåíò, îïðåäåëÿþùèé, íà ðàññòîÿíèè ñêîëüêèõ ATR îò òåêóùåãî êóðñà
//| ñëåäóåò ðàçìåñòèòü ñòîïëîññ;
//| trlinloss - óêàçàòåëü òîãî, ñëåäóåò ëè ïåðåäâèãàòü ñòîïëîññ íà "ëîññîâîì" ó÷àñòêå, ò.å. â èíòåðâàëå ìåæäó íà÷àëüíûì
//| ñòîïëîññîì è êóðñîì îòêðûòèÿ (true - òðàëèì, false - òðåéëèíã íà÷èíàåòñÿ òîëüêî ïðè óñëîâèè, ÷òî íîâûé ñòîïëîññ "ëó÷øå"
//| êóðñà îòêðûòèÿ, "â ïðîôèòå").
//| Òàêæå äîâîëüíî ïîïóëÿðíûé ñïîñîá òðåéëèíãà, (â áîëüøèíñòâå ñëó÷àåâ âûãîäíî) îòëè÷àþùèéñÿ îò ñòàíäàðòíîãî "àäàïòèâíîñòüþ"
//| ê òåêóùåé ñèòóàöèè íà ðûíêå.
//+------------------------------------------------------------------+
void TrailingByATR(int ticket,int atr_timeframe,int atr1_period,int atr1_shift,int atr2_period,int atr2_shift,double coeff,bool trlinloss)
{
// ïðîâåðÿåì ïåðåäàííûå çíà÷åíèÿ
//Print("ticket: ",ticket,", atr1_period: ",atr1_period,", atr2_period: ",atr2_period,", coeff: ",coeff,", OrderSelect(ticket,SELECT_BY_TICKET): ",OrderSelect(ticket,SELECT_BY_TICKET),", atr_timeframe: ",atr_timeframe,", atr1_shift: ",atr1_shift,", atr2_shift: ",atr2_shift);
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 (newstop>OrderStopLoss())
OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration());
}
else
{
Print("Bid: ",Bid,", atrXcoeff: ",atrXcoeff,", newstop: ",newstop);
// èíà÷å òðàëèòü íà÷èíàåì òîëüêî òîãäà, êîãäà ñòîïëîññ ëó÷øå êóðñà îòêðûòèÿ (â ïðîôèòå)
if ((newstop>OrderStopLoss()) && (newstop>OrderOpenPrice()))
OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration());
}
}
// åñëè êîðîòêàÿ ïîçèöèÿ (OP_SELL)
if (OrderType()==OP_SELL)
{
// îòêëàäûâàåì îò òåêóùåãî êóðñà (íîâûé ñòîïëîññ)
newstop = Ask + (atrXcoeff + MarketInfo(Symbol(),MODE_SPREAD)*Point);
// åñëè trlinloss==true (ò.å. ñëåäóåò òðàëèòü â çîíå ëîññîâ), òî
if (trlinloss==true)
{
// åñëè ñòîïëîññ íåîïðåäåëåí, òî òðàëèì â ëþáîì ñëó÷àå
if (OrderStopLoss()==0)
OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration());
// åñëè ñòîïëîññ â óáûòêå èëè â ïðîôèòå, òðàëèì òîëüêî åñëè íîâûé ñòîï ëó÷øå ñòàðîãî
else
{
if (newstop<OrderStopLoss())
OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration());
}
}
else
{
// åñëè ñòîïëîññ íåîïðåäåëåí, òî òðàëèì, åñëè ñòîï ëó÷øå îòêðûòèÿ
if ((OrderStopLoss()==0) && (newstop<OrderOpenPrice()-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration());
// åñëè ñòîï íå ðàâåí 0, òî ìåíÿåì åãî, åñëè îí ëó÷øå ïðåäûäóùåãî è êóðñà îòêðûòèÿ
else
{
if ((newstop<OrderStopLoss()) && (newstop<OrderOpenPrice()-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration());
}
}
}
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| ÒÐÅÉËÈÍÃ RATCHET ÁÀÐÈØÏÎËÜÖÀ |
//| Ïðè äîñòèæåíèè ïðîôèòîì óðîâíÿ 1 ñòîïëîññ - â +1, ïðè äîñòèæåíèè |
//| ïðîôèòîì óðîâíÿ 2 ïðîôèòà - ñòîïëîññ - íà óðîâåíü 1, êîãäà |
//| ïðîôèò äîñòèãàåò óðîâíÿ 3 ïðîôèòà, ñòîïëîññ - íà óðîâåíü 2 |
//| (äàëüøå ìîæíî òðåéëèòü äðóãèìè ìåòîäàìè) |
//| ïðè ðàáîòå â ëîññîâîì ó÷àñòêå - òîæå 3 óðîâíÿ, íî ñõåìà ðàáîòû |
//| ñ íèìè íåñêîëüêî èíàÿ, à èìåííî: åñëè ìû îïóñòèëèñü íèæå óðîâíÿ, |
//| à ïîòîì ïîäíÿëèñü âûøå íåãî (ïðèìåð äëÿ ïîêóïêè), òî ñòîïëîññ |
//| ñòàâèì íà ñëåäóþùèé, áîëåå ãëóáîêèé óðîâåíü (íàïðèìåð, óðîâíè |
//| -5, -10 è -25, ñòîïëîññ -40; åñëè îïóñòèëèñü íèæå -10, à ïîòîì |
//| ïîäíÿëèñü âûøå -10, òî ñòîïëîññ - íà -25, åñëè ïîäíèìåìñÿ âûùå |
//| -5, òî ñòîïëîññ ïåðåíåñåì íà -10, ïðè -2 (ñïðýä) ñòîï íà -5 |
//| ðàáîòàåì òîëüêî ñ îäíîé ïîçèöèåé îäíîâðåìåííî |
//| Õðàïîâîé (àíãë. ratchet) êëþ÷, êîëåñî - òîò, êîòîðûé "ïðîâîðà÷èâàåòñÿ òîëüêî â îäíîì íàïðàâëåíèè".
//| Íàçâàíèå - ìî¸, â îïèñàíèè Áàðèøïîëüöà óïîìèíàåòñÿ êàê "âòîðàÿ òàêòèêà òðåéëèíãà" (â ïðîòèâîâåñ "ïåðâîé", ñî "ñòàíäàðòíûìè"
//| - äàëüíèìè ñòîïëîññàìè), â èñïîëíåíèè KimIV - ò.í. "òðåõóðîâíåâûé" òðåéëèíã. Ñóòü: áûñòðûé ïåðåíîñ â áåçóáûòîê è ñòóïåí÷àòûé
//| òðåéëèíã ïðè íåáîëüøîì ïðîôèòå (äàëüøå ïðåäëàãàåòñÿ ïðèìåíÿòü èíûå âèäû òðåéëèíãà, íàïðèìåð, ñòàíäàðòíûé, ìîæíî ìîé
//| ñòàíäàðòíûé-"ñòóïåí÷àñòûé" èëè êàêîé-íèáóäü äðóãîé èç âûøåîïèñàííûõ). Öåëåñîîáðàçíîñòü òàêîãî òðàëà - "àáñîëþòíîå
//| áîëüøèíñòâî ïîçèöèé ïî êðàéíåé ìåðå íåêîòîðîå âðåìÿ äàþò ïðîôèò", ïîýòîìó ïðè ïåðâîé âîçìîæíîñòè ïåðåíîñèì ñòîïëîññ
//| â áåçóáûòîê; åñëè ïðåæäåâðåìåííî "çàêðîåò", íî ñèãíàëû ê îòêðûòèþ ñîõðàíÿþòñÿ, âîçìîæåí ïîâòîðíûé âõîä; à âîîáùå
//| ïîëó÷àåì áîëüøîå êîë-âî ñäåëîê, çàêðûòûõ â áåçóáûòîê, è íåñêîëüêî, âîçìîæíî, ñ õîðîøèì ïðîôèòîì - íà òåõ ñäåëêàõ,
//| ãäå ïîñëå îòêðûòèÿ ïîñëåäîâàëî ñèëüíîå äâèæåíèå â ïðîôèòíîì íàïðàâëåíèè. Àâòîð ïîä÷åðêèâàåò, ÷òî äàííûé òðåéëèíã íå ÿâëÿåòñÿ
//| "ïèïñîâî÷íûì", à ïðåäíàçíà÷åí äëÿ äîñòèæåíèÿ òîðãîâëè ñ íèçêèì % óáûòî÷íûõ ñäåëîê.
//| Ïàðàìåòðû:
//| ticket - óíèêàëüíûé ïîðÿäêîâûé íîìåð îðäåðà (âûáðàííûé ïåðåä âûçîâîì ôóíêöèè ñ ïîìîùüþ OrderSelect());
//| pf_level_1 - óðîâåíü ïðîôèòà (ïóíêòîâ), ïðè êîòîðîì ñòîïëîññ ïåðåíîñèì â áåçóáûòîê + 1 ïóíêò;
//| pf_level_2 - óðîâåíü ïðîôèòà (ïóíêòîâ), ïðè êîòîðîì ñòîïëîññ ïåðåíîñèì ñ +1 íà ðàññòîÿíèå pf_level_1 ïóíêòîâ îò êóðñà îòêðûòèÿ;
//| pf_level_3 - óðîâåíü ïðîôèòà (ïóíêòîâ), ïðè êîòîðîì ñòîïëîññ ïåðåíîñèì ñ pf_level_1 íà pf_level_2 ïóíêòîâ îò êóðñà îòêðûòèÿ
//| (íà ýòîì äåéñòâèÿ ôóíêöèè çàêàí÷èâàþòñÿ);
//| ls_level_1 - ðàññòîÿíèå îò êóðñà îòêðûòèÿ â ñòîðîíó "ëîññà", íà êîòîðîì áóäåò óñòàíîâëåí ñòîïëîññ ïðè äîñòèæåíèè ïðîôèòîì
//| ïîçèöèè +1 (ò.å. ïðè +1 ñòîïëîññ áóäåò ïîäæàò íà ls_level_1);
//| ls_level_2 - ðàññòîÿíèå îò êóðñà îòêðûòèÿ â "ëîññå", íà êîòîðîì áóäåò óñòàíîâëåí ñòîïëîññ ïðè óñëîâèè, ÷òî êóðñ ñíà÷àëà
//| îïóñêàëñÿ íèæå ls_level_1, à ïîòîì ïîäíÿëñÿ âûøå (ò.å. èìåëè ëîññ, íî îí íà÷àë óìåíüøàòüñÿ - íå äîïóñòèì åãî ïîâòîðíîãî
//| óâåëè÷åíèÿ);
//| ls_level_3 - ðàññòîÿíèå îò êóðñà îòêðûòèÿ "ìèíóñå", íà êîòîðîì áóäåò óñòàíîâëåí ñòîïëîññ ïðè óñëîâèè, ÷òî êóðñ ñíèæàëñÿ
//| íèæå ls_level_2, à ïîòîì ïîäíÿëñÿ âûøå;
//| trlinloss - óêàçàòåëü òîãî, ñëåäóåò ëè ïåðåäâèãàòü ñòîïëîññ íà "ëîññîâîì" ó÷àñòêå, ò.å. â èíòåðâàëå ìåæäó íà÷àëüíûì
//| ñòîïëîññîì è êóðñîì îòêðûòèÿ (true - òðàëèì, false - òðåéëèíã íà÷èíàåòñÿ òîëüêî ïðè óñëîâèè, ÷òî íîâûé ñòîïëîññ "ëó÷øå"
//| êóðñà îòêðûòèÿ, "â ïðîôèòå").
//| Àâòîðîì èäåè ïðåäëàãàëîñü íà EURUSD èñïîëüçîâàòü ñëåäóþùèå çíà÷åíèÿ: "5, 10, 25", ò.å. ïðè +5
//| (ò.å. "îòáèëè" ñïðýä è åù¸ 5 ïóíêòîâ ïðîøëè â ïðîôèò) ñòîïëîññ ïåðåíîñèì íà +1 (ïðè ðó÷íîé òîðãîâëå ïðåäëàãàåòñÿ
//| "äåðæàòü" åãî "â ãîëîâå", äàáû íå èñêóøàòü ëèøíèé ðàç äèëëåðà), ïðè +10 ï. ñòîïëîññ ïåðåíîñèòñÿ íà +5, ïðè +25 ï.
//| ïðîôèòà ñòîïëîññ - íà +10 è êóðñ "îòïóñêàåì" (ìîæíî ïîäæèìàòü äðóãèìè ñïîñîáàìè). Àíàëîãè÷íàÿ ÷àñòü ôóíêöèè äëÿ
//| ëîññîâîãî èíòåðâàëà àâòîðîì íå îïèñàíà, áûëà ïðèäóìàíà ÷èòàòåëÿìè åãî ðàññûëêè â õîäå îáñóæäåíèÿ. Ñóùåñòâóþò ñâåäåíèÿ,
//| ÷òî àâòîð (âåñüìà óñïåøíî) ïðèìåíÿåò äàííóþ ìåòîäèêó ïðè òîðãîâëå íà ñ÷åòå ñâîåãî èíâåñòèöèîííîãî ïðîåêòà, ÷òî, âåðîÿòíî,
//| ÿâëÿåòñÿ îäíèì èç ôàêòîðîâ î÷åíü âûñîêîãî % ïðîôèòîâ â åãî òîðãîâëå.  òî æå âðåìÿ ñëåäóåò îòìåòèòü, ÷òî äàííûé àëãîðèòì
//| òðåéëèíãà äîâîëüíî ñïåöèôè÷åí è ìîæåò ïîäîéòè íå âñåì.
//+------------------------------------------------------------------+
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)
{
Print("RatchetB");
// ïðîâåðÿåì ïåðåäàííûå çíà÷åíèÿ
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)"
}
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| ÒÐÅÉËÈÍÃ ÏÎ ÖÅÍÂÎÌÓ ÊÀÍÀËÓ |
//| Äîáàâëåí ïî ñîâåòó Nickolay Zhilin (aka rebus) |
//| Ôóíêöèè ïåðåäà¸òñÿ òèêåò ïîçèöèè, ïåðèîä (êîë-âî áàðîâ) äëÿ |
//| ðàññ÷åòà âåðõíåé è íèæíåé ãðàíèö êàíàëà, îòñòóï (ïóíêòîâ), íà |
//| êîòîðîì ðàçìåùàåòñÿ ñòîïëîññ îò ãðàíèöû êàíàëà |
//| Òðåéëèíã ïî çàêðûâøèìñÿ áàðàì. |
//+------------------------------------------------------------------+
//| Ïàðàìåòðû:
//| iTicket - óíèêàëüíûé ïîðÿäêîâûé íîìåð îðäåðà (âûáðàííûé ïåðåä âûçîâîì ôóíêöèè ñ ïîìîùüþ OrderSelect());
//| iBars_n - ïåðèîä êàíàëà (êîë-âî áàðîâ, ñðåäè êîòðûõ èùåì íàèáîëüøèé õàé è íàèìåíüøèé ëîó - âåðõíþþ è íèæíþþ
//| ãðàíèöû êàíàëà ñîîòâåòñòâåííî);
//| iIndent - îòñòóï (ïóíêòîâ), ñ êîòîðûì óñòàíàâëèâàåì ñòîïëîññ îò ãðàíèöû êàíàëà.
//+------------------------------------------------------------------+
//|  ïðèíöèïå, ïî êîíå÷íîìó ðåçóëüòàòó òðåéëèíã ïî öåíîâîìó êàíàëó ïðàêòè÷åñêè ñîâïàäàåò ñ òðåéëèíãîì ïî òåíÿì ñâå÷åé (ñì. âûøå),
//| à òàêæå â íåêîòîðîé ñòåïåíè íàïîìèíàåò òðåéëèíã ïî ôðàêòàëàì, õîòü è îòëè÷àåòñÿ ïî "êîíöåïöèè" è "öåëåñîîáðàçíîñòè".
//+------------------------------------------------------------------+
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)
OrderModify(iTicket,OrderOpenPrice(),dChnl_min,OrderTakeProfit(),OrderExpiration());
}
// åñëè ïîçèöèÿ - êîðîòêàÿ, è å¸ ñòîïëîññ õóæå (âûøå âåðõíåé ãðàíèöû êàíàëà èëè íå îïðåäåë¸í, ==0), ìîäèôèöèðóåì åãî
if (OrderType()==OP_SELL)
{
if ((OrderStopLoss()==0) || (OrderStopLoss()>dChnl_max))
OrderModify(iTicket,OrderOpenPrice(),dChnl_max,OrderTakeProfit(),OrderExpiration());
}
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| ÒÐÅÉËÈÍÃ ÏÎ ÑÊÎËÜÇßÙÅÌÓ ÑÐÅÄÍÅÌÓ |
//| Ôóíêöèè ïåðåäà¸òñÿ òèêåò ïîçèöèè è ïàðàìåòðû ñðåäíåé (òàéìôðåéì, |
//| ïåðèîä, òèï, ñäâèã îòíîñèòåëüíî ãðàôèêà, ìåòîä ñãëàæèâàíèÿ, |
//| ñîñòàâëÿþùàÿ OHCL äëÿ ïîñòðîåíèÿ, ¹ áàðà, íà êîòîðîì áåðåòñÿ |
//| çíà÷åíèå ñðåäíåé.
//+------------------------------------------------------------------+
//| Èäåÿ, â ïðèíöèïå, "â ïîëóøàãå" îò òðåéëèíãà ïî öåíîâîìó êàíàëó. Ôóíêöèè ïåðåäà¸òñÿ òèêåò ïîçèöèè, íåîáõîäèìûé òàéìôðåéì,
//| îòñòóï îò ñðåäíåé (ïóíòîâ), íà êîòîðîì óñòàíàâëèâàåòñÿ ñòîïëîññ è ñîáñòâåííî ïàðàìåòðû ñðåäíåãî (àíàëîãè÷íî ñòàíäàðòíûì
//| â iMA()). Ó÷èòûâàÿ ïðèðîäó ìóâèíãîâ, íåñëîæíî äîãàäàòüñÿ, ÷òî äàííûé àëãîðèòì ìîæåò äàâàòü âåñüìà íåïëîõîå ïîäæàòèå ïðè òðåíäå,
//| âî ôëýòå, îäíàêî, "ïóòàÿñü" ñ êóðñîì è ÷àñòî ïðèâîäÿ ê ïðåæäåâðåìåííîìó çàêðûòèþ. Âïðî÷åì, ìîæíî ïîïûòàòüñÿ ìåíÿòü ïàðàìåòðû
//| òðàëà (â ÷àñòíîñòè, ïåðèîä è ìåòîä óñðåäíåíèÿ) àäåêâàòíî ðûíî÷íîé ñèòóàöèè (ó÷èòûâàÿ âîëàòèëüíîñòü, íàïðèìåð).
//+------------------------------------------------------------------+
//| Ïàðàìåòðû:
//| iTicket - óíèêàëüíûé ïîðÿäêîâûé íîìåð îðäåðà (âûáðàííûé ïåðåä âûçîâîì ôóíêöèè ñ ïîìîùüþ OrderSelect());
//| iTmFrme - ïåðèîä ÷àðòà, íà êîòîðîì áóäåò ðàñ÷èòûâàòüñÿ ìóâèíã; äîïóñòèìûå âàðèàíòû ââîäà: 1 (M1), 5 (M5), 15 (M15), 30 (M30), 60 (H1), 240 (H4), 1440 (D), 10080 (W), 43200 (MN);
//| iMAPeriod - ïåðèîä óñðåäíåíèÿ äëÿ âû÷èñëåíèÿ ñêîëüçÿùåãî ñðåäíåãî;
//| iMAShift - ñäâèã èíäèêàòîðà îòíîñèòåëüíî öåíîâîãî ãðàôèêà;
//| iMAMethod - ìåòîä óñðåäíåíèÿ; äîïóñòèìûå âàðèàíòû ââîäà: 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 - ñäâèã îòíîñèòåëüíî òåêóùåãî áàðà íà óêàçàííîå êîëè÷åñòâî ïåðèîäîâ íàçàä;
//| iIndent - îòñòóï (ïóíêòîâ) îò çíà÷åíèÿ ñðåäíåãî ïðè ðàçìåùåíèè ñòîïëîññà.
//+------------------------------------------------------------------+
// Äîïóñòèìûå âàðèàíòû ââîäà:
// 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, öåëûå ÷èñëà;
extern int iTmFrme = 0;
extern int iMAPeriod = 0;
extern int iMAShift = 0;
extern int MAMethod = 0;
extern int iApplPrice = 0;
extern int iShift = 0;
extern int iIndent = 0;
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)
OrderModify(iTicket,OrderOpenPrice(),dMA-iIndent*Point,OrderTakeProfit(),OrderExpiration());
}
// åñëè ïîçèöèÿ - êîðîòêàÿ, è å¸ ñòîïëîññ õóæå (âûøå âåðõíåé ãðàíèöû êàíàëà èëè íå îïðåäåë¸í, ==0), ìîäèôèöèðóåì åãî
if (OrderType()==OP_SELL)
{
if ((OrderStopLoss()==0) || (OrderStopLoss()>dMA+(MarketInfo(Symbol(),MODE_SPREAD)+iIndent)*Point))
OrderModify(iTicket,OrderOpenPrice(),dMA+(MarketInfo(Symbol(),MODE_SPREAD)+iIndent)*Point,OrderTakeProfit(),OrderExpiration());
}
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| ÒÐÅÉËÈÍÃ "ÏÎËÎÂÈÍßÙÈÉ" |
//| Ïî çàêðûòèè î÷åðåäíîãî ïåðèîäà (áàðà) ïîäòÿãèâàåì ñòîïëîññ íà |
//| ïîëîâèíó (íî ìîæíî è ëþáîé èíîé êîýôôèöèåíò) äèñòàíöèè, ïðîé- |
//| äåííîé êóðñîì (ò.å., íàïðèìåð, ïî çàêðûòèè ñóòîê ïðîôèò +55 ï. - |
//| ñòîïëîññ ïåðåíîñèì â 55/2=27 ï. Åñëè ïî çàêðûòèè ñëåä. |
//| ñóòîê ïðîôèò äîñòèã, äîïóñòèì, +80 ï., òî ñòîïëîññ ïåðåíîñèì íà |
//| ïîëîâèíó (íàïð.) ðàññòîÿíèÿ ìåæäó òåê. ñòîïëîññîì è êóðñîì íà |
//| çàêðûòèè áàðà - 27 + (80-27)/2 = 27 + 53/2 = 27 + 26 = 53 ï. |
//| iTicket - òèêåò ïîçèöèè; iTmFrme - òàéìôðåéì (â ìèíóòàõ, öèôðàìè |
//| dCoeff - "êîýôôèöèåíò ïîäæàòèÿ", â % îò 0.01 äî 1 (â ïîñëåäíåì |
//| ñëó÷àå ñòîïëîññ áóäåò ïåðåíåñåí (åñëè ïîëó÷èòñÿ) âïëîòíóþ ê òåê. |
//| êóðñó è ïîçèöèÿ, ñêîðåå âñåãî, ñðàçó æå çàêðîåòñÿ) |
//| bTrlinloss - ñòîèò ëè òðàëèòü íà ëîññîâîì ó÷àñòêå - åñëè äà, òî |
//| ïî çàêðûòèþ î÷åðåäíîãî áàðà ðàññòîÿíèå ìåæäó ñòîïëîññîì (â ò.÷. |
//| "äî" áåçóáûòêà) è òåêóùèì êóðñîì áóäåò ñîêðàùàòüñÿ â dCoeff ðàç |
//| ÷òîáû ïîñë. âàðèàíò ðàáîòàë, îáÿçàòåëüíî äîëæåí áûòü îïðåäåë¸í |
//| ñòîïëîññ (íå ðàâåí 0) |
//| Èäåÿ ñëåäóþùàÿ: ïî çàêðûòèþ î÷åðåäíîãî áàðà óìåíüøàåì ðàññòîÿíèå ìåæäó ñòîïëîññîì è òåêóùèì êóðñîì â dCoeff ðàç
//| (èñõîäíî ÿ âçÿë 0,5, ò.å. íàïîëîâèíó, îòêóäà è íàçâàíèå). Ò.å., äîïóñòèì, îòêðûòà ïîêóïêà ñî ñòîïëîññîì â 40 ïóíêòîâ.
//| Ïî çàêðûòèþ áàðà, íà êîòîðîì áûë ñîâåðøåí âõîä â ðûíîê, Bid îêàçàëñÿ âûøå êóðñà îòêðûòèÿ íà 42 ïóíêòà.
//| Åñëè ìû âûáðàëè âàðèàíò òðàëà òîëüêî "â ïðîôèòå" (bTrlinloss==true), òî áåðåì ðàññòîÿíèå îò êóðñà îòêðûòèÿ äî òåêóùåãî êóðñà
//| - 42 ï., ìíîæèì åãî íà dCoeff (íàïðèìåð, 0.5), è ïîëó÷èâ 21 ï., ïåðåíîñèì ñòîïëîññ â +21. Ïóñòü ïðè çàêðûòèè ñëåäóþùåãî áàðà
//| ïðîôèò ñîñòàâèë +71 ï. Òîãäà ðàçíèöà ìåæäó òåêóùèì ñòîïëîññîì è êóðñîì: 71-21=50, ïîëîâèíà îò íàéäåííîãî çíà÷åíèÿ - 50*0.5=25,
//| è íîâûé ñòîïëîññ äîëæåí áûòü óñòàíîâëåí íà 25 ï. âûøå ïðåäûäóùåãî (21+25=46 ï. îò êóðñà îòêðûòèÿ).
//+------------------------------------------------------------------+
//| Ïðè îïèñàííîì âàðèàíò òðåéëèíãà, "â ïðîôèòå" (bTrlinloss==true), ñòîïëîññ ïåðåíîñèòñÿ ëèøü ïðè óñëîâèè, ÷òî íîâûé ñòîïëîññ
//| áóäåò "ëó÷øå" êóðñà îòêðûòèÿ. Åñëè æå óñòàíîâèòü bTrlinloss ðàâíûì false, òî òðàë áóäåò îñóùåñòâëÿòüñÿ è íà "ëîññîâîì"
//| ó÷àñòêå (ò.å. èíòåðâàëå ìåæäó êóðñîì îòêðûòèÿ è ñòîïëîññîì, êîòîðûé, êñòàòè, äîëæåí áûòü îáÿçàòåëüíî îïðåäåë¸í (íå ðàâåí 0),
//| ÷òîáû äàííûé ýëåìåíò ñðàáîòàë). Ò.å., åñëè âçÿòü âûøåîïèñàííûé âàðèàíò, òî ïî çàêðûòèè ïåðâîãî áàðà ñòîïëîññ áóäåò ïåðåìåùåí
//| íà 0.5 äèñòàíöèè íå ìåæäó îòêðûòèåì è òåêóùèì êóðñîì, à ìåæäó ñòîïëîññîì è òåêóùèì êóðñîì (ïðè ñòîïëîññå â 40 ï. è ïðîôèòå
//| â 42 ï. ýòî ðàññòîÿíèå ñîñòàâèò (40+42)/2 = 82/2 = 41 ï., ñòîïëîññ áóäåò óñòàíîâëåí â +1 ï. îò êóðñà îòêðûòèÿ. Íà âòîðîì áàðå,
//| ïðè ïðîôèòå â 71 ï.: à) 71 - 1 = 70, á) 70*0.5 = 35, â) 1 + 35 = 36 ï. Êàê âèäèì, òàêîé âàðèàíò áóäåò ñòàðòîâàòü ñ áîëüøåé
//| "äèñòàíöèè" è íåñêîëüêî îòñòàâàòü îò ïåðâîãî. Åãî îñíîâíàÿ ôóíêöèÿ - ïîäæàòèå ñòîïëîññà ïðè íåãàòèâíîì ðàçâèòèè ñîáûòèé.
//| Íàïðèìåð, åñëè ïî çàêðûòèþ ïåðâîãî áàðà ïðîôèò ñîñòàâèë -10 ï., òî ïðè bTrlinloss==true ìû: à) íàéäåì ðàññòîÿíèå îò êóðñà äî
//| ñòîïëîññà, |-40 + (-10)| = 30 ï., á) ðàññ÷èòàåì ïîëîâèíó ýòîãî çíà÷åíèÿ - 30*0.5 = 15 ï. è â) ïåðåìåñòèì ñòîïëîññ â ñòîðîíó
//| ïðîôèòà íà ýòî ðàññòîÿíèå: -40 + 15 = -25.
//+------------------------------------------------------------------+
//| Ïðè òðåéëèíãå â ëîññå óâåëè÷èâàåòñÿ êîëè÷åñòâî ïðåæäåâðåìåííûõ çàêðûòèé (ïðè÷åì ñ íåáîëüøèì óáûòêîì),
//| îäíàêî ñòðàõóåìñÿ îò ïîëó÷åíèÿ áîëüøèõ ëîññîâ.
//+------------------------------------------------------------------+
//| Ïàðàìåòðû:
//| iTicket - óíèêàëüíûé ïîðÿäêîâûé íîìåð îðäåðà (âûáðàííûé ïåðåä âûçîâîì ôóíêöèè ñ ïîìîùüþ OrderSelect());
//| iTmFrme - ïåðèîä ÷àðòà, ïî áàðàì êîòîðîãî áóäåò îñóùåñòâëÿòüñÿ òðåéëèíã; äîïóñòèìûå âàðèàíòû ââîäà: 1 (M1), 5 (M5), 15 (M15), 30 (M30), 60 (H1), 240 (H4), 1440 (D), 10080 (W), 43200 (MN);
//+------------------------------------------------------------------+
//| dCoeff - êîýôôèöèåíò, îïðåäåëÿþùèé òî, â ñêîëüêî ðàç áóäåò ñîêðàùåíî ðàññòîÿíèå ìåæäó êóðñîì íà ìîìåíò çàêðûòèÿ áàðà
//| è òåêóùèì ñòîïëîññîì;
//| bTrlinloss - óêàçàòåëü òîãî, ñëåäóåò ëè îñóùåñòâëÿòü òðåéëèíã íà ëîññîâîì ó÷àñòêå.
//+------------------------------------------------------------------+
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))
OrderModify(OrderTicket(),OrderOpenPrice(),dNewSl,OrderTakeProfit(),OrderExpiration(),Red);
}
// äåéñòâèÿ äëÿ êîðîòêîé ïîçèöèè
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))
OrderModify(OrderTicket(),OrderOpenPrice(),dNewSl,OrderTakeProfit(),OrderExpiration(),Blue);
}
}
}
}
//+------------------------------------------------------------------+
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
---