Author: Copyright � 2011, Andrey N. Bolkonsky
Price Data Components
Series array that contains open time of each barSeries array that contains the highest prices of each barSeries array that contains the highest prices of each barSeries array that contains the lowest prices of each barSeries array that contains the lowest prices of each barSeries array that contains close prices for each barSeries array that contains close prices for each bar
Orders Execution
It automatically opens orders when conditions are reachedChecks for the total of open ordersIt Closes Orders by itself It can change open orders parameters, due to possible stepping strategy
Indicators Used
Ichimoku Kinko Hyo
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 supported. Formatting help

Markdown Formatting Guide

Element Markdown Syntax
Heading # H1
## H2
### H3
Bold **bold text**
Italic *italicized text*
Link [title](https://www.example.com)
Image ![alt text](image.jpg)
Code `code`
Code Block ```
code block
```
Quote > blockquote
Unordered List - Item 1
- Item 2
Ordered List 1. First item
2. Second item
Horizontal Rule ---