MACD_signal.mq4 _v3





//+------------------------------------------------------------------+
//|                                                  MACD_signal.mq4 |
//|                                                           tom112 |
//|                                            tom112@mail.wplus.net |
//+------------------------------------------------------------------+
#property copyright "tom112"
#property link "tom112@mail.wplus.net"
//---- input parameters
extern double TakeProfit = 10;
extern double Lots = 10;
extern double TrailingStop = 25;
extern int Pfast = 9;
extern int Pslow = 15;
extern int Psignal = 8;
extern double LEVEL = 0.004;
double Points;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
  {
   Points = MarketInfo(Symbol(), MODE_POINT);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
  {
   double MacdCurrent = 0, MacdPrevious = 0, SignalCurrent = 0;
   double SignalPrevious = 0, MaCurrent = 0, MaPrevious = 0;
   int cnt = 0, total;
   int i1, pp, shift;
   double Tv[2][500] ;
   double Range, rr, Delta, Delta1, val3;
// ïåðâè÷íûå ïðîâåðêè äàííûõ
// âàæíî óäîñòîâåðèòüñÿ ÷òî ýêñïåðò ðàáîòàåò íà íîðìàëüíîì ãðàôèêå è
// ïîëüçîâàòåëü ïðàâèëüíî âûñòàâèë âíåøíèå ïåðåìåííûå (Lots, StopLoss,
// TakeProfit, TrailingStop)
// â íàøåì ñëó÷àå ïðîâåðÿåì òîëüêî TakeProfit
   if(Bars < 100)
     {
       Print("bars less than 100");
       return(0); // íà ãðàôèêå ìåíåå 100 áàðîâ
     }
   if(TakeProfit < 10)
     {
       Print("TakeProfit less than 10");
       return(0); // ïðîâåðÿåì TakeProfit
     }
   Range = iATR(NULL, 0, 200, 1);
   rr = Range*LEVEL;
   Delta = iMACD(NULL, 0, Pfast, Pslow, Psignal, PRICE_CLOSE, MODE_MAIN, 0)-
           iMACD(NULL, 0, Pfast, Pslow, Psignal, PRICE_CLOSE, MODE_SIGNAL, 0);
   Delta1 = iMACD(NULL, 0, Pfast, Pslow, Psignal, PRICE_CLOSE, MODE_MAIN, 1)-
            iMACD(NULL, 0, Pfast, Pslow, Psignal, PRICE_CLOSE, MODE_SIGNAL, 1);
// òåïåðü íàäî îïðåäåëèòüñÿ - â êàêîì ñîñòîÿíèè òîðãîâûé òåðìèíàë?
// ïðîâåðèì, åñòü ëè ðàíåå îòêðûòûå ïîçèöèè èëè îðäåðû?
   if(OrdersTotal() < 1) 
     {
       // íåò íè îäíîãî îòêðûòîãî îðäåðà
       // íà âñÿêèé ñëó÷àé ïðîâåðèì, åñëè ó íàñ ñâîáîäíûå äåíüãè íà ñ÷åòó?
       // çíà÷åíèå 1000 âçÿòî äëÿ ïðèìåðà, îáû÷íî ìîæíî îòêðûòü 1 ëîò
       if(AccountFreeMargin() < (1000*Lots))
         {
           Print("We have no money");
           return(0); // äåíåã íåò - âûõîäèì
         }
       // ïðîâåðèì, íå ñëèøêîì ëè ÷àñòî ïûòàåìñÿ îòêðûòüñÿ?
       // åñëè ïîñëåäíèé ðàç òîðãîâàëè ìåíåå ÷åì 5 ìèíóò(5*60=300 ñåê)
       // íàçàä, òî âûõîäèì
       // If((CurTime-LastTradeTime)<300) return(0);
       // ïðîâåðÿåì íà âîçìîæíîñòü âñòàòü â äëèííóþ ïîçèöèþ (BUY)
       if(Delta > rr && Delta1 < rr )
         {
           OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, 0, Ask + TakeProfit*Points, 
                     "macd signal", 16384, 0, Red); // èñïîëíÿåì
           if(GetLastError() == 0)
               Print("Order opened : ", OrderOpenPrice());
           return(0); // âûõîäèì, òàê êàê âñå ðàâíî ïîñëå ñîâåðøåíèÿ òîðãîâîé îïåðàöèè
           // íàñòóïèë 10-òè ñåêóíäíûé òàéìàóò íà ñîâåðøåíèå òîðãîâûõ îïåðàöèé
         }
       // ïðîâåðÿåì íà âîçìîæíîñòü âñòàòü â êîðîòêóþ ïîçèöèþ (SELL)
       if(Delta < -rr && Delta1 > -rr )
         {
           OrderSend(Symbol(), OP_SELL, Lots, Bid, 3, 0, Bid - TakeProfit*Points, 
                     "macd sample", 16384, 0, Red); // èñïîëíÿåì
           if(GetLastError() == 0)
               Print("Order opened : ", OrderOpenPrice());
           return(0); // âûõîäèì
         }
       // çäåñü ìû çàâåðøèëè ïðîâåðêó íà âîçìîæíîñòü îòêðûòèÿ íîâûõ ïîçèöèé.
       // íîâûå ïîçèöèè îòêðûòû íå áûëè è ïðîñòî âûõîäèì ïî Exit, òàê êàê
       // âñå ðàâíî àíàëèçèðîâàòü íå÷åãî
       return(0);
     }
   // ïåðåõîäèì ê âàæíîé ÷àñòè ýêñïåðòà - êîíòðîëþ îòêðûòûõ ïîçèöèé
   // 'âàæíî ïðàâèëüíî âîéòè â ðûíîê, íî âûéòè - åùå âàæíåå...'
   total = OrdersTotal();
   for(cnt = 0; cnt < total; cnt++)
     {
       OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
       if(OrderType() <= OP_SELL && // ýòî îòêðûòàÿ ïîçèöèÿ? OP_BUY èëè OP_SELL 
          OrderSymbol()==Symbol())  // èíñòðóìåíò ñîâïàäàåò?
         {
           if(OrderType() == OP_BUY) // îòêðûòà äëèííàÿ ïîçèöèÿ
             {
               // ïðîâåðèì, ìîæåò óæå ïîðà çàêðûâàòüñÿ?
               if(Delta < 0)
                 {
                   // çàêðûâàåì ïîçèöèþ
                   OrderClose(OrderTicket(), OrderLots(), Bid, 3, Violet); 
                   return(0); // âûõîäèì
                 }
               // ïðîâåðèì - ìîæåò ìîæíî/íóæíî óæå òðåéëèíã ñòîï ñòàâèòü?
               if(TrailingStop > 0) // ïîëüçîâàòåëü âûñòàâèë â íàñòðîéêàõ òðåéëèíãñòîï
                 { // çíà÷èò ìû èäåì åãî ïðîâåðÿòü
                   if(Bid - OrderOpenPrice() > Points*TrailingStop)
                     {
                       if(OrderStopLoss() < Bid - Points*TrailingStop)
                         {
                           OrderModify(OrderTicket(), OrderOpenPrice(), 
                                       Bid - Points*TrailingStop, 
                                       OrderTakeProfit(), 0, Red);
                           return(0);
                         }
                     }
                 }
             }
           else // èíà÷å ýòî êîðîòêàÿ ïîçèöèÿ
             {
               // ïðîâåðèì, ìîæåò óæå ïîðà çàêðûâàòüñÿ?
               if(Delta > 0)
                 {
                   // çàêðûâàåì ïîçèöèþ
                   OrderClose(OrderTicket(), OrderLots(), Ask, 3, Violet); 
                   return(0); // âûõîäèì
                 }
               // ïðîâåðèì - ìîæåò ìîæíî/íóæíî óæå òðåéëèíã ñòîï ñòàâèòü?
               if(TrailingStop > 0) // ïîëüçîâàòåëü âûñòàâèë â íàñòðîéêàõ òðåéëèíãñòîï
                 { // çíà÷èò ìû èäåì åãî ïðîâåðÿòü
                   if((OrderOpenPrice() - Ask) > (Points*TrailingStop))
                     {
                       if(OrderStopLoss() == 0.0 || OrderStopLoss() > 
                          (Ask + Points*TrailingStop))
                         {
                           OrderModify(OrderTicket(), OrderOpenPrice(), 
                                       Ask + Points*TrailingStop, 
                                       OrderTakeProfit(), 0, Red);
                           return(0);
                         }
                     }
                 }
             }
         }
     }
   return(0);
  }
// the end.
//+------------------------------------------------------------------+





Sample





Analysis



Market Information Used:



Indicator Curves created:


Indicators Used:

Indicator of the average true range
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: