Price Data Components
Orders Execution
Indicators Used
0
Views
0
Downloads
0
Favorites
Pivot3
//+------------------------------------------------------------------+
//| Pivot3.mq4 |
//| Ñîâåòíèê ðàçðàáîòàí ïî çàêàçó Àëåêñåÿ (seolink74)|
//| http://www.mql4.com/ru/users/seolink74 |
//+------------------------------------------------------------------+
//| Copyright © 2011, Andrey N. Bolkonsky |
//| 27/05.2011 |
//| email: abolk@yandex.ru | skype: abolk1 |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2011, Andrey N. Bolkonsky"
#property link "abolk@yandex.ru"
//
extern string rem1 = "=== Ïàðàìåòðû îðäåðîâ ===";
extern int _StopLoss = 50; // Ñòîï-ëîññ: 0 - íå èñïîëüçóåòñÿ
extern int _TakeProfit = 0; // Òåéê-ïðîôèò: 0 - íå èñïîëüçóåòñÿ
//
extern bool _IsOrderSend_Rev = true; // Âêëþ÷èòü "ïåðåâîðîò" îðäåðîâ
extern int _OrderSend_MaxBuy = 1; // Êîëè÷åñòâî îðäåðîâ îòêðûòûõ â íàïðàâëåíèè BUY
extern int _OrderSend_MaxSell = 1; // Êîëè÷åñòâî îðäåðîâ îòêðûòûõ â íàïðàâëåíèè SELL
extern bool _IsOrderSend_Loc = false; // Âêëþ÷èòü îòêðûòèå ïåðåêðûòûõ îðäåðîâ
//
extern string rem2 = "=== Êîëè÷åñòâî ëîòîâ ===";
extern double _Lots = 0.1; // Ôèêñèðîâàííûé ëîò
extern double _LotsMax = 2.0; // Ìàêñèìàëüíûé ëîò
extern int _Lots_Mode = 3; // Ðåæèì ðàñ÷¸òà ëîòà:
// 1 - ôèêñèðîâàííûé;
// 2 - ôèêñèðîâàííûé ïðîöåíò îò Áàëàíñà/Ñðåäñòâ
// 3 - ôèêñèðîâàííûé ïðîöåíò îò Áàëàíñà/Ñðåäñòâ ñ ó÷¸òîì ñòîï-ëîññà
extern bool _IsBalance = true; // true - ïðîöåíò îò Áàëàíñà; false - ïðîöåíò îò Ñðåäñòâ
extern double _Lots_ProcBalance = 2; // Ïðîöåíò îò Áàëàíñà/Ñðåäñòâ
//
extern string rem3 = "=== Äîïîëíèòåëüíûå ïàðàìåòðû ===";
extern bool _IsOrderClose1 = true; // Ïðèçíàê ðåæèìà çàêðûòèÿ îðäåðîâ: true - öåíà ïîä/íàä ëèíèåé Ichimoku
extern int _Price_From = 21; // Çíà÷åíèå öåíû îò ëèíèè èíäèêàòîðà Ichimoku
extern int _Ich_ModeDelete1 = MODE_TENKANSEN; // Èñòî÷íèê äàííûõ (ëèíèÿ) èíäèêàòîðà Ichimoku
//
extern bool _IsTimeframe = true; // Ïðèçíàê îòêðûòèÿ â íà÷àëå áàðà
extern int _TimeframePivot = PERIOD_D1; // Ïåðèîä äëÿ ðàñ÷¸òà Pivot (ìèí. PERIOD_H1)
extern int _shiftTFP = 0; // Ñìåùåíèå îòêðûòèÿ òàéìôðåéìà äëÿ ðàñ÷¸òà ïèâîòà (â ÷àñàõ)
//
extern bool _IsPivotFilter = true; // Ïðèçíàê èñïîëüçîâàíèÿ ôèëüòðà Pivot
extern int _PivotFilter = 50; // Çíà÷åíèå ôèëüòðà Pivot
//
extern string rem4 = "=== Ïàðàìåòðû áåçóáûòêà ===";
extern bool _IsStopLoss0 = false; // Âêëþ÷åíèå èñïîëüçîâàíèÿ óðîâíÿ áåçóáûòêà
extern int _StopLoss0_From = 0; // Îòñòóï îò óðîâåíÿ áåçóáûòêà (â ïóíêòàõ)
extern int _StopLoss0Level = 15; // Óðîâåíü áåçóáûòêà
//
extern string rem5 = "=== Ïàðàìåòðû òðåéëèíã ñòîïà ===";
extern bool _IsTrailingStop = false; // Âêëþ÷åíèå òðåéëèíã ñòîïà
extern bool _IsTrailingStopProfit = true; // Âêëþ÷åíèå òðåéëèíã ñòîïà ñ ïîçèöèè áåçóáûòêà
extern int _TrailingStopProfit_From = 0; // Îòñòóï îò óðîâíÿ áåçóáûòêà (â ïóíêòàõ)
extern int _TrailingStopLevel = 15; // Óðîâåíü òðåéëèíã ñòîïà
extern int _TrailingStopStep = 5; // Øàã ïåðåìåùåíèÿ òðåéëèíã ñòîïà
//
extern string rem6 = "=== Íàñòðîéêè èíñòðóìåíòà ===";
extern string _Symbol = ""; // Ñèìâîëüíîå èìÿ èíñòðóìåíòà: "" - òåêóùèé ñèìâîë
extern int _Timeframe = 0; // Ïåðèîä: 0 - ïåðèîä òåêóùåãî ãðàôèêà
int _Digits; // Êîëè÷åñòâî öèôð ïîñëå äåñÿòè÷íîé òî÷êè â öåíå
double _Point; // Ðàçìåð ïóíêòà â âàëþòå êîòèðîâêè
extern int _Slippage = 2; // Ïðîñêàëüçûâàíèå
extern int _Magic = 180; // Óíèêàëüíûé íîìåð îðäåðîâ ñîâåòíèêà
//
extern string rem7 = "=== Ïàðàìåòðû èíäèêàòîðà Ichimoku Kinko Hyo ===";
extern int _Ich_Timeframe = 0; // Ïåðèîä: 0 - ïåðèîä òåêóùåãî ãðàôèêà
extern int _Ich_Tenkan_Sen = 9; // Ïåðèîä óñðåäíåíèÿ Tenkan Sen
extern int _Ich_Kijun_Sen = 26; // Ïåðèîä óñðåäíåíèÿ Kijun Sen
extern int _Ich_Senkou_Span_B = 52; // Ïåðèîä óñðåäíåíèÿ Senkou Span B
extern int _Ich_Mode_1 = MODE_TENKANSEN; // Èñòî÷íèê äàííûõ (ëèíèÿ 1) èíäèêàòîðà Ichimoku
extern int _Ich_Mode_2 = MODE_KIJUNSEN; // Èñòî÷íèê äàííûõ (ëèíèÿ 2) èíäèêàòîðà Ichimoku
extern int _Ich_shift = 0; // ñ êàêîãî áàðà àíàëèçèðîâàòü (èíäåêñ)
//
datetime _TimePrevious;
datetime _TimeCurrent;
//
bool is_b1 = false, is_s1 = false;
bool is_b2 = false, is_s2 = false;
//
int _tfpHour;
//
//=++==============================================================++=
int init()
{
if(_Symbol == "") _Symbol = Symbol();
//
_Digits = MarketInfo(_Symbol, MODE_DIGITS);
_Point = MarketInfo(_Symbol, MODE_POINT);
//
if(_Timeframe == 0) _Timeframe = Period();
if(_TimeframePivot < PERIOD_H1) _TimeframePivot = PERIOD_H1;
_tfpHour = _TimeframePivot / 60 - 1;
if(_Ich_Timeframe == 0) _Ich_Timeframe = Period();
Print("v180-3 > init() >> _Timeframe=", _Timeframe,
" ",_TimeframePivot," ",_Ich_Timeframe," _tfpHour=",_tfpHour,
" rem1=",_IsOrderSend_Rev,_IsOrderSend_Loc,
" rem3=",_IsOrderClose1,_IsTimeframe,_IsPivotFilter,
" rem4=",_IsStopLoss0,
" rem5=",_IsTrailingStop,_IsTrailingStopProfit);
//
_TimePrevious=iTime(_Symbol, _Timeframe, 0);
Print("v180-3 > Çàâåðøåíî: init() >> _TimePrevious=", _TimePrevious, " (", TimeToStr(_TimePrevious,TIME_DATE|TIME_MINUTES), ")");
//
return(0);
}
//=++==============================================================++=
int start()
{
double High_0, Low_0, Close_0;
double High_1, Low_1, Close_1;
double Pivot_0, Pivot_1;
double Ich1_0, Ich2_0, Ich3_0;
double bid, ask;
bool is_signal_1_buy, is_signal_1_sell;
bool is_signal_2_buy, is_signal_2_sell;
double P1_buy, P2_buy, P3_buy;
double P1_sell, P2_sell, P3_sell;
bool b1, b2;
bool s1, s2;
int ticket;
bool is_TF;
double lots;
//
if(_IsTimeframe)
{
_TimeCurrent = iTime(_Symbol, _Timeframe, 0);
is_TF = _TimeCurrent != _TimePrevious;
}
else
is_TF = true;
//
if(is_TF)
{
/*High_0 = iHigh(_Symbol, _TimeframePivot, 0);
Low_0 = iLow(_Symbol, _TimeframePivot, 0);
Close_0 = iClose(_Symbol, _TimeframePivot, 0);
High_1 = iHigh(_Symbol, _TimeframePivot, 1);
Low_1 = iLow(_Symbol, _TimeframePivot, 1);
Close_1 = iClose(_Symbol, _TimeframePivot, 1);*/
//
int sh0, sh1;
int i, n;
double hh, ll;
//
sh0 = 1;
sh1 = iBarShift(_Symbol, PERIOD_H1, iTime(_Symbol, _TimeframePivot, sh0), false) - _shiftTFP;
if(sh1 <= _tfpHour)
{
sh0++;
sh1 = iBarShift(_Symbol, PERIOD_H1, iTime(_Symbol, _TimeframePivot, sh0), false) - _shiftTFP;
}
High_1 = iHigh(_Symbol, PERIOD_H1, sh1);
Low_1 = iLow(_Symbol, PERIOD_H1, sh1);
Close_1 = iClose(_Symbol, PERIOD_H1, sh1);
//Print("=(1)=sh1=",sh1," (", TimeToStr(iTime(_Symbol, PERIOD_H1, sh1),TIME_DATE|TIME_MINUTES), ")");
n = sh1-_tfpHour;
for(i = sh1-1; i >= n; i--)
{
hh = iHigh(_Symbol, PERIOD_H1, i);
if(hh > High_1) High_1 = hh;
ll = iLow(_Symbol, PERIOD_H1, i);
if(ll < Low_1) Low_1 = ll;
//Print("=(1)=i=",i," (", TimeToStr(iTime(_Symbol, PERIOD_H1, i),TIME_DATE|TIME_MINUTES), ")");
}
Close_1 = iClose(_Symbol, PERIOD_H1, n);
//Print("=(1)=n=",n," (", TimeToStr(iTime(_Symbol, PERIOD_H1, n),TIME_DATE|TIME_MINUTES), ")");
//
sh1 = iBarShift(_Symbol, PERIOD_H1, iTime(_Symbol, _TimeframePivot, sh0-1), false) - _shiftTFP;
High_0 = iHigh(_Symbol, PERIOD_H1, sh1);
Low_0 = iLow(_Symbol, PERIOD_H1, sh1);
Close_0 = iClose(_Symbol, PERIOD_H1, sh1);
//Print("=(2)=sh1=",sh1," (", TimeToStr(iTime(_Symbol, PERIOD_H1, sh1),TIME_DATE|TIME_MINUTES), ")");
n = MathMax(0,sh1-_tfpHour);
for(i = sh1-1; i >= n; i--)
{
hh = iHigh(_Symbol, PERIOD_H1, i);
if(hh > High_0) High_0 = hh;
ll = iLow(_Symbol, PERIOD_H1, i);
if(ll < Low_0) Low_0 = ll;
//Print("=(2)=i=",i," (", TimeToStr(iTime(_Symbol, PERIOD_H1, i),TIME_DATE|TIME_MINUTES), ")");
}
Close_0 = iClose(_Symbol, PERIOD_H1, n);
//Print("=(2)=n=",n," (", TimeToStr(iTime(_Symbol, PERIOD_H1, n),TIME_DATE|TIME_MINUTES), ")");
//
Pivot_0 = (High_0 + Low_0 + Close_0) / 3.0;
Pivot_1 = (High_1 + Low_1 + Close_1) / 3.0;
Print("v180-3 > ", _Symbol, " | ", _Timeframe,
" -> High_0=", High_0, " | Low_0=", Low_0, " | Close_0=", Close_0,
" -> High_1=", High_1, " | Low_1=", Low_1, " | Close_1=", Close_1,
" -> Pivot_0=", Pivot_0, " | Pivot_1=", Pivot_1);
//
Ich1_0 = iIchimoku(_Symbol, _Ich_Timeframe, _Ich_Tenkan_Sen, _Ich_Kijun_Sen, _Ich_Senkou_Span_B, _Ich_Mode_1, _Ich_shift);
Ich2_0 = iIchimoku(_Symbol, _Ich_Timeframe, _Ich_Tenkan_Sen, _Ich_Kijun_Sen, _Ich_Senkou_Span_B, _Ich_Mode_2, _Ich_shift);
Print("v180-3 > ", _Symbol, " | ", _Timeframe, "|", _Ich_Timeframe,
" -> Ich1_0=", Ich1_0, " | Ich2_0=", Ich2_0);
//
is_signal_2_buy = Close_0 > Pivot_0 && Close_0 > Ich1_0 && Close_0 > Ich2_0;
is_signal_2_sell = Close_0 < Pivot_0 && Close_0 < Ich1_0 && Close_0 < Ich2_0;
Print("v180-3 > ", _Symbol, " | ", _Timeframe,
" -> is_signal2 -> buy=", is_signal_2_buy, " | sell=", is_signal_2_sell);
//
if(_IsPivotFilter)
{
is_signal_2_buy = is_signal_2_buy && MathAbs(Pivot_0 - Pivot_1) > _PivotFilter * _Point;
is_signal_2_sell = is_signal_2_sell && MathAbs(Pivot_0 - Pivot_1) > _PivotFilter * _Point;
Print("v180-3 (PivotFilter) > ", _Symbol, " | ", _Timeframe,
" -> is_signal2 -> buy=", is_signal_2_buy, " | sell=", is_signal_2_sell);
}
// ========== ïî ðûíêó
// ========== îòêðûòèå îðäåðà BUY
if( is_signal_2_buy )
{
Print("v180-3 > ", _Symbol, " | ", _Timeframe,
" -> ñèãíàë íà îòêðûòèå îðäåðà BUY");
if( !is_b2 && _IsOrderSend_Rev ) // ðàáîòà ñ "ïåðåâ¸ðòûøàìè"
{
OrdersDelete(OP_SELL);
if(CountOrders(OP_SELL) == 0) is_b2 = true;
}
else is_b2 = true;
//
if(!is_b1)
{
if(CountOrders(OP_BUY) >= _OrderSend_MaxBuy) b1 = false;
else b1 = true;
if(!_IsOrderSend_Loc) { if(CountOrders(OP_SELL) > 0) b2 = false; else b2 = true; }
else b2 = true;
Print("= buy ===", b1, b2);
//
if(b1 && b2)
{
P1_buy = MarketInfo(_Symbol, MODE_ASK);
P2_buy = DoubleTestZero(_TakeProfit, P1_buy + (_TakeProfit) * _Point);
P3_buy = DoubleTestZero(_StopLoss, P1_buy - (_StopLoss) * _Point);
lots = GetLots();
Print("v180-3 > ", _Symbol, " | ", _Timeframe,
" -> BUY -> P1_buy=", P1_buy, " | P2_buy=", P2_buy, " | P3_buy=", P3_buy, " -> lots=", lots);
//
ticket = OrderSend(_Symbol, OP_BUY, lots, ND(P1_buy), _Slippage, ND(P3_buy), ND(P2_buy),
NULL, _Magic, 0, CLR_NONE);
if(ticket == -1)
Print("v180-3 > ", _Symbol, " | ", _Timeframe,
" -> BUY > Îøèáêà (îòêðûòèå) #", GetLastError());
else is_b1 = true;
}
else is_b1 = true;
}
else is_b1 = true;
}
else { is_b1 = true; is_b2 = true; }
Print("= buy +++",is_b1,is_b2,"==",is_s1,is_s2);
// ========== îòêðûòèå îðäåðà SELL
if( is_signal_2_sell )
{
Print("v180-3 > ", _Symbol, " | ", _Timeframe,
" -> ñèãíàë íà îòêðûòèå îðäåðà SELL");
if( !is_s2 && _IsOrderSend_Rev ) // ðàáîòà ñ "ïåðåâ¸ðòûøàìè"
{
OrdersDelete(OP_BUY);
if(CountOrders(OP_BUY) == 0)
is_s2 = true;
}
else is_s2 = true;
//
if(!is_s1)
{
if(CountOrders(OP_SELL) >= _OrderSend_MaxSell) s1 = false;
else s1 = true;
if(!_IsOrderSend_Loc) { if(CountOrders(OP_BUY) > 0) s2 = false; else s2 = true; }
else s2 = true;
Print("= sell ===", s1, s2);
//
if(s1 && s2)
{
P1_sell = MarketInfo(_Symbol, MODE_BID);
P2_sell = DoubleTestZero(_TakeProfit, P1_sell - (_TakeProfit) * _Point);
P3_sell = DoubleTestZero(_StopLoss, P1_sell + (_StopLoss) * _Point);
lots = GetLots();
Print("v180-3 > ", _Symbol, " | ", _Timeframe,
" -> SELL -> P1_sell=", P1_sell, " | P2_sell=", P2_sell, " | P3_sell=", P3_sell, " -> lots=", lots);
//
ticket = OrderSend(_Symbol, OP_SELL, lots, ND(P1_sell), _Slippage, ND(P3_sell), ND(P2_sell),
NULL, _Magic, 0, CLR_NONE); // Red);
if(ticket == -1)
Print("v180-3 > ", _Symbol, " | ", _Timeframe,
" -> SELL > Îøèáêà (îòêðûòèå) #", GetLastError());
else is_s1 = true;
}
else is_s1 = true;
}
else is_s1 = true;
}
else { is_s1 = true; is_s2 = true; }
Print("= sell +++",is_b1,is_b2,"==",is_s1,is_s2);
// ==========
if(is_b1 && is_s1 && is_b2 && is_s2)
{
_TimePrevious=_TimeCurrent;
is_b1 = false; is_s1 = false;
is_b2 = false; is_s2 = false;
}
}
// ========== çàêðûòèå îðäåðîâ - öåíà ïîä/íàä ëèíèåé Ichimoku
if(_IsOrderClose1)
{
bid = MarketInfo(_Symbol, MODE_BID);
ask = MarketInfo(_Symbol, MODE_ASK);
Ich3_0 = iIchimoku(_Symbol, _Ich_Timeframe, _Ich_Tenkan_Sen, _Ich_Kijun_Sen, _Ich_Senkou_Span_B, _Ich_ModeDelete1, _Ich_shift);
//Print("v180-3 > ", _Symbol, " | ", _Timeframe, "|", _Ich_Timeframe,
// " -> Ich3_0=", Ich3_0, " -> bid=", bid, " | ask=", ask);
is_signal_1_buy = (CountOrders(OP_BUY) > 0) && (bid < Ich3_0 - _Price_From * _Point);
is_signal_1_sell = (CountOrders(OP_SELL) > 0) && (ask > Ich3_0 + _Price_From * _Point);
//Print("v180-3 > ", _Symbol, " | ", _Timeframe,
// " -> is_signal1 -> buy=", is_signal_1_buy, " | sell=", is_signal_1_sell);
//
if(is_signal_1_buy)
{
OrdersDelete(OP_BUY);
}
//
if(is_signal_1_sell)
{
OrdersDelete(OP_SELL);
}
}
//
if(_IsTrailingStop) TrailingStop();
if(_IsStopLoss0) StopLoss0();
//
return(0);
}
//=++==============================================================++=
double DoubleTestZero(double value, double new_value)
{
if(value==0) return(value);
else return(new_value);
}
//=++==============================================================++=
double ND(double value)
{
return( NormalizeDouble(value, _Digits) );
}
//=++==============================================================++=
// çàêðûòèå îðäåðîâ
void OrdersDelete(int cmd)
{
for(int i = OrdersTotal() - 1; i >= 0 ; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if( (OrderSymbol() == _Symbol) && (OrderMagicNumber() == _Magic) && (OrderType() == cmd) )
{
if(OrderType() == OP_BUY)
if(!OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), _Slippage, CLR_NONE))
Print("v180-3 > ", _Symbol, " > BUY -> ticket=", OrderTicket(),
" -> Îøèáêà (çàêðûòèå) #", GetLastError());
if(OrderType() == OP_SELL)
if(!OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), _Slippage, CLR_NONE))
Print("v180-3 > ", _Symbol, " > SELL -> ticket=", OrderTicket(),
" -> Îøèáêà (çàêðûòèå) #", GetLastError());
}
}
}
}
//=++==============================================================++=
// ïîäñ÷¸ò êîëè÷åñòâà îðäåðîâ ïî íàïðàâëåíèþ
int CountOrders(int cmd)
{
int n = 0;
for(int i = OrdersTotal() - 1; i >= 0 ; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if( (OrderSymbol() == _Symbol) && (OrderMagicNumber() == _Magic) && (OrderType() == cmd) ) n++;
}
}
return(n);
}
//=++==============================================================++=
// îòðàáîòêà óðîâíÿ áåçóáûòêà
void StopLoss0()
{
int profitpoint;
double bid, ask, stoploss, openprice;
bool is;
double P3_buy, P3_sell;
//
for(int i = OrdersTotal() - 1; i >= 0 ; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(!( (OrderSymbol() == _Symbol) && (OrderMagicNumber() == _Magic) )) continue;
//
if(OrderType() == OP_BUY)
{
bid = MarketInfo(_Symbol, MODE_BID);
stoploss = ND( OrderStopLoss() );
openprice = ND( OrderOpenPrice() );
profitpoint = NormalizeDouble( (bid - openprice) / _Point, 0);
is = (profitpoint >= _StopLoss0Level);
P3_buy = ND( openprice + _StopLoss0_From * _Point );
//
if( is && ( stoploss == 0 || stoploss < P3_buy ) )
{
Print("v180-3 á6 >", _Symbol, " | ", _Timeframe,
" -> Bid=", MarketInfo(_Symbol, MODE_BID),
" | p/o=", OrderOpenPrice(), " | s/l=", OrderStopLoss(), " | P3_buy=", P3_buy,
" | d=", _StopLoss0Level, " | profitpoint=", profitpoint);
if(!OrderModify(OrderTicket(), OrderOpenPrice(), P3_buy, OrderTakeProfit(), 0, CLR_NONE))
Print("v180-3 á6 > ", _Symbol, " | ", _Timeframe,
" -> BUY > ticket=", OrderTicket(), " > Îøèáêà (áåçóáûòîê) #", GetLastError());
}
}
//
else if(OrderType() == OP_SELL)
{
ask = MarketInfo(_Symbol, MODE_ASK);
stoploss = ND( OrderStopLoss() );
openprice = ND( OrderOpenPrice() );
profitpoint = NormalizeDouble( (openprice - ask) / _Point, 0);
is = (profitpoint >= _StopLoss0Level);
P3_sell = ND( openprice - _StopLoss0_From * _Point );
//
if( is && ( stoploss == 0 || stoploss > P3_sell ) )
{
Print("v180-3 á6 >", _Symbol, " | ", _Timeframe,
" -> Ask =", MarketInfo(_Symbol, MODE_ASK),
" | p/o=", OrderOpenPrice(), " | s/l=", OrderStopLoss(), " | P3_sell=", P3_sell,
" | d=", _StopLoss0Level, " | profitpoint=", profitpoint);
if(!OrderModify(OrderTicket(), OrderOpenPrice(), P3_sell, OrderTakeProfit(), 0, CLR_NONE))
Print("v180-3 á6 > ", _Symbol, " | ", _Timeframe,
" -> SELL -> ticket=", OrderTicket(), " > Îøèáêà (áåçóáûòîê) #", GetLastError());
}
}
}
}
}
//=++==============================================================++=
// îòðàáîòêà òðåéëèíã ñòîïà
void TrailingStop()
{
int profitpoint;
double bid, ask, stoploss, openprice;
double fromprice;
//
for(int i = OrdersTotal() - 1; i >= 0 ; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(!( (OrderSymbol() == _Symbol) && (OrderMagicNumber() == _Magic) )) continue;
//
if(OrderType() == OP_BUY)
{
stoploss = ND( OrderStopLoss() );
openprice = ND( OrderOpenPrice() );
//
if(_IsTrailingStopProfit) fromprice = ND( openprice + _TrailingStopProfit_From * _Point );
else fromprice = stoploss;
//
bid = MarketInfo(_Symbol, MODE_BID);
profitpoint = NormalizeDouble( (bid - fromprice) / _Point, 0);
//
if( profitpoint >= _TrailingStopLevel &&
bid > ND( stoploss + (_TrailingStopLevel + _TrailingStopStep) * _Point) )
{
Print("v180-3 ò6 >", _Symbol, " | ", _Timeframe,
" -> Bid=", MarketInfo(_Symbol, MODE_BID),
" | p/o=", OrderOpenPrice(), " | s/l=", OrderStopLoss(),
" | d=", _TrailingStopLevel, " | profitpoint=", profitpoint);
if(!OrderModify(OrderTicket(), OrderOpenPrice(), ND(bid - (_TrailingStopLevel) * _Point),
OrderTakeProfit(), 0, CLR_NONE))
{
Print("v180-3 ò6 >", _Symbol, " | ", _Timeframe,
" -> BUY > ticket=", OrderTicket(), " > Îøèáêà (òðåéëèíã ñòîï) #", GetLastError());
}
}
}
//
else if(OrderType() == OP_SELL)
{
stoploss = ND( OrderStopLoss() );
openprice = ND( OrderOpenPrice() );
//
if(_IsTrailingStopProfit) fromprice = ND( openprice - _TrailingStopProfit_From * _Point );
else fromprice = stoploss;
//
ask = MarketInfo(_Symbol, MODE_ASK);
profitpoint = NormalizeDouble( (fromprice - ask) / _Point, 0);
//
if( profitpoint >= _TrailingStopLevel &&
ask < ND( stoploss - (_TrailingStopLevel + _TrailingStopStep) * _Point) )
{
Print("v180-3 ò6 >", _Symbol, " | ", _Timeframe,
" -> Ask=", MarketInfo(_Symbol, MODE_ASK),
" | p/o=", OrderOpenPrice(), " | s/l=", OrderStopLoss(),
" | d=", _TrailingStopLevel, " | profitpoint=", profitpoint);
if(!OrderModify(OrderTicket(), OrderOpenPrice(), ND(ask + (_TrailingStopLevel) * _Point),
OrderTakeProfit(), 0, CLR_NONE))
{
Print("v180-3 ò6 >", _Symbol, " | ", _Timeframe,
" -> SELL > ticket=", OrderTicket(), " > Îøèáêà (òðåéëèíã ñòîï) #", GetLastError());
}
}
}
}
}
}
//=++==============================================================++=
// ðàñ÷¸ò ïîòðåáíîãî êîëè÷åñòâà ëîòîâ
double GetLots()
{
double lots = 0;
//
switch(_Lots_Mode)
{
case 1: // ôèêñèðîâàííûé
lots = _Lots;
break;
case 2: // ïðîöåíò îò Áàëàíñà/Ñðåäñòâ
if(_IsBalance)
lots = (AccountBalance() + AccountCredit()) * (_Lots_ProcBalance / 100.0)
* AccountLeverage() / MarketInfo(_Symbol, MODE_LOTSIZE);
else
lots = (AccountEquity()) * (_Lots_ProcBalance / 100.0)
* AccountLeverage() / MarketInfo(_Symbol, MODE_LOTSIZE);
//
lots = NDLots(lots);
break;
case 3: // ïðîöåíò îò Áàëàíñà/Ñðåäñòâ ñ ó÷¸òîì ñòîï-ëîññà
if(_StopLoss == 0)
lots = _Lots;
else
{
if(_IsBalance)
lots = (AccountBalance() + AccountCredit()) * (_Lots_ProcBalance / 100.0)
* MarketInfo(_Symbol, MODE_MINLOT)
/ (_StopLoss * CostMinLot(_Symbol));
else
lots = (AccountEquity()) * (_Lots_ProcBalance / 100.0)
* MarketInfo(_Symbol, MODE_MINLOT)
/ (_StopLoss * CostMinLot(_Symbol));
//
lots = NDLots(lots);
}
break;
}
Print("v180-3 (GetLots) ë8ý > ", _Symbol, " | ", _Timeframe,
" -> lots=", lots);
//
return(lots);
}
//=++==============================================================++=
double NDLots(double lots)
{
lots = NormalizeDouble(lots / MarketInfo(_Symbol, MODE_LOTSTEP), 0);
lots = lots * MarketInfo(_Symbol, MODE_LOTSTEP);
lots = MathMin(lots, _LotsMax);
lots = MathMin(lots, MarketInfo(_Symbol, MODE_MAXLOT));
lots = MathMax(lots, MarketInfo(_Symbol, MODE_MINLOT));
return( lots );
}
//=++==============================================================++=
// ðàñ÷¸ò ñòîèìîñòè ïóíêòà ìèíèìàëüíîãî ëîòà
double CostMinLot(string symbol)
//+------------------------------------------------------------------+
{
return( MarketInfo(symbol, MODE_TICKVALUE) * MarketInfo(symbol, MODE_MINLOT) );
}
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
---