SAW_system_1

Author: Copyright 2014, SAW
Price Data Components
Series array that contains the highest prices of each barSeries array that contains the lowest prices of each bar
Orders Execution
Checks for the total of open ordersIt automatically opens orders when conditions are reachedIt Closes Orders by itself
0 Views
0 Downloads
0 Favorites

Profitability Reports

GBP/CAD Oct 2024 - Jan 2025
0.00 %
Total Trades 0
Won Trades 0
Lost trades 0
Win Rate 0.0 %
Expected payoff 0.00
Gross Profit 0.00
Gross Loss 0.00
Total Net Profit 0.00
-100%
-50%
0%
50%
100%
GBP/USD Oct 2024 - Jan 2025
123.00 %
Total Trades 66
Won Trades 25
Lost trades 41
Win Rate 0.38 %
Expected payoff 0.19
Gross Profit 67.33
Gross Loss -54.94
Total Net Profit 12.39
-100%
-50%
0%
50%
100%
SAW_system_1
//+------------------------------------------------------------------+
//|                                                 SAW_system_1.mq4 |
//|                                              Copyright 2014, SAW |
//|                                http://saw-trade.livejournal.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, SAW"
#property link      "http://saw-trade.livejournal.com/"
#property version   "1.00"
#property description "Ñîâåòíèê SAW_system_1 âûñòàâëÿåò îòëîæåííûå îðäåðà èç ðàñ÷åòà âîëàòèëüíîñòè"
#property description "çà N äíåé. StopLoss âñåãäà óñòàíàâëèâàåòñÿ íà óðîâåíü ïðîòèâîïîëîæíîãî îðäåðà,"
#property description "ñîîòâåòñòâåííî, â ïàðàìåòðàõ óêàçûâàåòñÿ ðàññòîÿíèå äî ñòîïà, òàì æå áóäåò ñòîÿòü"
#property description "è ïðîòèâîïîëîæíûé îðäåð!"
#property description "Òàéì-ôðåéì íå èìååò çíà÷åíèÿ."
#property strict

//--- input parameters
input double   lot         = 0.01;  // Lot
input int      d           = 5;     // Amount of days (for calculating volatility)
input int      open_hour   = 7;     // Hour installation orders (terminal time)
input int      close_hour  = 10;    // Hour removal orders (terminal time)
input int      sl_rate     = 15;    // Stop-Loss (percentage of the average volatility)
input int      tp_rate     = 30;    // Take-Profit (percentage of the average volatility)
input bool     rev         = false; // Reverse positions
input bool     martin      = false; // Martingale
input double   martin_koef = 2.0;   // Multiplier

//--- global parameters
//int      dig         = 0;
bool     new_day= true;  // new trading day
int      day_week= -1;   // the current day of the week
int      d_average   = 0;     // the value of the average volatility for the selected period
int      sl          = 0;     // Stop Loss
int      tp          = 0;     // Take Profit
int      or          = 0;     // the distance from the stage to order
int      err         = 0;     // variable for counting the number of consecutive errors
bool     mod_order   = false; // orders modification flag

//--- custom functions
void v_calc();
void sl_tp_or_calc();
int send_orders();
int error();
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   day_week=DayOfWeek();   // óñòàíàâëèâàåì òåêóùèé äåíü íåäåëè (0 - âîñêðåñåíüå)

   if(Hour()>=open_hour) // åñëè ÷àñ ïðîøåë, òî â ýòîò äåíü îðäåðà íå óñòàíàâëèâàåì
      new_day= false;
   
   v_calc();         // ÐÀÑ×ÅÒ ÂÎËÀÒÈËÜÍÎÑÒÈ
   sl_tp_or_calc();  // ðàññ÷èòûâàåì ñòîï-ëîññ è òåéê-ïðîôèò

// ðàñ÷åò ïåðåìåííîé dig   
//   if (Digits() == 5)
//      dig = 100000;
//   if (Digits() == 4)
//      dig = 10000;  
//   
//   if (Digits() == 3)
//      dig = 1000;
//   if (Digits() == 2)
//      dig = 100;

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- ïðîâåðÿåì íîâûé äåíü
   if(new_day==false && day_week!=DayOfWeek())
     {
      v_calc();         // ðàññ÷èòûâàåì âîëàòèëüíîñòü

      sl_tp_or_calc();  // ðàññ÷èòûâàåì ñòîï-ëîññ è òåéê-ïðîôèò

      //--- óñòàíàâëèâàåì ïåðåìåííûå
      day_week= DayOfWeek();
      new_day = true;
      mod_order=false;
     }
//-----------------------------------------------------------------------
//--- ïðè íàñòóïëåíèè íîâîãî äíÿ è òîðãîâîãî ÷àñà, âûñòàâëÿåì íàøè îðäåðà
   if(day_week==DayOfWeek() && new_day==true && Hour()==open_hour)
     {
      while(send_orders()==666) // åñëè îðäåð íå óñòàíîâèëñÿ, ïåðåçàïóñêàåì 5 ðàç
        {
         switch(error())
           {
            case 666: new_day=false; mod_order=true; Print("!!!!!!ÏÐÎÈÇÎØËÀ ÎØÈÁÊÀ ¹  ",GetLastError()); return;   // if the restart does not help, we derive a mistake and do not sell
            case   1: RefreshRates();
           }
        }
     }
//------------------------------------------------------------------------   
// åñëè äåíü íå íîâûé è ò. ä.
   if(new_day==false && day_week==DayOfWeek() && mod_order==false)
     {
      int tip1      = -1;   // òèï ïåðâîãî îðäåðà
      int tip2      = -1;   // òèï âòîðîãî îðäåðà
      int tick1     = -1;   // íîìåð ïåðâîãî îðäåðà
      int tick2     = -1;   // íîìåð âòîðîãî îðäåðà
      double price2 = -1.0; // öåíà îòêðûòèÿ âòîðîãî îðäåðà
      double sl2    = -1.0; // ñòîï-ëîññ âòîðîãî îðäåðà
      double tp2    = -1.0; // òåéê-ïðîôèò âòîðîãî îðäåðà

      RefreshRates();

      // ïðîâåðÿåì êîëè÷åñòâî îðäåðîâ
      if(OrdersTotal()>2)
        {
         Print("ÁÎËÜØÅ 2-õ îðäåðîâ íà îäíîì èíñòðóìåíòå. Çàêðûâàåì ÂÑÅ!!!");
         close_all_orders();
         return;
        }

      // ïîëó÷àåì èíôîðìàöèþ ïî îðäåðàì
      for(int i=0; i+1<=OrdersTotal(); i++)
        {

         if(OrderSelect(i,SELECT_BY_POS)==true)
           {
            switch(i)
              {
               case  0: tip1 = OrderType(); break;
               case  1: tip2 = OrderType(); tick2 = OrderTicket();
               price2=OrderOpenPrice(); sl2=OrderStopLoss(); tp2=OrderTakeProfit(); break;
               default: Print("Íåâåðíîå êîëè÷åñòâî îðäåðîâ, ñáîé â ðàáîòå öèêëà!!!");
              }
           }
        }

      // ïðîâåðÿåì âðåìÿ æèçíè îòëîæåííûõ îðäåðîâ
      if(tip1>1 && tip2>1 && close_hour<=Hour())
        {
         close_all_orders();
         mod_order=true;
         tip1=tip2=-1;
        }

      // ìåíÿåì çíà÷åíèÿ îðäåðîâ ìåñòàìè, åñëè íóæíî
      if((tip2==0 || tip2==1) && tip1>1)
        {
         int t;

         if(OrderSelect(0,SELECT_BY_POS)==true)
           {
            tick2=OrderTicket();
            price2=OrderOpenPrice();
            sl2 = OrderStopLoss();
            tp2 = OrderTakeProfit();

            t=tip1;
            tip1 = tip2;
            tip2 = t;
           }

        }

      // ìîäèôèöèðóåì èëè óäàëÿåì îðäåðà, åñëè íóæíî
      if((tip1==0 || tip1==1) && tip2>1)
        {
         if(rev==false)
           {
            if(OrderDelete(tick2)==true)
               mod_order=true;
           }

         if(rev==true && martin==true)
           {
            if(OrderDelete(tick2)==true)
               if(OrderSend(Symbol(),tip2,lot*martin_koef,price2,5,sl2,tp2,NULL,0,0,clrNONE)==-1)
                  Print("ÎØÈÁÊÀ ïåðåóñòàíîâêè âòîðîãî îðäåðà, äëÿ óâåëè÷åíèÿ ëîòà ¹",GetLastError());

            mod_order=true;
           }

         if(rev==true && martin==false)
           {
            mod_order=true;
           }
        }
     }

// ïðîâåðêà íà ñëó÷àé ñðàáàòûâàíèÿ òåéêà îäíîãî èç îðäåðîâ
   if(mod_order==true && OrdersTotal()==1 && Hour()>=close_hour)
      if(OrderSelect(0,SELECT_BY_POS)==true)
         if(OrderType()>1)
            if(!OrderDelete(OrderTicket()))
               Print("ÎØÈÁÊÀ óäàëåíèÿ îðäåðà! GetLastError = " + (string)GetLastError());

// äîïîëíèòåëüíàÿ ïðîâåðêà íà ñëó÷àé îòêëþ÷åíèÿ èíòåðíåòà
   if(new_day==true && day_week!=DayOfWeek())
     {
      day_week=DayOfWeek();
      mod_order=false;

      if(Hour() >= open_hour)
         new_day = false;
     }

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void v_calc() // ÐÀÑ×ÅÒ ÂÎËÀÒÈËÜÍÎÑÒÈ
  {
   double h;   // ìàêñèìàëüíàÿ öåíà áàðà
   double l;   // ìèíèìàëüíàÿ öåíà áàðà
   double av=0;  // ñóììà âñåé âîëàòèëüíîñòè çà ïåðèîä

                 // ðàñ÷åò ñðåäíåé âîëàòèëüíîñòè çà ïåðèîä
   for(int i=1; i<=d; i++)
     {
      h = NormalizeDouble (iHigh(NULL, PERIOD_D1, i), Digits);
      l = NormalizeDouble (iLow(NULL, PERIOD_D1, i), Digits);
      av= av+((h-l)/Point());
     }

   d_average=(int)(av/d);

   Print("d_average = ",d_average);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void sl_tp_or_calc() // ÐÀÑ×ÅÒ ÑÒÎÏÀ È ÏÐÎÔÈÒÀ
  {
   sl = d_average * sl_rate / 100;
   tp = d_average * tp_rate / 100;

   or=sl/2;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int send_orders() // ÓÑÒÀÍÎÂÊÀ ÎÐÄÅÐÎÂ
  {
   double price_up = -1.0; // óðîâåíü âûøå öåíû
   double price_dn = -1.0; // óðîâåíü íèæå öåíû
   double tp_up = -1.0;    // òåéê âåðõíåãî óðîâíÿ
   double tp_dn = -1.0;    // òåéê íèæíåãî óðîâíÿ

   RefreshRates();

// ðàñ÷åò óðîâíåé
   price_up = Bid + or * Point();
   price_dn = Bid - or * Point();
   tp_up    = price_up + tp * Point();
   tp_dn    = price_dn - tp * Point();

   Print ("price_up = ", price_up);
   Print ("price_dn = ", price_dn);
   Print ("tp_up = ", tp_up);
   Print ("tp_dn = ", tp_dn);

// óñòàíîâêà îðäåðà BUYSTOP
   if(OrderSend(Symbol(),OP_BUYSTOP,lot,price_up,5,price_dn,tp_up,NULL,0,0,clrNavy)==-1)
     {
      return(666);
     }

// óñòàíîâêà îðäåðà SELLSTOP
   if(OrderSend(Symbol(),OP_SELLSTOP,lot,price_dn,5,price_up,tp_dn,NULL,0,0,clrRed)==-1)
     {
      return(666);
     }

   new_day=false;
   err=0;

   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int error() // ÔÓÍÊÖÈß ÎÁÐÀÁÎÒÊÈ ÎØÈÁÎÊ
  {
   if(err>=5)
     {
      close_all_orders();
      err=0;
      return(666);
     }
   else
     {
      close_all_orders();
      err++;
      return(1);
     }

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void close_all_orders() // ÇÀÊÐÛÒÜ È ÓÄÀËÈÒÜ ÂÑÅ ÎÐÄÅÐÀ
  {
   int   tip=-1;        // òèïà âûáðàííîãî îðäåðà
   bool  cl=true;  // ðåçóëüòàò çàêðûòèÿ âñåõ îðäåðîâ
   int   i= 5;          // êîëè÷åñòâî ïîïûòîê çàêðûòèÿ îðäåðîâ
   int   tick = -1;     // íîìåð îðäåðà

   while(OrdersTotal()>0 && i>0)
     {
      RefreshRates();

      if(OrderSelect(0,SELECT_BY_POS)==true)
        {
         tip=OrderType();
         tick=OrderTicket();

         switch(tip)
           {
            case 0: cl = OrderClose(tick, OrderLots(), Bid, 5); break;
            case 1: cl = OrderClose(tick, OrderLots(), Ask, 5); break;
            case 2: cl = OrderDelete(tick); break;
            case 3: cl = OrderDelete(tick); break;
            case 4: cl = OrderDelete(tick); break;
            case 5: cl = OrderDelete(tick); break;
           }
        }
      else
        {
         Print("ÎØÈÁÊÀ ÂÛÁÎÐÀ ÎÐÄÅÐÀ");
         cl=false;
        }

      if(cl==false)
         i--;

     }

   if(cl==false)
     {
      Print("ÎØÈÁÊÀ ÇÀÊÐÛÒÈß ÂÑÅÕ ÎÐÄÅÐÎÂ");
      return;
     }
  }
//+------------------------------------------------------------------+

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