Перейти к содержанию

Графический интерфейс - обмен опытом


Рекомендуемые сообщения

Графический интерфейс - обмен опытом Опубликовано

Подсмотрел я как сделан интерфейс в одном индикаторе (инфопанель Ильнура для сетки) и стало мне понятно как для советников можно просто создавать интерфейс и самое главное, его потом можно перемещать мышкой по экрану. Те, что я велосипедил до этого, были абсолютно статичны и более объемны по коду. Но возникла проблема обработки нажатия на кнопки. После 20-го, 30-го... 50-го нажатия одна из кнопок как-бы залипает и срабатывает 2-5-6 раз. И если это была команда на закрытие сетки ордеров - все бы ничего, а вот если это кнопка открытия нового ордера!!?? Робот лупанет 5-6 ордеров в одной точке. :(
Пробовал на терминалах разных билдов.

Сейчас код вот такой:

Спойлер

void OnChartEvent(const int id, const long &lparam,  const double &dparam, const string &sparam) 
{
iPanel.OnEvent(id, lparam, dparam, sparam);
if (iPanel.xBuy_Button.Pressed()) Print("Нажата xBuy !!!");
if (iPanel.Buy_Button.Pressed()) Print("Нажата Buy 0.32 !!!");
if (iPanel.xSell_Button.Pressed()) Print("Нажата xSell !!!");
if (iPanel.Sell_Button.Pressed()) {Print("Нажата Sell 0.18 !!!"); };
ChartRedraw();
}


Раньше делал как-то так и дабл-трипл клик не было (но инфоокно - статично)
Спойлер


if(id==CHARTEVENT_OBJECT_CLICK) {
if(sparam == btnCloseAllBuy.name) {CloseOrders(OP_BUY); ObjectSetInteger(0,btnCloseAllBuy.name,OBJPROP_STATE,0); lastBuyTP =0; GlobalVariableSet(Symbol()+"lastBuyTP",lastBuyTP);}
if(sparam == btnCloseAllSell.name){CloseOrders(OP_SELL);ObjectSetInteger(0,btnCloseAllSell.name,OBJPROP_STATE,0);lastSellTP =0; GlobalVariableSet(Symbol()+"lastSellTP",lastSellTP);}
}


В приложении исходник индикатора с моей панелью. Там под комментариями в функции OnChartEvent видны мои эксперименты.
Буду рад любым идеям и особенно примерам интерфесов с исходниками.
P.S. И желательно для "домохозяек"!

Спойлер



O4_Setka_Interface_tmp.mq4

  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

  • 2 weeks later...
  • Ответов 57
  • Создано
  • Последний ответ

Популярные авторы

Популярные авторы

Популярные посты

Как быстро добавить панель управления к индикатору и советнику Изменяем параметры эксперта с пользовательской панели "На лету" Графические интерфейсы III: Простые и многофункциональные кнопки (Глава 1

Перейти

Простой исходник торговой панели для советника с кнопками: Код: //+------------------------------------------------------------------+ //| TradeP

Перейти

Последняя версия библиотек EastAndFastGUI работающая под MT4. При обновлении терминала MT4 файлы в папках Canvas и Graphics заменяются более новыми версиями, что приводит к ошибкам компиляции. Поэтому

Перейти
Графический интерфейс - обмен опытом Опубликовано

Хорошая задумка. Я как раз ищу нечто подобное, с мани менеджментом, чтобы в один клик выставлять ордера по рынку.

Ссылка на сообщение
Поделиться на другие сайты

Графический интерфейс - обмен опытом Опубликовано


Буду рад любым идеям и особенно примерам интерфесов с исходниками.


Простой исходник торговой панели для советника с кнопками:
Спойлер





Код:

//+------------------------------------------------------------------+
//| TradePanel.mq4 |
//| Ilnur17021992. Special for http://tradelikeapro.ru |
//| http://tradelikeapro.ru |
//+------------------------------------------------------------------+
#property copyright "Ilnur17021992. Special for http://tradelikeapro.ru"
#property link "http://tradelikeapro.ru"
#property version "1.00"
#property strict

#include
#include
#include

//--- Inputs
extern double Lot = 0.1;
extern int StopLoss = 500;
extern int TakeProfit = 500;
extern int Slip = 30;
extern int Magic = 0;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
enum label_align
{
left=-1,
right=1,
center=0
};
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
class CTradePanel : public CAppDialog
{
private:

CLabel Lots_label; // Display label " Lots"
CEdit Lots; // Display volume of next order
CButton SELL,BUY; // Sell and Buy Buttons
CButton CloseAll; // Close buttons

//--- Create Label object
bool CreateLabel(const long chart,const int subwindow,CLabel &object,const string text,const uint x,const uint y,label_align align);
//--- Create Button
bool CreateButton(const long chart,const int subwindow,CButton &object,const string text,const uint x,const uint y,const uint x_size,const uint y_size);
//--- Create Edit object
bool CreateEdit(const long chart,const int subwindow,CEdit &object,const string text,const uint x,const uint y,const uint x_size,const uint y_size);

//--- On Event functions
void LotsEndEdit(void); // Edit Lot size

//--- variables of current values
double cur_lot; // Lot of next order

void BuyClick(); // Click BUY button
void SellClick(); // Click SELL button
void CloseClick(); // Click CLOSE button

public:
CTradePanel(void){};
~CTradePanel(void){};
virtual bool Create(const long chart,const string name,const int subwin=0,const int x1=20,const int y1=20,const int x2=320,const int y2=420);
virtual bool OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam);
virtual void Destroy(const int reason);
};

CTradePanel TradePanel;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
// Create Trade Panel
TradePanel.Create(ChartID(),"TradePanel",0,20,20,150,200);
TradePanel.Run();
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
TradePanel.Destroy(reason);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool CTradePanel::CreateLabel(const long chart,const int subwindow,CLabel &object,const string text,const uint x,const uint y,label_align align)
{
// All objects must have separate name
string name=m_name+"Label"+(string)ObjectsTotal(chart,-1,OBJ_LABEL);
//--- Call Create function
if(!object.Create(chart,name,subwindow,x,y,0,0))
{
return false;
}
//--- Adjust text
if(!object.Text(text))
{
return false;
}
//--- Align text to Dialog box's grid
ObjectSetInteger(chart,object.Name(),OBJPROP_ANCHOR,(align==left ? ANCHOR_LEFT_UPPER :(align==right ? ANCHOR_RIGHT_UPPER : ANCHOR_UPPER)));
//--- Add object to controls
if(!Add(object))
{
return false;
}
return true;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool CTradePanel::CreateButton(const long chart,const int subwindow,CButton &object,const string text,const uint x,const uint y,const uint x_size,const uint y_size)
{
// All objects must have separate name
string name=m_name+"Button"+(string)ObjectsTotal(chart,-1,OBJ_BUTTON);
//--- Call Create function
if(!object.Create(chart,name,subwindow,x,y,x+x_size,y+y_size))
{
return false;
}
//--- Adjust text
if(!object.Text(text))
{
return false;
}
//--- set button flag to unlock
object.Locking(false);
//--- set button flag to unpressed
if(!object.Pressed(false))
{
return false;
}
//--- Add object to controls
if(!Add(object))
{
return false;
}
return true;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool CTradePanel::CreateEdit(const long chart,const int subwindow,CEdit &object,const string text,const uint x,const uint y,const uint x_size,const uint y_size)
{
// All objects must have separate name
string name=m_name+"Edit"+(string)ObjectsTotal(chart,-1,OBJ_EDIT);
//--- Call Create function
if(!object.Create(chart,name,subwindow,x,y,x+x_size,y+y_size))
{
return false;
}
//--- Adjust text
if(!object.Text(text))
{
return false;
}
//--- Align text in Edit box
if(!object.TextAlign(ALIGN_CENTER))
{
return false;
}
//--- set Read only flag to false
if(!object.ReadOnly(false))
{
return false;
}
//--- Add object to controls
if(!Add(object))
{
return false;
}
return true;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool CTradePanel::Create(const long chart,const string name,const int subwin=0,const int x1=20,const int y1=20,const int x2=320,const int y2=420)
{
// At first call create function of parents class
CAppDialog::Create(chart,name,subwin,x1,y1,x2,y2);

// Calculate coordinates and size of BID object

// Create object
CreateLabel(chart,subwin,Lots_label,"LOT",55,5,0);
CreateEdit(chart,subwin,Lots,"0.1",33,35,60,20);
CreateButton(chart,subwin,BUY,"BUY",33,65,60,20);
CreateButton(chart,subwin,SELL,"SELL",33,95,60,20);
CreateButton(chart,subwin,CloseAll,"CLOSE",33,125,60,20);

return(true);
}
//+------------------------------------------------------------------+
//| Event Handling |
//+------------------------------------------------------------------+
EVENT_MAP_BEGIN(CTradePanel)
ON_EVENT(ON_END_EDIT,Lots,LotsEndEdit)
ON_EVENT(ON_CLICK,BUY,BuyClick)
ON_EVENT(ON_CLICK,SELL,SellClick)
ON_EVENT(ON_CLICK,CloseAll,CloseClick)
EVENT_MAP_END(CAppDialog)
//+------------------------------------------------------------------+
//| Click BUY button |
//+------------------------------------------------------------------+
void CTradePanel::BuyClick(void)
{
PutOrder(0,Ask);
}
//+------------------------------------------------------------------+
//| Click BUY button |
//+------------------------------------------------------------------+
void CTradePanel::SellClick(void)
{
PutOrder(1,Bid);
}
//+------------------------------------------------------------------+
//| Click BUY button |
//+------------------------------------------------------------------+
void CTradePanel::CloseClick(void)
{
CloseAll();
}
//+------------------------------------------------------------------+
//| Read lots value after edit |
//+------------------------------------------------------------------+
void CTradePanel::LotsEndEdit(void)
{
//--- Read and normalize lot value
cur_lot=NormalizeDouble(StringToDouble(Lots.Text()),2);
}
//+------------------------------------------------------------------+
//| Application deinitialization function |
//+------------------------------------------------------------------+
void CTradePanel::Destroy(const int reason)
{
CAppDialog::Destroy(reason);
return;
}
//+------------------------------------------------------------------+
//| Установка ордера |
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
{
int r=0;
color clr=Green;
double sl=0,tp=0;

if(type==1 || type==3 || type==5)
{
clr=Red;
if(StopLoss>0) sl=NormalizeDouble(price+StopLoss*Point,Digits);
if(TakeProfit>0) tp=NormalizeDouble(price-TakeProfit*Point,Digits);
}

if(type==0 || type==2 || type==4)
{
clr=Blue;
if(StopLoss>0) sl=NormalizeDouble(price-StopLoss*Point,Digits);
if(TakeProfit>0) tp=NormalizeDouble(price+TakeProfit*Point,Digits);
}

r=OrderSend(NULL,type,Lot,NormalizeDouble(price,Digits),Slip,sl,tp,"",Magic,0,clr);
return;
}
//+------------------------------------------------------------------+
//| Закрытие позиции по типу ордера |
//+------------------------------------------------------------------+
void CloseAll(int ot=-1)
{
bool cl;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(OrderType()==0 && (ot==0 || ot==-1))
{
RefreshRates();
cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),Slip,White);
}
if(OrderType()==1 && (ot==1 || ot==-1))
{
RefreshRates();
cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),Slip,White);
}
}
}
}
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---

}
//+------------------------------------------------------------------+
//| ChartEvent function |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
const long &lparam,
const double &dparam,
const string &sparam)
{
//---
TradePanel.OnEvent(id,lparam,dparam,sparam);
}
//+------------------------------------------------------------------+

  • Лайк 8
Ссылка на сообщение
Поделиться на другие сайты

Графический интерфейс - обмен опытом Опубликовано

А по каким материалам лучше изучать программирование графического интерфейса: кнопки там всякие, метки, линии, обработка событий от них? Киньте ссылку, если не трудно!

Ссылка на сообщение
Поделиться на другие сайты

Графический интерфейс - обмен опытом Опубликовано (изменено)


А по каким материалам лучше изучать программирование графического интерфейса: кнопки там всякие, метки, линии, обработка событий от них? Киньте ссылку, если не трудно!


Как быстро добавить панель управления к индикатору и советнику
Изменяем параметры эксперта с пользовательской панели "На лету"
Графические интерфейсы III: Простые и многофункциональные кнопки (Глава 1)

Вот тут огромная библиотека по графическим интерфейсам в MQL Изменено пользователем ilnur17021992
  • Лайк 10
Ссылка на сообщение
Поделиться на другие сайты

  • 3 months later...
Графический интерфейс - обмен опытом Опубликовано (изменено)

Скомпилировал панельку из третьего поста в MT4. Столкнулся с такой проблемой — при переключении таймфреймов панелька рассыпается. Нормально проходит только первое переключение. Может кто подскажет, как это побороть?
MT4 Build 1090.




Добавлено: 31-07-2017 16:27:08

Еще немного дополнительной информации:
Нашел, что если в файле Dialog.mqh в функции CAppDialog::Destroy(const int reason) закоментировать строки
if(m_deinit_reason!=WRONG_VALUE)
return;
то панелька при переключении таймфреймов нормально уничтожается и заново инитится.

В классах я практически полный ноль, но имхо курочить Dialog.mqh не есть правильно. Может кто-нибудь подсказать как поступить в данной ситуации?



Добавлено: 31-07-2017 19:50:06

Продолжение:
В коде примера из третьего поста изменил функцию CTradePanel::Destroy(const int reason):


//+------------------------------------------------------------------+
//| Application deinitialization function |
//+------------------------------------------------------------------+
void CTradePanel::Destroy(const int reason)
{
m_chart.Detach();
CDialog::Destroy(reason);
if(reason==REASON_PROGRAM)
{
ExpertRemove();
}
return;
}


В таком варианте панелька не рассыпается. Не уверен, что это правильное решение, но работает.

Panel_1.jpg

Изменено пользователем lova
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

  • 1 year later...
Графический интерфейс - обмен опытом Опубликовано



А по каким материалам лучше изучать программирование графического интерфейса: кнопки там всякие, метки, линии, обработка событий от них? Киньте ссылку, если не трудно!


Как быстро добавить панель управления к индикатору и советнику
Изменяем параметры эксперта с пользовательской панели "На лету"
Графические интерфейсы III: Простые и многофункциональные кнопки (Глава 1)


Вот тут огромная библиотека по графическим интерфейсам в MQL

Приветствую!

меня тоже очень интересует тема создания графических панелек...
...но в предоставленных Вами выше ссылках - находятся ссылки на mql5 - язык с программами для MT5 - примеры которых не работают в MT4...

...сколько я не искал - хорошего материала для МТ4 я так и не нашел (нашел только здесь пример исходного кода в топике автора - ему спасибо за это)...

может у кого-то найдутся ли материалы по графическим панелям для mql4?
или же есть возможность как то запустить код написанный в mql5 для MT4?

буду очень признателен + как-то расшевелю эту тему! =^-^=
Ссылка на сообщение
Поделиться на другие сайты

Графический интерфейс - обмен опытом Опубликовано
bor-ix что именно интересует? Представленный код отлично работает в МТ4, просто пробуйте использовать, добавьте кнопочку и т.д.Ссылка
Ссылка на сообщение
Поделиться на другие сайты

Графический интерфейс - обмен опытом Опубликовано (изменено)


bor-ix что именно интересует? Представленный код отлично работает в МТ4, просто пробуйте использовать, добавьте кнопочку и т.д.Ссылка


Ссылка0ll, согласен - в топике представленный исходник работает - и выводит панель!

программирую я не очень + с ООП - совсем не дружу... >^-^ранее кодил посредством копипастов и разбирательства с ним в процедурном виде, кое где добавлял функции и этого мне было достаточно...

сейчас чтоб свое "совсем не дружу" по вопросу графических интерфейсов изменить в "дружу" ищу подробный материал как это делать в mql4...

допустим в примере из 3 поста (с изменениями из 5-го) - представленная панель не читает объемы ордера указываемые в самой панели - вводимые руками...
а ссылки на материал предоставленный по mql5 - не подходит для mql4... :-?

прошу помощи в моих изысканиях =^-^= Изменено пользователем bor-ix
Ссылка на сообщение
Поделиться на другие сайты

Графический интерфейс - обмен опытом Опубликовано

панель не читает объемы ордера указываемые в самой панели - вводимые руками...


Там ошибочка..., подсказываю:
есть начальный лот в настройках - Lot
есть переменная в классе панели - cur_lot
есть функция отправки ордера - PutOrder
Что нужно сделать:
Там где рисуются кнопочки и поля ввода панели, нужно в вставить в поле-Edit не текст "0,1", а реальный начальный лот Lot
При нажатии кнопок Бай/Селл вызывается функция
PutOrder - добавить аргумент ЛОТ и передать туда cur_lot.
Сделай сам и выложи сюда рабочий файл. Успехов!
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Графический интерфейс - обмен опытом Опубликовано (изменено)
Цитата

...
Что нужно сделать:
...



в настройках робота (панели) объявлена переменная, и она доступна из любого класса...
extern double Lot = 0.1;

в классе "class CTradePanel : public CAppDialog" в 53 строке (она под идентификатором private: ) - где попало ее не вызовешь

Цитата

double cur_lot;




правильно ли будет в аргументы функции PutOrder() как вы говорите добавить - третий аргумент - типа:

Цитата

void PutOrder(int type,double price, double sLot)


и
Цитата

//+------------------------------------------------------------------+
//| Click BUY button |
//+------------------------------------------------------------------+
void CTradePanel::BuyClick(void)
{
PutOrder(0,Ask, cur_lot);
}
//+------------------------------------------------------------------+
//| Click BUY button |
//+------------------------------------------------------------------+
void CTradePanel::SellClick(void)
{
PutOrder(1,Bid, cur_lot);
}



???

в 190 строке - заменить на числовое
нельзя т.к. она объявлена в 47 строке как String... (const string text)


Цитата

CreateEdit(chart,subwin,Lots,"0.1",33,35,60,20);




если в функции строковую переменную заменить на числовую:

Цитата

bool CreateEdit(const long chart,const int subwindow,CEdit &object,const double num,const uint x,const uint y,const uint x_size,const uint y_size);



и

Цитата

bool CTradePanel::CreateEdit(const long chart,const int subwindow,CEdit &object,const double num,const uint x,const uint y,const uint x_size,const uint y_size)




то в строке 157 - выдает ошибку...
что дальше делать - я уже не понимаю... :-? fcplm ~x(

-------------------
ПС: понимаю что без ООП тут мне делать нечего, но как то его надо начать учить!..
но для mql4 - таких материалов нигде нет...

Panel_20180813.mq4

Изменено пользователем bor-ix
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

Графический интерфейс - обмен опытом Опубликовано
bor-ix Ну что - классно. Давай добивать панельку:
1. С PutOrder() всё сделал как надо \M/
2. Надо добиться, чтоб при старте панели в Edite отображался лот указанный в настройках (Lot)
Вы уже передали значение Lot в функцию рисования Edit-a, но почему-то не использовали...
нужно в if(!object.Text(text)) вместо text вставить DoubleToStr(num)

Доделай, потестируй, если ОК - напиши.
В качестве доп.задания:
добавь Label внизу панельки и выведи туда прибыль всех открытых ордеров по текущей паре. (я помогу, если нужно)
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Графический интерфейс - обмен опытом Опубликовано (изменено)


bor-ix Ну что - классно. Давай добивать панельку:
1. С PutOrder() всё сделал как надо \M/
2. Надо добиться, чтоб при старте панели в Edite отображался лот указанный в настройках (Lot)
Вы уже передали значение Lot в функцию рисования Edit-a, но почему-то не использовали...

нужно в if(!object.Text(text)) вместо text вставить DoubleToStr(num)


Доделай, потестируй, если ОК - напиши.
В качестве доп.задания:
добавь Label внизу панельки и выведи туда прибыль всех открытых ордеров по текущей паре. (я помогу, если нужно)


отлично - с Вашими подсказками теперь всё работает!!! #:-s
0ll, спасибо за поддержку! >:d
приму Ваше условие по дополнению инфы в панельку и буду продолжать учиться кодить! =^-^= Изменено пользователем bor-ix
Ссылка на сообщение
Поделиться на другие сайты

Графический интерфейс - обмен опытом Опубликовано

отлично - с Вашими подсказками теперь всё работает!!!


а у нас будет работать или только у вас? :)
последнюю рабочую версию мы увидим?
Ссылка на сообщение
Поделиться на другие сайты

Графический интерфейс - обмен опытом Опубликовано (изменено)


отлично - с Вашими подсказками теперь всё работает!!!


а у нас будет работать или только у вас? :)
последнюю рабочую версию мы увидим?

у меня есть 2 варианта:

оба работают, но:
в первом варианте (там где окошко) - табличка выводит double значение (0.01000000) - из-за замены параметров в функциях на double...
во втором (пересмотрев код) - выводит string значение (0.02) - вернул обратно изначальный код функций string и по другому решил данный вопрос...

Panel_20180815-1.mq4
Panel_20180815-2.mq4

Изменено пользователем bor-ix
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

Графический интерфейс - обмен опытом Опубликовано
bor-ix чтоб не выводило нули достаточно сделать так: DoubleToStr( num, 2 ) 2 - это количество знаков (точность)
Вам бы ещё со справкой научиться работать...
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Графический интерфейс - обмен опытом Опубликовано (изменено)


bor-ix чтоб не выводило нули достаточно сделать так: DoubleToStr( num, 2 ) 2 - это количество знаков (точность)
Вам бы ещё со справкой научиться работать...


я таким то способом и решил вопрос с количеством нулей во второй панельке - там где записывается строковый (string) параметр в функции CreateEdit...

...а вот в первом варианте панельки (с нулями) в функцию записывается параметр в формате double - вот я и не знаю как double параметр представить там в виде с двумя цифрами после запятой... :-/
для меня это не решаемо... разве что - перевести его в строковый (string) параметр... т.е. string переводим в double, а потом обратно в string... - а это уже получается много лишнего кода - зачем это делать?..


Добавлено: 17-08-2018 16:36:42


для выполнения Вашего задания, 0ll - для расчета прибыли по открытым ордерам - я код то написал...

Цитата


double BuyProfit = 0, SellProfit = 0, SumProfit = 0;
if(OrdersTotal() > 0)
{
for(int i = 0; i {
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
switch(OrderType())
{
case OP_BUY: BuyProfit = BuyProfit + OrderProfit() + OrderCommission() + OrderSwap(); break;
case OP_SELL: SellProfit = SellProfit + OrderProfit() + OrderCommission() + OrderSwap(); break;
}
}
}
}
SumProfit = BuyProfit + SellProfit;
}
else SumProfit = 0;


а вот в какую часть кода нашей панельки его записать я уже не понимаю...

вот вид будущей панельки:


-------------
ПС: уважаемые админы - движок форума на меня ругается когда я хочу записать текст в формате кода - "Sorry, you are not allowed to post external links."
...пока обхожу этот запрет через форматирование цитатами... - что у меня может быть не так?


Добавлено: 18-08-2018 00:32:03


всё - задачка решена! =^-^=



Panel_20180816-2.mq4

Изменено пользователем bor-ix
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Графический интерфейс - обмен опытом Опубликовано

т.е. string переводим в double, а потом обратно в string... - а это уже получается много лишнего кода - зачем это делать?..


Нет, что-то здесь Вы перегнули...
У Вас есть:
1. double параметр Lot в настройках
2. поле string для вывода этого параметра
поэтому достаточно 1-го преобразования DoubleToStr( Lot, 2 );
понятно, что когда меняете этот параметр, то идёт обратное преобразование, но по другому ни как... - панель для торговли вешаете, а не для красоты.
Ссылка на сообщение
Поделиться на другие сайты

Графический интерфейс - обмен опытом Опубликовано


т.е. string переводим в double, а потом обратно в string... - а это уже получается много лишнего кода - зачем это делать?..


Нет, что-то здесь Вы перегнули...
У Вас есть:
1. double параметр Lot в настройках
2. поле string для вывода этого параметра
поэтому достаточно 1-го преобразования DoubleToStr( Lot, 2 );
понятно, что когда меняете этот параметр, то идёт обратное преобразование, но по другому ни как... - панель для торговли вешаете, а не для красоты.

0ll, в первом моём варианте - вот так "по другому" и получилось - я поменял логику и из-за этого не мог побороть многозначность отображаемых данных...

поспорю на счет "красоты" - все должно быть функционально, удобно и эстетично... если информация будет предоставляться кое-как - её нельзя будет прочитать, это будет отвлекать излишними действиями и постоянно раздражать - а оно нам такое надо(?) если можно предусмотреть решение этих неприятных нюансов...
Ссылка на сообщение
Поделиться на другие сайты

Графический интерфейс - обмен опытом Опубликовано
bor-ix посмотрел код, по теме вывода Lot - вопросов нет, всё правильно.
По выводу профита - у Вас профит считает один раз при запуске панели, исправил чуток, можете смотреть.

Panel_3.mq4

  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Графический интерфейс - обмен опытом Опубликовано (изменено)


bor-ix посмотрел код, по теме вывода Lot - вопросов нет, всё правильно.
По выводу профита - у Вас профит считает один раз при запуске панели, исправил чуток, можете смотреть.



Цитата

void OnTick()
{
//---
TradePanel.nProf.Text( DoubleToStr( Profit(),2) );
}



0ll, я понимаю, что функция OnTick() - это то место где ежетиково будет производится пересчет текущих значений... но мои потуги подставить результаты подсчета профита туда - у меня не увенчались успехом - выкрутился так как Вы увидели...


...я не понимаю логики записи: "TradePanel.nProf.Text" - что обозначают точки и последовательность этой записи... где можно про это прочитать?
что обозначает запись:
Цитата

public:
CLabel nProf;



+
Цитата

CreateLabel(chart,subwin,nProf,"wait...",60,155,0);


я не пониманию, что вместо "wait..." записать чтоб данные профита правильно подставляло?

или также как со значением Lot поступить - перевести его в string и подставить в строку отображения CreateLabel?

Цитата

string Profit = DoubleToStr(Profit(),2);
...
CreateLabel(chart,subwin,nProf,Profit,60,155,0);


Изменено пользователем bor-ix
Ссылка на сообщение
Поделиться на другие сайты

Графический интерфейс - обмен опытом Опубликовано

...я не понимаю логики записи: "TradePanel.nProf.Text" - что обозначают точки и последовательность этой записи... где можно про это прочитать?


Это и есть ООП...
Вы создали объект TradePanel, потом внутри него создали label-объект nProf (если заметили я его перенёс из области private в область public), у последнего объекта есть свойство Text - вот в него и нужно записывать значение.
Почитайте хотя-бы справку по mql, там есть " Другие операции / Операция точка ( . ) "
и по ООП тоже есть инфа.

я не пониманию, что вместо "wait..." записать чтоб данные профита подставляло?


"wait..." - это временная надпись во время создания объекта, когда придёт тик там появятся данные профита по текущим сделкам.
Ссылка на сообщение
Поделиться на другие сайты

Графический интерфейс - обмен опытом Опубликовано (изменено)


я не пониманию, что вместо "wait..." записать чтоб данные профита подставляло?


"wait..." - это временная надпись во время создания объекта, когда придёт тик там появятся данные профита по текущим сделкам.

при закрытом рынке - не очень практично...

---------------

0ll, спасибо на ссылку про ООП в разделе справки - буду изучать...

-------------

ПС: приложу тут версию последней панельки которая показывает профит и при закрытом рынке

Panel_3+.mq4

Изменено пользователем bor-ix
Ссылка на сообщение
Поделиться на другие сайты

Графический интерфейс - обмен опытом Опубликовано

при закрытом рынке - не очень практично...


Я просто показал разницу между созданием объекта и дальнейшим использованием. Вы можете делать как считаете удобным.
Ссылка на сообщение
Поделиться на другие сайты

  • 2 weeks later...
Графический интерфейс - обмен опытом Опубликовано

Если кому интересна тема панелей - есть запрос на следующую конфигурацию. Если нужна будет помощь - пишите.

tm-close-buttons-screen-5140.png

Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Специальное предложение


  • Рекомендуемые брокеры

  • ×
    ×
    • Создать...