Author: Copyright 2013, MetaQuotes Software Corp.
Profit factor:
0.00
Price Data Components
Orders Execution
It automatically opens orders when conditions are reached
Indicators Used
Moving average indicator
Miscellaneous
It issuies visual alerts to the screen
2 Views
0 Downloads
0 Favorites
ma
//+------------------------------------------------------------------+
//|                                                           MA.mq5 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//--- input parameters
input int      StopLoss=100;
input int      TakeProfit=100;
input int      MA_Period=57;
input int      MA_Period1=3;
input int      EA_Magic=12345;
input double   Lot=1.0;

//--- ãëîáàëüíûå ïåðåìåííûå
int ma1Handle;   // õýíäë èíäèêàòîðà  Moving Average
int maHandle;    // õýíäë èíäèêàòîðà Moving Average
double ma1Val[]; // äèíàìè÷åñêèå ìàññèâû äëÿ õðàíåíèÿ ÷èñëåííûõ çíà÷åíèé Moving Average äëÿ êàæäîãî áàðà
double maVal[];  // äèíàìè÷åñêèé ìàññèâ äëÿ õðàíåíèÿ çíà÷åíèé èíäèêàòîðà Moving Average äëÿ êàæäîãî áàðà
double p_close;  // ïåðåìåííàÿ äëÿ õðàíåíèÿ çíà÷åíèÿ close áàðà
int STP,TKP;     // áóäóò èñïîëüçîâàíû äëÿ çíà÷åíèé Stop Loss è Take Profit
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Ïîëó÷èòü õýíäë èíäèêàòîðà MA
   ma1Handle=iMA(_Symbol,_Period,MA_Period1,0,MODE_LWMA,PRICE_CLOSE);

//---Ïîëó÷èòü õýíäë èíäèêàòîðà Moving Average
   maHandle=iMA(_Symbol,_Period,MA_Period,0,MODE_EMA,PRICE_CLOSE);
//--- Íóæíî ïðîâåðèòü, íå áûëè ëè âîçâðàùåíû çíà÷åíèÿ Invalid Handle
   if(ma1Handle<0 || maHandle<0)
     {
      Alert("Îøèáêà ïðè ñîçäàíèè èíäèêàòîðîâ - íîìåð îøèáêè: ",GetLastError(),"!!");
      return(-1);
     }

//--- äëÿ ðàáîòû ñ áðîêåðàìè, èñïîëüçóþùèìè 5-òè çíà÷íûå êîòèðîâêè,
//--- óìíîæàåì íà 10 çíà÷åíèÿ SL è TP
   STP = StopLoss;
   TKP = TakeProfit;
   if(_Digits==5 || _Digits==3)
     {
      STP = STP*10;
      TKP = TKP*10;
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- îñâîáîæäàåì õýíäëû èíäèêàòîðîâ
   IndicatorRelease(ma1Handle);

   IndicatorRelease(maHandle);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- äîñòàòî÷íî ëè êîëè÷åñòâî áàðîâ äëÿ ðàáîòû
   if(Bars(_Symbol,_Period)<60) // îáùåå êîëè÷åñòâî áàðîâ íà ãðàôèêå ìåíüøå 60?
     {
      Alert("Íà ãðàôèêå ìåíüøå 60 áàðîâ, ñîâåòíèê íå áóäåò ðàáîòàòü!!");
      return;
     }

//--- Äëÿ ñîõðàíåíèÿ çíà÷åíèÿ âðåìåíè áàðà ìû èñïîëüçóåì static-ïåðåìåííóþ Old_Time.
//--- Ïðè êàæäîì âûïîëíåíèè ôóíêöèè OnTick ìû áóäåì ñðàâíèâàòü âðåìÿ òåêóùåãî áàðà ñ ñîõðàíåííûì âðåìåíåì.
//--- Åñëè îíè íå ðàâíû, ýòî îçíà÷àåò, ÷òî íà÷àë ñòðîèòñÿ íîâûé áàð.

   static datetime Old_Time;
   datetime New_Time[1];
   bool IsNewBar=false;

//--- êîïèðóåì âðåìÿ òåêóùåãî áàðà â ýëåìåíò New_Time[0]
   int copied=CopyTime(_Symbol,_Period,0,1,New_Time);
   if(copied>0) // ok, óñïåøíî ñêîïèðîâàíî
     {
      if(Old_Time!=New_Time[0]) // åñëè ñòàðîå âðåìÿ íå ðàâíî
        {
         IsNewBar=true;   // íîâûé áàð
         if(MQL5InfoInteger(MQL5_DEBUGGING)) Print("Íîâûé áàð",New_Time[0],"ñòàðûé áàð",Old_Time);
         Old_Time=New_Time[0];   // ñîõðàíÿåì âðåìÿ áàðà
        }
     }
   else
     {
      Alert("Îøèáêà êîïèðîâàíèÿ âðåìåíè, íîìåð îøèáêè =",GetLastError());
      ResetLastError();
      return;
     }

//--- ñîâåòíèê äîëæåí ïðîâåðÿòü óñëîâèÿ ñîâåðøåíèÿ íîâîé òîðãîâîé îïåðàöèè òîëüêî ïðè íîâîì áàðå
   if(IsNewBar==false)
     {
      return;
     }

//--- èìååì ëè ìû äîñòàòî÷íîå êîëè÷åñòâî áàðîâ íà ãðàôèêå äëÿ ðàáîòû
   int Mybars=Bars(_Symbol,_Period);
   if(Mybars<60) // åñëè îáùåå êîëè÷åñòâî áàðîâ ìåíüøå 60
     {
      Alert("Íà ãðàôèêå ìåíåå 60 áàðîâ, ñîâåòíèê ðàáîòàòü íå áóäåò!!");
      return;
     }

//--- îáúÿâëÿåì ñòðóêòóðû, êîòîðûå áóäóò èñïîëüçîâàòüñÿ äëÿ òîðãîâëè
   MqlTick latest_price;       // Áóäåò èñïîëüçîâàòüñÿ äëÿ òåêóùèõ êîòèðîâîê
   MqlTradeRequest mrequest;   // Áóäåò èñïîëüçîâàòüñÿ äëÿ îòñûëêè òîðãîâûõ çàïðîñîâ
   MqlTradeResult mresult;     // Áóäåò èñïîëüçîâàòüñÿ äëÿ ïîëó÷åíèÿ ðåçóëüòàòîâ âûïîëíåíèÿ òîðãîâûõ çàïðîñîâ
   MqlRates mrate[];           // Áóäåò ñîäåðæàòü öåíû, îáúåìû è ñïðåä äëÿ êàæäîãî áàðà
   ZeroMemory(mrequest);
/*
     Óñòàíîâèì èíäåêñàöèþ â ìàññèâàõ êîòèðîâîê è èíäèêàòîðîâ 
     êàê â òàéìñåðèÿõ
*/
//--- ìàññèâ êîòèðîâîê
   ArraySetAsSeries(mrate,true);

//--- ìàññèâ çíà÷åíèé èíäèêàòîðà MA
   ArraySetAsSeries(ma1Val,true);

//--- ìàññèâ çíà÷åíèé èíäèêàòîðà MA-8
   ArraySetAsSeries(maVal,true);

//--- Ïîëó÷èòü òåêóùåå çíà÷åíèå êîòèðîâêè â ñòðóêòóðó òèïà MqlTick
   if(!SymbolInfoTick(_Symbol,latest_price))
     {
      Alert("Îøèáêà ïîëó÷åíèÿ ïîñëåäíèõ êîòèðîâîê - îøèáêà:",GetLastError(),"!!");
      return;
     }

//--- Ïîëó÷èòü èñòîðè÷åñêèå äàííûå ïîñëåäíèõ 3-õ áàðîâ
   if(CopyRates(_Symbol,_Period,0,3,mrate)<0)
     {
      Alert("Îøèáêà êîïèðîâàíèÿ èñòîðè÷åñêèõ äàííûõ - îøèáêà:",GetLastError(),"!!");
      return;
     }

//--- êîïèðóåì çíà÷åíèÿ èíäèêàòîðîâ èç èíäèêàòîðíûõ áóôåðîâ
   if(CopyBuffer(ma1Handle,0,0,3,ma1Val)<0)
     {
      Alert("Îøèáêà êîïèðîâàíèÿ áóôåðîâ èíäèêàòîðà Moving Average - íîìåð îøèáêè:",GetLastError(),"!!");
      return;
     }
   if(CopyBuffer(maHandle,0,0,3,maVal)<0)
     {
      Alert("Îøèáêà êîïèðîâàíèÿ áóôåðîâ èíäèêàòîðà Moving Average - íîìåð îøèáêè:",GetLastError());
      return;
     }
//--- åñòü ëè îòêðûòûå ïîçèöèè?
   bool Buy_opened=false;  // ïåðåìåííûå, â êîòîðûõ áóäåò õðàíèòüñÿ èíôîðìàöèÿ 
   bool Sell_opened=false; // î íàëè÷èè ñîîòâåòñòâóþùèõ îòêðûòûõ ïîçèöèé

   if(PositionSelect(_Symbol)==true) // åñòü îòêðûòàÿ ïîçèöèÿ
     {
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
        {
         Buy_opened=true;  //ýòî äëèííàÿ ïîçèöèÿ
        }
      else if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
        {
         Sell_opened=true; // ýòî êîðîòêàÿ ïîçèöèÿ
        }
     }

//--- Ñêîïèðóåì òåêóùóþ öåíó çàêðûòèÿ ïðåäûäóùåãî áàðà (ýòî áàð 1)
   p_close=mrate[1].close;  // öåíà çàêðûòèÿ ïðåäûäóùåãî áàðà

/*
    1. Ïðîâåðêà óñëîâèé äëÿ ïîêóïêè : MA-8 ðàñòåò, 
    ïðåäûäóùàÿ öåíà çàêðûòèÿ áàðà áîëüøå MA-8, 
*/

//--- îáúÿâëÿåì ïåðåìåííûå òèïà boolean, îíè áóäóò èñïîëüçîâàòüñÿ ïðè ïðîâåðêå óñëîâèé äëÿ ïîêóïêè
   bool Buy_Condition_1=(maVal[0]>maVal[1]) && (maVal[1]>maVal[2]); // MA-8 ðàñòåò
   bool Buy_Condition_2=(ma1Val[0]>ma1Val[1]) &&(ma1Val[1]>ma1Val[2]);
   bool Buy_Condition_3=(p_close>maVal[1]);         // ïðåäûäóùàÿ öåíà çàêðûòèÿ âûøå ñêîëüçÿøåé ñðåäíåé MA-8
   bool Buy_Condition_4 =(maVal[0]>ma1Val[0]);

//--- ñîáèðàåì âñå âìåñòå
   if(Buy_Condition_1 && Buy_Condition_2)
     {
      if(Buy_Condition_3 && Buy_Condition_4)
        {
         // åñòü ëè â äàííûé ìîìåíò îòêðûòàÿ ïîçèöèÿ íà ïîêóïêó?
         if(Buy_opened)
           {
            Alert("Óæå åñòü ïîçèöèÿ íà ïîêóïêó!!!");
            return;    // íå äîáàâëÿòü ê îòêðûòîé ïîçèöèè íà ïîêóïêó
           }
         mrequest.action = TRADE_ACTION_DEAL;                                  // íåìåäëåííîå èñïîëíåíèå
         mrequest.price = NormalizeDouble(latest_price.ask,_Digits);           // ïîñëåäíÿÿ öåíà ask
         mrequest.sl = NormalizeDouble(latest_price.ask - STP*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits); // Take Profit
         mrequest.symbol = _Symbol;                                            // ñèìâîë
         mrequest.volume = Lot;                                                // êîëè÷åñòâî ëîòîâ äëÿ òîðãîâëè
         mrequest.magic = EA_Magic;                                            // Magic Number
         mrequest.type = ORDER_TYPE_BUY;                                       // îðäåð íà ïîêóïêó
         mrequest.type_filling = ORDER_FILLING_FOK;                            // òèï èñïîëíåíèÿ îðäåðà - âñå èëè íè÷åãî
         mrequest.deviation=100;                                               // ïðîñêàëüçûâàíèå îò òåêóùåé öåíû
         //--- îòñûëàåì îðäåð
         if(OrderSend(mrequest,mresult))
         // àíàëèçèðóåì êîä âîçâðàòà òîðãîâîãî ñåðâåðà
         if(mresult.retcode==10009 || mresult.retcode==10008) //çàïðîñ âûïîëíåí èëè îðäåð óñïåøíî ïîìåùåí
           {
            Alert("Îðäåð Buy óñïåøíî ïîìåùåí, òèêåò îðäåðà #:",mresult.order,"!!");
           }
         else
           {
            Alert("Çàïðîñ íà óñòàíîâêó îðäåðà Buy íå âûïîëíåí - êîä îøèáêè:",GetLastError());
            return;
           }
        }
     }
/*
    2. Ïðîâåðêà óñëîâèé äëÿ ïðîäàæè : MA-8 ïàäàåò, 
    ïðåäûäóùàÿ öåíà çàêðûòèÿ áàðà ìåíüøå MA-8
*/

//--- îáúÿâëÿåì ïåðåìåííûå òèïà boolean, îíè áóäóò èñïîëüçîâàòüñÿ ïðè ïðîâåðêå óñëîâèé äëÿ ïðîäàæè
   bool Sell_Condition_1 = (maVal[0]<maVal[1]) && (maVal[1]<maVal[2]);  // MA-8 ïàäàåò
   bool Sell_Condition_2 = (p_close <maVal[1]);                         // ïðåäûäóùàÿ öåíà çàêðûòèÿ íèæå MA-8
   bool Sell_Condition_3=(ma1Val[0]<ma1Val[1]) && (ma1Val[1]<ma1Val[2]);                         // òåêóùåå çíà÷åíèå ADX value áîëüøå çàäàííîãî (22)
   bool Sell_Condition_4=(maVal[0]<ma1Val[0]);                         // -DI áîëüøå, ÷åì +DI

//--- ñîáèðàåì âñå âìåñòå
   if(Sell_Condition_1 && Sell_Condition_2)
     {
      if(Sell_Condition_3 && Sell_Condition_4)
        {
         // åñòü ëè â äàííûé ìîìåíò îòêðûòàÿ ïîçèöèÿ íà ïðîäàæó?
         if(Sell_opened)
           {
            Alert("Óæå åñòü ïîçèöèÿ íà ïðîäàæó!!!");
            return;    // íå äîáàâëÿòü ê îòêðûòîé ïîçèöèè íà ïðîäàæó
           }
         mrequest.action = TRADE_ACTION_DEAL;                                  // íåìåäëåííîå èñïîëíåíèå
         mrequest.price = NormalizeDouble(latest_price.bid,_Digits);           // ïîñëåäíÿÿ öåíà Bid
         mrequest.sl = NormalizeDouble(latest_price.bid + STP*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.bid - TKP*_Point,_Digits); // Take Profit
         mrequest.symbol = _Symbol;                                            // ñèìâîë
         mrequest.volume = Lot;                                                // êîëè÷åñòâî ëîòîâ äëÿ òîðãîâëè
         mrequest.magic = EA_Magic;                                            // Magic Number
         mrequest.type= ORDER_TYPE_SELL;                                       // îðäåð íà ïðîäàæó
         mrequest.type_filling = ORDER_FILLING_FOK;                            // òèï èñïîëíåíèÿ îðäåðà - âñå èëè íè÷åãî
         mrequest.deviation=100;                                               // ïðîñêàëüçûâàíèå îò òåêóùåé öåíû
         //--- îòñûëàåì îðäåð
         if(OrderSend(mrequest,mresult))
         // àíàëèçèðóåì êîä âîçâðàòà òîðãîâîãî ñåðâåðà
         if(mresult.retcode==10009 || mresult.retcode==10008) //Request is completed or order placed
           {
            Alert("Îðäåð Sell óñïåøíî ïîìåùåí, òèêåò îðäåðà #:",mresult.order,"!!");
           }
         else
           {
            Alert("Çàïðîñ íà óñòàíîâêó îðäåðà Sell íå âûïîëíåí - êîä îøèáêè:",GetLastError());
            return;
           }
        }
     }
   return;
  }
//+------------------------------------------------------------------+

Comments