two_ma_cross_eatrade manager_v4.mq4
Похожие материалы по тегам
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «two_ma_cross_eatrade manager_v4.mq4» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Этот советник для MetaTrader 4 работает на языке MQL4 и предназначен для автоматического управления торговыми позициями на основе скрещивания двух скользящих средних. Советник может открывать позиции Buy или Sell при пересечении быстрой и медленной MA, а также поддерживает альтернативный режим SuperSignal с сигналами на основе LWMA на старших таймфреймах. Реализованы контроль рисков, стоп-лосс, тейк-профит, трейлинг-стоп, а также система уведомлений через звуковые оповещения и электронную почту.
Настройки программы
| Настройка | Описание |
|---|---|
| SuperSignal | SuperSignal — Переключатель режима работы: при выключении используется стандартное пересечение MA, при включении — режим SuperSignal на основе LWMA |
| UseStepMa | UseStepMa — Включает или отключает фильтр StepMA для подтверждения сигнала в режиме SuperSignal |
| StepMaShift | StepMaShift — Сдвиг для расчёта значения StepMA-фильтра |
| Comment1 | Comment1 — Текстовый разделитель для группы параметров стратегии |
| CloseAtProfit | CloseAtProfit — Закрывает все позиции, когда прибыль на счёте достигает указанного значения |
| CloseAtLoss | CloseAtLoss — Закрывает все позиции, когда убыток на счёте достигает указанного значения |
| EA_Activated | EA_Activated — Включает или отключает работу советника |
| TimeFrame | TimeFrame — Таймфрейм для расчёта скользящих средних |
| Order_Type | Order_Type — Тип ордеров: только покупка, только продажа или оба направления |
| Maximum_Trades_Open | Maximum_Trades_Open — Максимальное количество одновременно открытых позиций |
| Wait_Mins_For_Next_Trade | Wait_Mins_For_Next_Trade — Минимальное время ожидания между сделками в минутах |
| Fast_MA_Period | Fast_MA_Period — Период быстрой скользящей средней |
| Fast_MA_Method | Fast_MA_Method — Метод расчёта быстрой скользящей средней |
| Fast_MA_Price_Type | Fast_MA_Price_Type — Тип цены для расчёта быстрой скользящей средней |
| Slow_MA_Period | Slow_MA_Period — Период медленной скользящей средней |
| Slow_MA_Method | Slow_MA_Method — Метод расчёта медленной скользящей средней |
| Slow_MA_Price_Type | Slow_MA_Price_Type — Тип цены для расчёта медленной скользящей средней |
| Max_Pips_Away_From_Cross | Max_Pips_Away_From_Cross — Максимальное допустимое расстояние от текущей цены до точки пересечения MA в пунктах |
| Comment2 | Comment2 — Текстовый разделитель для группы параметра магического номера |
| Magic_N | Magic_N — Магический номер для идентификации ордеров советника |
| Comment3 | Comment3 — Текстовый разделитель для группы параметров расчёта лотов |
| Risk_Management | Risk_Management — Режим управления рисками: автоматический или ручной |
| Comment4 | Comment4 — Текстовый разделитель для группы параметров автоматического риска |
| Auto_Risk_Percent | Auto_Risk_Percent — Процент риска от equity на одну сделку при автоматическом управлении |
| Auto_Max_Risk_in_Total_Orders | Auto_Max_Risk_in_Total_Orders — Максимальный суммарный риск в процентах на все открытые позиции |
| Comment5 | Comment5 — Текстовый разделитель для группы параметров ручного лотирования |
| Manual_Lots | Manual_Lots — Размер лота при ручном управлении рисками |
| Manual_Maximum_Lots | Manual_Maximum_Lots — Максимально допустимый суммарный размер лотов при ручном управлении |
| Comment6 | Comment6 — Текстовый разделитель для группы параметров проскальзывания |
| Slippage | Slippage — Максимально допустимое проскальзывание цены в пунктах |
| Comment7 | Comment7 — Текстовый разделитель для группы параметров стоп-лосса |
| StopLoss | StopLoss — Стоп-лосс в пунктах |
| Comment8 | Comment8 — Текстовый разделитель для группы параметров тейк-профита |
| TakeProfit | TakeProfit — Тейк-профит в пунктах |
| Comment9 | Comment9 — Текстовый разделитель для группы параметров трейлинг-стопа |
| TrailingStop | TrailingStop — Трейлинг-стоп в пунктах |
| TrailingStep | TrailingStep — Шаг сдвига трейлинг-стопа в пунктах |
| Comment10 | Comment10 — Текстовый разделитель для группы параметров оповещений |
| Sound_Alert | Sound_Alert — Включает или отключает звуковые оповещения о событиях |
| Email_Alert | Email_Alert — Включает или отключает отправку email-уведомлений о событиях |
| Comment11 | Comment11 — Текстовый разделитель для группы дополнительных параметров |
| EASounds | EASounds — Включает или отключает воспроизведение звука при открытии и закрытии ордеров |
| Show_Profit_Comments | 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 bool SuperSignal=true;
extern bool UseStepMa=true;
extern int StepMaShift=1;
extern string Comment1 = "- Strategy Parameters -";
extern int CloseAtProfit=+150;
extern int CloseAtLoss=-60;
double pl=0;
extern bool EA_Activated = true;
input e_cycles TimeFrame = Min_5;
input order_type Order_Type = Both;
extern int Maximum_Trades_Open = 2;
extern int Wait_Mins_For_Next_Trade = 30;
extern int Fast_MA_Period = 1;
extern e_method Fast_MA_Method = SMA;
extern ENUM_APPLIED_PRICE Fast_MA_Price_Type = PRICE_CLOSE;
extern int Slow_MA_Period = 2;
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 = 1236;
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 = 0.625;
extern double Auto_Max_Risk_in_Total_Orders = 2;
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 = 60;
extern string Comment8 = "- Take profit in Pips -";
extern double TakeProfit = 300;
extern string Comment9 = "- Trailing Stop in Pips -";
extern double TrailingStop = 50;
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 SuperSignal(){
Open_Long = 0;
Open_Short = 0;
Close_Long = 0;
Close_Short = 0;
if(Bid<iMA(NULL,PERIOD_H4,1000,0,MODE_LWMA,PRICE_CLOSE,0))
if(iHigh(NULL,PERIOD_H1,1)<iMA(NULL,PERIOD_H1,20,0,MODE_LWMA,PRICE_CLOSE,0))
if(!UseStepMa || StepMA(StepMaShift)==-1)
{Open_Short=1;}
if(Bid>iMA(NULL,PERIOD_H4,1000,0,MODE_LWMA,PRICE_CLOSE,0))
if(iLow(NULL,PERIOD_H1,1)>iMA(NULL,PERIOD_H1,20,0,MODE_LWMA,PRICE_CLOSE,0))
if(!UseStepMa || StepMA(StepMaShift)==1)
{Open_Long=1;}
if(Bid<iMA(NULL,PERIOD_H1,20,0,MODE_LWMA,PRICE_CLOSE,1))
if(iHigh(NULL,PERIOD_H1,1)<iMA(NULL,PERIOD_H1,20,0,MODE_LWMA,PRICE_CLOSE,1))
{ClosePos(OP_BUY);}
if(Bid>iMA(NULL,PERIOD_H1,20,0,MODE_LWMA,PRICE_CLOSE,1))
if(iLow(NULL,PERIOD_H1,1)>iMA(NULL,PERIOD_H1,20,0,MODE_LWMA,PRICE_CLOSE,1))
{ClosePos(OP_SELL);}
}
int StepMA(int shift)
{
double val=iCustom(NULL,PERIOD_H1,"stepma_v9_nmc",0,shift);
double low=iLow(NULL,PERIOD_H1,shift);
double high=iHigh(NULL,PERIOD_H1,shift);
if(low>val)
return 1;
if(high<val)
return -1;
return 0;
}
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(attempts=0;attempts<3;attempts++){
if (IsTradeContextBusy()){
Sleep(1000);
}elsПоказано первые 50% кода (символов: 24102)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.