4_PLC_fractals

Author: Vyacheslav Barbakov | 4_PLC | 28 ������� 2012 ����
Price Data Components
Series array that contains the highest prices of each barSeries array that contains open time of each bar
Orders Execution
Checks for the total of open ordersIt automatically opens orders when conditions are reachedIt Closes Orders by itself
Indicators Used
Fractals
0 Views
0 Downloads
0 Favorites
4_PLC_fractals
#property copyright "Vyacheslav Barbakov | 4_PLC | 28 ôåâðàëÿ 2012 ãîäà"
#property link      "barbakov@bk.ru"
//+-----------------------------------------------------------------------------------------------------------+
//| Âíåøíèå ïåðåìåííûå, ââîäèìûå ïåðåä çàïóñêîì ñîâåòíèêà                                                     |
//+-----------------------------------------------------------------------------------------------------------+
  extern   int       MagicNumber                    =     0;
  extern   int       spred_razmer                   =     15;
  extern   int       filtr_razmer                   =     23;
  extern   double    profit_close                   =     7;
  extern   double    filtr_otstup_no_orders         =     43;
  extern   double    razmer_order_buy               =     0.01;
  extern   double    razmer_order_sell              =     0.01;
  extern   int       x5min                          =     2;
  extern   int       x60min                         =     4;

//+-----------------------------------------------------------------------------------------------------------+
  double spread;
  bool   close_all = false;
//+-----------------------------------------------------------------------------------------------------------+
int init()
{ // íà÷àëî ïðîöåäóðû init()
  return(0);
} // êîíåö ïðîöåäóðû init()
           
//+-----------------------------------------------------------------------------------------------------------+
//| Òåëî ïðîãðàììû îáðàáîòêè êàæäîãî òèêà start()                                                             |
//+-----------------------------------------------------------------------------------------------------------+
int start()
{ // íà÷àëî ïðîöåäóðû start()
//+-----------------------------------------------------------------------------------------------------------+
//| Èíèöèàëèçàöèÿ ïåðåìåííûõ
//+-----------------------------------------------------------------------------------------------------------+
         double buy_orders_price [];
         double sell_orders_price [];
  if (OrdersTotal()!=0)
  {
    ArrayInitialize (buy_orders_price, 0);
    ArrayInitialize (sell_orders_price, 0);
  }
//+-----------------------------------------------------------------------------------------------------------+
//| Èùåì áëèæàéøèå ôðàêòàëû íà 5 ìèíóòíîì  ãðàôèêå
//+-----------------------------------------------------------------------------------------------------------+
  double fractal_5min_hi, fractal_5min_low; 
  int f_5min_hi =0;
  while(fractal_5min_hi == 0)
  {
    fractal_5min_hi = iFractals(NULL,5, 1, f_5min_hi);
    f_5min_hi++;
  }

  int f_5min_low =0;
  while(fractal_5min_low == 0)
  {
    fractal_5min_low = iFractals(NULL, 5, 2, f_5min_low);
    f_5min_low++;
  }
//+-----------------------------------------------------------------------------------------------------------+
//| Èùåì áëèæàéøèå ôðàêòàëû íà 15 ìèíóòíîì òàéìôðýéìå
//+-----------------------------------------------------------------------------------------------------------+
  double fractal_15min_hi, fractal_15min_low; 
  int f_15min_hi =0;
  while(fractal_15min_hi == 0)
  {
    fractal_15min_hi = iFractals(NULL,15, 1, f_15min_hi);
    f_15min_hi++;
  }

  int f_15min_low =0;
  while(fractal_15min_low == 0)
  {
    fractal_15min_low = iFractals(NULL, 15, 2, f_15min_low);
    f_15min_low++;
  }
 //+-----------------------------------------------------------------------------------------------------------+
//| Èùåì áëèæàéøèå ôðàêòàëû íà 30 ìèíóòíîì òàéìôðýéìå
//+-----------------------------------------------------------------------------------------------------------+
  double fractal_30min_hi, fractal_30min_low; 
  int f_30min_hi =0;
  while(fractal_30min_hi == 0)
  {
    fractal_30min_hi = iFractals(NULL,30, 1, f_30min_hi);
    f_30min_hi++;
  }

  int f_30min_low =0;
  while(fractal_30min_low == 0)
  {
    fractal_30min_low = iFractals(NULL, 30, 2, f_30min_low);
    f_30min_low++;
  }
//+-----------------------------------------------------------------------------------------------------------+
//| Èùåì áëèæàéøèå ôðàêòàëû íà 60 ìèíóòíîì òàéìôðýéìå
//+-----------------------------------------------------------------------------------------------------------+
  double fractal_60min_hi, fractal_60min_low; 
  int f_60min_hi =0;
  while(fractal_60min_hi == 0)
  {
    fractal_60min_hi = iFractals(NULL, 60, 1, f_60min_hi);
    f_60min_hi++;
  }

  int f_60min_low =0;
  while(fractal_60min_low == 0)
  {
    fractal_60min_low = iFractals(NULL, 60, 2, f_60min_low);
    f_60min_low++;
  }
//+-----------------------------------------------------------------------------------------------------------+
//| Èùåì áëèæàéøèå ôðàêòàëû íà 60 ìèíóòíîì òàéìôðýéìå
//+-----------------------------------------------------------------------------------------------------------+
  double fractal_240min_hi, fractal_240min_low; 
  int f_240min_hi =0;
  while(fractal_240min_hi == 0)
  {
    fractal_240min_hi = iFractals(NULL, 240, 1, f_240min_hi);
    f_240min_hi++;
  }

  int f_240min_low =0;
  while(fractal_240min_low == 0)
  {
    fractal_240min_low = iFractals(NULL, 240, 2, f_240min_low);
    f_240min_low++;
  }
//+-----------------------------------------------------------------------------------------------------------+
//| Îïðåäåëÿåì óñëîâèå âû÷èñëåíèÿ ðàçìåðà ñïðåäà 
//| åñëè íå óñòàíîâëåí â ðó÷íóþ (spred_ramer == 0) òî âû÷èñëÿåì èñõîäÿ èç ðûíî÷íûõ óñëîâèé
//+-----------------------------------------------------------------------------------------------------------+
  if (spred_razmer == 0)
  {
    spread = NormalizeDouble(MarketInfo(Symbol(), MODE_SPREAD) * Point, Digits); 
  }
  else
  {
    spread = NormalizeDouble(spred_razmer * Point, Digits); 
  }
  double filtr = NormalizeDouble(filtr_razmer * Point, Digits);
//+-----------------------------------------------------------------------------------------------------------+
//+-----------------------------------------------------------------------------------------------------------+
//| Ïåðåáèðàåì îòêðûòûå ðûíî÷íûå îðäåðà è ôîðìèðóåì ìàññèâû: buy_orders_price [], sell_orders_price []        |
//+-----------------------------------------------------------------------------------------------------------+
  int num_buy_orders_price  = 0;
  int num_sell_orders_price = 0;

  bool est_sellstop = false;
  bool est_buystop  = false;

  for (int ord = 0; ord < OrdersTotal(); ord ++)
  if(OrderSelect(ord, SELECT_BY_POS))
  { // íà÷àëî ïåðåáîðà îòêðûòûõ îðäåðîâ
    if ((OrderType() == 0) && OrderMagicNumber() == MagicNumber)
    { // BUY 
      buy_orders_price [num_buy_orders_price] = OrderOpenPrice();
      num_buy_orders_price++;
    }
    if ((OrderType() == 4) && OrderMagicNumber() == MagicNumber)
    { // BUYSTOP 
      buy_orders_price [num_buy_orders_price] = OrderOpenPrice();
      num_buy_orders_price++;
      est_buystop = true;
    }
    if ((OrderType() == 1) && OrderMagicNumber() == MagicNumber)
    { // SELL
      sell_orders_price [num_sell_orders_price] = OrderOpenPrice();
      num_sell_orders_price++;
    }
    if ((OrderType() == 5) && OrderMagicNumber() == MagicNumber)
    { // SELLSTOP
      sell_orders_price [num_sell_orders_price] = OrderOpenPrice();
      num_sell_orders_price++;
      est_sellstop = true;
    }
  } // êîíåö ïåðåáîðà îòêðûòûõ îðäåðîâ
//+-----------------------------------------------------------------------------------------------------------+
  if (num_buy_orders_price !=0)
  {
    ArrayResize(buy_orders_price,  num_buy_orders_price);
    int num_max_level = ArrayMaximum(buy_orders_price,  num_buy_orders_price,  0);
    double level_max_buy  = buy_orders_price[num_max_level];
  }
  if (num_sell_orders_price != 0)
  {
    ArrayResize(sell_orders_price, num_sell_orders_price);
    int num_min_level = ArrayMinimum(sell_orders_price, num_sell_orders_price, 0);
    double level_min_sell = sell_orders_price[num_min_level];
  }
  Comment("\n Ìàêñèìàëüíûé óðîâåíü BUY :" + level_max_buy + " èç " + ArrayRange(buy_orders_price, 0) +
          "\n Ìèíèìàëüíûé óðîâåíü SELL :" + level_min_sell + " èç " + ArrayRange(sell_orders_price, 0));
//+-----------------------------------------------------------------------------------------------------------+
//| âûñòàâëÿåì îðäåðà
//+-----------------------------------------------------------------------------------------------------------+
  
  if (candle_begin())
  { // íà÷àëî âûñòàâëÿåì îðäåðà
    double hi_pred_svechi  = NormalizeDouble((iHigh(NULL, 0, 1) + filtr + spread), Digits);
    double low_pred_svechi = NormalizeDouble((iLow (NULL, 0, 1) - filtr), Digits);
    
    if ((NormalizeDouble((iHigh(NULL, 0, 1) + spread), Digits) - level_max_buy > filtr_otstup_no_orders*Point && level_max_buy != 0 )
        || (level_max_buy == 0 && !est_buystop ))
    {
      double order_buy = razmer_order_buy;
      int case_hi = 0;
      if(hi_pred_svechi - fractal_5min_hi > 0)
      {
        case_hi = 1;
      }
      if(hi_pred_svechi - fractal_60min_hi > 0)
      {
        case_hi = 2;
      }
      switch (case_hi)
      {
        case 0 : order_buy = razmer_order_buy;
        break;
        case 1 : order_buy = x5min * razmer_order_buy;
        break;
        case 2 : order_buy = x60min * razmer_order_buy;
        break;
      }
      int res_buystop  = OrderSend(Symbol(), 
                                   OP_BUYSTOP, 
                                   order_buy, 
                                   hi_pred_svechi,  
                                   5, 
                                   0,  
                                   0,  
                                   "B",  
                                   MagicNumber, 
                                   0, 
                                   Green);
    }
    
    if ((level_min_sell - NormalizeDouble(iLow (NULL, 0, 1), Digits) > filtr_otstup_no_orders*Point)
       || (level_min_sell == 0 && !est_sellstop)) 
    {
      double order_sell = razmer_order_sell;
      int case_low = 0;
      if(low_pred_svechi < fractal_5min_low)
      {
        case_low = 1;
      }
      if(hi_pred_svechi < fractal_60min_low)
      {
        case_low = 2;
      }
      switch (case_low)
      {
        case 0 : order_sell = razmer_order_sell;
        break;
        case 1 : order_sell = x5min * razmer_order_sell;
        break;
        case 2 : order_sell = x60min * razmer_order_sell;
        break;
      }
      int res_sellstop = OrderSend(Symbol(), 
                                   OP_SELLSTOP, 
                                   order_sell, 
                                   low_pred_svechi, 
                                   5, 
                                   0, 
                                   0, 
                                   "S", 
                                   MagicNumber, 
                                   0, 
                                   Red);
    }                                   
  } // êîíåö âûñòàâëÿåì îðäåðà
//+-----------------------------------------------------------------------------------------------------------+
//| Çàêðûâàåì îðäåðà ïðè ïîÿâëåíèè ïðèáûëè çàäààíîé ïðè çàïóñêå ñîâåòíèêà
//+-----------------------------------------------------------------------------------------------------------+
  if (AccountProfit() >= profit_close)
  {
    close_all = true;
  }
    
  if (close_all)
  { //íà÷àëî close_all
    Print("Çàêðûâàåì âñå îðäåðà. Äîñòèãíóò óðîâåíü ïðèáûëè " + profit_close + " USD.");
    for (int ord_close = 0; ord_close < OrdersTotal(); ord_close ++)
    if(OrderSelect(ord_close, SELECT_BY_POS))
    { // íà÷àëî ïåðåáîðà îòêðûòûõ îðäåðîâ
      if ((OrderType() == 0) && OrderMagicNumber() == MagicNumber)
      { // BUY 
        OrderClose(OrderTicket(), OrderLots(), Bid, 5, Green);
      }
      if ((OrderType() == 4) && OrderMagicNumber() == MagicNumber)
      { // BUYSTOP 
        OrderDelete(OrderTicket());
      }
      if ((OrderType() == 1) && OrderMagicNumber() == MagicNumber)
      { // SELL
        OrderClose(OrderTicket(), OrderLots(), Ask, 5, Red);
      }
      if ((OrderType() == 5) && OrderMagicNumber() == MagicNumber)
      { // SELLSTOP
        OrderDelete(OrderTicket());
      }
    } // êîíåö ïåðåáîðà îòêðûòûõ îðäåðîâ
  } //êîíåö close_all
  if (OrdersTotal() == 0)
  {
    close_all = false;
  }
//+-----------------------------------------------------------------------------------------------------------+
  return(0);
} // êîíåö ïðîöåäóðû start()
//+-----------------------------------------------------------------------------------------------------------+

//+-----------------------------------------------------------------------------------------------------------+
//| 1. Ïðîöåäóðà - Îïðåäåëÿåì ìîìåíò íàñòóïëåíèÿ íîâîé ñâå÷è                                                  |
//+-----------------------------------------------------------------------------------------------------------+

bool candle_begin()
{
  static int  diff_prev = 0;
         bool rc        = false;
         int  diff      = TimeCurrent() - iTime(NULL, NULL, 0);
  if(diff < diff_prev)
  {
    rc = true;
    diff_prev = 0;
    Print("Íà÷àëî íîâîé ñâå÷è");
    Print("Ñïðýä: ", NormalizeDouble((Ask-Bid)/Point,0));
  }
  else
  {
    diff_prev = diff;
    rc = false;
  }
  return(rc);
}
//+-----------------------------------------------------------------------------------------------------------+
//| Êîíåö                                                                                                     |
//+-----------------------------------------------------------------------------------------------------------+

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