Moving Average Cross with Exit EA
Похожие материалы по тегам
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «ma_cross_with_exit_ea.mq4» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Данный продукт представляет собой торговый советник для MetaTrader 4, который автоматически открывает позиции Buy или Sell при пересечении двух скользящих средних. Восходящее пересечение MA1 над MA2 генерирует сигнал на покупку, а нисходящее — на продажу. Советник также отслеживает дополнительную линию MA3 для определения условий выхода из позиций.
Советник поддерживает автоматическое управление рисками с расчётом размера лота на основе процента риска от депозита либо ручной задание лотов. Для каждой позиции настраиваются стоп-лосс, тейк-профит и трейлинг-стоп. При срабатывании стоп-лосса или тейк-профита позиция закрывается автоматически.
Реализованы системы уведомлений: звуковые и email-оповещения о открытии и закрытии позиций. На графике отображается информационный комментарий с текущими значениями скользящих средних, состоянием позиций, прибылью и доступным риском. Советник требует установки внешнего индикатора Two_MA_Cross_Indicator для расчёта некоторых типов скользящих средних.
Настройки программы
| Настройка | Описание |
|---|---|
| Comment1 | Комментарий 1 — Текстовый комментарий для раздела параметров стратегии |
| EA_Activated | Активация EA — Включает или отключает работу советника |
| TimeFrame | Таймфрейм — Таймфрейм, на котором работает советник |
| Order_Type | Тип ордера — Тип разрешённых ордеров: оба, только покупка или только продажа |
| Maximum_Trades_Open | Макс. открытых сделок — Максимальное количество одновременно открытых позиций |
| Wait_Mins_For_Next_Trade | Ожидание между сделками — Время ожидания в минутах между последовательными сделками |
| MA1_Period | Период MA1 — Период первой скользящей средней |
| MA1_Method | Метод MA1 — Тип расчёта первой скользящей средней |
| MA1_Price_Type | Цена MA1 — Тип цены для расчёта первой скользящей средней |
| MA2_Period | Период MA2 — Период второй скользящей средней |
| MA2_Method | Метод MA2 — Тип расчёта второй скользящей средней |
| MA2_Price_type | Цена MA2 — Тип цены для расчёта второй скользящей средней |
| MA3_Period | Период MA3 — Период третьей скользящей средней |
| MA3_Method | Метод MA3 — Тип расчёта третьей скользящей средней |
| MA3_Price_type | Цена MA3 — Тип цены для расчёта третьей скользящей средней |
| Max_Pips_Away_From_Cross | Макс. расстояние от пересечения — Максимальное расстояние от точки пересечения в пипсах для открытия позиции |
| Comment2 | Комментарий 2 — Текстовый комментарий для раздела магического номера ордера |
| Magic_N | Магический номер — Магический номер ордера для идентификации позиций советника |
| Comment3 | Комментарий 3 — Текстовый комментарий для раздела автоматического расчёта лотов |
| Risk_Management | Управление рисками — Режим управления рисками: автоматический расчёт лота или ручной |
| Comment4 | Комментарий 4 — Текстовый комментарий для раздела автоматического риска |
| Auto_Risk_Percent | Процент риска — Процент риска от депозита на одну сделку при автоматическом расчёте лота |
| Auto_Max_Risk_in_Total_Orders | Макс. совокупный риск — Максимальный совокупный риск в процентах от депозита при автоматическом управлении рисками |
| Comment5 | Комментарий 5 — Текстовый комментарий для раздела ручных лотов |
| Manual_Lots | Ручной лот — Ручное значение лота при ручном управлении рисками |
| Manual_Maximum_Lots | Макс. ручные лоты — Максимальное количество лотов при ручном управлении рисками |
| Comment6 | Комментарий 6 — Текстовый комментарий для раздела проскальзывания |
| Slippage | Проскальзывание — Допустимое проскальзывание цены при открытии и закрытии позиций |
| Comment7 | Комментарий 7 — Текстовый комментарий для раздела стоп-лосса |
| StopLoss | Стоп-лосс — Уровень стоп-лосса в пипсах |
| Comment8 | Комментарий 8 — Текстовый комментарий для раздела тейк-профита |
| TakeProfit | Тейк-профит — Уровень тейк-профита в пипсах |
| Comment9 | Комментарий 9 — Текстовый комментарий для раздела трейлинг-стопа |
| TrailingStop | Трейлинг-стоп — Уровень трейлинг-стопа в пипсах |
| TrailingStep | Шаг трейлинг-стопа — Шаг трейлинг-стопа в пипсах |
| Comment10 | Комментарий 10 — Текстовый комментарий для раздела настроек оповещений |
| Sound_Alert | Звуковой сигнал — Включает звуковой сигнал при срабатывании торговых событий |
| Email_Alert | Email-оповещения — Включает отправку email-оповещений о событиях торговых позиций |
| Comment11 | Комментарий 11 — Текстовый комментарий для раздела дополнительных действий |
| EASounds | Звуковые оповещения EA — Включает звуковое оповещение при открытии и закрытии позиций |
| Show_Profit_Comments | Показывать прибыль — Отображение информации о прибыли в комментариях на графике |
Поиск по коду файла
#property description "This EA triggers a Buy or Sell Order after two moving averages cross each other.\n"
#property description "- MA1 crossing above the MA2 triggers a Buy Order"
#property description "- MA1 crossing below the MA2 triggers a Sell Order\n"
#property description "It will Exit a trade:\n"
#property description "- If the MA1 crosses either the MA2 or MA3"
#property description "- Or after hitting Take Profit or Stop Loss\n"
enum e_cycles{ Min_1=1, Min_5=2, Min_15=3, Min_30=4, Min_60=5, Min_240=6, Daily=7, Weekly=8, Monthly=9 };
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
};
enum e_price{ CLOSE=PRICE_CLOSE, OPEN=PRICE_OPEN, LOW=PRICE_LOW, HIGH=PRICE_HIGH, MEDIAN=PRICE_MEDIAN, TYPICAL=PRICE_TYPICAL, WEIGHTED=PRICE_WEIGHTED };
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 MA1_Period = 5;
extern e_method MA1_Method = SMA;
extern e_price MA1_Price_Type = CLOSE;
extern int MA2_Period = 30;
extern e_method MA2_Method = SMA;
extern e_price MA2_Price_type = CLOSE;
extern int MA3_Period = 10;
extern e_method MA3_Method = SMA;
extern e_price MA3_Price_type = 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 = "Moving Average Cross with Exit 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 = MA2_Period*multiplier*2;
int iMA1_Method = -1;
int iMA2_Method = -1;
int iMA3_Method = -1;
double MA1_0, MA2_0, MA3_0, MA1_1, MA2_1, MA3_1;
if (MA1_Method==1) iMA1_Method = ENUM_MA_METHOD(0);
if (MA1_Method==2) iMA1_Method = ENUM_MA_METHOD(1);
if (MA1_Method==8) iMA1_Method = ENUM_MA_METHOD(2);
if (MA1_Method==4) iMA1_Method = ENUM_MA_METHOD(3);
if (MA2_Method==1) iMA2_Method = ENUM_MA_METHOD(0);
if (MA2_Method==2) iMA2_Method = ENUM_MA_METHOD(1);
if (MA2_Method==8) iMA2_Method = ENUM_MA_METHOD(2);
if (MA2_Method==4) iMA2_Method = ENUM_MA_METHOD(3);
if (MA3_Method==1) iMA3_Method = ENUM_MA_METHOD(0);
if (MA3_Method==2) iMA3_Method = ENUM_MA_METHOD(1);
if (MA3_Method==8) iMA3_Method = ENUM_MA_METHOD(2);
if (MA3_Method==4) iMA3_Method = ENUM_MA_METHOD(3);
if (iMA1_Method != -1){
MA1_0 = iMA(NULL,period,MA1_Period,0,iMA1_Method,ENUM_APPLIED_PRICE(MA1_Price_Type),0);
MA1_1 = iMA(NULL,period,MA1_Period,0,iMA1_Method,ENUM_APPLIED_PRICE(MA1_Price_Type),1);
}else{
MA1_0 = iCustom(NULL,period,"Two_MA_Cross_Indicator",MA1_Period,MA1_Method,MA1_Price_Type,MA2_Period,MA2_Method,MA2_Price_type,0,0);
MA1_1 = iCustom(NULL,period,"Two_MA_Cross_Indicator",MA1_Period,MA1_Method,MA1_Price_Type,MA2_Period,MA2_Method,MA2_Price_type,0,1);
}
if (iMA2_Method != -1){
MA2_0 = iMA(NULL,period,MA2_Period,0,iMA2_Method,ENUM_APPLIED_PRICE(MA2_Price_type),0);
MA2_1 = iMA(NULL,period,MA2_Period,0,iMA2_Method,ENUM_APPLIED_PRICE(MA2_Price_type),1);
}else{
MA2_0 = iCustom(NULL,period,"Two_MA_Cross_Indicator",MA1_Period,MA1_Method,MA1_Price_Type,MA2_Period,MA2_Method,MA2_Price_type,1,0);
MA2_1 = iCustom(NULL,period,"Two_MA_Cross_Indicator",MA1_Period,MA1_Method,MA1_Price_Type,MA2_Period,MA2_Method,MA2_Price_type,1,1);
}
if (iMA3_Method != -1){
MA3_0 = iMA(NULL,period,MA3_Period,0,iMA3_Method,ENUM_APPLIED_PRICE(MA3_Price_type),0);
MA3_1 = iMA(NULL,period,MA3_Period,0,iMA3_Method,ENUM_APPLIED_PRICE(MA3_Price_type),1);
}else{
MA3_0 = iCustom(NULL,period,"Two_MA_Cross_Indicator",MA1_Period,MA1_Method,MA1_Price_Type,MA3_Period,MA3_Method,MA3_Price_type,1,0);
MA3_1 = iCustom(NULL,period,"Two_MA_Cross_Indicator",MA1_Period,MA1_Method,MA1_Price_Type,MA3_Period,MA3_Method,MA3_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 (EA_Activated && ((MA1_0 < MA2_0 && MA1_1 > MA2_1)||(MA1_0 < MA3_0 && MA1_1 > MA3_1))){
Close_Long = 1;
}
if (EA_Activated && ((MA1_0 > MA2_0 && MA1_1 < MA2_1)||(MA1_0 > MA3_0 && MA1_1 < MA3_1))){
Close_Short = 1;
}
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)+" | MA3: "+DoubleToStr(MA3_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 && BID-TrailingStop*PP>SL_Level) {
if (OrderModify(OrderTicket(),OrderOpenPrice(),BID-TrailingStop*PP,OrderTakeProfit(),0,clrMagenta)){ Order_Modified = true; }
}
}
}
if(Side == OP_SELL){
if (OrderOpenPrice()-ASK>TrailingStop*PP) {
if (OrderStopLoss()>ASK+(TrailingStop+TrailingStep-1)*PP && ASK+TrailingStop*PP<SL_Level) {
if (OrderModify(OrderTicket(),OrderOpenPrice(),ASK+TrailingStop*PP,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 ="+ordeПоказано первые 50% кода (символов: 23162)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.