Простейшая панель

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
nkaretnikov
100
nkaretnikov  

День добрый!

Н‌амереваюсь в пустом окне выводить что-то вроде Market Match\Popup Prices

Наподобие

‌На форуме есть навороченные панели, с торговлей, с закладками. Там черт ногу сломит в коде. 

П‌одскажите, какие основные методы \ функции нужны для вывода котировок в отдельное окно.

С‌пасибо!

Alexey Volchanskiy
27264
Alexey Volchanskiy  
nkaretnikov:

День добрый!

Н‌амереваюсь в пустом окне выводить что-то вроде Market Match\Popup Prices

Наподобие

‌На форуме есть навороченные панели, с торговлей, с закладками. Там черт ногу сломит в коде. 

П‌одскажите, какие основные методы \ функции нужны для вывода котировок в отдельное окно.

С‌пасибо!


Вообще панель не нужна, просто выводить через Label. Вот тут пример с картинкой, он для МТ4, но вывод текта на пятерку легко переделать (а может и так заработает, лень вспоминать..)

https://www.mql5.com/ru/code/12395‌

nkaretnikov
100
nkaretnikov  
Alexey Volchanskiy:


Вообще панель не нужна, просто выводить через Label. Вот тут пример с картинкой, он для МТ4, но вывод текта на пятерку легко переделать (а может и так заработает, лень вспоминать..)

https://www.mql5.com/ru/code/12395‌


Похоже! 

Н‌а MT5, правда, не пошло :)

П‌опробую разобраться или поискать еще более близкое совпадение, написанное на mq5, спасибо! 

Alexander Fedosov
15795
Alexander Fedosov  

Может быть это подойдет.

https://www.mql5.com/ru/articles/2500

nkaretnikov
100
nkaretnikov  
Alexander Fedosov:

Может быть это подойдет.

https://www.mql5.com/ru/articles/2500


Спасибо! 

Качнул zip из статьи и попробовал скомпилировать, но получил вот это

https://www.mql5.com/ru/forum/87507#comment_4146664‌

Может что не так сделал? Распаковал и открыл в MT5 Редакторе

Alexey Volchanskiy
27264
Alexey Volchanskiy  
nkaretnikov:


Похоже! 

Н‌а MT5, правда, не пошло :)

П‌опробую разобраться или поискать еще более близкое совпадение, написанное на mq5, спасибо! 


Вспомнил, вот еще пример из моего индюка для МТ5. Я его переделываю, так что есть лишнее, но вам нужна только функция CreateLabel, потом вывод текста через ObjectSetString, смотри в OnCalculate. Индюк рабочий, можно использовать

//+------------------------------------------------------------------+
//|                                          ShowImportantParams.mq4 |
//|                               Copyright 2016, Alexey Volchanskiy |
//|                                          https://mql.gnomio.com/ |
//+------------------------------------------------------------------+

#property copyright "Copyright 2016 June 30, Alexey Volchanskiy"
#property link      "https://mql.gnomio.com/"
#property version   "1.03"
#property description "Indicator shows important params for current symbol and account"

#include <Trade\SymbolInfo.mqh>  
#include <Trade\AccountInfo.mqh>  

CSymbolInfo    m_symbolInfo;
CAccountInfo   m_accountInfo;

#property indicator_chart_window
#property indicator_buffers 0
#property indicator_plots DRAW_NONE

input int       FontSize            = 10;
input color     FontColor           = clrYellow;
input string    FontName            = "Tahoma";
input int       XOffset             = 10;
input int       YOffset             = 15;
input int       SpreadSmoothTicks   = 20;

string lNames[]={"Margin4lot= ", "PointPrice= ", "Leverage= 1:","SpreadSmooth= ","SpreadPrice= ","StopLevel= ","MarginCall= ", "StopOut= "};

double  SpreadBuf[];
int     SpreadBufIdx=0;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ObjectsDeleteAll(0,"SIP");
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnInit()
  {
   ArrayResize(SpreadBuf,SpreadSmoothTicks);
   for(int n=0; n<SpreadSmoothTicks; n++)
      SpreadBuf[n]=0;
   SpreadBufIdx=0;
   if(!m_symbolInfo.Name(Symbol()))
    Print("Symbol ", Symbol(), " initialization false");
   if(!m_symbolInfo.Select(true))
    Print("Symbol ", Symbol(), " selection false");

   ObjectsDeleteAll(0,"SIP");
   Sleep(200);
   ChartRedraw();
   Sleep(200);
   for(int n=ArraySize(lNames)-1; n>=0; n--)
     {
      if(!CreateLabel("SIP_"+lNames[ArraySize(lNames)-1-n],XOffset,YOffset*n+YOffset))
         Print("CreateLabel returns false, n = ",IntegerToString(n));
     }
   Sleep(200);
   ChartRedraw();
  }
  
double GetMargin(string symbol, double volume)
{
    long leverage = AccountInfoInteger(ACCOUNT_LEVERAGE);
    double contract = SymbolInfoDouble(symbol, SYMBOL_TRADE_CONTRACT_SIZE) * volume;
    double margin = volume * contract / leverage;
    //string currency = StringSubstr(symbol, 0, 3) + AccountInfoString(ACCOUNT_CURRENCY) + end;
    //SymbolInfoDouble(currency, SYMBOL_LAST) * contract / leverage;
    return margin;
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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[])
  {
   m_symbolInfo.Refresh();
   m_symbolInfo.RefreshRates();
   SpreadBuf[SpreadBufIdx++] = m_symbolInfo.Ask() - m_symbolInfo.Bid();
   if(SpreadBufIdx >= SpreadSmoothTicks)
      SpreadBufIdx = 0;
   double sprd=0;
   for(int n = 0; n < SpreadSmoothTicks; n++)
      sprd += SpreadBuf[n];
   sprd/=(double)SpreadSmoothTicks;
   ResetLastError();

   double price4lot;
   Quote2Price(sprd,price4lot,Symbol());
  
   m_symbolInfo.Refresh();
   double marginBuy = 0, marginSell = 0;
   m_symbolInfo.RefreshRates();
   m_symbolInfo.Refresh();
   ResetLastError();

   double margin = GetMarginRequired2(Symbol());
   double marginHedged = 0;
   if(!SymbolInfoDouble(_Symbol, SYMBOL_MARGIN_HEDGED, marginHedged))
    marginHedged = -1.0;
   ObjectSetString(0,"SIP_"+lNames[0],OBJPROP_TEXT,lNames[0]+DoubleToString(margin,2) + "  MarginHedjed4lot= " + DoubleToString(marginHedged/m_accountInfo.Leverage(),2));
   ObjectSetString(0,"SIP_"+lNames[1],OBJPROP_TEXT,lNames[1]+DoubleToString(m_symbolInfo.TickValue(),2));
   ObjectSetString(0,"SIP_"+lNames[2],OBJPROP_TEXT,lNames[2]+IntegerToString(m_accountInfo.Leverage()));
   ObjectSetString(0,"SIP_"+lNames[3],OBJPROP_TEXT,lNames[3]+DoubleToString(sprd,_Digits) + ",  RealSpread= " + DoubleToString(m_symbolInfo.Ask() - m_symbolInfo.Bid(),_Digits));
   ObjectSetString(0,"SIP_"+lNames[4],OBJPROP_TEXT,lNames[4]+DoubleToString(price4lot,2));
   ObjectSetString(0,"SIP_"+lNames[5],OBJPROP_TEXT,lNames[5]+DoubleToString(m_symbolInfo.StopsLevel(),0));

   ENUM_ACCOUNT_STOPOUT_MODE stop_out_mode=(ENUM_ACCOUNT_STOPOUT_MODE)AccountInfoInteger(ACCOUNT_MARGIN_SO_MODE);
   string s=(stop_out_mode==ACCOUNT_STOPOUT_MODE_PERCENT)?" %":"";
   ObjectSetString(0,"SIP_"+lNames[6],OBJPROP_TEXT,lNames[6]+DoubleToString(AccountInfoDouble(ACCOUNT_MARGIN_SO_CALL),0)+s);
   ObjectSetString(0,"SIP_"+lNames[7],OBJPROP_TEXT,lNames[7]+DoubleToString(AccountInfoDouble(ACCOUNT_MARGIN_SO_SO),0)+s);
   return(rates_total);
  }
  
// Размер свободных средств, необходимых для открытия 1 лота на покупку
double GetMarginRequired( const string Symb )
{
    MqlTick Tick;
    return(SymbolInfoTick(Symb, Tick) ? Tick.ask * SymbolInfoDouble(Symb, SYMBOL_TRADE_TICK_VALUE) /
        (SymbolInfoDouble(Symb, SYMBOL_TRADE_TICK_SIZE) * AccountInfoInteger(ACCOUNT_LEVERAGE)) : 0);
}
  
// Размер свободных средств, необходимых для открытия 1 лота на покупку
double GetMarginRequired(const string Symb, double marginHedged )
{
  MqlTick Tick;
  double MarginInit, MarginMain;

  return((SymbolInfoTick(Symb, Tick) && SymbolInfoMarginRate(Symb, ORDER_TYPE_BUY, MarginInit, MarginMain)) ? MarginInit * Tick.ask *
          SymbolInfoDouble(Symb, SYMBOL_TRADE_TICK_VALUE) / (SymbolInfoDouble(Symb, SYMBOL_TRADE_TICK_SIZE) * AccountInfoInteger(ACCOUNT_LEVERAGE)) : 0);
}  
//+------------------------------------------------------------------+
// Преобразует разницу котировок в цену "валюта депозита/лот".
// Например, спред 0.00016 для пары EURUSD и валюты депозита USD будет равен $16/лот для лота 100000 ед. базовой валюты пары EUR.
//+------------------------------------------------------------------+
bool Quote2Price(double diff,double &price4lot,string symbol="EURUSD")
{
    int dig = m_symbolInfo.Digits();
    if(dig == 0)
       return(false); // symbol is none
    double tickSize = m_symbolInfo.TickSize();      // пункт в валюте котировки (0,00001 для EURUSD на 5-знаке)
    double tickValue = m_symbolInfo.TickValue();    // пункт в валюте депозита ($1 для EURUSD на 5-знаке)
    double price = diff/(tickSize/tickValue);
    price4lot = NormalizeDouble(price,2);
    return true;
}

//+------------------------------------------------------------------+
// Преобразует цену "валюта депозита/лот" в разницу котировок.
// Например, спред для пары EURUSD и валюты депозита USD, равный $16/лот для лота 100000 ед. базовой валюты пары EUR, будет равен 0.00016.
//+------------------------------------------------------------------+
bool Price2Quote(double &diff, double price4lot, string symbol = "EURUSD")
{
    long dig = 0;
    double tickSize, tickValue;
    if(!SymbolInfoInteger(symbol, SYMBOL_DIGITS, dig))
        return(false); // операция неуспешна
    if(!SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_SIZE, tickSize))
        return(false);
    if(!SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_VALUE, tickValue))
        return(false);
    if(tickValue > 0)    
    {
        diff = price4lot*tickSize / tickValue;
        diff = NormalizeDouble(diff, (int)dig);
    }
    else
        return false;    
    return true;
}
  
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool CreateLabel(string name,int x,int y=10)
  {
   if(!ObjectCreate(0,name,OBJ_LABEL,0,0,0))
      return false;;
   ObjectSetInteger(0,name,OBJPROP_ANCHOR,ANCHOR_LEFT_LOWER);
   ObjectSetInteger(0,name,OBJPROP_CORNER,CORNER_LEFT_LOWER);
   ObjectSetInteger(0,name,OBJPROP_XDISTANCE,x);
   ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y);
   ObjectSetInteger(0,name,OBJPROP_FONTSIZE,FontSize);
   ObjectSetInteger(0,name,OBJPROP_COLOR,FontColor);
   ObjectSetInteger(0,name,OBJPROP_SELECTABLE,true);
   ObjectSetString(0,name,OBJPROP_FONT,FontName);
   ChartRedraw();
   return true;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTimer()
  {

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {

  }
//+------------------------------------------------------------------+

nkaretnikov
100
nkaretnikov  
Alexey Volchanskiy:


Вспомнил, вот еще пример из моего индюка для МТ5. Я его переделываю, так что есть лишнее, но вам нужна только функция CreateLabel, потом вывод текста через ObjectSetString, смотри в OnCalculate. Индюк рабочий, можно использовать


Супер! Спасибо! :) 

Д‌умаю, теперь я справлюсь! 

nkaretnikov
100
nkaretnikov  

Е‌сть ли возможность как-нибудь скрыть график совсем в окне MT5 и получить чистый холст, так сказать?‌

Я попробовал выставить фиксированный масштаб 

н‌о все равно остаются артефакты

п‌люс еще справа шкала цен. 

К‌ак получить совсем пустой канвас?

Alexander Puzanov
42935
Alexander Puzanov  
nkaretnikov:

К‌ак получить совсем пустой канвас?

MQL5: Добавлено свойство CHART_SHOW для отключения отображения графика. Для получения и установки свойства используются функции ChartGetInteger и ChartSetInteger

Если установлено значение false, то отключается отрисовка любых атрибутов ценового графика и устраняются все отступы по краям графика: шкалы времени и цены, строка быстрой навигации, метки событий Календаря, значки сделок, тултипы индикаторов и баров, подокна индикаторов, гистограммы объёмов и т.д.

Отключение отрисовки является идеальным решением для создания собственного интерфейса программы с использованием графических ресурсов.

Графические объекты отрисовываются всегда независимо от установленного значения свойства CHART_SHOW.

Alexey Volchanskiy
27264
Alexey Volchanskiy  
Alexander Puzanov:
Пункт #7 вот здесь прочтите - https://www.mql5.com/ru/forum/168237 

Тоже спасибо, занес в отметки. Кстати, а в пятерке остались автономные графики, как в МТ4? У себя посмотрел - нет такого пункта в меню.
Evgeny Belyaev
131747
Evgeny Belyaev  
Alexey Volchanskiy:

Тоже спасибо, занес в отметки. Кстати, а в пятерке остались автономные графики, как в МТ4? У себя посмотрел - нет такого пункта в меню.

нет автономных графиков
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий