Author: Copyright 2013, MetaQuotes Software Corp.
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
0 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

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