two_ma_cross.mq4
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «two_ma_cross.mq4» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Советник для MetaTrader 4, реализующий торговую логику на основе пересечения двух скользящих средних. При формировании сигнала на покупку или продажу советник открывает позицию с заданным объёмом, стоп-лоссом и тейк-профитом. Внутренний обработчик отслеживает открытые ордера по магическому номеру и текущему символу, обеспечивая управление позицией в рамках заданных ограничений. Советник поддерживает трейлинг-стоп с возможностью сужения, перевод стоп-лосса в безубыток, а также расчёт объёма позиции на основе свободного маржи счёта.
Настройки программы
| Настройка | Описание |
|---|---|
| First MA Method (Ma1Method) | Метод первой MA — Тип скользящей средней для первой MA (например, SMA, EMA). |
| First MA Period (Ma1Preiod) | Период первой MA — Период расчёта первой скользящей средней. |
| First Ma Shift (Ma1Shift) | Сдвиг первой MA — Горизонтальное смещение первой скользящей средней по графику. |
| First MA Applied Price (Ma1Price) | Цена применения первой MA — Тип цены, на основе которой рассчитывается первая скользящая средняя. |
| Second MA Method (Ma2Method) | Метод второй MA — Тип скользящей средней для второй MA (например, SMA, EMA). |
| Second MA Period (Ma2Preiod) | Период второй MA — Период расчёта второй скользящей средней. |
| Second Ma Shift (Ma2Shift) | Сдвиг второй MA — Горизонтальное смещение второй скользящей средней по графику. |
| Second MA Applied Price (Ma2Price) | Цена применения второй MA — Тип цены, на основе которой рассчитывается вторая скользящая средняя. |
| Order lot Value (LotValue) | Значение лота — Процент от свободного маржи, используемый для расчёта объёма позиции. |
| Stop Loss value in pt (StopLoss) | Стоп-лосс — Уровень стоп-лосса в пунктах от цены входа. |
| Take Profit value in pt (TakeProfit) | Тейк-профит — Уровень тейк-профита в пунктах от цены входа. |
| Disable/Enable halving trailing stop (UseTrailing) | Включить трейлинг-стоп — Включает или отключает трейлинг-стоп с постепенным сужением. |
| Division ratio (DivisionRatio) | Коэффициент деления — Коэффициент, определяющий шаг сужения трейлинг-стопа. |
| Disable/Enable trailing stop in loss (TrailingInLoss) | Трейлинг в зоне убытка — Разрешает или запрещает движение трейлинг-стопа в зоне убытка. |
| Use Breakeven (UseBreakeven) | Использовать безубыток — Включает перевод стоп-лосса в точку безубытка при достижении заданного уровня прибыли. |
| Transfer to breakeven when reaching value (BreakevenValue) | Значение безубытка — Уровень прибыли в пунктах, при достижении которого стоп-лосс переводится в безубыток. |
| Order opening slippage (Slippage) | Проскальзывание — Максимально допустимое отклонение цены при открытии ордера. |
| A number of simultaneously open orders (OrdersCount) | Максимум ордеров — Максимальное количество одновременно открытых позиций по магическому номеру. |
| Magic number (magicNumber) | Магический номер — Идентификатор ордеров советника для отслеживания и управления. |
| comment | Комментарий — Текст комментария, добавляемый к открываемым ордерам. |
Поиск по коду файла
#property version "1.00"
#property strict
input ENUM_MA_METHOD Ma1Method = MODE_SMA; //First MA Method
input int Ma1Preiod = 100; //First MA Period
input int Ma1Shift =0 ; //First Ma Shift
input ENUM_APPLIED_PRICE Ma1Price = PRICE_CLOSE;//First MA Applied Price
input ENUM_MA_METHOD Ma2Method = MODE_SMA; //Second MA Method
input int Ma2Preiod = 30; //Second MA Period
input int Ma2Shift = 0; //Second Ma Shift
input ENUM_APPLIED_PRICE Ma2Price = PRICE_CLOSE;//Second MA Applied Price
input double LotValue=0.1; // Order lot Value
input int StopLoss=10; // Stop Loss value in pt
input int TakeProfit=10; // Take Profit value in pt
input bool UseTrailing=false; // Disable/Enable halving trailing stop
input double DivisionRatio = 0.5; // Division ratio
input bool TrailingInLoss=false; // Disable/Enable trailing stop in loss
input bool UseBreakeven=false; // Use Breakeven
input int BreakevenValue=100; // Transfer to breakeven when reaching value
input int Slippage=5; // Order opening slippage
input int OrdersCount=1; // A number of simultaneously open orders
input int magicNumber = 41503; //Magic number
input string comment= "MA Cross Expert";
int OnInit()
{
// код доступен только после оплаты
}
void OnDeinit(const int reason)
{
}
datetime time;
void OnTick()
{
// код доступен только после оплаты
}
int getSignal(int shift = 1)
{
double ma1_1 = iMA(NULL, NULL, Ma1Preiod, Ma1Shift, Ma1Method, Ma1Price, shift);
double ma1_2 = iMA(NULL, NULL, Ma1Preiod, Ma1Shift, Ma1Method, Ma1Price, shift+1);
double ma2_1 = iMA(NULL, NULL, Ma2Preiod, Ma2Shift, Ma2Method, Ma2Price, shift);
double ma2_2 = iMA(NULL, NULL, Ma2Preiod, Ma2Shift, Ma2Method, Ma2Price, shift+1);
if (ma1_1 > ma2_1 && ma1_2 <= ma2_2) return 1;
if (ma1_1 < ma2_1 && ma1_2 >= ma2_2) return 2;
return 0;
}
void TrallsCheck()
{
if(KolvoMN() > 0)
{
for(int j=1;j<=Mas_Ord_New[0][0];j++)
{
if(Mas_Ord_New[j][7] == magicNumber )
{
HalfTrallSignal(Mas_Ord_New[j][4]);
}
}
}
}
void CheckMoveStopLoss()
{
for(int j=0;j<=Mas_Ord_New[0][0];j++)
{
if(Mas_Ord_New[j][7] == magicNumber)
MoveStopLossToProfitZone(Mas_Ord_New[j][4]);
}
}
void HalfTrallSignal(int ticket)
{
int iTicket = ticket; // unique number (ticket) of an open position
int iTmFrme = Period (); // chart period, on which bars are pressed
double dCoeff = DivisionRatio; // "compression ratio", in% from 0.01 to 1
bool bTrlinloss = TrailingInLoss; // whether to trail in the area of losses (between the stop loss and the opening rate)
OrderSelect(ticket,SELECT_BY_TICKET);
double dBid = MarketInfo(Symbol(),MODE_BID);
double dAsk = MarketInfo(Symbol(),MODE_ASK);
double dNewSl;
double dNexMove;
if (OrderType()==OP_BUY)
{
if ((bTrlinloss) && (OrderStopLoss()!=0))
{
dNexMove = NormalizeDouble(dCoeff*(dBid-OrderStopLoss()),Digits);
dNewSl = NormalizeDouble(OrderStopLoss()+dNexMove,Digits);
}
else
{
if (OrderOpenPrice()>OrderStopLoss())
{
dNexMove = NormalizeDouble(dCoeff*(dBid-OrderOpenPrice()),Digits);
dNewSl = NormalizeDouble(OrderOpenPrice()+dNexMove,Digits);
}
if (OrderStopLoss()>=OrderOpenPrice())
{
dNexMove = NormalizeDouble(dCoeff*(dBid-OrderStopLoss()),Digits);
dNewSl = NormalizeDouble(OrderStopLoss()+dNexMove,Digits);
}
}
if ((dNewSl>OrderStopLoss()) && (dNexMove>0) && ((dNewSl<Bid- MarketInfo(Symbol(),MODE_STOPLEVEL)*Point)))
{
if (!OrderModify(OrderTicket(),OrderOpenPrice(),dNewSl,OrderTakeProfit(),OrderExpiration(),Red))
Print("Failed to modify stop loss order №",OrderTicket(),". Error: ",GetLastError());
}
}
if (OrderType()==OP_SELL)
{
if ((bTrlinloss) && (OrderStopLoss()!=0))
{
dNexMove = NormalizeDouble(dCoeff*(OrderStopLoss()-(dAsk)),Digits);
dNewSl = NormalizeDouble(OrderStopLoss()-dNexMove,Digits);
}
else
{
if (OrderOpenPrice()<OrderStopLoss())
{
dNexMove = NormalizeDouble(dCoeff*(OrderOpenPrice()-(dAsk)),Digits);
dNewSl = NormalizeDouble(OrderOpenPrice()-dNexMove,Digits);
}
if (OrderStopLoss()<=OrderOpenPrice())
{
dNexMove = NormalizeDouble(dCoeff*(OrderStopLoss()-(dAsk)),Digits);
dNewSl = NormalizeDouble(OrderStopLoss()-dNexMove,Digits);
}
}
if ((dNewSl<OrderStopLoss()) && (dNexMove>0) && (dNewSl>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
{
if (!OrderModify(OrderTicket(),OrderOpenPrice(),dNewSl,OrderTakeProfit(),OrderExpiration(),Blue))
Print("Failed to modify stop loss order №",OrderTicket(),". Error: ",GetLastError());
}
}
}
void MoveStopLossToProfitZone(int ticket)
{
double ord_sl = OrderStopLoss();
double sl_op_diff = MathAbs(ord_sl - OrderOpenPrice());
if(sl_op_diff == 0) return;
double move_pt = NormalizeDouble(BreakevenValue*Point,Digits);
int Ticket_c = -1;
if (OrderType()==OP_BUY)
{
double diff = Bid - OrderOpenPrice();
if(diff > 0 && diff > move_pt)
{
if(OrderOpenPrice() > OrderStopLoss())
{
Ticket_c = OrderModify(ticket,OrderOpenPrice(),OrderOpenPrice(), OrderTakeProfit(),0);
if(Ticket_c == 0 && !IsTesting())
{
Sleep(2000);
MoveStopLossToProfitZone(ticket);
}
}
}
}
if (OrderType()==OP_SELL)
{
double diff = ord_sl - Ask - (ord_sl - OrderOpenPrice());
if(diff > 0 && diff > move_pt)
{
if(OrderOpenPrice() < OrderStopLoss())
{
Ticket_c =OrderModify(ticket,OrderOpenPrice(),OrderOpenPrice(), OrderTakeProfit(),0);
if(Ticket_c == 0 && !IsTesting())
{
Sleep(2000);
MoveStopLossToProfitZone(ticket);
}
}
}
}
}
double Mas_Ord_New [150][10];
double Mas_Ord_Old[150][10];
int Mas_Tip [6];
int his=0;
int Terminal()
{
int Qnt=0; // Счётчик количества ордеров
if(IsTesting())
{
if(OrdersTotal() == Mas_Ord_New[0][0] && OrdersHistoryTotal() == his)
{
return 0;
}
his = OrdersHistoryTotal();
}
ArrayCopy(Mas_Ord_Old, Mas_Ord_New);// Сохраняем предыдущую историю
Qnt=0; // Обнуление счётчика ордеров
ArrayInitialize(Mas_Ord_New,0); // Обнуление массива
ArrayInitialize(Mas_Tip, 0); // Обнуление массива
for(int i=0; i<OrdersTotal(); i++) // По рыночн. и отлож. ордерам
{
if((OrderSelect(i,SELECT_BY_POS)==true) //Если есть следующ.
&& (OrderSymbol()==Symbol())) //.. и наша вал.пара
{
Qnt++; // Колич. ордеров
Mas_Ord_New[Qnt][1]=OrderOpenPrice(); // Курс открытия орд
Mas_Ord_New[Qnt][2]=OrderStopLoss(); // Курс SL
Mas_Ord_New[Qnt][3]=OrderTakeProfit(); // Курс ТР
Mas_Ord_New[Qnt][4]=OrderTicket(); // Номер ордера
Mas_Ord_New[Qnt][5]=OrderLots(); // Количество лотов
Mas_Tip[OrderType()]++; // Кол. ордеров типа
Mas_Ord_New[Qnt][6]=OrderType(); // Тип ордера
Mas_Ord_New[Qnt][7]=OrderMagicNumber(); // Магическое число
if (OrderComment()=="")
Mas_Ord_New[Qnt][8]=0; // Если нет коммент
else
Mas_Ord_New[Qnt][8]=1; // Если есть коммент
}
}
Mas_Ord_New[0][0]=Qnt; // Колич. ордеров
return(0);
}
int KolvoMN()
{
int RR=0;
for(int i=1; i<=Mas_Ord_New[0][0]; i++)
{
if (Mas_Ord_New[i][7]==magicNumber) RR=RR+1;
}
return (RR);
}
int PreCheck(int OrdType)
{
if(KolvoMN() >= OrdersCount) return 0;
int ret = 0;
int stoploss = 0;
int takeprofit=0;
double volume=0;
double price=0;
int slippage;
stoploss = StopLoss;
takeprofit = TakeProfit;
volume = GetVolume(stoploss);
if(OrdType == OP_BUY) price = Ask;
if(OrdType == OP_SELL) price = Bid;
if(stoploss > 0)
{
double sl = 0;
double tp = 0;
if(OrdType == OP_BUY)
{
Print(" stoploss "+stoploss + " takeprofit "+takeprofit );
if(stoploss != 0) sl = NormalizeDouble(Bid - stoploss * Point, Digits);
if(takeprofit != 0)tp = NormalizeDouble(Bid + takeprofit * Point, Digits);
}
if(OrdType == OP_SELL)
{
if(stoploss != 0) sl = NormalizeDouble(Ask + stoploss * Point, Digits);
if(takeprofit != 0) tp = NormalizeDouble(Ask - takeprofit * Point, Digits);
}
int result = OrderOpenF(NULL,OrdType,volume,price,Slippage,sl,tp,comment + " "+magicNumber,magicNumber,NULL,NULL);
return result;
}
Показано первые 50% кода (символов: 12220)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.