OM_2WAY_v3.6
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «om_2way_v3.6.mq4» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
OM_2WAY_v3.6 — это торговый советник для платформы MetaTrader 4, написанный на языке MQL4. Советник анализирует текущие ценовые данные с применением индикатора скользящей средней и на основе полученных сигналов открывает рыночные позиции Buy и Sell. Поддерживается режим параллельной торговли в обоих направлениях рынка.
Советник предоставляет гибкую настройку параметров лотов, включая ручной и автоматический режимы увеличения размера позиции, ограничение максимального лота, количество максимальных одновременных сделок, а также фиксированный тейк-профит. Реализована модификация тейк-профитов уже открытых позиций.
На экране отображается информация о текущих позициях, суммарных лотах и прибыли для направлений Buy и Sell, доступны графические линии средней цены и часы. Включена логика выборочного закрытия позиций по заданным процентным порогам прибыли. Для разделения покупательских и продавательских ордеров используются два независимых магических числа.
Настройки программы
| Настройка | Описание |
|---|---|
| EAName | Имя советника — Имя торгового советника |
| ?????? ?? ??????? (MagicNumberBuy) | Магическое число Buy — Идентификационный номер для покупательских ордеров |
| ?????? ?? ??????? (MagicNumberSell) | Магическое число Sell — Идентификационный номер для продавательских ордеров |
| s1 | Разделитель 1 — Визуальный разделитель настроек |
| ????? ???? ?? ????? (OnScreenInfo) | Информация на экране — Отображение информации о текущих позициях и прибыли на графике |
| ????? ??????? ?? ????? (ShowClock) | Показать часы — Отображение текущих часов на графике |
| ????? ????? ??????? ???? (DrawAveragePrice) | Отрисовка средней цены — Отображение на графике линий средней цены и целевого уровня для открытых позиций |
| ?????????? ?? ????????????? ???????? (DualTrade) | Двойная торговля — Разрешение одновременного открытия позиций Buy и Sell на одном символе |
| ?????????? ?? ????? ??????? (NewTradeBuy) | Новая торговля Buy — Разрешение на открытие новых покупательских позиций |
| ?????????? ?? ????? ??????? (NewTradeSell) | Новая торговля Sell — Разрешение на открытие новых продавательских позиций |
| s4 | Разделитель 4 — Визуальный разделитель настроек |
| s5 | Метка 5 — Текстовая метка группы настроек |
| ??????????? ????? ?????? ?? ????? ?????...????? ???????? (CheckNewBar) | Проверка нового бара — Фильтрация повторного запуска логики в рамках одного бара |
| ??????????? ?????????? ???????????? ???????? ??????? (MaxTrades) | Максимальное количество сделок — Максимальное количество одновременных открытых сделок |
| ??? ????? ???????????? ????? ????? (PipStep) | Шаг в пунктах — Шаг в пунктах для последовательного открытия позиций |
| ?????????? (PipStepExponent) | Степень шага — Степенной коэффициент для расчёта шага между позициями |
| ??????????? ???? ?????? (StaticTakeProfit) | Статический тейк-профит — Фиксированное значение тейк-профита в пунктах для новых позиций |
| s6 | Метка 6 — Текстовая метка группы настроек |
| ??????? ??????????(10...50) (ProfitPersent) | Процент прибыли 1 — Процентный порог для выборочного закрытия позиций |
| ??????? ?????????? ????? ???????????? ????????????? ????? (SecondProfitPersent) | Процент прибыли 2 — Дополнительный процентный порог для закрытия позиций при наличии нескольких открытых ордеров |
| s8 | Разделитель 8 — Визуальный разделитель настроек |
| s9 | Метка 9 — Текстовая метка группы настроек |
| ?????? ??????? ???? ??? ?????? ??????n (StartLot) | Начальный лот — Начальный размер лота для открытия первой позиции |
| ?????? ?????????? ??????? ? ???? * ?? ?????????? ??????? (LotIncrement) | Приращение лота — Величина увеличения лота при каждом последующем шаге в ручном режиме |
| ???????????? ???????? ???? (MaxLot) | Максимальный лот — Максимально допустимый размер лота |
| ????????????? ???? ????...??????? ?? ???? (UseAutoLot) | Автоматический лот включён — Включение автоматического расчёта размера лота на основе баланса |
| ??????? ??? ??????? ????...????????? ?? ??????? (AutoLot) | Автоматический лот — Размер лота для автоматического режима управления размером позиции |
| ??????? ?????????? ??????? ? ???? * ?? ?????????? ??????? (AutoLotIncrement) | Приращение автоматического лота — Величина увеличения лота при каждом последующем шаге в автоматическом режиме |
| s10 | Разделитель 10 — Визуальный разделитель настроек |
| s11 | Разделитель 11 — Визуальный разделитель настроек |
| iMA_Period | Период скользящей средней — Период расчёта скользящей средней |
| iMA_OpenDistance | Расстояние от скользящей средней — Расстояние от скользящей средней в пунктах для генерации торгового сигнала |
Поиск по коду файла
#include <stderror.mqh>
#include <stdlib.mqh>
extern string EAName = "OM_2WAY_v3.6";
extern int MagicNumberBuy = 123456789; // ?????? ?? ???????
extern int MagicNumberSell = 987654321; // ?????? ?? ???????
extern string s1 = ">>>>>>>>>>>>>>>>>>>>>>>>>>>>";
extern bool OnScreenInfo = true; //????? ???? ?? ?????
extern bool ShowClock = false; //????? ??????? ?? ?????
extern bool DrawAveragePrice = false; //????? ????? ??????? ????
extern bool DualTrade = false; //?????????? ?? ????????????? ????????
extern bool NewTradeBuy = true; //?????????? ?? ????? ???????
extern bool NewTradeSell = true; //?????????? ?? ????? ???????
extern string s4 = ">>>>>>>>>>>>>>>>>>>>>>>>>>>>";
extern string s5 = ">>> ???????? ?????";
extern bool CheckNewBar = true; // ??????????? ????? ?????? ?? ????? ?????...????? ????????
extern int MaxTrades = 30; // ??????????? ?????????? ???????????? ???????? ???????
extern double PipStep = 25.0; // ??? ????? ???????????? ????? ?????
extern double PipStepExponent = 1.0; // ??????????
extern int StaticTakeProfit = 15; // ??????????? ???? ??????
extern string s6 = ">>> ???????? ?????????? ???????";
extern double ProfitPersent = 30; // ??????? ??????????(10...50)
extern double SecondProfitPersent = 50; // ??????? ?????????? ????? ???????????? ????????????? ?????
extern string s8 = ">>>>>>>>>>>>>>>>>>>>>>>>>>>>";
extern string s9 = ">>> ?????? ????";
extern double StartLot = 0.2; // ?????? ??????? ???? ??? ?????? ??????n
extern double LotIncrement = 0.1; // ?????? ?????????? ??????? ? ???? * ?? ?????????? ???????
extern double MaxLot = 30; // ???????????? ???????? ????
extern bool UseAutoLot = false; //????????????? ???? ????...??????? ?? ????
extern double AutoLot = 0.5; //??????? ??? ??????? ????...????????? ?? ???????
extern double AutoLotIncrement = 0.3; // ??????? ?????????? ??????? ? ???? * ?? ?????????? ???????
extern string s10 = ">>>>>>>>>>>>>>>>>>>>>>>>>>>>";
extern string s11 = ">>> ???? ?????? ??";
extern int iMA_Period = 700;
extern int iMA_OpenDistance = 60;
int i = 0;
int TimePrev = 0;
int vDigits;
int OrderSended = 0;
int TotalBuyOrders = 0, TotalSellOrders = 0;
int Lpos, Lpos1, Cpos;
double Spread;
double mPipStep;
double vPoint;
double PriceTarget, AveragePrice, LastBuyPrice, LastSellPrice;
double BuySummLot,SellSummLot,TotalProfitBuy,TotalProfitSell;
double BLot, SLot;
double Cprofit, Lprofit, Lprofit1, PrcCL;
string LastOrderComment = "";
string BComment, SComment;
int init()
{
// код доступен только после оплаты
}
int deinit()
{
ObjectDelete("CurrTime");
ObjectDelete("BuyZeroLevel");
ObjectDelete("BuyAveragePrice");
ObjectDelete("SellZeroLevel");
ObjectDelete("SellAveragePrice");
return(0);
}
int start()
{
// код доступен только после оплаты
}
void CheckTakeProfit()
{
TotalBuyOrders = CountOfOrders(MagicNumberBuy);
PriceTarget = 0;
AveragePrice = 0;
if(TotalBuyOrders > 0)
{
PriceTarget = FindFirstOrderParameter(MagicNumberBuy, "price") + StaticTakeProfit*vPoint;
AveragePrice = CalculateAveragePrice(MagicNumberBuy);
}
for (i = 0; i < OrdersTotal(); i++)
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumberBuy)
if (NormalizeDouble(OrderTakeProfit(),vDigits) != NormalizeDouble(PriceTarget,vDigits)) ModifyTakeProfit(PriceTarget);
if(DrawAveragePrice == true)
{
if(AveragePrice == 0)
{
if(ObjectFind("BuyZeroLevel") != -1) ObjectDelete("BuyZeroLevel");
if(ObjectFind("BuyAveragePrice") != -1) ObjectDelete("BuyAveragePrice");
}
else
{
if(ObjectFind("BuyZeroLevel") == -1)
{
ObjectCreate("BuyZeroLevel",OBJ_HLINE, 0, 0, AveragePrice);
ObjectSet("BuyZeroLevel", OBJPROP_COLOR, Blue);
ObjectSet("BuyZeroLevel", OBJPROP_STYLE, DRAW_SECTION);
}
else ObjectSet("BuyZeroLevel", OBJPROP_PRICE1, AveragePrice);
if(ObjectFind("BuyAveragePrice") == -1)
{
ObjectCreate("BuyAveragePrice",OBJ_HLINE, 0, 0, AveragePrice + StaticTakeProfit*vPoint);
ObjectSet("BuyAveragePrice", OBJPROP_COLOR, Blue);
ObjectSet("BuyAveragePrice", OBJPROP_STYLE, DRAW_LINE);
}
else ObjectSet("BuyAveragePrice", OBJPROP_PRICE1, AveragePrice + StaticTakeProfit*vPoint);
}
}
PriceTarget = 0;
AveragePrice = 0;
TotalSellOrders = CountOfOrders(MagicNumberSell);
if(TotalSellOrders > 0)
{
PriceTarget = FindFirstOrderParameter(MagicNumberSell, "price") - StaticTakeProfit*vPoint;
AveragePrice = CalculateAveragePrice(MagicNumberSell);
}
for (i = 0; i < OrdersTotal(); i++)
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumberSell)
if (NormalizeDouble(OrderTakeProfit(),vDigits) != NormalizeDouble(PriceTarget,vDigits)) ModifyTakeProfit(PriceTarget);
if(DrawAveragePrice == true)
{
if(AveragePrice == 0)
{
if(ObjectFind("SellZeroLevel") != -1) ObjectDelete("SellZeroLevel");
if(ObjectFind("SellAveragePrice") != -1) ObjectDelete("SellAveragePrice");
}
else
{
if(ObjectFind("SellZeroLevel") == -1)
{
ObjectCreate("SellZeroLevel",OBJ_HLINE, 0, 0, AveragePrice);
ObjectSet("SellZeroLevel", OBJPROP_COLOR, Red);
ObjectSet("SellZeroLevel", OBJPROP_STYLE, DRAW_SECTION);
}
else ObjectSet("SellZeroLevel", OBJPROP_PRICE1, AveragePrice);
if(ObjectFind("SellAveragePrice") == -1)
{
ObjectCreate("SellAveragePrice",OBJ_HLINE, 0, 0, AveragePrice - StaticTakeProfit*vPoint);
ObjectSet("SellAveragePrice", OBJPROP_COLOR, Red);
ObjectSet("SellAveragePrice", OBJPROP_STYLE, DRAW_LINE);
}
else ObjectSet("SellAveragePrice", OBJPROP_PRICE1, AveragePrice - StaticTakeProfit*vPoint);
}
}
}
double CalculateAveragePrice(int mNumber)
{
double AveragePrice = 0;
double Count = 0;
for (int i = 0; i < OrdersTotal(); i++)
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == mNumber)
if (OrderType() == OP_BUY || OrderType() == OP_SELL)
{
AveragePrice += OrderOpenPrice() * OrderLots();
Count += OrderLots();
}
if(AveragePrice > 0 && Count > 0)
return( NormalizeDouble(AveragePrice / Count, vDigits));
else
return(0);
}
int GetSignal()
{
int Signal = 0;
double iMA_Signal = iMA(Symbol(), 0, iMA_Period, 0, MODE_SMMA, PRICE_CLOSE, 0);
int Ma_Bid_Diff = MathAbs(iMA_Signal - Bid)/vPoint;
if(Ma_Bid_Diff > iMA_OpenDistance && Bid > iMA_Signal) Signal = -1;
if(Ma_Bid_Diff > iMA_OpenDistance && Bid < iMA_Signal) Signal = 1;
return(Signal);
}
int CountOfOrders(int mNumber)
{
int count = 0;
for (int i = 0; i < OrdersTotal(); i++)
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
if ((OrderSymbol() == Symbol()) && (OrderMagicNumber() == mNumber))
if ((OrderType() == OP_SELL) || (OrderType() == OP_BUY))
count++;
return(count);
}
double GetLotForStep(int mNumber, int OrdCount)
{
double CurrLot = 0;
double LastOrderLot = FindLastOrderParameter(mNumber, "lot");
if(UseAutoLot == true)
{
if(LastOrderLot != 0) CurrLot = NormalizeDouble(LastOrderLot + NormalizeDouble(AccountEquity() * AutoLotIncrement/10000, 2)*OrdCount, 2);
}
else
{
if(LastOrderLot != 0) CurrLot = NormalizeDouble(LastOrderLot + LotIncrement*OrdCount, 2);
}
if(CurrLot > MaxLot) CurrLot = MaxLot;
if(CurrLot < StartLot) CurrLot = StartLot;
if(CurrLot == 0) CurrLot = StartLot;
return(CurrLot);
}
double GetStartLot()
{
double FirstLot = 0;
if(UseAutoLot == true)
{
FirstLot = NormalizeDouble(AccountEquity() * AutoLot/10000, 2);
}
else
{
FirstLot = StartLot;
}
if(FirstLot > MaxLot) FirstLot = MaxLot;
if(FirstLot < StartLot) FirstLot = StartLot;
return(FirstLot);
}
double GetPipstepForStep(int CurrStep)
{
double CurrPipstep = NormalizeDouble(PipStep * MathPow(PipStepExponent,CurrStep), 0);
return(CurrPipstep);
}
double FindFirstOrderParameter(int mNumber, string ParamName)
{
int mOrderTicket = 0;
double mOrderPrice = 0;
double mOrderLot = 0;
double mOrderProfit = 0;
int PrevTicket = 0;
int CurrTicket = 0;
for (i = OrdersTotal() - 1; i >= 0; i--)
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == mNumber)
{
CurrTicket = OrderTicket();
if (CurrTicket < PrevTicket || PrevTicket == 0)
{
PrevTicket = CurrTicket;
mOrderPrice = OrderOpenPrice();
mOrderTicket = OrderTicket();
mOrderLot = OrderLots();
mOrderProfit = OrderProfit() + OrderSwap() + OrderCommission();
}
}
if(ParamName == "price") return(mOrderPrice);
else if(ParamName == "ticket") return(mOrderTicket);
else if(ParamName == "lot") return(mOrderLot);
else if(ParamName == "profit") return(mOrderProfit);
}
double FindLastOrderParameter(int mNumber, string ParamName)
{
int mOrderTicket = 0;
double mOrderPrice = 0;
double mOrderLot = 0;
double mOrderProfit = 0;
int PrevTicket = 0;
int CurrTicket = 0;
for (i = OrdersTotal() - 1; i >= 0; i--)
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == mNumber)
{
CurrTicket = OrderTicket();
if (CurrTicket > PrevTicket)
{
PrevTicket = CurrTicket;
mOrderPrice = OrderOpenPrice();
mOrderTicket = OrderTicket();
mOrderLot = OrderLots();
mOrderProfit = OrderProfit() + OrderSwap() + OrderCommission();
LastOrПоказано первые 50% кода (символов: 17331)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.