← К каталогу
Исходный код · ID 448

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 и перейдите к оплате.

Стоимость полного кода
1 733,10₽ ≈ $21.18