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

vr calculate martingale lite.mq4

Вы автор или правообладатель?

Сообщите нам, если считаете, что материал размещён без разрешения.

Краткий обзор

О программе

Это пользовательский индикатор для платформы MetaTrader 4 (MQL4), который создаёт графический интерфейс на графике для ручного размещения и управления ордерами Buy и Sell. Индикатор отрисовывает кнопки, поля ввода лота, трендовые линии и стрелки, позволяя перетаскивать ордера мышью и пересчитывать средневзвешенную цену позиции. При наличии как минимум двух ордеров с разными направлениями вычисляется и отображается уровень усреднённой цены.

Настройки программы

НастройкаОписание
iPrefix Префикс объектов — Текстовый префикс, используемый для именования графических объектов (кнопок, полей, линий) на графике, чтобы избежать конфликтов имён.
iLots Размер лота — Числовой параметр типа double, задающий стандартный размер лота для создаваемых ордеров.
Получить полный код

Поиск по коду файла

#property strict

#property version       "19.101"
#property description   " "
#property description   " "
#property description   " "
#property indicator_chart_window
#property indicator_plots 0
#property indicator_buffers 0

input string iPrefix = "^$%#";
input double iLots   = 0.01;
struct str
  {
protected:
   string            m_name_orders;
   int               m_type_orders;
   double            m_lots_orders;
   double            m_cena_orders;
   MqlTick           tick;
public:
   string            GetName(void)         { return m_name_orders; }
   int               GetType(void)         { return m_type_orders; }
   double            GetLots(void)         { return m_lots_orders; }
   double            GetCena(void)         { return m_cena_orders; }

   void              SetName(string aName) { m_name_orders = aName;}
   void              SetType(int aType)    { m_type_orders = aType;}
   void              SetLots(double aLots) { m_lots_orders = aLots;}
   void              SetCena(double aCena) { m_cena_orders = aCena;}

   void              SetAWpr(string aName, datetime aTime, double aPrice)
     {
      ObjectSetInteger(0, iPrefix + "D" + aName, OBJPROP_TIME, 1, TimeCurrent() + PeriodSeconds() * 5);
      ObjectSetDouble(0, iPrefix + "D" + aName, OBJPROP_PRICE, 1, aPrice);
     }

   bool              CreateBuy(string aName)
     {
      if(!SymbolInfoTick(Symbol(), tick))
        {
         Print("SymbolInfoTick() failed, error = ", GetLastError());
         return false;
        }
      m_name_orders = aName;
      m_type_orders = 0;
      m_lots_orders = iLots;
      m_cena_orders = NormalizeDouble(tick.bid, Digits());
      ButtonCreate(0, iPrefix + "A" + aName, 0, 0, 0, 30, 18, CORNER_LEFT_UPPER, "Buy", "Arial", 10, clrWhite, clrBlue, clrBlue, false, false, false, true, 0);
      EditCreate(0, iPrefix + "B" + aName, 0, 10, 30, 36, 18, DoubleToString(m_lots_orders, 2), "Arial", 10, ALIGN_CENTER, false, CORNER_LEFT_UPPER, clrWhite, clrGray, clrBlue, false, false, true, 0);
      TrendCreate(0, iPrefix + "D" + aName, 0, TimeCurrent() - PeriodSeconds() * 10, m_cena_orders, TimeCurrent() + PeriodSeconds() * 10, m_cena_orders, clrBlue, STYLE_SOLID, 1, false, false, false, false, true, 0);

      ArrowCreate(0, iPrefix + "C" + aName, 0, TimeCurrent() + PeriodSeconds() * 10, m_cena_orders,   clrBlue, STYLE_SOLID, 2, false, true, true, 0);

      OrderDrag(aName);
      return true;
     }
   bool              CreateSel(string aName)
     {
      if(!SymbolInfoTick(Symbol(), tick))
        {
         Print("SymbolInfoTick() failed, error = ", GetLastError());
         return false;
        }
      m_name_orders = aName;
      m_type_orders = 1;
      m_lots_orders = iLots;
      m_cena_orders = NormalizeDouble(tick.bid, Digits());
      ButtonCreate(0, iPrefix + "A" + aName, 0, 0, 0, 30, 18, CORNER_LEFT_UPPER, "Sell", "Arial", 10, clrWhite, clrTomato, clrTomato, false, false, false, true, 0);
      EditCreate(0, iPrefix + "B" + aName, 0, 10, 30, 36, 18, DoubleToString(m_lots_orders, 2), "Arial", 10, ALIGN_CENTER, false, CORNER_LEFT_UPPER, clrWhite, clrGray, clrTomato, false, false, true, 0);
      TrendCreate(0, iPrefix + "D" + aName, 0, TimeCurrent() - PeriodSeconds() * 10, m_cena_orders, TimeCurrent() + PeriodSeconds() * 10, m_cena_orders, clrTomato, STYLE_SOLID, 1, false, false, false, false, true, 0);

      ArrowCreate(0, iPrefix + "C" + aName, 0, TimeCurrent() + PeriodSeconds() * 10, m_cena_orders,   clrTomato, STYLE_SOLID, 2, false, true, true, 0);
      OrderDrag(aName);
      return true;
     }

   void              OrderDrag(string aName)
     {
      datetime times = (datetime)ObjectGetInteger(0, iPrefix + "C" + aName, OBJPROP_TIME, 0);
      double   price = ObjectGetDouble(0, iPrefix + "C" + aName, OBJPROP_PRICE, 0);

      string    text = ObjectGetString(0, iPrefix + "B" + aName, OBJPROP_TEXT);
      m_lots_orders  = StringToDouble(text);
      m_cena_orders  = price;
      int x = 0, y = 0;
      if(ChartTimePriceToXY(0, 0, times, price, x, y))
        {
         ObjectSetInteger(0, iPrefix + "A" + aName, OBJPROP_XDISTANCE, x + 2 - 72);
         ObjectSetInteger(0, iPrefix + "A" + aName, OBJPROP_YDISTANCE, y + 2 - 10);

         ObjectSetInteger(0, iPrefix + "B" + aName, OBJPROP_XDISTANCE, x + 32 - 72);
         ObjectSetInteger(0, iPrefix + "B" + aName, OBJPROP_YDISTANCE, y + 2 - 10);

         ObjectSetInteger(0, iPrefix + "D" + aName, OBJPROP_TIME, 0, times);
         ObjectSetDouble(0, iPrefix + "D" + aName, OBJPROP_PRICE, 0, price);

        }
     }
  };

struct structura
  {
protected:

public:
   str               orders[];
   bool              MenuCreate(void)
     {
      EditCreate(0, iPrefix + "Menu", 0, 10, 30, 64, 22, "", "Arial", 10, ALIGN_CENTER, false, CORNER_LEFT_UPPER, clrWhite, clrGray, clrNONE, false, true, true, 0);
      ButtonCreate(0, iPrefix + "Buy", 0, 0, 0, 30, 18, CORNER_LEFT_UPPER, "Buy", "Arial", 10, clrWhite, clrBlue, clrBlue, false, false, false, true, 0);
      ButtonCreate(0, iPrefix + "Sel", 0, 0, 0, 30, 18, CORNER_LEFT_UPPER, "Sell", "Arial", 10, clrWhite, clrTomato, clrTomato, false, false, false, true, 0);

      ArrowCreate(0, iPrefix + "AW", 0, TimeCurrent() + PeriodSeconds() * 10, 0,   clrGreen, STYLE_SOLID, 3, false, false, true, 0);

      MenuDrag();
      return true;
     }

   void              MenuDrag(void)
     {
      int x = (int)ObjectGetInteger(0, iPrefix + "Menu", OBJPROP_XDISTANCE);
      int y = (int)ObjectGetInteger(0, iPrefix + "Menu", OBJPROP_YDISTANCE);

      ObjectSetInteger(0, iPrefix + "Buy", OBJPROP_XDISTANCE, x + 2);
      ObjectSetInteger(0, iPrefix + "Buy", OBJPROP_YDISTANCE, y + 2);

      ObjectSetInteger(0, iPrefix + "Sel", OBJPROP_XDISTANCE, x + 32);
      ObjectSetInteger(0, iPrefix + "Sel", OBJPROP_YDISTANCE, y + +2);
     }

   bool              GetStateBuy(void) { return (bool)ObjectGetInteger(0, iPrefix + "Buy", OBJPROP_STATE);}
   void              SetStateBuy(void) { ObjectSetInteger(0, iPrefix + "Buy", OBJPROP_STATE, false);}
   bool              GetStateSel(void) { return (bool)ObjectGetInteger(0, iPrefix + "Sel", OBJPROP_STATE);}
   void              SetStateSel(void) { ObjectSetInteger(0, iPrefix + "Sel", OBJPROP_STATE, false);}
  };
structura st;

int OnInit()
  {
      // код доступен только после оплаты
   }

void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
  {
   if(id == CHARTEVENT_OBJECT_CLICK)
     {
      if(st.GetStateBuy())
        {
         int u = ArraySize(st.orders);
         ArrayResize(st.orders, u + 1, 100);
         st.orders[u].CreateBuy(IntegerToString(u));

         st.SetStateBuy();
        }

      if(st.GetStateSel())
        {
         int u = ArraySize(st.orders);
         ArrayResize(st.orders, u + 1, 100);
         st.orders[u].CreateSel(IntegerToString(u));

         st.SetStateSel();
        }
     }

   if(id == CHARTEVENT_MOUSE_MOVE || id == CHARTEVENT_OBJECT_ENDEDIT)
      if(sparam == "1")
        {
         double buy_price = 0, sel_price = 0, buy_lot = 0, sel_lot = 0, price_aw = 0;
         int t = 0;
         for(int i = 0; i < ArraySize(st.orders); i++)
           {
            st.orders[i].OrderDrag(IntegerToString(i));

            if(st.orders[i].GetType() == 0)
              {
               buy_price += st.orders[i].GetCena() * st.orders[i].GetLots();
               buy_lot += st.orders[i].GetLots();

               t++;
              }
            if(st.orders[i].GetType() == 1)
              {
               sel_price += st.orders[i].GetCena() * st.orders[i].GetLots();
               sel_lot += st.orders[i].GetLots();
               t++;
              }
           }

         if(t >= 2 && (buy_lot - sel_lot) != 0)
           {
            price_aw = NormalizeDouble((buy_price - sel_price) / (buy_lot - sel_lot), Digits());

            if(price_aw > 0)
               for(int i = 0; i < ArraySize(st.orders); i++)
                  st.orders[i].SetAWpr(IntegerToString(i), TimeCurrent(), price_aw);

            ObjectSetDouble(0, iPrefix + "AW", OBJPROP_PRICE, 0, price_aw);
            ObjectSetInteger(0, iPrefix + "AW", OBJPROP_TIME, 0, TimeCurrent() + PeriodSeconds() * 5);

           }
         st.MenuDrag();
        }

   ChartRedraw();
  }

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[]
               )
  {
      // код доступен только после оплаты
   }

void OnDeinit(const int reason)
  {
   ObjectsDeleteAll(0, iPrefix);
  }

bool ButtonCreate(const long              chart_ID = 0,             // chart's ID
                  const string            name = "Button",          // button name
                  const int               sub_window = 0,           // subwindow index
                  const int               x = 0,                    // X coordinate
                  const int               y = 0,                    // Y coordinate
                  const int               width = 50,               // button width

Показано первые 50% кода (символов: 12549)

Открыть по тарифу

Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.

Разовая покупка файла

На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.

Чтобы оформить заказ, введите email и перейдите к оплате.

Стоимость полного кода
1 254,90₽ ≈ $15.34