Price Data Components
Orders Execution
Indicators Used
Miscellaneous
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 Formatting Guide
# H1
## H2
### H3
**bold text**
*italicized text*
[title](https://www.example.com)

`code`
```
code block
```
> blockquote
- Item 1
- Item 2
1. First item
2. Second item
---