FutureMACD





//+------------------------------------------------------------------+
//|                                                   FurureMACD.mq4 |
//|                     Copyright © 2008, Äåì¸õèí Âèòàëèé Åâãåíüåâè÷ |
//|                                             vitalya_1983@list.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, Äåì¸õèí Âèòàëèé Åâãåíüåâè÷"
#property link      "vitalya_1983@list.ru"

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
extern int  Kol_vo_sovpadenii =  5,
            tocnost           =  10,
            analiz_bars       =  8,
            poisk_fractals    =  4,
            minTP             =  30;
extern bool TrailingStop      =  false,
            Ruchnik           =  false,
            dokupka           =  true;

extern double  Stat_Take_Profit  =  0.5,
               zabyvaemost    =  1.5;
bool Proverka_buy,Proverka_sell;
string nash_grafik;
static datetime New_time;
int i,magic_number;
int init()
  {
//----
   magic_number = Period();
   nash_grafik = Symbol() +"_"+ Period ();
      New_time=Time[0];
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   nash_grafik = NULL;
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
//----------------------------------------------ñîñòàâëåíèå ïîñëåäîâàòåëüíîñòè áàðîâ
   if (TrailingStop)
      Trailing_start ();
   if (New_time!=Time[0])
   {
      int history [1000];
      
      for (int i=analiz_bars+poisk_fractals;i>poisk_fractals;i--)
         {
         history [i] = NormalizeDouble((tocnost*(iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,i)-iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,i)))/(100*Point),0);
         }
      
   //--------------------------------îòêðûâàåì èëè ñîçäàåì ôàéë ñ äàííîé ïîñëåäîâàòåëüíîñòüþ
      
      for (i=analiz_bars+poisk_fractals;i>poisk_fractals;i--)
         {
         string posledovatelnost =posledovatelnost+history [i]+"_";
         }
      posledovatelnost = posledovatelnost +".csv";
      int nash_file=FileOpen ("FutureMACD_"+nash_grafik+"/"+posledovatelnost, FILE_CSV|FILE_READ,',');
      if (nash_file<0)
         {
         bool new_file=true;
         }
      else 
         {
         new_file=false;
         FileClose (nash_file);
         }
      nash_file=FileOpen ("FutureMACD_"+nash_grafik+"/"+posledovatelnost, FILE_CSV|FILE_READ|FILE_WRITE,',');
   
   //---------------------------------------------------------îïðåäåëÿåì ñðåäè íèõ ôðàêòàëû
      double MaxHighPik = High [poisk_fractals]; //Íà÷èíàåì ñðàâíèâàòü áàðû
      double MaxLowPik = Low [poisk_fractals];  
      for (i=poisk_fractals; i>=1; i--)
         {
         if (MaxHighPik < High [i])
            {
            MaxHighPik = High [i];     
            }
         if (MaxLowPik > Low [i])
            {
            MaxLowPik = Low [i];       
            }
         }
         
      double Fractal_Up = (MaxHighPik - Open [poisk_fractals])/Point;
      double Fractal_Down = (Open [poisk_fractals]-MaxLowPik)/Point;
   //-------------------------------------------------ðåäàêòèðóåì íàø ôàéë
      double setka [1] [1];
   /*
         |êîë-âî îáðàùåíèé |Òåéêïðîôèò |
         |                 |           |
   ------------------------------------|
   Buy   |        0        |     0     |
   ------------------------------------|
   Sell  |        0        |     0     |
   */ if (!new_file)
         {
         FileSeek (nash_file, 0,SEEK_SET);
         int Buy_Kol_vo_obraschenii    = FileReadNumber (nash_file);
         int Buy_Take_Profit           = FileReadNumber (nash_file);
         int Sell_Kol_vo_obraschenii   = FileReadNumber (nash_file);
         int Sell_Take_Profit          = FileReadNumber (nash_file);
         }
      if (new_file)
         {
         Buy_Kol_vo_obraschenii        = 0;
         Buy_Take_Profit               = 0;
         Sell_Kol_vo_obraschenii       = 0;
         Sell_Take_Profit              = 0;
         }
   //----------------------------------------------------Ðàáîòà ñ äàííûìè
      if (Fractal_Up>=Fractal_Down)
         {
         Buy_Kol_vo_obraschenii++;
         Buy_Take_Profit=NormalizeDouble((Buy_Take_Profit+Fractal_Up*zabyvaemost)/(1+zabyvaemost),0);
         Sell_Take_Profit=NormalizeDouble((Sell_Take_Profit-Fractal_Up*zabyvaemost)/(1+zabyvaemost),0);
         }
      if (Fractal_Down>=Fractal_Up)
         {
         Sell_Kol_vo_obraschenii++;
         Sell_Take_Profit=NormalizeDouble((Sell_Take_Profit+Fractal_Down*zabyvaemost)/(1+zabyvaemost),0);
         Buy_Take_Profit=NormalizeDouble((Buy_Take_Profit-Fractal_Down*zabyvaemost)/(1+zabyvaemost),0);
         }
//-------------------------------------------------------------------çàïèñü â ôàéë
      FileSeek (nash_file,0,SEEK_SET);
      FileWrite (nash_file,
                           Buy_Kol_vo_obraschenii,
                           Buy_Take_Profit);
                        
      FileWrite (nash_file,
                           Sell_Kol_vo_obraschenii,
                           Sell_Take_Profit);
      FileClose (nash_file);
      
         
//------------------------------------------------------------------èùåì ñîâïàäåíèÿ â ãðàôèêå         
      for (i=analiz_bars+poisk_fractals;i>poisk_fractals;i--)
         {
         history [i] = NormalizeDouble((tocnost*(iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,i)-iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,i)))/(100*Point),0);
         }
      
//---------------------------------------------------îòêðûâàåì ôàéë ñ äàííîé ïîñëåäîâàòåëüíîñòüþ
      
      
      for (i=analiz_bars;i>=1;i--)
         {
         string nasha_posledovatelnost=nasha_posledovatelnost+history [i]+"_";
         }
      nasha_posledovatelnost= nasha_posledovatelnost +".csv";
      nash_file=FileOpen ("FutureMACD_"+nash_grafik+"/"+nasha_posledovatelnost, FILE_CSV|FILE_READ,',');
      if (nash_file>0)
         {
         FileClose (nash_file);
         nash_file=FileOpen ("FutureMACD_"+nash_grafik+"/"+posledovatelnost, FILE_CSV|FILE_READ|FILE_WRITE,',');
         FileSeek (nash_file, 0,SEEK_SET);
         Buy_Kol_vo_obraschenii    = FileReadNumber (nash_file);
         Buy_Take_Profit           = FileReadNumber (nash_file);
         Sell_Kol_vo_obraschenii   = FileReadNumber (nash_file);
         Sell_Take_Profit          = FileReadNumber (nash_file);
         FileClose (nash_file);
         if (!Proverka_buy ()||(dokupka&&New_time!= Time [0])) 
            {
            if (!Ruchnik&& Buy_Take_Profit>=Sell_Take_Profit)// Åñëè Àëëèãàòîð äàë êîìàíäó èëè íå ìåøàåò...
               {
               double TP = NormalizeDouble ((Buy_Take_Profit*Stat_Take_Profit)*Point,Digits);
               for (i=OrdersTotal();i>=1;i--)
                  {
                  OrderSelect (i-1,SELECT_BY_POS,MODE_TRADES);
                  if (OrderType () == OP_SELL&&OrderSymbol() == Symbol()&& OrderMagicNumber () == magic_number)
                     {
                     OrderClose(OrderTicket(),OrderLots(),Bid,3,Red);
                     }
                  }
               if (Buy_Kol_vo_obraschenii>Kol_vo_sovpadenii&&Buy_Take_Profit>minTP)
                  {
                  OrderSend (Symbol(),OP_BUY, 0.1,Ask,3,Bid-Buy_Take_Profit*Point,Bid+TP,0,magic_number);
                  }
               }
            }
         if (!Proverka_sell()||(dokupka&&New_time != Time[0])) //Åñëè îòêðûòûõ îðäåðîâ íåò...
            {
            if (!Ruchnik&& Buy_Take_Profit<=Sell_Take_Profit)
               {
               for (i=OrdersTotal();i>=1;i--)
                  {
                  OrderSelect (i-1,SELECT_BY_POS,MODE_TRADES);
                  if (OrderType () == OP_BUY&&OrderSymbol() == Symbol()&& OrderMagicNumber () == magic_number)
                     {
                     OrderClose(OrderTicket(),OrderLots(),Bid,3,Blue);
                     }
                  }
               if (Sell_Kol_vo_obraschenii>Kol_vo_sovpadenii&&Sell_Take_Profit>minTP)
                  {
                  TP = NormalizeDouble ((Sell_Take_Profit*Stat_Take_Profit)*Point,Digits);
                  OrderSend (Symbol(),OP_SELL, 0.1,Bid,3,Ask+Sell_Take_Profit*Point,Ask-TP,0,magic_number);
                  }
               }
            }
         }
      }
//----
   return(0);
  }
//+------------------------------------------------------------------+
   bool Proverka_buy()
   {
   bool Otkryt_orders_buy = false; //ôëàã "îòêðûòûõ îðäåðîâ íåò"
   for (i = OrdersTotal(); i>=1; i--)
      {
      OrderSelect(i-1, SELECT_BY_POS, MODE_TRADES);
      if(OrderType() == OP_BUY && OrderSymbol () ==Symbol() && OrderMagicNumber() == magic_number)
      Otkryt_orders_buy = true; //Ïîïàëñÿ!!!
      }
   if (Otkryt_orders_buy==true)
      return(true);
   else 
      {
      return (false);
      }
   }
//--------------------------

bool Proverka_sell()
   {
   bool Otkryt_orders_sell = false;
   for (i = OrdersTotal() ; i>=1; i--)
      {
      
      OrderSelect(i-1, SELECT_BY_POS, MODE_TRADES);
      if(OrderType() == OP_SELL && OrderSymbol () ==Symbol() && OrderMagicNumber() == magic_number)  
      Otkryt_orders_sell= true;
      }
   if (Otkryt_orders_sell==true)
      return(true);
   else 
      {
      return (false);
      }
   }

//------------------------------------------------------------
int Trailing_start ()
   {
   
   for (i = OrdersTotal(); i>=1; i--)
      {
      RefreshRates();
      OrderSelect(i-1, SELECT_BY_POS, MODE_TRADES);
      
      if(OrderType() == OP_BUY && OrderSymbol () ==Symbol() && OrderMagicNumber() == magic_number)
         {
         int Trailing = NormalizeDouble ((OrderTakeProfit()-OrderOpenPrice())/4,0);
         if(Bid>Point*Trailing +OrderOpenPrice()&&OrderStopLoss()<Bid-Point*Trailing)
            {
            OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*Trailing,OrderTakeProfit(),0,0);
            Sleep (1000);
            }
         }
      if(OrderType() == OP_SELL && OrderSymbol () ==Symbol() && OrderMagicNumber() == magic_number)
         {
          Trailing = NormalizeDouble ((OrderOpenPrice()-OrderTakeProfit())/4,0);
         if(OrderOpenPrice()-Ask>Point*Trailing&&OrderStopLoss()>Ask+Point*Trailing)
            {
            OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*Trailing,OrderTakeProfit(),0,0);
            Sleep (1000);
            }
         }  
      }
   return (0);
   }



Sample





Analysis



Market Information Used:

Series array that contains open time of each bar


Indicator Curves created:


Indicators Used:

MACD Histogram


Custom Indicators Used:

Order Management characteristics:
Checks for the total of open orders

It Closes Orders by itself
It can change open orders parameters, due to possible stepping strategy

Other Features: