Author: Copyright � 2011, Andrey N. Bolkonsky
Price Data Components
Series array that contains open time 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
Moving average indicatorBollinger bands indicator
Miscellaneous
It writes information to fileUses files from the file systemIt reads information from a file
0 Views
0 Downloads
0 Favorites
v128-2
//+------------------------------------------------------------------+
//|                                                       v128-2.mq4 |
//|                            Copyright © 2011, Andrey N. Bolkonsky |
//|                                                       21/03.2011 |
//|                           email: abolk@yandex.ru | skype: abolk1 |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2011, Andrey N. Bolkonsky"
#property link      "abolk@yandex.ru"
//
extern string rem2                       = "=== Êîëè÷åñòâî ëîòîâ ===";
extern double _Lots0_1                   =   0.1; // Áàçîâûé óðîâåíü (äëÿ 1-ãî îðäåðà)
extern double _Lots0_2                   =   0.1; // Áàçîâûé óðîâåíü (äëÿ 2-ãî îðäåðà)
//
extern string rem3                       = "=== Äîïîëíèòåëüíûå ïàðàìåòðû ===";
extern int    _TakeProfit1_Proc          =    50; // Ïðîöåíò ðèñêà äëÿ òåéê-ïðîôèòà 1-ãî îðäåðà
extern int    _SpaseFromMaxMin           =     1; // Îòñòóï îò Âåðøèíû/Äíà
//
extern string rem4                       = "=== Ïàðàìåòðû áåçóáûòêà ===";
extern bool   _IsStopLoss_0              = false; // Âêëþ÷åíèå èñïîëüçîâàíèÿ óðîâíÿ áåçóáûòêà
extern int    _StopLoss_0_From           =     0; // Îòñòóï îò óðîâåíÿ áåçóáûòêà (â ïóíêòàõ)
extern int    _StopLoss_0_Level          =    15; // Óðîâåíü áåçóáûòêà
//
extern string rem5                       = "=== Ïàðàìåòðû òðåéëèíã ñòîïà ===";
extern bool   _IsTrailingStop            = false; // Âêëþ÷åíèå òðåéëèíã ñòîïà
       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    _Magic1                     =  1281; // Óíèêàëüíûé íîìåð îðäåðîâ ñîâåòíèêà (1-é îðäåð)
extern int    _Magic2                     =  1282; // Óíèêàëüíûé íîìåð îðäåðîâ ñîâåòíèêà (2-é îðäåð)
//
extern string rem7                       = "=== Ïàðàìåòðû èíäèêàòîðà MA1 ===";
extern int    _MA1_Timeframe             = PERIOD_D1; // Ïåðèîä: 0 - ïåðèîä òåêóùåãî ãðàôèêà
extern int    _MA1_Period                =    20; // Ïåðèîä óñðåäíåíèÿ äëÿ âû÷èñëåíèÿ ñêîëüçÿùåãî ñðåäíåãî
extern int    _MA1_Shift                 =     0; // Ñäâèã èíäèêàòîðà îòíîñèòåëüíî öåíîâîãî ãðàôèêà
extern int    _MA1_Method                =     0; // Ìåòîä óñðåäíåíèÿ: 0 - SMA, 1 - EMA, 2 - SMMA, 3 - LWMA
extern int    _MA1_Applied_Price         =     0; // Èñïîëüçóåìàÿ öåíà: 0 - close, 1 - open, 2 - high, 3 - low
//
extern string rem8                       = "=== Ïàðàìåòðû èíäèêàòîðà MA2 ===";
extern int    _MA2_Timeframe             = PERIOD_H4; // Ïåðèîä: 0 - ïåðèîä òåêóùåãî ãðàôèêà
extern int    _MA2_Period                =    20; // Ïåðèîä óñðåäíåíèÿ äëÿ âû÷èñëåíèÿ ñêîëüçÿùåãî ñðåäíåãî
extern int    _MA2_Shift                 =     0; // Ñäâèã èíäèêàòîðà îòíîñèòåëüíî öåíîâîãî ãðàôèêà
extern int    _MA2_Method                =     0; // Ìåòîä óñðåäíåíèÿ: 0 - SMA, 1 - EMA, 2 - SMMA, 3 - LWMA
extern int    _MA2_Applied_Price         =     0; // Èñïîëüçóåìàÿ öåíà: 0 - close, 1 - open, 2 - high, 3 - low
//
extern string rem9                       = "=== Ïàðàìåòðû èíäèêàòîðà Bollinger Bands ===";
//extern int    _BB_Timeframe              =     0; // Ïåðèîä: 0 - ïåðèîä òåêóùåãî ãðàôèêà
extern int    _BB_Period                 =    20; // Ïåðèîä óñðåäíåíèÿ îñíîâíîé ëèíèè èíäèêàòîðà
extern int    _BB_Deviation              =     2; // Îòêëîíåíèå îò îñíîâíîé ëèíèè
extern int    _BB_Bands_Shift            =     0; // Ñäâèã èíäèêàòîðà îòíîñèòåëüíî öåíîâîãî ãðàôèêà
extern int    _BB_Applied_Price          =     0; // Èñïîëüçóåìàÿ öåíà: 0 - close
//
extern string rem10                      = "=== Ïàðàìåòðû èíäèêàòîðà ZigZag ===";
//extern int    _ZZ_Timeframe              =     0; // Ïåðèîä: 0 - ïåðèîä òåêóùåãî ãðàôèêà
extern int    _ZZ_ExtDepth               =    12;
extern int    _ZZ_ExtDeviation           =     5;
extern int    _ZZ_ExtBackstep            =     3;
//
datetime _TimePrevious;
datetime _TimeCurrent;
//
string _fstr;
int    _tp;
//


//=++==============================================================++=
int init()
{
   if(_Symbol == "") _Symbol = Symbol();
   //
   _Digits    = MarketInfo(_Symbol, MODE_DIGITS);
   _Point     = MarketInfo(_Symbol, MODE_POINT);
   //
   if(_Timeframe == 0) _Timeframe = Period();
   Print("v128-2 > init() >> _Timeframe=", _Timeframe,
         " rem4=",_IsStopLoss_0,
         " rem5=",_IsTrailingStop,_IsTrailingStopProfit);
   //
   _fstr = "v128_";
   _tp = _FileReadWriteDouble(_fstr+"_tp.dat", 0); // óáåäèòüñÿ â íàëè÷èè ôàéëà, åñëè åãî íåò - ñîçäàòü
   Print("v128-2 > init() >> _Timeframe=", _Timeframe, " _tp=",_tp);
   //
   _TimePrevious=iTime(_Symbol, _Timeframe, 0);
   //
   Print("v128-2 > Çàâåðøåíî: init() >> _TimePrevious=", _TimePrevious, " (", TimeToStr(_TimePrevious,TIME_DATE|TIME_MINUTES), ")");
   return(0);
}


//=++==============================================================++=
int start()
{
   double P_Close1, P_Close2;
   double BB_1_upper, BB_1_lower;
   double MA1_0, MA2_0;
   double P_ask, P_bid;
   bool is_signal_2_buy, is_signal_2_sell;
   double P1_buy, P2_buy, P3_buy;
   double P1_sell, P2_sell, P3_sell;
   bool is_b1 = false, is_s1 = false;
   bool is_b2 = false, is_s2 = false;
   int ticket;
   //
   _TimeCurrent = iTime(_Symbol, _Timeframe, 0);
   if(_TimeCurrent != _TimePrevious)
   {
      MA1_0 = iMA(_Symbol, _MA1_Timeframe, _MA1_Period, _MA1_Shift, _MA1_Method, _MA1_Applied_Price, 0);
      MA2_0 = iMA(_Symbol, _MA2_Timeframe, _MA2_Period, _MA2_Shift, _MA2_Method, _MA2_Applied_Price, 0);
      BB_1_upper = iBands(_Symbol, _Timeframe, _BB_Period,_BB_Deviation,_BB_Bands_Shift,_BB_Applied_Price, MODE_UPPER, 1);
      BB_1_lower = iBands(_Symbol, _Timeframe, _BB_Period,_BB_Deviation,_BB_Bands_Shift,_BB_Applied_Price, MODE_LOWER, 1);
      P_Close1 = iClose(_Symbol, _Timeframe, 1);
      P_Close2 = iClose(_Symbol, _Timeframe, 2);
      P_ask = MarketInfo(_Symbol, MODE_ASK);
      P_bid = MarketInfo(_Symbol, MODE_BID);
      Print("v120-4 > ", _Symbol, " | ", _Timeframe,
            " -> MA1_0=", MA1_0, " | MA2_0=", MA2_0,
            " -> BB_1_upper=", BB_1_upper, " | BB_1_lower=", BB_1_lower,
            " -> P_Close1=", P_Close1, " | P_Close2=", P_Close2,
            " -> ask=", P_ask, " | bid=", P_bid);
      //
      is_signal_2_buy  = P_bid >= MA1_0 && P_bid >= MA2_0 && P_Close1 >= BB_1_lower && P_Close2 <= BB_1_lower && P_bid >= BB_1_lower;
      is_signal_2_sell = P_bid <= MA1_0 && P_bid <= MA2_0 && P_Close1 <= BB_1_upper && P_Close2 >= BB_1_upper && P_bid <= BB_1_upper;
      Print("v128-2 > ", _Symbol, " | ", _Timeframe,
            " -> is_signal2 -> buy=", is_signal_2_buy, " | sell=", is_signal_2_sell);
      // ========== ïî ðûíêó
      // ========== îòêðûòèå îðäåðà BUY
      if( is_signal_2_buy )
      {
         Print("v128-2 > ", _Symbol, " | ", _Timeframe,
               " -> ñèãíàë íà îòêðûòèå îðäåðà BUY");
         OrdersDeleteAll(OP_SELL);
         //
         if(!is_b1 || !is_b2)
         {
            P1_buy = P_ask;
            P3_buy = FindPriceMinMax(false) - (_SpaseFromMaxMin) * _Point;
            _tp = (P1_buy - P3_buy) / _Point * (_TakeProfit1_Proc / 100.0);
            P2_buy = DoubleTestZero(_tp, P1_buy + (_tp) * _Point);
            //
            _FileWriteDouble(_fstr+"_tp.dat", _tp);
            //
            Print("v128-2 > ", _Symbol, " | ", _Timeframe,
                  " -> BUY -> P1_buy=", P1_buy, " | P2_buy=", P2_buy, " | P3_buy=", P3_buy, "_tp=", _tp);
            //
            ticket = OrderSend(_Symbol, OP_BUY, _Lots0_1, ND(P1_buy), _Slippage, ND(P3_buy), ND(P2_buy),
                               NULL, _Magic1, 0, CLR_NONE);
            if(ticket == -1)
               Print("v128-2 > ", _Symbol, " | ", _Timeframe,
                     " -> BUY (1) > Îøèáêà (îòêðûòèå) #", GetLastError());
            else is_b1 = true;
            //
            ticket = OrderSend(_Symbol, OP_BUY, _Lots0_2, ND(P1_buy), _Slippage, ND(P3_buy), 0,
                               NULL, _Magic2, 0, CLR_NONE);
            if(ticket == -1)
               Print("v128-2 > ", _Symbol, " | ", _Timeframe,
                     " -> BUY (2) > Îøèáêà (îòêðûòèå) #", GetLastError());
            else is_b2 = true;
            //
         }
         else { is_b1 = true; is_b2 = 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("v128-2 > ", _Symbol, " | ", _Timeframe,
               " -> ñèãíàë íà îòêðûòèå îðäåðà SELL");
         OrdersDeleteAll(OP_BUY);
         //
         if(!is_s1 || !is_s2)
         {
            P1_sell = P_bid;
            P3_sell = FindPriceMinMax(true) + (_SpaseFromMaxMin) * _Point;
            _tp = (P3_sell - P1_sell) / _Point * (_TakeProfit1_Proc / 100.0);
            P2_sell = DoubleTestZero(_tp, P1_sell - (_tp) * _Point);
            //
            _FileWriteDouble(_fstr+"_tp.dat", _tp);
            //
            Print("v128-2 > ", _Symbol, " | ", _Timeframe,
                  " -> BUY -> P1_sell=", P1_sell, " | P2_sell=", P2_sell, " | P3_sell=", P3_sell);
            //
            ticket = OrderSend(_Symbol, OP_SELL, _Lots0_1, ND(P1_sell), _Slippage, ND(P3_sell), ND(P2_sell),
                               NULL, _Magic1, 0, CLR_NONE);
            if(ticket == -1)
               Print("v128-2 > ", _Symbol, " | ", _Timeframe,
                     " -> SELL (1) > Îøèáêà (îòêðûòèå) #", GetLastError());
            else is_s1 = true;
            //
            ticket = OrderSend(_Symbol, OP_SELL, _Lots0_2, ND(P1_sell), _Slippage, ND(P3_sell), 0,
                               NULL, _Magic2, 0, CLR_NONE);
            if(ticket == -1)
               Print("v128-2 > ", _Symbol, " | ", _Timeframe,
                     " -> SELL (2) > Îøèáêà (îòêðûòèå) #", GetLastError());
            else is_s2 = true;
            //
         }
         else { is_s1 = true; is_s2 = 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;
   }
   //
   if(_IsTrailingStop)
   {
      if( !FindOrders(_Magic1) ) TrailingStop(_tp);
   }
   //
   if(_IsStopLoss_0)
      StopLoss_0(_StopLoss_0_From);
   //
   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 OrdersDeleteAll(int cmd)
{
   while(CountOrders(cmd) > 0)
   {
      for(int i = OrdersTotal() - 1; i >= 0 ; i--) 
      {
         if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         {
            if( (OrderSymbol() == _Symbol)
                && (OrderMagicNumber() == _Magic1 || OrderMagicNumber() == _Magic2)
                && (OrderType() == cmd) )
            {
               if(OrderType() == OP_BUY)
                  if(!OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), _Slippage, CLR_NONE))
                     Print("v128-2 > ", _Symbol, " > BUY -> ticket=", OrderTicket(), 
                           " -> Îøèáêà (çàêðûòèå) #", GetLastError());
               if(OrderType() == OP_SELL)
                  if(!OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), _Slippage, CLR_NONE))
                     Print("v128-2 > ", _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() == _Magic1 || OrderMagicNumber() == _Magic2)
            && (OrderType() == cmd) ) n++;
      }
   }
   return(n);
}


//=++==============================================================++=
// ïîèñê îðäåðà ïî ìàãèêó
bool FindOrders(int magic)
{
   for(int i = OrdersTotal() - 1; i >= 0 ; i--) 
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if( (OrderSymbol() == _Symbol) && (OrderMagicNumber() == magic) )
            return(true);
      }
   }
   return(false);
}


//=++==============================================================++=
// îòðàáîòêà óðîâíÿ áåçóáûòêà ïî ìàãèêó
void StopLoss_0(int from)
{
   double profitpoint, bid, ask;
   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() == _Magic1 || OrderMagicNumber() == _Magic2) )) continue;
         //
         if(OrderType() == OP_BUY)
         {
            bid         = MarketInfo(_Symbol, MODE_BID);
            profitpoint = (bid - OrderOpenPrice()) / _Point;
            is = profitpoint >= _StopLoss_0_Level + from;
            P3_buy = ND( OrderOpenPrice() + from * _Point );
            //
            if( is && ( OrderStopLoss() == 0 || OrderStopLoss() < P3_buy ) )
            {
               Print("v128-2 á4 >", _Symbol, " | ", _Timeframe,
                     " -> Bid=", MarketInfo(_Symbol, MODE_BID),
                     " | p/o=", OrderOpenPrice(), " | s/l=", OrderStopLoss(), " | P3_buy=", P3_buy,
                     " | d=", _StopLoss_0_Level, " | profitpoint=", profitpoint);
               if(!OrderModify(OrderTicket(), OrderOpenPrice(), P3_buy, OrderTakeProfit(), 0, CLR_NONE))
                  Print("v128-2 á4 > ", _Symbol, " | ", _Timeframe,
                        " -> BUY > ticket=", OrderTicket(), " > Îøèáêà (áåçóáûòîê) #", GetLastError());
            }
         }
         //
         else if(OrderType() == OP_SELL)
         {
            ask         = MarketInfo(_Symbol, MODE_ASK);
            profitpoint = (OrderOpenPrice() - ask) / _Point;
            is = profitpoint >= _StopLoss_0_Level + from;
            P3_sell = ND( OrderOpenPrice() - from * _Point );
            //
            if( is && ( OrderStopLoss() == 0 || OrderStopLoss() > P3_sell ) )
            {
               Print("v128-2 á4 >", _Symbol, " | ", _Timeframe,
                     " -> Ask =", MarketInfo(_Symbol, MODE_ASK),
                     " | p/o=", OrderOpenPrice(), " | s/l=", OrderStopLoss(), " | P3_sell=", P3_sell,
                     " | d=", _StopLoss_0_Level, " | profitpoint=", profitpoint);
               if(!OrderModify(OrderTicket(), OrderOpenPrice(), P3_sell, OrderTakeProfit(), 0, CLR_NONE))
                  Print("v128-2 á4 > ", _Symbol, " | ", _Timeframe,
                        " -> SELL -> ticket=", OrderTicket(), " > Îøèáêà (áåçóáûòîê) #", GetLastError());
            }
         }
      }
   }
}


//=++==============================================================++=
// îòðàáîòêà òðåéëèíã ñòîïà ïî ìàãèêó
void TrailingStop(int from)
{
   double profitpoint, bid, ask;
   double fromprice;
   //
   for(int i = OrdersTotal() - 1; i >= 0 ; i--) 
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if(!( (OrderSymbol() == _Symbol) && (OrderMagicNumber() == _Magic1 || OrderMagicNumber() == _Magic2) )) continue;
         //
         if(OrderType() == OP_BUY)
         {
            if(_IsTrailingStopProfit) fromprice = OrderOpenPrice() + from * _Point;
            else                      fromprice = OrderStopLoss();
            //
            bid         = MarketInfo(_Symbol, MODE_BID);
            profitpoint = (bid - ND(fromprice)) / _Point;
            //
            if( profitpoint >= _TrailingStopLevel &&
                bid > (OrderStopLoss() + (_TrailingStopLevel + _TrailingStopStep) * _Point) )
            {
               Print("v128-2 ò4 >", _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("v128-2 ò4 >", _Symbol, " | ", _Timeframe,
                        " -> BUY > ticket=", OrderTicket(), " > Îøèáêà (òðåéëèíã ñòîï) #", GetLastError());
               }
            }
         }
         //
         else if(OrderType() == OP_SELL)
         {
            if(_IsTrailingStopProfit) fromprice = OrderOpenPrice() - from * _Point;
            else                      fromprice = OrderStopLoss();
            //
            ask         = MarketInfo(_Symbol, MODE_ASK);
            profitpoint = (ND(fromprice) - ask) / _Point;  
            //
            if( profitpoint >= _TrailingStopLevel &&
                ask < (OrderStopLoss() - (_TrailingStopLevel + _TrailingStopStep) * _Point) )
            {
               Print("v128-2 ò4 >", _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("v128-2 ò4 >", _Symbol, " | ", _Timeframe,
                        " -> SELL > ticket=", OrderTicket(), " > Îøèáêà (òðåéëèíã ñòîï) #", GetLastError());
               }
            }
         }
      }
   }
}


//=++==============================================================++=
// Ïîèñê ëîêàëüíîãî äíà. Âîçâðàùàåò öåíó
double FindPriceMinMax(bool isUp)
{
   int shift = 1;
   double price = 0, p0,p1,p2;
   while(price == 0) 
   {
      p0 = iCustom(_Symbol, _Timeframe, "ZigZag", _ZZ_ExtDepth, _ZZ_ExtDeviation, _ZZ_ExtBackstep, 0, shift);
      p1 = iCustom(_Symbol, _Timeframe, "ZigZag", _ZZ_ExtDepth, _ZZ_ExtDeviation, _ZZ_ExtBackstep, 1, shift);
      p2 = iCustom(_Symbol, _Timeframe, "ZigZag", _ZZ_ExtDepth, _ZZ_ExtDeviation, _ZZ_ExtBackstep, 2, shift);
      //Print("v128-2 >", _Symbol, " | ", _Timeframe,
      //      " > sift=", shift, " | p0=", p0, " | p1=", p1, " | p2=", p2);
      if(isUp)
      {
         if(p0 !=0 && p0 == p1) // íàéäåíà âåðøèíà
            price = p0;
      }
      else
      {
         if(p0 != 0 && p0 == p2) // íàéäåíî äíî
            price = p0;
      }
      shift++;
   }
   //Print("v128-2 >", _Symbol, " | ", _Timeframe,
   //      " -> return(price)=", price);
   return(price);
}


//====================================================================
// C÷èòàòü ïåðåìåííóþ èç ôàéëà.
//  ñëó÷àå îòñóòñòâèÿ ôàéëà - ñîçäàòü ôàéë è çàïèñàòü ïåðåìåííóþ â ôàéë
double _FileReadWriteDouble(string filename, double value)
{
   int h1 = FileOpen(filename, FILE_BIN);
   if(h1 > 0)
   {
      value = FileReadDouble(h1, DOUBLE_VALUE);
      FileClose(h1);
   }
   else
   {
      h1 = FileOpen(filename, FILE_BIN|FILE_WRITE);
      FileWriteDouble(h1, value, DOUBLE_VALUE);
      FileClose(h1);
   }
   return(value);
}


//====================================================================
// Çàïèñàòü ïåðåìåííóþ â ôàéë
void _FileWriteDouble(string filename, double value)
{
   int h1 = FileOpen(filename, FILE_BIN|FILE_WRITE);
   FileWriteDouble(h1, value, DOUBLE_VALUE);
   FileClose(h1);
}

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 ---