Two Moving Average Cross EA
Похожие материалы по тегам
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «two_ma_cross_ea.mq4» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Этот торговый советник для MetaTrader 4 открывает позиции Buy или Sell при пересечении двух скользящих средних. Советник рассчитывает размер лотов автоматически по заданному проценту риска или использует ручные значения. Он поддерживает управление рисками, стоп-лосс, тейк-профит и трейлинг-стоп, а также отправляет звуковые и email-уведомления о торговых событиях.
Настройки программы
| Настройка | Описание |
|---|---|
| Comment1 | Раздел стратегии — Текстовый заголовок группы параметров стратегии |
| EA_Activated | Активация советника — Включает или отключает работу советника |
| TimeFrame | Таймфрейм — Период графика для расчёта moving average |
| Order_Type | Тип ордера — Направление сделок: обе стороны, только покупка или только продажа |
| Maximum_Trades_Open | Максимум открытых сделок — Лимит одновременно открытых позиций |
| Wait_Mins_For_Next_Trade | Паула между сделками — Минимальное время в минутах между последовательными сделками |
| Fast_MA_Period | Период быстрой MA — Длина периода для быстрой скользящей средней |
| Fast_MA_Method | Метод быстрой MA — Тип скользящей средней для быстрого индикатора |
| Fast_MA_Price_Type | Тип цены быстрой MA — Ценовой тип для расчёта быстрой скользящей средней |
| Slow_MA_Period | Период медленной MA — Длина периода для медленной скользящей средней |
| Slow_MA_Method | Метод медленной MA — Тип скользящей средней для медленного индикатора |
| Slow_MA_Price_Type | Тип цены медленной MA — Ценовой тип для расчёта медленной скользящей средней |
| Max_Pips_Away_From_Cross | Макс. пипсов от пересечения — Допустимое расстояние в пипсах от уровня пересечения MA для входа в сделку |
| Comment2 | Раздел магического номера — Текстовый заголовок группы параметра магического номера |
| Magic_N | Магический номер — Идентификатор ордеров советника |
| Comment3 | Раздел авто-лотов — Текстовый заголовок группы параметров автоматического расчёта лотов |
| Risk_Management | Управление риском — Режим расчёта лотов: автоматический по риску или ручной |
| Comment4 | Раздел авто-риска — Текстовый заголовок группы параметров автоматического риска |
| Auto_Risk_Percent | Процент риска — Процент от депозита, рискуемый на одну сделку |
| Auto_Max_Risk_in_Total_Orders | Макс. суммарный риск — Максимальный общий процент риска по всем открытым позициям |
| Comment5 | Раздел ручных лотов — Текстовый заголовок группы параметров ручного размера лота |
| Manual_Lots | Ручной размер лота — Фиксированный размер лота при ручном управлении |
| Manual_Maximum_Lots | Макс. ручной лот — Максимально допустимый суммарный размер лота при ручном режиме |
| Comment6 | Раздел проскальзывания — Текстовый заголовок группы параметров проскальзывания |
| Slippage | Проскальзывание — Максимально допустимое проскальзывание цены при открытии ордера |
| Comment7 | Раздел стоп-лосса — Текстовый заголовок группы параметров стоп-лосса |
| StopLoss | Стоп-лосс — Размер стоп-лосса в пипсах |
| Comment8 | Раздел тейк-профита — Текстовый заголовок группы параметров тейк-профита |
| TakeProfit | Тейк-профит — Размер тейк-профита в пипсах |
| Comment9 | Раздел трейлинг-стопа — Текстовый заголовок группы параметров трейлинг-стопа |
| TrailingStop | Трейлинг-стоп — Расстояние трейлинг-стопа в пипсах от текущей цены |
| TrailingStep | Шаг трейлинг-стопа — Шаг сдвига трейлинг-стопа в пипсах |
| Comment10 | Раздел уведомлений — Текстовый заголовок группы параметров оповещений |
| Sound_Alert | Звуковое оповещение — Включает или отключает звуковые уведомления |
| Email_Alert | Email-оповещение — Включает или отключает отправку email-уведомлений |
| Comment11 | Раздел дополнительных действий — Текстовый заголовок группы дополнительных параметров |
| EASounds | Звуки советника — Включает или отключает воспроизведение звуковых файлов советником |
| Show_Profit_Comments | Показать комментарии прибыли — Отображает в комментариях графика результаты закрытых сделок |
Поиск по коду файла
#property description "This EA triggers a Buy or Sell Order after two moving averages cross each other.\n"
#property description "- Fast MA crossing above the Slow MA triggers a Buy Order\n"
#property description "- Fast MA crossing below the Slow MA triggers a Sell Order\n"
enum e_cycles{ Min_5=1, Min_15=2, Min_30=3, Min_60=4, Min_240=5, Daily=6, Weekly=7, Monthly=8 };
enum order_type{ Both=1, Only_Buy=2, Only_Sell=3 };
enum e_risk { Automatic=1, Manual=2 };
enum e_method{ SMA = 1,
EMA = 2,
Wilder = 3,
LWMA = 4,
SineWMA = 5,
TriMA = 6,
LSMA = 7,
SMMA = 8,
HMA = 9,
ZeroLagEMA = 10,
ITrend = 11,
Median = 12,
GeoMean = 13,
REMA = 14,
ILRS = 15,
IE_2 = 16,
TriMAgen = 17
};
extern string Comment1 = "- Strategy Parameters -";
extern bool EA_Activated = true;
input e_cycles TimeFrame = Min_60;
input order_type Order_Type = Both;
extern int Maximum_Trades_Open = 3;
extern int Wait_Mins_For_Next_Trade = 30;
extern int Fast_MA_Period = 30;
extern e_method Fast_MA_Method = SMA;
extern ENUM_APPLIED_PRICE Fast_MA_Price_Type = PRICE_CLOSE;
extern int Slow_MA_Period = 100;
extern e_method Slow_MA_Method = SMA;
extern ENUM_APPLIED_PRICE Slow_MA_Price_Type = PRICE_CLOSE;
extern double Max_Pips_Away_From_Cross = 10;
extern string Comment2 = "- Order magic number. May be used as user defined identifier -";
extern int Magic_N = 123456;
extern string Comment3 = "- AutoLots True will calculate Lots automatically -";
input e_risk Risk_Management = Automatic;
extern string Comment4 = "- Automatic Risk, For ex: 2.5 means 2.5% -";
extern double Auto_Risk_Percent = 2;
extern double Auto_Max_Risk_in_Total_Orders = 7;
extern string Comment5 = "- Manual Number of Lots (if not Automatic Risk) -";
extern double Manual_Lots = 0.3;
extern double Manual_Maximum_Lots = 3.0;
extern string Comment6 = "- Maximum price slippage for buy or sell orders -";
extern double Slippage = 3;
extern string Comment7 = "- Stop loss in Pips -";
extern double StopLoss = 10;
extern string Comment8 = "- Take profit in Pips -";
extern double TakeProfit = 20;
extern string Comment9 = "- Trailing Stop in Pips -";
extern double TrailingStop = 20;
extern double TrailingStep = 5;
extern string Comment10 = "- Should the EA use alerts -";
extern bool Sound_Alert = true;
extern bool Email_Alert = false;
extern string Comment11 = "- Optional EA actions -";
extern bool EASounds = true;
extern bool Show_Profit_Comments = true;
double Emergency_SL = 2000;
string EA_Name = "Two Moving Average Cross EA";
string CommentOrder = EA_Name+" Order";
double Lots;
int Open_Long, Open_Short, Close_Long, Close_Short;
double Side, Open_Level, TP_Level, SL_Level, TSL_Level = 0;
double Profit;
string Calculation_Comments, Orders_Comments, Profit_Comments;
datetime LastClose, LastOpen;
double Equity_Risked=0;
double Order_SL;
double Orders_Lots;
int init(){
// код доступен только после оплаты
}
int start(){
// код доступен только после оплаты
}
void EA_Calculations(){
Open_Long = 0;
Open_Short = 0;
Close_Long = 0;
Close_Short = 0;
int period = Get_TimeFrame(TimeFrame);
int multiplier = Get_TimeFrame(TimeFrame, true)/Period();
int limit = Slow_MA_Period*multiplier*2;
int iFast_MA_Method = -1;
int iSlow_MA_Method = -1;
double MA1_0, MA2_0, MA1_1, MA2_1;
if (Fast_MA_Method==1) iFast_MA_Method = ENUM_MA_METHOD(0);
if (Fast_MA_Method==2) iFast_MA_Method = ENUM_MA_METHOD(1);
if (Fast_MA_Method==8) iFast_MA_Method = ENUM_MA_METHOD(2);
if (Fast_MA_Method==4) iFast_MA_Method = ENUM_MA_METHOD(3);
if (Slow_MA_Method==1) iSlow_MA_Method = ENUM_MA_METHOD(0);
if (Slow_MA_Method==2) iSlow_MA_Method = ENUM_MA_METHOD(1);
if (Slow_MA_Method==8) iSlow_MA_Method = ENUM_MA_METHOD(2);
if (Slow_MA_Method==4) iSlow_MA_Method = ENUM_MA_METHOD(3);
if (iFast_MA_Method != -1){
MA1_0 = iMA(NULL,period,Fast_MA_Period,0,iFast_MA_Method,ENUM_APPLIED_PRICE(Fast_MA_Price_Type),0);
MA1_1 = iMA(NULL,period,Fast_MA_Period,0,iFast_MA_Method,ENUM_APPLIED_PRICE(Fast_MA_Price_Type),1);
}else{
MA1_0 = iCustom(NULL,period,"Two_MA_Cross_Indicator",Fast_MA_Period,Fast_MA_Method,Fast_MA_Price_Type,Slow_MA_Period,Slow_MA_Method,Slow_MA_Price_Type,0,0);
MA1_1 = iCustom(NULL,period,"Two_MA_Cross_Indicator",Fast_MA_Period,Fast_MA_Method,Fast_MA_Price_Type,Slow_MA_Period,Slow_MA_Method,Slow_MA_Price_Type,0,1);
}
if (iSlow_MA_Method != -1){
MA2_0 = iMA(NULL,period,Slow_MA_Period,0,iSlow_MA_Method,ENUM_APPLIED_PRICE(Slow_MA_Price_Type),0);
MA2_1 = iMA(NULL,period,Slow_MA_Period,0,iSlow_MA_Method,ENUM_APPLIED_PRICE(Slow_MA_Price_Type),1);
}else{
MA2_0 = iCustom(NULL,period,"Two_MA_Cross_Indicator",Fast_MA_Period,Fast_MA_Method,Fast_MA_Price_Type,Slow_MA_Period,Slow_MA_Method,Slow_MA_Price_Type,1,0);
MA2_1 = iCustom(NULL,period,"Two_MA_Cross_Indicator",Fast_MA_Period,Fast_MA_Method,Fast_MA_Price_Type,Slow_MA_Period,Slow_MA_Method,Slow_MA_Price_Type,1,1);
}
double PP=MarketInfo(OrderSymbol(), MODE_POINT);
double Distance = MathAbs(MA2_0 - Close[0]);
if ( (Risk_Management==1 && Auto_Max_Risk_in_Total_Orders-Equity_Risked > Auto_Risk_Percent)
|| (Risk_Management==2 && Manual_Maximum_Lots-Orders_Lots > Manual_Lots)
)
bool Risk_Allowed = true;
else
Risk_Allowed = false;
if (Digits==3||Digits==5) Max_Pips_Away_From_Cross*=10;
if (EA_Activated && Risk_Allowed && MA1_0 > MA2_0 && MA1_1 < MA2_1 && Distance <= Max_Pips_Away_From_Cross*PP && TimeCurrent() > (LastOpen+(Wait_Mins_For_Next_Trade*60))){
Open_Long = 1;
LastOpen = TimeCurrent();
}
if (EA_Activated && Risk_Allowed && MA1_0 < MA2_0 && MA1_1 > MA2_1 && Distance <= Max_Pips_Away_From_Cross*PP && TimeCurrent() > (LastOpen+(Wait_Mins_For_Next_Trade*60))){
Open_Short = 1;
LastOpen = TimeCurrent();
}
if (MA1_0 > MA2_0) string next_trade = "SELL"; else next_trade = "BUY";
Calculation_Comments = "MA1: "+DoubleToStr(MA1_0,4)+" | MA2: "+DoubleToStr(MA2_0,4)+"\n";
Calculation_Comments = "Max Pips: "+(Max_Pips_Away_From_Cross*PP)+" | Distance: "+(Distance)+"\n";
Calculation_Comments+= "Waiting for MA cross to "+next_trade;
}
void Set_Levels(){
double PP=MarketInfo(OrderSymbol(), MODE_POINT);
double BID=MarketInfo(OrderSymbol(), MODE_BID);
double ASK=MarketInfo(OrderSymbol(), MODE_ASK);
double TP = PP*TakeProfit;
double SL = PP*StopLoss;
double BUY_TSL = BID - (TrailingStop*PP);
double SELL_TSL = ASK + (TrailingStop*PP);
if(Side == -1) return;
if (StopLoss==0) StopLoss = Emergency_SL;
if(TakeProfit > 0){
if(Side == OP_BUY ) TP_Level = Open_Level + TP;
if(Side == OP_SELL ) TP_Level = Open_Level - TP;
}
if(StopLoss > 0){
if(Side == OP_BUY ) SL_Level = Open_Level - SL;
if(Side == OP_SELL ) SL_Level = Open_Level + SL;
}
bool Order_Modified = false;
if ((OrderTakeProfit()==0 && TakeProfit > 0) || (OrderStopLoss()==0 && StopLoss > 0)){
if (OrderModify(OrderTicket(),0,SL_Level,TP_Level,0,clrBlue)){ Order_Modified = true; }
}
if(TrailingStop){
if(Side == OP_BUY){
if ((BID-OrderOpenPrice())>TrailingStop*PP){
if (OrderStopLoss()<BID-(TrailingStop+TrailingStep-1)*PP && BUY_TSL>SL_Level) {
if (OrderModify(OrderTicket(),OrderOpenPrice(),BUY_TSL,OrderTakeProfit(),0,clrMagenta)){ Order_Modified = true; }
}
}
}
if(Side == OP_SELL){
if (OrderOpenPrice()-ASK>TrailingStop*PP) {
if (OrderStopLoss()>ASK+(TrailingStop+TrailingStep-1)*PP && SELL_TSL<SL_Level) {
if (OrderModify(OrderTicket(),OrderOpenPrice(),SELL_TSL,OrderTakeProfit(),0,clrMagenta)){ Order_Modified = true; }
}
}
}
}
return;
}
double LotSize() {
double minlot = MarketInfo(Symbol(), MODE_MINLOT);
double maxlot = MarketInfo(Symbol(), MODE_MAXLOT);
double tickVal = MarketInfo(Symbol(), MODE_TICKVALUE);
double Equity = AccountInfoDouble(ACCOUNT_EQUITY);
double _Risk = Auto_Risk_Percent / 100;
double Risk_per_Trade = Equity * _Risk;
double Pips_Risked = StopLoss * tickVal;
if(Risk_per_Trade > 0 && Pips_Risked > 0 && (Risk_per_Trade / Pips_Risked) > 0) {
double lots = (Risk_per_Trade / Pips_Risked);
if(lots < minlot) {
lots = minlot;
} else if(lots > maxlot) {
lots = maxlot;
}
Lots = lots;
}
return(0);
}
void EA_Notes(){
if (Digits==3||Digits==5){
double sl = StopLoss/10;
double tp = TakeProfit/10;
double tsl = TrailingStop/10;
}
else{
sl = StopLoss/10;
tp = TakeProfit/10;
tsl = TrailingStop/10;
}
string Currency = AccountCurrency();
string Note = EA_Name+"\n";
Note = Note + "Account Equity: "+AccountInfoDouble(ACCOUNT_EQUITY)+" "+Currency+"\n";
Note = Note + "Risk per SL Pip: "+DoubleToStr(((AccountInfoDouble(ACCOUNT_EQUITY)*(Auto_Risk_Percent/100))/sl),2)+" "+Currency+"\n";
Note = Note + "Total Risk per Trade: "+DoubleToStr((AccountInfoDouble(ACCOUNT_EQUITY)*(Auto_Risk_Percent/100)),2)+" "+Currency+"\n";
Note = Note + "Lots: " + DoubleToStr(Lots,2);
if(Risk_Management==1) Note = Note + " (Automatic "+Auto_Risk_Percent+"%)"; else Note = Note + " (Set Manually)";
Note = Note + "\n";
Note = Note + "SL:" + DoubleToStr(sl,0) + " pips | ";
Note = Note + "TP:" + DoubleToStr(tp,0) + " pips | ";
Note = Note + "TSL:" + DoubleToStr(tsl,0) + " pips\n";
Note = Note + "=======================\n";
if (Show_Profit_Comments){
Note = Note + "Trades Results:\n";
Note = Note + Profit_Comments;
}
Note = Note + "-----------------------\nTotal Profit: " + DoubleToStr(Profit,2) + "\n";
Note = Note + "=======================\n";
Note = Note + Calculation_Comments+"\n";
Note = Note + "=======================\n";
Note = Note + Orders_Comments;
Comment(Note);
}
int OpenPos(int direction){
int attempts = 0;
int order = 0;
double price;
string string_direction = "";
for(attempts=0;attempts<3;attempts++){
if (IsTradeContextBusy()){
Sleep(1000);
}else{
RefreshRates();
if(direction == OP_BUY){
price = Ask;
string_direction = "Long";
}else{
price = Bid;
string_direction = "Short";
}
if(EASounds) PlaySound("alert.wav");
order = OrderSend(Symbol(),direction,Lots,price,Slippage,0,0,CommentOrder,Magic_N,0,Red);
if(order<=0) {
Print("Error Occured : "+Errors(GetLastError()));
}else{
attempts = 3;
Print("Order opened : "+Symbol()+" Price @ "+price+" SL @ "+StopLoss+" TP @"+TakeProfit+" order ="+order);
Side = direction;
Open_Level = OrderOpenPrice();
TP_Level = 0;
SL_Level = 0;
TSL_Level = 0;
Notifications("Open "+string_direction,price,StopLoss,TakeProfit,order);
return(order);
}
}
}
return(-1);
}
int ClosePos(int direction){
int i = 0;
int attempts = 0;
int order = 0;
double price;
string string_direction = "";
for(i=0; i<OrdersTotal(); i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
if (OrderType()==direction && OrderSymbol()==Symbol() && ((OrderMagicNumber () == Magic_N) || Magic_N==0)) {
for(atteПоказано первые 50% кода (символов: 22024)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.